Domino 9 und frühere Versionen > ND6: Entwicklung

ACL manipulieren

(1/2) > >>

Helge Jantzen:
Hallo,

ich hab eine Datenbank in der ich Personendokumente angelegt habe. Wann immer ein Dokument angelegt oder geändert wird wird der entsprechende Eintrag auch in der ACL angelegt oder geändert, so zumindest wenn man Manager der Datenbank ist. User die solche Personendokumente anlegen dürfen sind aber keine Manager der DB und sollen es auch nicht werden. Wie kann ich diesen Usern ermöglichen die ACL trotzdem zu ändern? Ich hab da mal was gelesen, das bestimmte Aktionen mit der ServerID ausgeführt werden, oder sowas in der Art. Hat einer ne Ahnung wie das genau war und kann mir da ein paar Hinweise geben?

Außerdem sollen User, deren Personendokumente gelöscht wurden natürlich auch aus der ACL verschwinden, ich hab da das Postdocumentdelete event im Datenbankscript ins Auge gefasst, kann das was geben oder bin ich auf dem Holzweg?

Deutschland wird Weltmeister!!   :D

Danke und Gruß
Helge

Lossa:
Hallo,

ich würde das so lösen:

1. User erstell ein Personendokument in der DB
2. Ein zyklischer, oder Ereignissgesteuerter Agent läuft auf dem Server unter der berechtigung des Servers oder eines Admins
3. Es muss ja dazu ein enstprechendes Dokument im names.nsf oder via Directory Assitance angebundenen Adressbuch ein Userdokument geben, dieses wird von dem Agent erstellt und der User wird in eine Gruppe eingetragen, diese Gruppe ist berechtigt auf die DB zuzugreifen.

gossifu:
Hallo,

schreibe einen Agenten der die ACL oder die Gruppe mit den Werten aus dem Dokument minipuliert.
Dann schreibst Du in Postsave des Dokuments den Agentenaufruf

Dim s as New NotesSession
Dim db as NotesDatabase
dim ag as Notesagent
'Das SourceDocument hast Du ja

Set db = s.CurrentDatabase
Set ag = db.GetAgent("Dein Agent")
Call ag.RunOnServer(Source.Document.NoteID)'Damit übergibst Du das Personendokument an den Agenten

Im Agent holst Du Dir dieses so:

Dim s as New NotesSession
Dim db as NotesDatabase
dim ag as Notesagent
Dim doc as NotesDocument

Set db = s.CurrentDatabase
Set ag = s.CurrentAgent
Set doc = db.GetDocumentByID(ag.ParameterDocID)

doc ist das Personendokument, aus dem Du den Namen auslesen kannst, der in die ACL oder wie mein Vorredner meint in die Gruppe der names.nsf (auch 'ne gute Idee).

Wichjtig, der Agent sollte mit der Server-ID signiert sein.

mfg

Kjeld

Helge Jantzen:
Danke, das war sehr hilfreich.

@Lossa: Ich hab mich am Anfang der Entwicklung der DB gegen Usergruppen im Adressbuch entschieden und auch wenn ich im Moment nicht mehr so ganz sicher bin warum möchte ich dabei bleiben. Ist ja auch eigentlich nicht das Problem die ACL zu manipileren.

@Kjeld: Hab ich alles so gemacht, hab leider noch nen Fehler drin.

Ich hab mal den Code angehängt vielleicht sieht einer von euch warum die folgende Meldung kommt.

---------------------------
Lotus Notes
---------------------------
Notes error: Im Hintergrund ausgeführter oder eingebetteter Agent verwendet einen nicht unterstützten Auslöser und Suchtyp
---------------------------
OK   
---------------------------

Hier mal der Code des Agenten:

Sub Initialize
   Dim s As New NotesSession
   Dim db As NotesDatabase
   Dim ag As Notesagent
   Dim doc As NotesDocument
   Dim acl As NotesACL
   Dim entry As NotesACLEntry
   
   Set db = s.CurrentDatabase
   Set ag = s.CurrentAgent
   Set doc = db.GetDocumentByID(ag.ParameterDocID)
   Set acl = db.ACL
   
   Call db.GrantAccess( doc.GetItemValue("Pruefer_Name"),  ACLLEVEL_EDITOR)
   Set entry = acl.GetEntry( doc.GetItemValue("Pruefer_Name") )
   Call entry.DisableRole("QMB")
   Call entry.DisableRole("QUM-Koordinator")
   Call entry.DisableRole("QM-Bearbeiter")
   If Not (entry Is Nothing) Then
      entry.UserType = ACLTYPE_PERSON
      Call entry.EnableRole( doc.GetItemValue("Pruefer_Typ") )
      If ((doc.GetItemValue("Pruefer_Typ") = "QMB")) Then
         entry.CanDeleteDocuments=True
      End If
      Call acl.Save()
   End If
End Sub

Axel:
Eventuell liegt es daran, dass du für den Zugriff auf die ACL-Einträge Variant-Typen und keine Strings verwendest.

Ändere mal den Code wie folgt ab:

Sub Initialize
   Dim s As New NotesSession
   Dim db As NotesDatabase
   Dim ag As Notesagent
   Dim doc As NotesDocument
   Dim acl As NotesACL
   Dim entry As NotesACLEntry
   
   Set db = s.CurrentDatabase
   Set ag = s.CurrentAgent
   Set doc = db.GetDocumentByID(ag.ParameterDocID)
   Set acl = db.ACL
   
   Call db.GrantAccess( doc.Pruefer_Name(0),  ACLLEVEL_EDITOR)
   Set entry = acl.GetEntry( doc.Pruefer_Name(0) )
   Call entry.DisableRole("QMB")
   Call entry.DisableRole("QUM-Koordinator")
   Call entry.DisableRole("QM-Bearbeiter")
   If Not (entry Is Nothing) Then
      entry.UserType = ACLTYPE_PERSON
      Call entry.EnableRole( doc.Pruefer_Typ(0) )
      If doc.Pruefer_Typ(0) = "QMB" Then
         entry.CanDeleteDocuments=True
      End If
      Call acl.Save()
   End If
End Sub

Außerdem muss der Unterzeichner des Agenten auch die entsprechenden Rechte haben in der ACL Änderungen vorzunehmen.

Axel

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln