У меня есть разрешение?


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
Нет необходимости быть суперпользователем, чтобы иметь идентификатор группы 0. Я добавил его в контрольные примеры.
Колера Су

@ColeraSu Ах, я неправильно понял, может ли идентификатор пользователя быть отрицательным?
TFeld

И UID, и GID будут неотрицательными.
Колера Су


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.