Apakah saya punya izin?

10

Tantangan

Diberikan string yang menunjukkan notasi simbolis izin UNIX file dan kepemilikannya (ID pengguna dan ID grup), memutuskan apakah pengguna yang diberikan Amemiliki izin untuk membaca / menulis / menjalankannya.

Terkait .

Izin dalam sistem UNIX

Di UNIX, setiap file memiliki tiga kelas izin ( pengguna , grup , dan lainnya ) dan kepemilikan, termasuk pengguna mana dan grup mana yang dimilikinya.

Notasi simbolik terdiri dari sepuluh karakter. Karakter pertama tidak penting dalam tantangan ini. Sembilan karakter tersisa dalam tiga set tiga karakter, mewakili izin pengguna, grup, dan kelas lainnya. Karakter di setiap set menunjukkan apakah membaca / menulis / mengeksekusi diizinkan. Jika diizinkan, itu akan menjadi r, watau x. Kalau tidak, itu akan terjadi -.

Perhatikan bahwa setuid , setgid dan lengket bit dapat mengubah karakter ketiga dari setiap set untuk s, S, tatau T. Ini aturan sederhana: jika karakter huruf kecil, maka izin ditetapkan; kalau tidak, tidak.

(Untuk perincian notasi simbolis izin, silakan lihat di sini .)

Setiap pengguna memiliki ID pengguna, dan setiap grup memiliki ID grupnya. Semua ID akan berupa bilangan bulat non-negatif. Seorang pengguna akan menjadi anggota setidaknya satu grup. Jika pengguna Aingin mendapatkan akses ke file, sistem akan memeriksa izinnya sebagai berikut:

  • Jika file tersebut milik pengguna A, periksa izin kelas pengguna .

  • Jika file tersebut bukan milik A, tetapi Amilik grup yang menjadi milik file tersebut, periksa izin kelas grup .

  • Kalau tidak, periksa izin kelas lain .

Namun, ada satu pengecualian: jika ID pengguna adalah 0 (pengguna super), mereka memiliki izin untuk melakukan apa saja !

Spesifikasi

  • Program / fungsi Anda harus mengambil ini sebagai input dalam format apa pun yang masuk akal:
    • Izin dalam notasi simbolis .
    • ID pengguna dan ID grup yang menjadi milik file tersebut.
    • ID pengguna A, dan daftar ID grup yang Amenjadi milik.
    • Jenis akses. Anda dapat menggunakan tiga nilai satu digit atau satu karakter yang berbeda untuk membaca, menulis, dan mengeksekusi.
  • Kembalikan / hasilkan nilai yang benar jika Amemiliki izin untuk mengakses file, atau nilai yang salah jika tidak.
  • Anda dapat mengasumsikan bahwa karakter pertama dari notasi akan selalu menjadi -(file biasa).
  • Ini , jadi byte terpendek menang!

Uji Kasus

Format di sini adalah [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
sumber

Jawaban:

6

JavaScript (ES6), 61 51 50 byte

Mengambil 6 parameter berbeda sebagai input, sesuai urutan yang dijelaskan dalam tantangan. Diharapkan parameter terakhir adalah 1untuk dibaca , 2untuk penulisan atau 3untuk dieksekusi . Pengembalian 0atau 1.

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

Uji kasus

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

Cobalah online!

Mengambil tipe 3untuk membaca, 2menulis, dan 1mengeksekusi

TFeld
sumber
68 byte
Mr. Xcoder
1
Tidak perlu menjadi pengguna super untuk memiliki ID grup 0. Saya menambahkannya ke kasus uji.
Colera Su
@ ColeraSu Ah saya salah membaca, bisakah id pengguna menjadi negatif?
TFeld
Baik UID dan GID akan menjadi non-negatif.
Colera Su
1

Java (OpenJDK 8) , 60 byte

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

Cobalah online!

Pemetaan untuk jenis ini adalah sebagai berikut: 1sarana r, 2sarana wdan 3sarana x.

Olivier Grégoire
sumber
1

Pyth, 22 21 byte

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

Cobalah online. Suite uji.

Mengambil input sebagai enam baris:

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

Penjelasan

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