¿Tengo permiso?

10

El reto

Dada una cadena que indica la notación simbólica del permiso UNIX de un archivo y su propiedad (ID de usuario e ID de grupo), decida si un usuario dado Atiene permiso para leerlo / escribirlo / ejecutarlo.

Relacionados .

Permisos en el sistema UNIX

En UNIX, cada archivo tiene tres clases de permisos ( usuario , grupo y otros ) y propiedad, incluido a qué usuario y a qué grupo pertenece.

La notación simbólica consta de diez caracteres. El primer personaje no es importante en este desafío. Los nueve caracteres restantes se encuentran en tres conjuntos de tres caracteres, que representan permisos de usuario, grupo y otros. Los caracteres en cada conjunto indican si la lectura / escritura / ejecución está permitida. Si está permitido, será r, wo x. De lo contrario, lo será -.

Tenga en cuenta que setuid , setgid y sticky bit puede modificar el tercer carácter de cada conjunto a s, S, to T. Aquí hay una regla simple: si el carácter es letra minúscula, entonces se establece el permiso; de lo contrario, no lo es.

(Para obtener detalles sobre la notación simbólica de los permisos, consulte aquí ).

Cada usuario tiene su ID de usuario y cada grupo tiene su ID de grupo. Todos los ID serán enteros no negativos. Un usuario pertenecerá al menos a un grupo. Si un usuario Adesea obtener acceso a un archivo, el sistema verificará sus permisos de la siguiente manera:

  • Si el archivo pertenece al usuario A, verifique los permisos de la clase de usuario .

  • Si el archivo no pertenece A, pero Apertenece al grupo al que pertenece el archivo, verifique los permisos de la clase de grupo .

  • De lo contrario, verifique los permisos de la clase de otros .

Sin embargo, hay una excepción: si el ID de usuario es 0 (superusuario), ¡tienen permiso para hacer cualquier cosa !

Especificaciones

  • Su programa / función debe tomar estos como entrada en cualquier formato razonable:
    • Permisos en notación simbólica .
    • ID de usuario e ID de grupo al que pertenece el archivo.
    • El ID de usuario Ay una lista de ID de grupo a la que Apertenece.
    • Tipo de acceso. Puede usar tres valores diferentes de un dígito o un carácter para leer, escribir y ejecutar.
  • Devuelve / genera un valor verdadero si Atiene permiso para acceder al archivo, o un valor falso si no.
  • Puede suponer que el primer carácter de la notación siempre será -(archivo normal).
  • Este es el , por lo que gana el más corto en bytes.

Casos de prueba

El formato aquí es [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
fuente

Respuestas:

6

JavaScript (ES6), 61 51 50 bytes

Toma 6 parámetros distintos como entrada, en el orden descrito en el desafío. Espera que el último parámetro sea 1para lectura , 2para escritura o 3para ejecución . Devoluciones 0o 1.

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

Casos de prueba

Arnauld
fuente
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]

Pruébalo en línea!

Toma el tipo 3de lectura, 2escritura y 1ejecución

TFeld
fuente
68 bytes
Sr. Xcoder
1
No es necesario ser superusuario para tener el ID de grupo 0. Lo agregué a los casos de prueba.
Colera Su
@ColeraSu Ah, he leído mal, ¿puede ser negativa la identificación del usuario?
TFeld
Tanto UID como GID serán no negativos.
Colera Su
1

Java (OpenJDK 8) , 60 bytes

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

Pruébalo en línea!

La asignación para el tipo es la siguiente: 1medias r, 2medias wy 3medias x.

Olivier Grégoire
fuente
1

Pyth, 22 21 bytes

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

Pruébalo en línea. Banco de pruebas.

Toma la entrada como seis líneas:

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

Explicación

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