Eu tenho permissão?

10

O desafio

Dada uma sequência que indica a notação simbólica da permissão UNIX de um arquivo e sua propriedade (ID do usuário e ID do grupo), decida se um determinado usuário Atem permissão para lê-lo / gravá-lo / executá-lo.

Relacionado .

Permissões no sistema UNIX

No UNIX, cada arquivo possui três classes de permissões ( usuário , grupo e outras ) e propriedade, incluindo a qual usuário e a qual grupo pertence.

A notação simbólica consiste em dez caracteres. O primeiro personagem não é importante nesse desafio. Os nove caracteres restantes estão em três conjuntos de três caracteres, representando permissões de usuário, grupo e outras classes. Os caracteres em cada conjunto indicam se a leitura / gravação / execução é permitida. Se permitido, será r, wou x. Caso contrário, será -.

Note-se que setuid , setgid e sticky bit pode mudar o terceiro carácter de cada conjunto para s, S, tou T. Aqui está uma regra simples: se o caractere estiver em letra minúscula, a permissão será definida; caso contrário, não é.

(Para os detalhes da notação simbólica de permissões, consulte aqui .)

Todo usuário tem seu ID de usuário e todo grupo tem seu ID de grupo. Todos os IDs serão números inteiros não negativos. Um usuário pertencerá a pelo menos um grupo. Se um usuário Aquiser obter acesso a um arquivo, o sistema verificará suas permissões da seguinte maneira:

  • Se o arquivo pertencer ao usuário A, verifique as permissões da classe de usuário .

  • Se o arquivo não pertence A, mas Apertence ao grupo ao qual ele pertence, verifique as permissões da classe do grupo .

  • Caso contrário, verifique as permissões de outras classes.

No entanto, há uma exceção: se o ID do usuário for 0 (superusuário), eles terão permissão para fazer qualquer coisa !

Especificações

  • Seu programa / função deve aceitá-los como entrada em qualquer formato razoável:
    • Permissões em notação simbólica .
    • ID do usuário e ID do grupo ao qual o arquivo pertence.
    • O ID do usuário Ae uma lista de IDs de grupo aos quais Apertence.
    • Tipo de acesso. Você pode usar três valores diferentes de um dígito ou um caractere para leitura, gravação e execução.
  • Retorna / Agera um valor verdadeiro, se tiver permissão para acessar o arquivo, ou um valor falso, se não tiver.
  • Você pode assumir que o primeiro caractere da notação será sempre -(arquivo regular).
  • Isso é , então o menor em bytes vence!

Casos de teste

O formato aqui é [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
fonte

Respostas:

6

JavaScript (ES6), 61 51 50 bytes

Toma 6 parâmetros distintos como entrada, na ordem descrita no desafio. Espera que o último parâmetro a ser 1de leitura , 2para escrita ou 3para executar . Retorna 0ou 1.

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

Casos de teste

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

Experimente online!

Assume o tipo 3de leitura, 2gravação e 1execução

TFeld
fonte
68 bytes
Sr. Xcoder 29/11
11
Não é necessário ser superusuário para ter o ID de grupo 0. Eu o adicionei aos casos de teste.
Colera Su
@ColeraSu Ah, eu li errado, o ID do usuário pode ser negativo?
TFeld
O UID e o GID não serão 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

Experimente online!

O mapeamento para o tipo é o seguinte: 1meios r, 2meios we 3meios x.

Olivier Grégoire
fonte
1

Pitão, 22 21 bytes

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

Experimente online. Suíte de teste.

Aceita entrada como seis linhas:

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

Explicação

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