Menu

Showing posts with label permission. Show all posts
Showing posts with label permission. Show all posts

Tuesday, August 11, 2020

[Android - Espresso] การกดปุ่ม Allow บนหน้าต่างขอ Permission โดยไม่จำเป็นต้องรู้ชื่อของ Permission
[Android - Espresso] How to Click Allow Permissions with No Need to Know Permission Name

การทำ UI test automation ด้วย Espresso บางครั้งเราต้องเปิดใช้งานกล้องถ่ายรูป ถ้าหากเปิดใช้งานจาก application ของเราเป็นครั้งแรก สิ่งหนึ่งที่เราต้องเจอแน่นอน คือ modal สำหรับขอ permission ให้ application ของเราสามารถใช้งานกล้องดังภาพข้างล่างนี้


ด้วยข้อจำกัดของ Espresso ที่ไม่สามารถทำ action กับ element ที่อยู่ภายนอก application ได้ เราจึงต้องใช้ UI automator ช่วยในการกดปุ่ม Allow แทน โค้ดข้างล่างนี้จะกดปุ่ม Allow ให้เราโดยอัตโนมัติ ถ้าหากปุ่มดังกล่าวปรากฏอยู่
private val device: UiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())

fun allowPermissionsIfNeeded() {
    if (Build.VERSION.SDK_INT >= 23) {
        val allowPermissions = device.findObject(UiSelector().text("Allow"))
        if (allowPermissions.exists()) {
            try {
                allowPermissions.click()
            } catch (e: UiObjectNotFoundException) {

            }
        }
    }
}
เนื่องจากเป็นการกดปุ่ม Allow โดยไม่สนใจว่า เป็นการขอ permission ใด จึงสามารถนำไปใช้กับการขอ permission อื่นๆได้ เช่น การเลือกรูปจาก gallery, การใช้งาน location เป็นต้น

สำหรับข้อมูลเพิ่มเติม สามารถอ่านได้ที่ https://stackoverflow.com/questions/33929937/android-marshmallow-test-permissions-with-espresso

Monday, January 6, 2020

[Laravel - Scheduler] ระวัง!!! การไม่กำหนด username ใน Cron Entry สามารถทำให้เกิด "Permission Denied" ได้
[Laravel - Scheduler] Warning!!! Adding Cron Entry without Specify Username May Cause "Permission Denied"

จากตัวอย่างใน Starting The Scheduler จะกำหนดให้ใส่ cron entry ดังนี้
 
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
ถ้าหากเราตั้งค่าข้างต้นใน crontab ของ root จะมีผลทำให้ folder ที่ถูกสร้างโดย Laravel command ที่ถูกรัน เป็นสิทธิ์ root ทันที

ผลกระทบ คือ เมื่อ controller พยายามเขียนไฟล์หรือสร้าง folder ภายใน folder ดังกล่าว จะเกิด Permission Denied ขึ้น ซึ่งอาจจะทำให้หน้าเว็บไม่สามารถใช้งานได้เลย

วิธีการป้องกัน คือ ให้ใส่ cron entry โดยกำหนด username ที่รันเป็น user ที่ใช้รัน web server ดังนี้
 
* * * * * username cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
โดยปกติแล้ว username ที่รัน PHPFPM จะเป็น www-data ดังนั้น cron entry จะเป็นดังนี้
 
* * * * * www-data cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

หมายเหตุ กรณีที่สร้าง folder ด้วยสิทธิ์ root ไปแล้ว ให้แก้ไขโดยใช้คำสั่งดังนี้
 
chown username folder_name
เช่น
 
chown www-data storages