Czy mam pozwolenie?

10

Wyzwanie

Biorąc pod uwagę ciąg znaków wskazujący symboliczną notację uprawnień UNIX do pliku i jego własności (identyfikator użytkownika i identyfikator grupy), zdecyduj, czy dany użytkownik Ama uprawnienia do odczytu / zapisu / wykonania.

Związane .

Uprawnienia w systemie UNIX

W systemie UNIX każdy plik ma trzy klasy uprawnień ( użytkownik , grupa i inne ) oraz własność, w tym do którego użytkownika i do której grupy należy.

Zapis symboliczny składa się z dziesięciu znaków. Pierwsza postać nie jest ważna w tym wyzwaniu. Pozostałe dziewięć znaków składa się z trzech zestawów trzech znaków, reprezentujących uprawnienia klasy użytkownika, grupy i innych. Znaki w każdym zestawie wskazują, czy odczyt / zapis / wykonywanie jest dozwolone. Jeśli jest to dozwolone, to będzie r, walbo x. W przeciwnym razie będzie -.

Zauważ, że setuid , setgid i lepki bit może zmienić trzecią charakter każdego zestawu do s, S, tlub T. Oto prosta zasada: jeśli znak jest małymi literami, to uprawnienie jest ustawione; w przeciwnym razie tak nie jest.

(Szczegółowe informacje na temat symbolicznego zapisu uprawnień znajdują się tutaj .)

Każdy użytkownik ma swój identyfikator użytkownika, a każda grupa ma swój identyfikator grupy. Wszystkie identyfikatory będą liczbami całkowitymi nieujemnymi. Użytkownik będzie należeć do co najmniej jednej grupy. Jeśli użytkownik Achce uzyskać dostęp do pliku, system sprawdzi swoje uprawnienia w następujący sposób:

  • Jeśli plik należy do użytkownika A, sprawdź uprawnienia klasy użytkownika .

  • Jeśli plik nie należy A, ale Anależy do grupy, do której należy plik, sprawdź uprawnienia klasy grupy .

  • W przeciwnym razie sprawdź uprawnienia innych klas.

Jest jednak jeden wyjątek: jeśli ID użytkownika to 0 (superużytkownik), mają uprawnienia do robienia czegokolwiek !

Dane techniczne

  • Twój program / funkcja powinna przyjąć je jako dane wejściowe w dowolnym rozsądnym formacie:
    • Uprawnienia w notacji symbolicznej .
    • Identyfikator użytkownika i identyfikator grupy, do której należy plik.
    • Identyfikator użytkownika Aoraz lista identyfikatorów grup, do których Anależy.
    • Rodzaj dostępu Możesz użyć dowolnych trzech różnych jednocyfrowych lub jednoznakowych wartości do odczytu, zapisu i wykonania.
  • Zwraca / wyświetla prawdziwą wartość, jeśli Ama uprawnienia dostępu do pliku, lub wartość fałszowania, jeśli nie.
  • Możesz założyć, że pierwszym znakiem notacji będzie zawsze -(zwykły plik).
  • To jest , więc wygrywa najkrótsza bajt!

Przypadki testowe

Format jest tutaj [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
Colera Su
źródło

Odpowiedzi:

6

JavaScript (ES6), 61 51 50 bajtów

Pobiera 6 różnych parametrów jako dane wejściowe, w kolejności opisanej w wyzwaniu. Oczekuje, że ostatni parametr będzie 1do odczytu , 2do zapisu lub 3do wykonania . Zwraca 0lub 1.

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

Przypadki testowe

Arnauld
źródło
2

Python 2 , 76 70 67 63 59 58 56 55 52 49 48 bajtów

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

Wypróbuj online!

Pobiera typ jak 3do odczytu, 2do zapisu i 1do wykonania

TFeld
źródło
68 bajtów
Mr. Xcoder
1
Nie trzeba być superużytkownikiem, aby mieć grupę o identyfikatorze 0. Dodałem ją do przypadków testowych.
Colera Su
@ColeraSu Ah, źle przeczytałem, czy identyfikator użytkownika może być negatywny?
TFeld
Zarówno UID, jak i GID będą nieujemne.
Colera Su
1

Java (OpenJDK 8) , 60 bajtów

(p,u,g,U,G,t)->U<1|p.charAt(t+(u==U?0:G.contains(g)?3:6))>90

Wypróbuj online!

Mapowanie typu jest następujące: 1oznacza r, 2oznacza wi 3oznacza x.

Olivier Grégoire
źródło
1

Pyth, 22 21 bajtów

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

Wypróbuj online. Zestaw testowy.

Pobiera dane wejściowe jako sześć wierszy:

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

Wyjaśnienie

|!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
PurkkaKoodari
źródło