Autor Thema: Mit Script herausfinden, ob jemand Löschrechte hat  (Gelesen 2535 mal)

Glombi

  • Gast
Wie kann man mit Script herausfinden, ob jemand Löschrechte hat. Irgendwie gibts da keine Methode, oder?

Leider geht ein @UserAccess mit Evaluate nicht.

ie ACL möchte ich nicht abfragen, denn der User steht nicht unbedingt namentlich drin.

Andreas
« Letzte Änderung: 06.10.05 - 09:53:01 von Glombi »

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Mit Script herausfinden, ob jemand Löschrechte hat
« Antwort #1 am: 22.07.05 - 22:56:11 »
NotesACLEntry.CanDeleteDocuments.
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Glombi

  • Gast
Re: Mit Script herausfinden, ob jemand Löschrechte hat
« Antwort #2 am: 22.07.05 - 22:58:02 »
Ja klar, aber wie komme ich an den ACLEntry, wenn der User gar nicht in der ACL steht (wegen Gruppen, Wildcard, -Default-).

Andreas

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Mit Script herausfinden, ob jemand Löschrechte hat
« Antwort #3 am: 22.07.05 - 23:04:51 »
Irgendwo *muss* das ja in der ACL stehen.
wenn ich mich recht erinnere gibt es seit R5 eine Formel, mit der man eine Liste aller Gruppen, Wildcards, etc. bekommt, denen der User angehört. @UserNamesList.
Sofern du diese Liste hast, kannst du die ACL durchsuchen und pro gefundenen Entry überprüfen, ob der Eintrag autorisiert ist zu löschen.
Aus meiner Sicht sollte das so gehen.
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Mit Script herausfinden, ob jemand Löschrechte hat
« Antwort #4 am: 22.07.05 - 23:09:56 »
Ü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.


Code
'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
« Letzte Änderung: 22.07.05 - 23:26:25 von kennwort »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Mit Script herausfinden, ob jemand Löschrechte hat
« Antwort #5 am: 23.07.05 - 01:38:20 »
Leider geht ein @UserAccess mit Evaluate nicht.

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

  • Gast
Re: Mit Script herausfinden, ob jemand Löschrechte hat
« Antwort #6 am: 23.07.05 - 09:06:10 »
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
« Letzte Änderung: 23.07.05 - 09:08:02 von Glombi »

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Mit Script herausfinden, ob jemand Löschrechte hat
« Antwort #7 am: 24.07.05 - 21:09:53 »

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

2. Möglichkeit wäre stateless:
Code
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.
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 


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
« Letzte Änderung: 24.07.05 - 21:22:39 von kennwort »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Glombi

  • Gast
Re: Mit Script herausfinden, ob jemand Löschrechte hat
« Antwort #8 am: 06.10.05 - 09:52:32 »
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

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz