Tôi có được phép không?


10

Các thách thức

Đưa ra một chuỗi biểu thị ký hiệu tượng trưng cho phép UNIX của một tệp và quyền sở hữu của nó (ID người dùng và ID nhóm), quyết định xem một người dùng nhất định Acó quyền đọc / ghi / thực thi nó hay không.

Liên quan .

Quyền trong hệ thống UNIX

Trong UNIX, mọi tệp đều có ba loại quyền ( người dùng , nhómnhững người khác ) và quyền sở hữu, bao gồm người dùng và nhóm nào thuộc về nó.

Ký hiệu tượng trưng bao gồm mười ký tự. Nhân vật đầu tiên không quan trọng trong thử thách này. Chín ký tự còn lại nằm trong ba bộ ba ký tự, thể hiện quyền của người dùng, nhóm và các lớp khác. Các ký tự trong mỗi bộ cho biết việc đọc / viết / thực thi có được phép hay không. Nếu được phép, nó sẽ r, whoặc x. Nếu không, nó sẽ được -.

Lưu ý rằng setuid , setgiddính chút có thể thay đổi nhân vật thứ ba của mỗi bộ để s, S, thoặc T. Đây là một quy tắc đơn giản: nếu ký tự là chữ thường, thì quyền được đặt; mặt khác, nó không phải là.

(Để biết chi tiết về ký hiệu tượng trưng của quyền, vui lòng tham khảo tại đây .)

Mọi người dùng đều có ID người dùng và mỗi nhóm đều có ID nhóm. Tất cả các ID sẽ là số nguyên không âm. Một người dùng sẽ thuộc về ít nhất một nhóm. Nếu người dùng Amuốn có quyền truy cập vào một tệp, hệ thống sẽ kiểm tra các quyền của họ như sau:

  • Nếu tệp thuộc về người dùng A, hãy kiểm tra quyền của lớp người dùng .

  • Nếu tệp không thuộc về A, nhưng Athuộc về nhóm mà tệp thuộc về, hãy kiểm tra quyền của lớp nhóm .

  • Nếu không, kiểm tra quyền của lớp người khác .

Tuy nhiên, có một ngoại lệ: nếu ID người dùng bằng 0 (siêu người dùng), họ có quyền làm bất cứ điều gì !

Thông số kỹ thuật

  • Chương trình / chức năng của bạn nên lấy những thứ này làm đầu vào ở bất kỳ định dạng hợp lý nào:
    • Quyền trong ký hiệu tượng trưng .
    • ID người dùng và ID nhóm mà tệp thuộc về.
    • ID người dùng Avà danh sách ID nhóm Athuộc về.
    • Loại truy cập. Bạn có thể sử dụng bất kỳ ba giá trị một chữ số hoặc một ký tự khác nhau để đọc, viết và thực thi.
  • Trả về / xuất giá trị trung thực nếu Acó quyền truy cập tệp hoặc giá trị giả nếu không.
  • Bạn có thể giả sử rằng ký tự đầu tiên của ký hiệu sẽ luôn là -(tệp thông thường).
  • Đây là , do đó, byte ngắn nhất sẽ thắng!

Các trường hợp thử nghiệm

Các định dạng ở đây là [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

Câu trả lời:


6

JavaScript (ES6), 61 51 50 byte

Có 6 tham số riêng biệt làm đầu vào, theo thứ tự được mô tả trong thử thách. Hy vọng các tham số cuối cùng là 1cho đọc , 2cho ghi hoặc 3cho thực hiện . Trả về 0hoặc 1.

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

Các trường hợp thử nghiệm


2

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

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

Hãy thử trực tuyến!

Lấy kiểu như 3để đọc, 2viết và 1thực thi



1
Không cần thiết phải là siêu người dùng để có ID nhóm 0. Tôi đã thêm nó vào các trường hợp thử nghiệm.
Colera Su

@ColeraSu Ah tôi đọc sai, id người dùng có thể âm không?
TFeld

Cả UID và GID sẽ không âm.
Colera Su


1

Pyth, 22 21 byte

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

Hãy thử trực tuyến. Bộ thử nghiệm.

Có đầu vào là sáu dòng:

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

Giải trình

|!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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.