Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: ghostmw am 29.05.15 - 10:59:44

Titel: Ermitteln der "sichtbaren" Dokumente für beliebige Benutzer
Beitrag von: ghostmw am 29.05.15 - 10:59:44
Hi,

folgende Aufgabenstellung bereitet uns Kopfzerbrechen.

Ich habe eine Ansicht voller Dokumente ( ca. 100.000! ), in den Dokumente enthalten sind Leser-/Autorenfelder.

Nun soll ein Agent, der vom Web aufgerufen wird, ermitteln, welche Dokumente der Benutzer XYZ alles in Notes sehen kann und die Ergebnisse gefiltert zurückgeben.
Das ganze passiert ohne Webanmeldung des Users mit seinen Notes-Credentials!

Der Agent ist mit der Server-ID unterzeichnet, ist in LotusScript verfasst und auf einem Dominoserver >= Version 8.5x am Laufen.

Hat jemand noch eine Idee dazu?

Marco
Titel: Re: Ermitteln der "sichtbaren" Dokumente für beliebige Benutzer
Beitrag von: Driri am 29.05.15 - 11:04:30
D.h. der Anwender ruft als Anonymous den Agent auf ?
Titel: Re: Ermitteln der "sichtbaren" Dokumente für beliebige Benutzer
Beitrag von: ghostmw am 29.05.15 - 11:08:25
Yep, das meinte ich damit, sorry, wenn's nicht klar genug war.

Das ganze ist gekapselt in eine externe Anwendung, die die ganzen Parameter (Internetadresse des aktuellen Windows AD-Users und Suchparameter) übergibt.



Titel: Re: Ermitteln der "sichtbaren" Dokumente für beliebige Benutzer
Beitrag von: Driri am 29.05.15 - 11:29:16
Mir will da leider nichts sinnvolles zu einfallen, außer den Notes-User zu ermitteln und durch alle Dokumente zu laufen und gegen die Autoren-/Leserfelder zu vergleichen. Das geht dann aber nur gut, wenn da wirklich Usernamen drin stehen und nicht etwa Rollen und/oder Gruppen.

Für eine saubere Filterung bräuchtest Du IMO eine Session mit Authentifizierung des Users.
Titel: Re: Ermitteln der "sichtbaren" Dokumente für beliebige Benutzer
Beitrag von: ghostmw am 29.05.15 - 12:04:21
Danke ...

das war auch mein allerletzter Ausweg, es stehen Gruppen und Rollen mit drin in der L/A-Feldern - leider.

Da geht dann die Performance ordentlich in die Knie, und die Abfrage dauert dann hal 2-3 min, bis Ergebnisse kommen.

Ich hab auch schon getallReadEntries und getAllUnreadEntries probiert, in der Hoffnung, da man hier den Usernamen angeben kann, dass er die Sachen filtert.
Aber leider Fehleranzeige, in Summe sind es alle Dokumente :-(

Trotzdem vielen Dank, vielleicht fällt uns oder den anderen noch was ein?

Marco
Titel: Re: Ermitteln der "sichtbaren" Dokumente für beliebige Benutzer
Beitrag von: Tode am 01.06.15 - 08:46:29
Nun: Du könntest Dir eine "@UserNamesList"- Funktion bauen, um alle Gruppen zu bekommen, in denen der Benutzer drin ist. Dann über NotesDatabase.QueryAccessRoles( username ) die Rollen des Users ermitteln, und dann über NotesDatabase.Search( {DeineLeserFelder : DeineAutorenFelder *= UserGruppen : UserRollen} ) die Dokumente finden.

Search ist relativ schnell, und die Gruppenmitgliedschaften kannst Du zur Not ja irgendwo cachen, falls das ermitteln zu lange dauert...

EDIT: Wegen UserNamesList: Unter Umständen hilft Dir der GroupManager (http://www.ibm.com/developerworks/lotus/library/ls-groups/) weiter. Ich habe den grade beim Googeln über diese Stackexchange- Seite (http://stackoverflow.com/questions/10010740/determine-all-groups-for-a-defined-user) gefunden.
Titel: Re: Ermitteln der "sichtbaren" Dokumente für beliebige Benutzer
Beitrag von: Sven Hasselbach am 01.06.15 - 15:47:00
Mit einem OSGi-Servlet könntes Du den Request im Context eines beliebeigen Users laufen lassen.
Beispielcode findest Du hier:
https://github.com/hasselbach/domino-stateless-token-servlet/blob/master/src/ch/hasselba/servlet/DominoStatelessTokenServlet.java (https://github.com/hasselbach/domino-stateless-token-servlet/blob/master/src/ch/hasselba/servlet/DominoStatelessTokenServlet.java)

Der entscheidende Part ist in der Methode createUserSession.
Titel: Re: Ermitteln der "sichtbaren" Dokumente für beliebige Benutzer
Beitrag von: ghostmw am 01.06.15 - 16:20:50
Vielen Dank an alle und dickes Dankeschön an Torsten.

Das war der entscheidende Hinweis. Die GroupManager-Klasse brachte den entscheidenen Hinweis und damit den Erfolg.

Einmal das NAB (names.nsf) des Servers laden lassen, dann alle gecacheden Gruppen durchlaufen, die neue Funktion hasMember (ist noch zu schreiben) prüfen und los gehts mit dem Auflisten der Gruppen, wo der User enthalten ist.

Code
	Dim groupMan As New NotesGroupManager(True)

	.... ' weitere Deklarationen

	Set db = session.Currentdatabase     
	
	Set dbNAB = session.getDatabase ( db.Server , "names.nsf" )
	
Call groupMan.LoadAddressBook(dbNAB)
	
strNotesUserName = "CN=Hugo Test/OU=xy/O=z"

' den Notesname im CN-Format und alle seine Rollen auf der aktuellen DB im Array hinterlegen
varGroups = FullTrim ( ArrayAppend ( Split ( strNotesUserName, Chr$(1) ), db.QueryAccessRoles(strNotesUserName) ) )
			
Call groupMan.LoadAllGroups()

	ForAll varGroup In groupman.CachedGroups()
		Set group = varGroup
		If Not group Is Nothing Then
			Select Case group.Type
			Case "0", "2" :     ' nur Multi-Purpose und ACL only-Gruppen benutzen
				If group.hasMember ( strNotesUsername ) Then varGroups = ArrayAppend ( varGroups, group.Name ) 					
			End Select
		End If
	End ForAll

	' in varGroups sind nun alle Gruppen drin, zusammen mit dem CN-Format des Notesnamens und aller Rollen auf der aktuellen DB, damit kann man gegen die Autoren- und Leserfelder prüfen.

Die Methode hasMember benutzt die Eigenschaft AllMembers, um der übergebenen Notesnamen (canonisches Format CN=...) im Array zu suchen und den Erfolg/Misserfolg zurückzuliefern.

Das Problem ist erfolgreich in LotusScript gelöst und sehr performant.

Marco