Autor Thema: Ermitteln der "sichtbaren" Dokumente für beliebige Benutzer  (Gelesen 3886 mal)

Offline ghostmw

  • Aktives Mitglied
  • ***
  • Beiträge: 201
  • Geschlecht: Männlich
    • BELOS - Raum+Ressourcenmanagement unter Lotus Notes
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
« Letzte Änderung: 01.06.15 - 16:21:51 von ghostmw »
Grüße
Marco Weller
Lotus Domino / Lotus Notes seit 1996 (ab 4.5x)

Driri

  • Gast
Re: Ermitteln der "sichtbaren" Dokumente für beliebige Benutzer
« Antwort #1 am: 29.05.15 - 11:04:30 »
D.h. der Anwender ruft als Anonymous den Agent auf ?

Offline ghostmw

  • Aktives Mitglied
  • ***
  • Beiträge: 201
  • Geschlecht: Männlich
    • BELOS - Raum+Ressourcenmanagement unter Lotus Notes
Re: Ermitteln der "sichtbaren" Dokumente für beliebige Benutzer
« Antwort #2 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.



« Letzte Änderung: 29.05.15 - 11:10:27 von ghostmw »
Grüße
Marco Weller
Lotus Domino / Lotus Notes seit 1996 (ab 4.5x)

Driri

  • Gast
Re: Ermitteln der "sichtbaren" Dokumente für beliebige Benutzer
« Antwort #3 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.

Offline ghostmw

  • Aktives Mitglied
  • ***
  • Beiträge: 201
  • Geschlecht: Männlich
    • BELOS - Raum+Ressourcenmanagement unter Lotus Notes
Re: Ermitteln der "sichtbaren" Dokumente für beliebige Benutzer
« Antwort #4 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
Grüße
Marco Weller
Lotus Domino / Lotus Notes seit 1996 (ab 4.5x)

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.883
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Re: Ermitteln der "sichtbaren" Dokumente für beliebige Benutzer
« Antwort #5 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 weiter. Ich habe den grade beim Googeln über diese Stackexchange- Seite gefunden.
« Letzte Änderung: 01.06.15 - 08:50:47 von Tode »
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Offline Sven Hasselbach

  • Senior Mitglied
  • ****
  • Beiträge: 316
  • Geschlecht: Männlich
    • blog@hasselba.ch
Re: Ermitteln der "sichtbaren" Dokumente für beliebige Benutzer
« Antwort #6 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

Der entscheidende Part ist in der Methode createUserSession.

Offline ghostmw

  • Aktives Mitglied
  • ***
  • Beiträge: 201
  • Geschlecht: Männlich
    • BELOS - Raum+Ressourcenmanagement unter Lotus Notes
Re: Ermitteln der "sichtbaren" Dokumente für beliebige Benutzer
« Antwort #7 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
Grüße
Marco Weller
Lotus Domino / Lotus Notes seit 1996 (ab 4.5x)

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz