2003-01-28 08:49:49 -05:00
|
|
|
;;; This file is part of the Scheme Untergrund Library.
|
|
|
|
|
|
|
|
;;; Copyright (c) 2002-2003 by Martin Gasbichler.
|
|
|
|
;;; For copyright information, see the file COPYING which comes with
|
|
|
|
;;; the distribution.
|
|
|
|
|
|
|
|
(define-enumerated-type afs-permission :afs-permission
|
|
|
|
afs-permission?
|
|
|
|
the-afs-permissions
|
|
|
|
afs-permission-name
|
|
|
|
afs-permission-index
|
|
|
|
(read
|
|
|
|
list
|
|
|
|
insert
|
|
|
|
delete
|
|
|
|
write
|
|
|
|
lock
|
|
|
|
administer))
|
|
|
|
|
|
|
|
(define-enum-set-type afs-permissions :afs-permissions
|
|
|
|
afs-permissions?
|
|
|
|
make-afs-permissions
|
|
|
|
afs-permission afs-permission? the-afs-permissions afs-permission-index)
|
|
|
|
|
|
|
|
(define (char->afs-permission c)
|
|
|
|
(case c
|
|
|
|
((#\r) (afs-permission read))
|
|
|
|
((#\l) (afs-permission list))
|
|
|
|
((#\i) (afs-permission insert))
|
|
|
|
((#\d) (afs-permission delete))
|
|
|
|
((#\w) (afs-permission write))
|
|
|
|
((#\k) (afs-permission lock))
|
|
|
|
((#\a) (afs-permission administer))
|
|
|
|
(else (error "wrong char in char->afs-permission" c))))
|
|
|
|
|
|
|
|
(define (afs-permission->char afs-perm)
|
|
|
|
(cond ((eq? afs-perm (afs-permission read)) #\r)
|
|
|
|
((eq? afs-perm (afs-permission list)) #\l)
|
|
|
|
((eq? afs-perm (afs-permission insert)) #\i)
|
|
|
|
((eq? afs-perm (afs-permission delete)) #\d)
|
|
|
|
((eq? afs-perm (afs-permission write)) #\w)
|
|
|
|
((eq? afs-perm (afs-permission lock)) #\k)
|
|
|
|
((eq? afs-perm (afs-permission administer)) #\a)
|
|
|
|
(else (error "unknown permission" afs-perm))))
|
|
|
|
|
|
|
|
(define (string->afs-permissions s)
|
|
|
|
(string-fold (lambda (e accu)
|
|
|
|
(enum-set-union accu (make-afs-permissions (list (char->afs-permission e)))))
|
|
|
|
(make-afs-permissions '())
|
|
|
|
s))
|
|
|
|
|
|
|
|
(define (afs-permissions->string afs-perms)
|
2003-02-22 02:51:44 -05:00
|
|
|
(if (null? (enum-set->list afs-perms))
|
|
|
|
"none"
|
|
|
|
(fold (lambda (perm s)
|
|
|
|
(if (enum-set-member? afs-perms perm)
|
|
|
|
(string-append s (string (afs-permission->char perm)))
|
|
|
|
s))
|
|
|
|
""
|
|
|
|
(vector->list the-afs-permissions))))
|
|
|
|
|
2003-01-28 08:49:49 -05:00
|
|
|
(define all-afs-permissions
|
|
|
|
(make-afs-permissions (map char->afs-permission (string->list "rlidwka"))))
|
|
|
|
|
2003-02-12 04:38:03 -05:00
|
|
|
(define (afs-permissions<=? p1 p2)
|
|
|
|
(enum-set=? (enum-set-union p1 p2) p2))
|
|
|
|
|
2003-01-28 08:49:49 -05:00
|
|
|
;; access control lists: lists of pairs of user name and
|
|
|
|
;; afs-permissions
|
|
|
|
|
|
|
|
(define (get-acl dir)
|
|
|
|
(let* ((output (run/strings (,fs la ,dir))))
|
|
|
|
(map (lambda (s)
|
|
|
|
(apply (lambda (user al)
|
|
|
|
(cons user (string->afs-permissions al)))
|
|
|
|
((field-splitter) s)))
|
|
|
|
(cddr output)))) ; TODO add sanity check
|
|
|
|
|
|
|
|
(define (acl-users acl)
|
|
|
|
(map car acl))
|
|
|
|
|
|
|
|
(define (acl->strings acl)
|
|
|
|
(apply append
|
|
|
|
(map (lambda (user.afs-perms)
|
|
|
|
(list (car user.afs-perms)
|
|
|
|
(afs-permissions->string (cdr user.afs-perms))))
|
|
|
|
acl)))
|
|
|
|
|
|
|
|
(define (arla-set-access-control-list-for-user! dir user afs-perms)
|
|
|
|
(run (,fs sa ,dir ,user ,(afs-permissions->string afs-perms))))
|
|
|
|
|
|
|
|
(define (arla-set-access-control-list! dir acl)
|
|
|
|
(for-each (lambda (user.afs-perms)
|
|
|
|
(arla-set-access-control-list-for-user! dir (car user.afs-perms) (cdr user.afs-perms)))
|
|
|
|
acl))
|
|
|
|
|
|
|
|
(define (set-acl! dir acl)
|
|
|
|
(run (,fs setacl ,dir -acl ,@(acl->strings acl) -clear)))
|
|
|
|
|
|
|
|
(define (add-acl! dir acl)
|
|
|
|
(run (,fs setacl ,dir -acl ,@(acl->strings acl))))
|
|
|
|
|
|
|
|
(define fs "fs")
|
|
|
|
|
|
|
|
(define (set-fs-command! the-fs)
|
|
|
|
(set! fs the-fs))
|