Übergeordnete Funktion: Iteriere durch den UserNamesList Array.
1. Funktion: Suche in der SkriptACL Klasse nach dem gleichnamigen Entry und schaue ob er Löschrechte hat.
'pseudocode: Eigenschaften und Methoden frei erfunden von mir -> zu faul.
'client
Forall x in @UserNamesList
aclEntryDeleter = false
if (isACLEntryDeleter(x) then
aclEntryDeleter = true
exit forall
end if
end forall
---------------------
function isACLEntryDeleter (name As String) As Integer
dim entryFound as Integer
entryFound = false
forall x in ACL.Entries (oder wie immer das heisst)
if x.name = name then
entryFound = true
exit forall
endif
end forall
if entryFound then
isACLEntryDeleter = x.CanDeleteDocuments
else
print "ERROR: Entry " + name + " not found in ACL"
isACLEntryDeleter = false
end if
end function
[CREATEDOCUMENTS]
[DELETEDOCUMENTS]
[CREATEPERSONALAGENTS]
[CREATEPERSONALFOLDERSANDVIEWS]
[CREATELOTUSSCRIPTJAVAAGENTS]
[CREATESHAREDFOLDERSANDVIEWS]
[READPUBLICDOCUMENTS]
[WRITEPUBLICDOCUMENTS]
[REPLICATEORCOPYDOCUMENTS]
Hab grad was gelesen, dass eventuell darauf passt.
Wie soll man diese ganzen Rechte schnell abrufbar im Objekt haben?
Ich gehe davon aus, dass in einer ersten Phase die Rechte des Users aufgebaut werden. Und dann später abgerufen werden.
ClientCode wäre dann:
RightsUser rightsUser = new RightsUser(NotesDatabase db)
call rightsUser.init (UserNamesList[]) ' als Array ' ginge auch im Konstruktor, aber ich mag nicht, wenn zuviel Operationen durch den Constructor initiiert werden.
' das Objekt hält den state aller Berechtigungen dieses Users
....
' und später:
rightsUser.hasCreateDocuments ' gibt boolean-int zurück.
2. Möglichkeit wäre stateless:
RightsUser rightsUser = new RightsUser(NotesDatabase db)
rightsUser.hasCreateDocuments(userNamesList()) ' als array.
Bei 1. (statefull) wäre die 2., 3., 4., etc. Abfrage der hasThisRight-Methode sehr schnell, bei 2. (stateless) langsamer.
Eine Möglichkeit die statefull Lösung zu implementieren wäre, dass jedem dieser Rechte eine Primzahl zugeordnet wird und dann daraus ein Wert errechnet wird.
z.B.
if (ACLEntry.hasRight(CreateDocuments) AND (allRightsLong MOD 2 = valAllRights / 2) then
allRightsLong = allRightsLong * 2
end if
if (ACLEntry.hasRight(DeleteDocuments) AND (allRightsLong MOD 3 = valAllRights / 3) then
allRightsLong = allRightsLong * 3
end if
if (ACLEntry.hasRight(CREATEPERSONALAGENTS) AND (allRightsLong MOD 5 = valAllRights / 5) then
allRightsLong = allRightsLong * 5
end if
Jedem dieser Rechte ist eine Primzahl zugeordnet. Wenn später beider Abfrage gilt:
(allRightsLong MOD 2 = AllRightsLong / 2) dann wurde später dieses Recht in allRightsLong reingeschrieben. Der 2. Ausdruck hinter dem AND während des Ermittelns der Rechte ist nur dafür da um Rechte nicht doppelt in allRightsLong zu schreiben.
Solange man für jedes Recht eine Primzahl nimmt, geht das.
Auf etwas ähnliches (mit bitmask) wird hier verwiesen. http://jaredtech.blogspot.com/2005/07/how-integer-masked-permission-works.html
Weiss nicht, ob das mit LotusScript geht.
Gruß Axel