Das Notes Forum

Domino 9 und frühere Versionen => ND7: Entwicklung => Thema gestartet von: jo@chim am 21.02.08 - 14:07:35

Titel: Edit-Rechte auf Dokument per LS überprüfen
Beitrag von: jo@chim am 21.02.08 - 14:07:35
Ich möchte per Lotus Script die Bearbeitungrechte auf ein Backup-Dokument überprüfen.

Das könnte ich natürlich über einen Vergleich der verschiedenen Autorenfelder mit dem aktuellen Benutzer und seinen Roles (was sich aber recht aufwändig gestalten würde) oder per workspace.editdocument - ich will das Dokument aber überhaupt nicht öffnen, sondern lediglich die Rechte prüfen und dann ein Antwortdokument zuordnen, falls diese ausreichend sind.

Etwas in der Art
Code
if doc.IsEditable = true
wäre also bärfäggd für mich.

Any hints?
Titel: Re: Edit-Rechte auf Dokument per LS überprüfen
Beitrag von: klaussal am 21.02.08 - 14:15:41
Du möchtest vielleicht @useraccess lesen ?

Und evtl. @userroles.
Titel: Re: Edit-Rechte auf Dokument per LS überprüfen
Beitrag von: diali am 21.02.08 - 14:29:31
schau Dir mal QueryAccess, QueryAccessPrivileges und QueryAccessRoles in der Klasse NotesDatabase an.
Titel: Re: Edit-Rechte auf Dokument per LS überprüfen
Beitrag von: jo@chim am 21.02.08 - 14:36:44
Danke an Euch beide für die schnelle Re... aber mir gehts nicht um die Benutzerrechte auf die DB allgemein - das ist soweit schon klar - sondern um eine schnelle Möglichkeit, zu überprüfen, ob ein gegebener Benutzer auf ein gegebenes NotesDocument Edit-Rechte hat, ohne das Dokument im Frontend zu öffnen...
Titel: Re: Edit-Rechte auf Dokument per LS überprüfen
Beitrag von: diali am 21.02.08 - 14:39:20
über die DB-Rechte und den Inhalten in den Autorenfeldern hast Du was Du brauchst.
Titel: Re: Edit-Rechte auf Dokument per LS überprüfen
Beitrag von: koehlerbv am 21.02.08 - 14:40:48
Dafür gibt es in der Tat keine Property (was ja schön wäre ...).

Vorschlag: Bilde eine Liste Deiner Autorenfelder
Autoren := Autoren1 : Autoren2 usw.

Vergleiche diese dann mit mit @UserNamesList:
Autoren *= @UserNamesList

Das ganze natürlich via der Evaluate-Function von LS.

HTH,
Bernhard
Titel: Re: Edit-Rechte auf Dokument per LS überprüfen
Beitrag von: botschi am 21.02.08 - 14:42:10
Eine Liste aller Rollen, Gruppen, User erstellen, die in den Autorenfeldern des entsprechenden Doks sind und dann z.B. mit Evaluate und @isMember oder @contains einen entsprechenden Rückgabewert bekommen.

Zu spät...  O0

Matthias
Titel: Re: Edit-Rechte auf Dokument per LS überprüfen
Beitrag von: jo@chim am 21.02.08 - 15:09:18
Dafür gibt es in der Tat keine Property (was ja schön wäre ...)
Das hatte ich befürchtet  ::)

Das ganze natürlich via der Evaluate-Function von LS.

An dem "natürlich" bin ich natürlich wieder hängengeblieben...  aber nach 8 Jahren LN hab ichs inzwischen auch begriffen, dass da manches schneller mit geht  :)

Mal sehn, vielleicht finde ich die Zeit, gelegentlich eine ordentliche LS-Funktion in der Art UserEditRight(doc) as boolean zu programmieren:

Über die Ermittlung aller User-Rollen und einen Schleifendurchlauf durch die Autorenfelder des Dokuments müsste das ja mit vertretbarem Aufwand zu realiseren sein...

thX@all
Titel: Re: Edit-Rechte auf Dokument per LS überprüfen
Beitrag von: koehlerbv am 21.02.08 - 15:18:20
Solch ein Verfahren wäre aber um einiges inperformanter als ein

Autoren1 : Autoren2 : Autoren3 *= @UserNamesList.

Bernhard
Titel: Re: Edit-Rechte auf Dokument per LS überprüfen
Beitrag von: jo@chim am 21.02.08 - 15:58:35
Sicher richtig. Aber wenn ich eine Funktion schreibe, will ich doch, dass sie für alle Arten von Dokumenten brauchbar ist, nicht nur für eine festgelegte Anzahl Autorenfelder mit festgelegten Bezeichnungen...
Titel: Re: Edit-Rechte auf Dokument per LS überprüfen
Beitrag von: koehlerbv am 21.02.08 - 16:04:20
Auch wahr  ;)

Dann kannst Du die Verfahren kombinieren: Die Autorenfelder ermitteln und dann mit Evaluate und *= @UserNamesList verarbeiten.

Bernhard
Titel: Re: Edit-Rechte auf Dokument per LS überprüfen
Beitrag von: jo@chim am 21.02.08 - 16:40:32
Et voilà:

Code
Function userEditRights(doc As NotesDocument) As Boolean
	Forall item In doc.Items
		If item.IsAuthors=True Then
			userlookup=Evaluate(|@contains(@usernameslist;@explode("|+item.text+|";"; "))|)
			If userlookup(0)=1 Then 	userEditRights=True
		End If
	End Forall	
End Function
Ganz nackich noch die Funktion, ohne Errorhandling und Behandlung übergeordneter Benutzerrechte (Editor, Manager...) - aber funktioniert.

Danke für den Hinweis mit dem @usernames - da wär ich bei meiner LS-Fixierung wieder nicht draufgekommen :-)
Titel: Re: Edit-Rechte auf Dokument per LS überprüfen
Beitrag von: koehlerbv am 21.02.08 - 16:55:14
Feine Rückmeldung. Danke, Achim.

Drei Vorschläge:
- Option Declare einschalten und Dim userlookup As Variant
- Ordnung und Sauberkeit im Schlachthof: Der Code beginnt (nach dem Deklarationen) mit userEditRights = False
- Kleiner Performance-Kicker:
If Abs (userlookup(0)) = True Then
    userEditRights = True
    Exit Function     'What the hell we should check without any sense more items ...
End If

Bernhard
Titel: Re: Edit-Rechte auf Dokument per LS überprüfen
Beitrag von: jo@chim am 22.02.08 - 10:16:48
OK, also so (inkl. der Prüfung, ob weitergehende Rechte vorliegen):

Code
Function userEditRights(doc As NotesDocument) As Boolean	
	Dim session As New NotesSession
	Dim db As NotesDatabase
	Dim level As Integer
	Dim userlookup As Variant	
	userEditRights=False	
	'Prüfung auf Editor-, Designer-, Managerrechte...
	Set db = session.CurrentDatabase
	level = db.QueryAccess(session.UserName )
	If level>3 Then
		userEditRights=True
		Exit Function
	End If	
	'Prüfung auf Autorenrechte...	
	Forall item In doc.Items
		If item.IsAuthors=True Then
			userlookup=Evaluate(|@contains(@usernameslist;@explode("|+item.text+|";"; "))|)
			If userlookup(0)=1 Then
				userEditRights=True
				Exit Function
			End If
		End If
	End Forall	
End Function

Hat das eine besondere Bewandnis damit, dass Du das userlookup mittels ABS umwandelst? Erscheint mir auf den ersten Blick nicht notwendig...
Titel: Re: Edit-Rechte auf Dokument per LS überprüfen
Beitrag von: koehlerbv am 22.02.08 - 10:18:51
Hat das eine besondere Bewandnis damit, dass Du das userlookup mittels ABS umwandelst? Erscheint mir auf den ersten Blick nicht notwendig...

Ja - dann kann ich mit True arbeiten. Liest sich besser und ist damit wartungsfreundlicher.

Bernhard
Titel: Re: Edit-Rechte auf Dokument per LS überprüfen
Beitrag von: jo@chim am 22.02.08 - 14:19:28
Hm. Also ok, durchaus möglich, dass das dadurch übersichtlicher wird für den einen oder anderen...  ;)

Noch ne Ergänzung am Schluss, für Dokumente, die überhaupt keine definierten Autorenfelder besitzen:

Code
Function userEditRights(doc As NotesDocument) As Boolean	
	Dim session As New NotesSession
	Dim db As NotesDatabase
	Dim userlookup As Variant	
	
	userEditRights=False	
	'Prüfung auf Editor-, Designer-, Managerrechte...
	Set db = session.CurrentDatabase
	level% = db.QueryAccess(session.UserName )
	If level%>3 Then
		userEditRights=True
		Exit Function
	End If	
	'Prüfung der Autorenfelder auf Autorenrechte...
	Forall item In doc.Items
		If item.IsAuthors=True Then
			userlookup=Evaluate(|@contains(@usernameslist;@explode("|+item.text+|";"; "))|)
			If userlookup(0)=1 Then
				userEditRights=True
				Exit Function
			End If
		End If
	End Forall	
	'Prüfung auf Autorenrechte, falls keine Autorenfelder vorhanden sind...
	userlookup=Evaluate(|@contains(@usernameslist;@author)|)
	If userlookup(0)=1 Then
		userEditRights=True
	End If
End Function

Da leistet die @author-Formelfunktion gute Dienste...

Welche Fehlerroutine(n) würden wir denn benötigen?
Titel: Re: Edit-Rechte auf Dokument per LS überprüfen
Beitrag von: jo@chim am 25.02.08 - 09:51:06
Nachtrag - es wird natürlich eine Prüfung benötigt, ob Autorenfelder vorhanden sind, sonst wird @author in jedem Falle herangezogen. Also hier korrigiert:

Function userEditRights(doc As NotesDocument) As Boolean   
   Dim session As New NotesSession
   Dim db As NotesDatabase
   Dim userlookup As Variant   
   
   userEditRights=False   
   'Prüfung auf Editor-, Designer-, Managerrechte...
   Set db = session.CurrentDatabase
   level% = db.QueryAccess(session.UserName )
   If level%>3 Then
      userEditRights=True
      Exit Function
   End If   
   'Prüfung der Autorenfelder auf Autorenrechte...
i%=0
   Forall item In doc.Items
      If item.IsAuthors=True Then
i%=1
         userlookup=Evaluate(|@contains(@usernameslist;@explode("|+item.text+|";"; "))|)
         If userlookup(0)=1 Then
            userEditRights=True
            Exit Function
         End If
      End If
   End Forall   
   'Prüfung auf Autorenrechte, falls keine Autorenfelder vorhanden sind...
if i%=0 then
userlookup=Evaluate(|@contains(@usernameslist;@author)|)
   If userlookup(0)=1 Then
      userEditRights=True
   End If
end if
End Function
Titel: Re: Edit-Rechte auf Dokument per LS überprüfen
Beitrag von: LN4ever am 25.02.08 - 20:46:56
Jetzt fehlt nur noch die Prüfung, ob es sich um ein öffentliches Dokument handelt und der Benutzer laut ACL öffentliche Dokumente schreiben darf.

Gruß

Norbert
Titel: Re: Edit-Rechte auf Dokument per LS überprüfen
Beitrag von: jo@chim am 26.02.08 - 09:51:55
Nun gut Norbert :) Inklusive Prüfung, ob es sich um ein öffentliches Dokument handelt und IsCurrentAccessPublicWriter-Abfrage:
Code
Function userEditRights(doc As NotesDocument) As Boolean	
	Dim session As New NotesSession
	Dim db As NotesDatabase
	Dim userlookup As Variant	
	
	userEditRights=False	
	Set db = session.CurrentDatabase
	
	level% = db.QueryAccess(session.UserName )
	If level%>3 Then
		userEditRights=True
		Exit Function
	End If	
	
	i=0
	Forall item In doc.Items
		If item.IsAuthors=True Then
			i=1
			userlookup=Evaluate(|@contains(@usernameslist;@explode("|+item.text+|";"; "))|)
			If userlookup(0)=1 Then
				userEditRights=True
				Exit Function
			End If
		End If
	End Forall	
	
	If i=0 Then
		userlookup=Evaluate(|@contains(@usernameslist;@author)|)
		If userlookup(0)=1 Then
			userEditRights=True
		End If
		If doc.~$PublicAccess="1" Then
			If Not db.IsCurrentAccessPublicWriter Then
				userEditRights=False
			Else
				userEditRights=True
			End If
		End If
	End If
End Function
Titel: Re: Edit-Rechte auf Dokument per LS überprüfen
Beitrag von: jo@chim am 26.02.08 - 09:57:19
Ähem, P.S.: und wer jetzt kommt und sagt "die PublicAccess-Prüfung könnte man schon zu Beginn setzen, dann würden 0,01333ms eingespart", dem antworte ich "du hast Recht Bernd"  ;D