Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: inu am 06.01.11 - 18:16:00

Titel: C-API: Prüfen, ob ACL-Einträge (Gruppen, Personen) im Adressbuch vorhanden sind
Beitrag von: inu am 06.01.11 - 18:16:00
Hallo Leute,

gibt es eine Möglichkeit, mittels C-API die ACL einer DB auszulesen und zu prüfen, ob die gefundenen  Einträge überhaupt greifen würden - sprich: sind ACL-Einträge (Gruppen, Server, Personen) im Adressbuch hinterlegt?

Wie prüft Domino/Notes eigentlich eine ACL? Wird da auf Vorhandensein eines Eintrages in einer bestimmte Ansicht in der names.nsf verglichen?

Viele Grüße
Titel: Re: C-API: Prüfen, ob ACL-Einträge (Gruppen, Personen) im Adressbuch vorhanden sind
Beitrag von: koehlerbv am 06.01.11 - 18:19:44
Wieso willst Du das mit C-API machen? Dazu reichen doch wenige Zeilen in LotusScript (ACLEntries durchgehen und in der DD-View "($Users)" gegenprüfen).

Bernhard
Titel: Re: C-API: Prüfen, ob ACL-Einträge (Gruppen, Personen) im Adressbuch vorhanden sind
Beitrag von: inu am 07.01.11 - 06:57:33
... weil es in einem Servertask integriert werden muss.

($Users) reicht bestimmt nicht. Irgendwie muss ich ja auch Gruppen und Server gegenprüfen.

Hast Du eine Idee?

Viele Grüße
Titel: Re: C-API: Prüfen, ob ACL-Einträge (Gruppen, Personen) im Adressbuch vorhanden sind
Beitrag von: eknori am 07.01.11 - 07:03:57
#include <acl.h>

STATUS LNPUBLIC ACLLookupAccess(
   DHANDLE  hACL,
   NAMES_LIST far *pNamesList,
   WORD far *retAccessLevel,
   ACL_PRIVILEGES far *retPrivileges,
   WORD far *retAccessFlags,
   DHANDLE far *rethPrivNames);

ist hier wohl das Richtige
Titel: Re: C-API: Prüfen, ob ACL-Einträge (Gruppen, Personen) im Adressbuch vorhanden sind
Beitrag von: koehlerbv am 07.01.11 - 09:31:04
In ($Users) stehen auch die Gruppen. Für die Server brauchst Du dann noch ($Servers), David (oder eine andere vorhandene Ansicht, die ggf. für Dich besser passt).

Bernhard
Titel: Re: C-API: Prüfen, ob ACL-Einträge (Gruppen, Personen) im Adressbuch vorhanden sind
Beitrag von: inu am 07.01.11 - 15:33:13
@eknori: Diese Funktion klingt recht interessant. Es scheint aber keinen Rückgabewert für den Fall zu geben, dass der ACL-Eintrag nicht geprüft werden kann (Eintrag nicht in der names.nsf vorhanden). Ich muss die Funktion erst testen, aber ich vermute, dass bei einem ACL-Eintrag, der nicht gegen die names.nsf geprüft werden kann, lediglich "ACL_LEVEL_NOACCESS"  als retAccessLevel zurück gibt.

Gruß
David
Titel: Re: C-API: Prüfen, ob ACL-Einträge (Gruppen, Personen) im Adressbuch vorhanden sind
Beitrag von: eknori am 07.01.11 - 17:46:59
Da kannst du Recht haben.
Dann musst du halt den harten Weg gehen, und die Lotusscript Funktionen nachbilden.

Hier ien Codefragment aus einem meiner Addins

Code
	/* Get the note id of the view we want. */
	if (error = NIFFindView (dbhNames, "($VIMGroups)", &view_id))
	{
		NSFDbClose (dbhNames);
		AddInLogMessageText("View not found: ($VIMGroups)...", ERR(error));
        return (ERR(error));
	}
	
	/* Get a collection of notes using this view. */
	if (error = NIFOpenCollection(
		dbhNames,		/* handle of db with view */
		dbhNames,		/* handle of db with data */
		view_id,        /* note id of the view */
		0,              /* collection open flags */
		NULLHANDLE,     /* handle to unread ID list (input and return) */
		&coll_handle,   /* collection handle (return) */
		NULLHANDLE,     /* handle to open view note (return) */
		NULL,           /* universal note id of view (return) */
		NULLHANDLE,     /* handle to collapsed list (return) */
		NULLHANDLE))    /* handle to selected list (return) */
	{
		NSFDbClose (dbhNames);
		return (ERR(error));
	}
	
	/* Look for notes that have the given primary sort key (which must be of
	type text). We get back a COLECTIONPOSITION structure describing where the 
	first such note is in the collection, and a count of how many such notes 
	there are. Check the return code for "not found" versus a real error. */
	error = NIFFindByName (
		coll_handle,			/* collection to look in */
		szGrpName,				/* string to match on */
		FIND_CASE_INSENSITIVE,	/* match rules */
		&coll_pos,				/* where match begins (return) */
		&match_size);			/* how many match (return) */
	
	
	if (ERR(error) == ERR_NOT_FOUND) 
	{ 
		NIFCloseCollection (coll_handle);
		/* The group is not in the Domino Directory. Create a new one */

Du kannst uch ohne die Views suchen . Hier ein Beispiel mit der CPP API

Code
		/* 	first argument represents the configuration database; 
				Let's try to open the db */
				LNString DatabasePathCatchAllDB; 
				DatabasePathCatchAllDB = argv[1];
				s.GetDatabase( DatabasePathCatchAllDB, &workDB, s.GetUserName());
				workDB.Open(); 
				
				/* Find setup document*/
				LNSearchOptions	o;
				o.SetNoteType (LNNOTETYPE_DOCUMENT);
				o.SetBeginDate ("01/01/2005");
				o.SetEndDate (s.GetCurrentDatetime());
				workDB.Search ("Form=\"Setup\"", &col, &o);
				
				LNDocument setupDoc = col[0];
				setupDoc.Open();
				
				LNText mboxes;  /* get name of mailboxes, if multiple */
				if (setupDoc.HasItem ("mailboxes"))
				{ /* does item exist ? */
					setupDoc.GetItem("mailboxes", &mboxes);
				}