Das mit der Verschlüsselung ist eine ganz kniffelige Sache und man muss unterscheiden zwischen Frontend und Backend-Aktion:
Ein UI-Save, bzw. Frontend-Save verschlüsselt das Dokument. Damit dies reibungslos funktioniert, muss es in der Maske das Feld "SecretEnctyptionKeys" geben.
Ein "doc.SecretencryptionKeys = ..." bzw. "FIELD SecretEncrytionKeys := ... " reicht nicht (je nach Notesversion). Das Feld muss wirklich in der Maske existieren.
Greift man anschließend im Backend per LotusScript auf das Dokument zu (Ansichtsaktion/Agent), wird es automatisch wieder entschlüsselt (sofern man einen der angegebenen Schlüssel hat). Diese (nervige) automatische Entschlüsselung kann man leider nirgends abschalten.
=> Du musst also vor jedem doc.save prüfen, ob das Dokument verschlüsselt war, automatisch entschlüsselt wurde und eine Neuverschlüsselung erforderlich ist.
if (doc.SecretEncryptionKeys(0) <> "") or (doc.PublicEncryptionKeys(0) <> "") then ' Verschlüsselung ist aktiviert
if not doc.isEncrypted then ' Das Dokument ist aber nicht verschlüsselt bzw. wurde automatisch entschlüsselt
call doc.encrypt() ' Versuchen, das Dokument wieder zu verschlüsseln
end if
end if
Nun gibt es folgenden "gemeinen" Sonderfall:
Angenommen, Person A gibt mehrere Schlüssel in SecretEncryptionKeys (z.B: SC1 + SC2) an und speichert das Dokument.
Dabei wird das Dokument mit SC1, SC2 verschlüsselt (um ganz genau zu sein wird es zusätzlich noch mit dem öffentliche Schlüssel von Person A verschlüsselt. Man kann sich also selbst nicht "aussperren")
Führt nun Person B eine LS-Aktion auf dem Dokument aus und hat nur SC1, so kann Person B das Dokument zwar entschlüsseln, aber nicht mehr verschlüsseln, da "doc.encrypt()" mit der Fehlermeldung abbricht, dass SC2 kein bekannter Schlüssel ist (dieser steht ja noch im Feld SecretEncryptionKeys)
Mit LotusScript lässt sich so ein Dokument nicht mehr ändern :-:
Die einzige Möglichkeit um bei solchen Dokumenten irgenwelche Flags zu ändern ist Formelsprache, da diese das Dokument nicht entschlüsselt. Man kann zur Not in LotusScript mit Evaluate + @SetDocField arbeiten um Werte in Dokumenten zu ändern, ohne die Verschlüsselung aufzuheben.
Gruß
Roland
Hi Roland, vielen Dank für die ausführliche Antwort. Ich habe die Verschlüsselung nun im QueryClose des Dokuments eingebaut
Dim Agent As NotesAgent
Set Agent = db.GetAgent("(EncryptThisDoc)")
If uidoc.EditMode Then
Call Agent.Run(doc.NoteID)
End If
Das ist ja echt eine riesige Schei .... Wenn ich mir überlege, an wie vielen Stellen ich in der Anwendung im BackEnd auf die Dokumente zugreife, stellt das ein echtes Problem mit der automatischen Entschlüsselung dar. Ich habe mir nun gedacht, dass ich einfach einen periodischen Server Agenten baue, der alle 5 Minuten die Verschlüsselungen wieder gerade zieht, das geht ja aber auch nicht, da dieser ja im Besitz der persönlichen Schlüssel sein muss. Also bleibt offensichtlich nichts anderes übrig, als tatsächlich alle Routinen noch einmal durchzuschauen und die Verschlüsselung zu checken und sofern erforderlich neu zu setzen. Sehr ärgerlich!!!
Gibt's vielleicht noch einen anderen Weg ursprünglich verschlüsselte Dokumente auch weiter verschlüsselt zu halten, nachdem per Skript darauf zugegriffen wurde?