İznim var mı?


10

Meydan okuma

Bir dosyanın UNIX izninin sembolik gösterimini ve sahipliğini (kullanıcı kimliği ve grup kimliği) gösteren bir dize verildiğinde A, belirli bir kullanıcının dosyayı okuma / yazma / yürütme iznine sahip olup olmadığına karar verin .

İlgili .

UNIX sistemindeki izinler

UNIX'te, her dosya üç izin sınıfına ( kullanıcı , grup ve diğerleri ) ve sahipliğine, hangi kullanıcıya ve hangi gruba ait olduğunu içerir.

Sembolik gösterim on karakterden oluşur. Bu meydan okumada ilk karakter önemli değil. Kalan dokuz karakter, kullanıcı, grup ve diğer sınıfların izinlerini temsil eden üç karakterlik üç set halinde yer alır. Her gruptaki karakterler okuma / yazma / yürütmeye izin verilip verilmediğini gösterir. İzin verilirse r, wveya olur x. Aksi halde olacak -.

Bu Not setuid , setgid ve yapışkan bit için her bir grubu üçüncü karakterini değişebilir s, S, tya da T. İşte basit bir kural: karakter küçük harfse, izin ayarlanır; aksi halde değildir.

(Sembolik izin gösterimi ile ilgili ayrıntılar için lütfen buraya bakın .)

Her kullanıcının kendi kullanıcı kimliği vardır ve her grubun kendi grup kimliği vardır. Tüm kimlikler negatif olmayan tamsayılar olacaktır. Bir kullanıcı en az bir gruba ait olacaktır. Bir kullanıcı Abir dosyaya erişmek istiyorsa, sistem izinlerini aşağıdaki gibi kontrol edecektir:

  • Dosya kullanıcıya aitse A, kullanıcı sınıfı izinlerini kontrol edin .

  • Dosya ait değilse Aancak Adosyanın ait olduğu gruba aitse grup sınıfının izinlerini kontrol edin .

  • Aksi takdirde, diğer sınıfların izinlerini kontrol edin .

Ancak, bir istisna vardır: kullanıcı kimliği 0 ise (süper kullanıcı), herhangi bir şey yapma iznine sahiptirler !

Özellikler

  • Programınız / işleviniz bunları herhangi bir makul biçimde girdi olarak almalıdır:
    • Sembolik gösterimde izinler .
    • Dosyanın ait olduğu kullanıcı kimliği ve grup kimliği.
    • Ait kullanıcı kimliği Ave Aait olan grup kimliklerinin listesi .
    • Erişim türü. Okuma, yazma ve yürütme için üç farklı tek basamaklı veya tek karakterlik değeri kullanabilirsiniz.
  • Dosyaya Aerişim izni varsa doğruluk değeri veya değilse yanlış bir değer döndürme / çıktı alma .
  • Gösterimin ilk karakterinin her zaman -(normal dosya) olacağını varsayabilirsiniz .
  • Bu , yani bayt en kısa kazanır!

Test Durumları

Buradaki biçim [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

Yanıtlar:


6

JavaScript (ES6), 61 51 50 bayt

Meydan okumada açıklanan sırayla, girdi olarak 6 ayrı parametre alır. Son parametre olmasını bekler 1için okuma , 2için yazma veya 3için yürütmek . 0Veya döndürür 1.

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

Test senaryoları


2

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

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

Çevrimiçi deneyin!

Olarak türünü Alır 3, okuma 2yazma için ve 1için yürütmek



1
Grup kimliği 0'a sahip olmak için süper kullanıcı olmanıza gerek yoktur. Bunu test senaryolarına ekledim.
Colera Su

@ColeraSu Ah yanlış okudum, kullanıcı kimliği negatif olabilir mi?
TFeld

Hem UID hem de GID negatif olmayacaktır.
Colera Su


1

Pyth, 22 21 bayt

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

Çevrimiçi deneyin. Test odası.

Girişi altı satır olarak alır:

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

açıklama

|!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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.