ฉันได้รับอนุญาตหรือไม่


10

ความท้าทาย

ระบุสตริงที่ระบุสัญลักษณ์ของการอนุญาต UNIX ของไฟล์และความเป็นเจ้าของ (ID ผู้ใช้และ ID กลุ่ม) ให้ตัดสินใจว่าผู้ใช้ที่Aได้รับมีสิทธิ์ในการอ่าน / เขียน / ดำเนินการหรือไม่

ที่เกี่ยวข้อง

สิทธิ์ในระบบ UNIX

ใน UNIX, ไฟล์ทุกคนมีสามชั้นของสิทธิ์ ( ผู้ใช้ , กลุ่มและคนอื่น ๆ ) และความเป็นเจ้าของรวมทั้งผู้ใช้และกลุ่มที่มันเป็น

สัญกรณ์สัญลักษณ์ประกอบด้วยอักขระสิบตัว ตัวละครตัวแรกนั้นไม่สำคัญสำหรับความท้าทายนี้ อักขระเก้าตัวที่เหลืออยู่ในสามชุดสามอักขระซึ่งเป็นตัวแทนสิทธิ์ของผู้ใช้กลุ่มและคลาสอื่น ๆ อักขระในแต่ละชุดระบุว่าอนุญาตให้อ่าน / เขียน / ดำเนินการได้หรือไม่ หากได้รับอนุญาตก็จะเป็นr, หรือw มิฉะนั้นก็จะเป็นx-

โปรดทราบว่าsetuid , setgidและเหนียวบิตอาจมีการเปลี่ยนแปลงตัวละครในสามของแต่ละชุดเพื่อs, S, หรือt Tนี่เป็นกฎง่ายๆ: ถ้าตัวละครเป็นตัวอักษรตัวเล็กก็จะได้รับอนุญาตตั้ง; มิฉะนั้นจะไม่

(สำหรับรายละเอียดเกี่ยวกับสัญลักษณ์การอนุญาตโปรดดูที่นี่ )

ผู้ใช้ทุกคนมี ID ผู้ใช้และทุกกลุ่มมี ID กลุ่ม ID ทั้งหมดจะไม่ใช่จำนวนเต็มลบ ผู้ใช้จะอยู่ในกลุ่มอย่างน้อยหนึ่งกลุ่ม หากผู้ใช้Aต้องการเข้าถึงไฟล์ระบบจะตรวจสอบการอนุญาตดังต่อไปนี้:

  • หากไฟล์เป็นของผู้ใช้Aตรวจสอบการอนุญาตของคลาสผู้ใช้

  • หากไฟล์ไม่ได้อยู่ในกลุ่มAแต่Aเป็นของกลุ่มที่เป็นของไฟล์ให้ตรวจสอบสิทธิ์ของคลาสกลุ่ม

  • มิฉะนั้นตรวจสอบสิทธิ์ของชั้นเรียนอื่น ๆ

อย่างไรก็ตามมีข้อยกเว้นหนึ่งประการ: ถ้า ID ผู้ใช้คือ 0 (superuser) พวกเขามีสิทธิ์ในการทำอะไร !

ข้อมูลจำเพาะ

  • โปรแกรม / ฟังก์ชั่นของคุณควรใช้สิ่งเหล่านี้เป็นอินพุตในรูปแบบที่เหมาะสม:
    • สิทธิ์ในสัญกรณ์สัญลักษณ์
    • ID ผู้ใช้และรหัสกลุ่มที่ไฟล์นั้นเป็นเจ้าของ
    • ID ผู้ใช้ของAและรายการ ID กลุ่มที่Aเป็นของ
    • ประเภทของการเข้าถึง คุณสามารถใช้ค่าหนึ่งหลักหรือค่าหนึ่งอักขระที่แตกต่างกันสามค่าสำหรับการอ่านการเขียนและการดำเนินการ
  • ส่งคืน / ส่งออกค่าความจริงหากAมีสิทธิ์ในการเข้าถึงไฟล์หรือค่าเท็จหากไม่ได้รับ
  • คุณสามารถสันนิษฐานได้ว่าตัวอักษรตัวแรกของสัญกรณ์จะเป็น-(ไฟล์ปกติ) เสมอ
  • นี่คือดังนั้นจำนวนไบต์ที่สั้นที่สุดชนะ!

กรณีทดสอบ

[permissions, user ID of file, group ID of file, user ID of A, group IDs of A, type(r/w/x)]รูปแบบที่นี่คือ

[-rwx------, 13, 15, 13, [15, 24], r]: True   # user
[-rwxr-xr-x, 13, 24, 24, [15, 24], w]: False  # group 
[-rwxr-Sr-T, 13, 15, 24, [15, 35], x]: False  # group
[-rwsr-xr-t, 13, 15, 24, [24, 35], x]: True   # others
[----------, 13, 15, 0, [0, 1, 2], r]: True   # superuser
[----------, 13, 15, 1, [0, 1, 2], r]: False  # others
[----rwxrwx, 13, 15, 13, [15, 24], r]: False  # user

คำตอบ:


6

JavaScript (ES6), 61 51 50 ไบต์

รับพารามิเตอร์ที่แตกต่าง 6 ตัวเป็นอินพุตตามลำดับที่อธิบายในการท้าทาย คาดว่าพารามิเตอร์ที่ผ่านมาจะเป็น1สำหรับการอ่าน , 2สำหรับเขียนหรือ3สำหรับการดำเนินการ ผลตอบแทนหรือ01

(p,u,g,a,G,P)=>!a|p[u-a?6-3*G.includes(g)+P:P]>'Z'

กรณีทดสอบ


2

Python 2 , 76 70 67 63 59 58 56 55 52 49 48 ไบต์

lambda p,u,g,A,G,t:A*'_'<p[~(u==A)*3*(g in G)-t]

ลองออนไลน์!

ใช้พิมพ์3สำหรับอ่าน2เขียนและ1ดำเนินการ



1
ไม่จำเป็นต้องเป็น superuser เพื่อให้มี ID กลุ่ม 0 ฉันเพิ่มลงในกรณีทดสอบ
Colera Su

@ColeraSu อ่าฉันอ่านผิด ID ผู้ใช้จะเป็นลบได้ไหม?
TFeld

ทั้ง UID และ GID จะไม่เป็นลบ
Colera Su


1

Pyth, 22 21 ไบต์

|!Q}@@c3tw*nEQ-2}EEEG

ลองออนไลน์ ชุดทดสอบ

รับอินพุตเป็นหกบรรทัด:

user id
permissions
file user id
file group
user groups
permission (0 = read, 1 = write, 2 = execute)

คำอธิบาย

|!Q}@@c3tw*nEQ-2}EEEG     Implicit: read user id to Q
 !Q                       True if user id is 0, false otherwise
|                         If true, just return it
         w                Read permission string
        -                 Omit first -
      c3                  Split in 3 parts
            E             Read file user id
           n Q            See if it doesn't equal Q
                          -> False (0) if user matches, true (1) otherwise
                 E        Read file group
                  E       Read user groups
                }         -> True (1) if group matches, false (0) otherwise
              -2          Subtract from 2
                          -> 1 if group matches, 2 otherwise
          *               Multiply the two numbers
                          -> 0 if user matches, 1 if group matches, 2 otherwise
     @                    Take correct part of permission string
    @                     Take correct character of that part
   }                G     See if it is in lowercase alphabet
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.