Domino 9 und frühere Versionen > Entwicklung

Mit Script herausfinden, ob jemand Löschrechte hat

<< < (2/2)

koehlerbv:

--- Zitat von: Glombi am 22.07.05 - 22:29:29 ---Leider geht ein @UserAccess mit Evaluate nicht.

--- Ende Zitat ---

Hallo Andreas,

dazu braucht es ja auch kein Evaluate, dafür gibt es ja NotesDatabase.CurrentAccessLevel.  :)

Aber das Probem löst das naürlich ebenso wie @UserAccess in keinster Weise, und die ACL "direkt" auszuwerten, wie viel zu oft (nicht von Dir ! Das ist mir klar !) ist Schwachfug.

Ich sehe - in Unkenntnis des Kontextes, den Du jetzt hast, zwei Möglichkeiten:
Brauchst Du eine globale Aussage: Folge Axel's Vorschlag und schreibe Dir eine Prozedur oder Klasse, die prinzipiell an Hand der @UserNamesList die wirklich effektiven Rechte ausliest.
Steht es im Kontext eines bestimmten Vorgangs: Entsprechendes Errorhandling mit erforderlicher Reaktion statt sturer Notes-Fehlermeldung (ggf. verschärft durch "herkömmliches" ErrorHandling  ;))

Bernhard

PS: Wäre das nicht was für die BestPractices-Sektion ? Da wäre ich sofort dabei !

Glombi:
Danke für Eure Inputs.

Folgendes möchte ich programmieren: Im QueryDocumentDelete der Datenbank abfragen, ob ein User Löschrechte hat. Falls nicht, soll eine aussagekräftige Meldung kommen.

In Formelsprache alles kein Problem:
_Access:=@UserAccess(@Subset(@DbName;1) : @Subset(@DbName;-1));
@If(
      @Subset(@Subset(_Access ;3);-1) = "0";
             @Return(@Prompt([Ok];"Hinweis";"Bitte klicken Sie die Schaltfläche <Stornieren>, um Ihre Dokumente zu entfernen. Sie sind nicht autorisiert in dieser Anwendung zu löschen!"));
@True)

In Script liefert mir aber
To get: level% = notesDatabase.CurrentAccessLevel
Legal values
ACLLEVEL_NOACCESS (0)
ACLLEVEL_DEPOSITOR (1)
ACLLEVEL_READER (2)
ACLLEVEL_AUTHOR (3)
ACLLEVEL_EDITOR (4)
ACLLEVEL_DESIGNER (5)
ACLLEVEL_MANAGER (6)

nur die Zugriffsrechte zurück.

Daher habe ich nun das Event in Formelsprache programmiert, was ich eigentlich vermeiden wollte.

Der Ansatz von Axel ist ein gangbarer Weg - Danke für Deine Mühe!
Wenn ich Zeit habe, werde ich es angehen und dann auch in den BP posten.
Die Klasse muss dann natürlich alles zurückliefern, also
[CREATEDOCUMENTS]
[DELETEDOCUMENTS]
[CREATEPERSONALAGENTS]
[CREATEPERSONALFOLDERSANDVIEWS]
[CREATELOTUSSCRIPTJAVAAGENTS]
[CREATESHAREDFOLDERSANDVIEWS]
[READPUBLICDOCUMENTS]
[WRITEPUBLICDOCUMENTS]
[REPLICATEORCOPYDOCUMENTS]

Andreas

flaite:

--- Zitat von: Glombi am 23.07.05 - 09:06:10 ---
[CREATEDOCUMENTS]
[DELETEDOCUMENTS]
[CREATEPERSONALAGENTS]
[CREATEPERSONALFOLDERSANDVIEWS]
[CREATELOTUSSCRIPTJAVAAGENTS]
[CREATESHAREDFOLDERSANDVIEWS]
[READPUBLICDOCUMENTS]
[WRITEPUBLICDOCUMENTS]
[REPLICATEORCOPYDOCUMENTS]

--- Ende Zitat ---

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:

--- Code: ---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.

--- Ende Code ---

2. Möglichkeit wäre stateless:

--- Code: ---RightsUser rightsUser = new RightsUser(NotesDatabase db)

rightsUser.hasCreateDocuments(userNamesList()) ' als array.

--- Ende Code ---
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.

--- Code: ---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


--- Ende Code ---

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

Glombi:
Es gibt seit Notes 6.5 eine neue Property:

QueryAccessPrivileges method

Returns the privileges of a person, group, or server in a database.
This method is new with Release 6.5.

privileges& = notesDatabase.QueryAccessPrivileges( name$ )

Parameters
name$
String. The name of the person, group, or server. For a hierarchical name, the full name must be specified but can be in abbreviated format.
Return value

privileges&
Long constant. The current access privileges, a combination of the following:
DBACL_CREATE_DOCUMENTS (1)
DBACL_DELETE_DOCUMENTS (2)
DBACL_CREATE_PRIV_AGENTS (4)
DBACL_CREATE_PRIV_FOLDERS_VIEWS (8)
DBACL_CREATE_SHARED_FOLDERS_VIEWS (16)
DBACL_CREATE_SCRIPT_AGENTS (32)
DBACL_READ_PUBLIC_DOCUMENTS (64)
DBACL_WRITE_PUBLIC_DOCUMENTS (128)
DBACL_REPLICATE_COPY_DOCUMENTS (256)
Individual privileges can be discerned through bitwise operations.

Usage
If the name you specify is listed explicitly in the ACL, then QueryAccessPrivileges returns the privileges for that ACL entry and does not check groups.
If the name you specify is not listed explicitly in the ACL, QueryAccessPrivileges checks to see if the name is a member of a group in the primary address book where the program is running: on a workstation the Personal Address Book; on a server the Domino Directory.

Andreas

Navigation

[0] Themen-Index

[*] Vorherige Sete

Zur normalen Ansicht wechseln