Habe ich die erlaubnis

10

Die Herausforderung

Entscheiden Sie anhand einer Zeichenfolge, die die symbolische Notation der UNIX-Berechtigung einer Datei und deren Besitz (Benutzer-ID und Gruppen-ID) angibt, ob ein bestimmter Benutzer Adie Berechtigung zum Lesen / Schreiben / Ausführen hat.

Verwandte .

Berechtigungen im UNIX-System

Unter UNIX verfügt jede Datei über drei Berechtigungsklassen ( Benutzer , Gruppe und andere ) und Eigentümer, einschließlich des Benutzers und der Gruppe, zu der sie gehört.

Die symbolische Notation besteht aus zehn Zeichen. Der erste Charakter ist bei dieser Herausforderung nicht wichtig. Die verbleibenden neun Zeichen bestehen aus drei Sätzen mit jeweils drei Zeichen, die die Berechtigungen von Benutzer, Gruppe und anderen Klassen darstellen. Zeichen in jedem Satz geben an, ob Lesen / Schreiben / Ausführen zulässig ist. Wenn erlaubt, wird es sein r, woder x. Sonst wird es sein -.

Beachten Sie, dass setuid , setgid und Sticky - Bit kann das dritte Zeichen eines jeden Satzes ändern s, S, toder T. Hier ist eine einfache Regel: Wenn das Zeichen ein Kleinbuchstabe ist, wird die Berechtigung festgelegt. sonst ist es nicht.

(Einzelheiten zur symbolischen Notation von Berechtigungen finden Sie hier .)

Jeder Benutzer hat seine Benutzer-ID und jede Gruppe hat ihre Gruppen-ID. Alle IDs sind nicht negative Ganzzahlen. Ein Benutzer gehört mindestens einer Gruppe an. Wenn ein Benutzer AZugriff auf eine Datei erhalten möchte, überprüft das System seine Berechtigungen wie folgt:

  • Wenn die Datei dem Benutzer gehört A, überprüfen Sie die Berechtigungen der Benutzerklasse .

  • Wenn die Datei nicht , gehören tut A, sondern Agehört zu der Gruppe , die die Datei gehört, überprüfen Sie die Berechtigungen der Gruppe Klasse.

  • Überprüfen Sie andernfalls die Berechtigungen anderer Klassen.

Es gibt jedoch eine Ausnahme: Wenn die Benutzer-ID 0 (Superuser) ist, haben sie die Berechtigung, etwas zu tun !

Spezifikationen

  • Ihr Programm / Ihre Funktion sollte diese als Eingabe in einem angemessenen Format verwenden:
    • Berechtigungen in symbolischer Notation .
    • Benutzer-ID und Gruppen-ID, zu der die Datei gehört.
    • Die Benutzer-ID von Aund eine Liste der Gruppen-IDs, die dazu Agehören.
    • Art des Zugriffs. Sie können drei verschiedene einstellige oder einstellige Werte zum Lesen, Schreiben und Ausführen verwenden.
  • Geben Sie einen Wahrheitswert zurück / geben Sie ihn aus, wenn Sie berechtigt sind A, auf die Datei zuzugreifen, oder einen Falschwert, wenn nicht.
  • Sie können davon ausgehen, dass das erste Zeichen der Notation immer -(reguläre Datei) ist.
  • Dies ist , also gewinnt das kürzeste Byte!

Testfälle

Das Format hier ist [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
quelle

Antworten:

6

JavaScript (ES6), 61 51 50 Byte

Nimmt 6 verschiedene Parameter als Eingabe in der in der Herausforderung beschriebenen Reihenfolge. Erwartet , dass der letzte Parameter zu sein 1für Lese- , 2für Schreib- oder 3für ausführen . Rückgabe 0oder 1.

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

Testfälle

Arnauld
quelle
2

Python 2 , 76 70 67 63 59 58 56 55 52 49 48 Bytes

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

Probieren Sie es online aus!

Nimmt Typ wie 3zum Lesen, 2zum Schreiben und 1zum Ausführen

TFeld
quelle
68 Bytes
Mr. Xcoder
1
Es ist nicht erforderlich, Superuser zu sein, um die Gruppen-ID 0 zu haben. Ich habe sie den Testfällen hinzugefügt.
Colera Su
@ColeraSu Ah, ich habe falsch verstanden, kann die Benutzer-ID negativ sein?
TFeld
Sowohl UID als auch GID sind nicht negativ.
Colera Su
1

Pyth, 22 21 Bytes

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

Probieren Sie es online aus. Testsuite.

Nimmt die Eingabe als sechs Zeilen entgegen:

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

Erläuterung

|!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
quelle