Чи маю я дозвіл?


10

Змагання

Враховуючи рядок, що вказує на символічне позначення дозволу UNIX на файл та його право власності (ідентифікатор користувача та ідентифікатор групи), вирішіть, чи має даний користувач Aдозвіл на читання / запис / виконання його.

Пов'язані .

Дозволи в системі UNIX

У UNIX кожен файл має три класи дозволів ( користувач , група та інші ) та права власності, включаючи, до якого користувача та до якої групи він належить.

Символічна нотація складається з десяти символів. Перший персонаж не важливий у цьому виклику. Решта дев'ять символів у трьох наборах з трьох символів, що представляють дозволи користувачів, груп та інших класів. Символи в кожному наборі вказують, чи дозволено читання / запис / виконання. Якщо це дозволено, це буде r, wабо x. Інакше так і буде -.

Зверніть увагу , що УИП , setgid і липкі біт може змінити третій символ кожного набору на s, S, tабо T. Ось просте правило: якщо символ є малою літерою, то встановлюється дозвіл; інакше це не так.

(Детальну інформацію про символьні позначення дозволів див. Тут .)

Кожен користувач має свій ідентифікатор користувача, і кожна група має свій ідентифікатор групи. Усі ідентифікатори будуть невід’ємними цілими числами. Користувач буде належати щонайменше до однієї групи. Якщо користувач Aхоче отримати доступ до файлу, система перевірятиме їх дозволи наступним чином:

  • Якщо файл належить користувачеві A, перевірте дозволи користувача класу.

  • Якщо файл не належить A, але Aналежить до групи, до якої належить файл, перевірте дозволи групового класу.

  • В іншому випадку перевірте дозволи інших класів.

Однак є один виняток: якщо ідентифікатор користувача дорівнює 0 (суперпользователь), вони мають дозвіл робити що- небудь !

Технічні умови

  • Ваша програма / функція повинна сприймати їх як вхід у будь-якому розумному форматі:
    • Дозволи в символічній нотації .
    • Ідентифікатор користувача та ідентифікатор групи, до якої належить файл.
    • Ідентифікатор користувача Aта список ідентифікаторів групи, до яких 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для виконання . Повертається 0або 1.

(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
Не обов’язково бути суперпользователем, щоб мати групу ID 0. Я додав його до тестових випадків.
Colera Su

@ColeraSu Ах, я неправильно прочитав, чи може ідентифікатор користувача бути негативним?
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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.