-
Notifications
You must be signed in to change notification settings - Fork 0
/
Ldap.c
executable file
·217 lines (132 loc) · 5.88 KB
/
Ldap.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
/*
============================================================================
Name : Ldap.c
Author : Diego Marafetti
Version : 0.1
Copyright : Your copyright notice
Description : El objetivo de este codigo es demostrar el uso de la API
que actua de wrapper sobre la API original de OpenLDAP.
============================================================================
*/
#include "LdapWrapper.h"
/**
* Esta funcion muestra como insertar una nueva entry
* con nuevos atributos y valores
*
*/
VOID insertEntry(PLDAP_SESSION session, PLDAP_SESSION_OP sessionOp, PLDAP_ENTRY_OP entryOp, PLDAP_ATTRIBUTE_OP attribOp) {
/* creo una nueva entry.
le agrego los parametros correspondientes */
PLDAP_ENTRY entry = entryOp->createEntry();
entry->dn = "utnurlID=00009,ou=so,dc=utn,dc=edu";
entryOp->addAttribute(entry, attribOp->createAttribute("objectclass", 2, "top", "utnUrl"));
entryOp->addAttribute(entry, attribOp->createAttribute("utnUrlID", 1, "00009"));
entryOp->addAttribute(entry, attribOp->createAttribute("labeledURL", 2, "labeledURL", "www.unaUrl.com"));
entryOp->addAttribute(entry, attribOp->createAttribute("utnurlTitle", 1, "Un titulo para la url"));
entryOp->addAttribute(entry, attribOp->createAttribute("utnurlDescription", 1, "Esta es la descripcion de la url esta"));
entryOp->addAttribute(entry, attribOp->createAttribute("utnurlContent", 1, "<HTML> <HEAD> <TITLE>El contenido</title> </HEAD> <B>Esto es todo</B> </HTML>"));
entryOp->addAttribute(entry, attribOp->createAttribute("utnurlKeywords", 3, "EstesUnKiwor", "Estesotro", "AcaHayUnoMAs"));
/* inserto la entry en el directorio */
sessionOp->addEntry(session, entry);
}
/**
* Se muestra como eliminar una entrada existente a partir
* de un dn conocido.
*
*/
VOID delEntry(PLDAP_SESSION session, PLDAP_SESSION_OP sessionOp, PLDAP_ENTRY_OP entryOp, PLDAP_ATTRIBUTE_OP attribOp) {
/* creo una nueva entry.
le agrego los parametros correspondientes */
PLDAP_ENTRY entry = entryOp->createEntry();
entry->dn = "utnurlID=00009,ou=so,dc=utn,dc=edu";
/* Se puede eliminar ena entry pasando un objeto
entry como parametro */
sessionOp->deleteEntryObj(session, entry);
/* O se puede eliminar una entry pasando
el dn correspondiente */
sessionOp->deleteEntryDn(session, "utnurlID=00009,ou=so,dc=utn,dc=edu");
}
/**
* Se muestra como modificar el valor de un atributo en una entry
* Es necesario conocer el dn.
*
*/
VOID modifyEntry(PLDAP_SESSION session, PLDAP_SESSION_OP sessionOp, PLDAP_ENTRY_OP entryOp, PLDAP_ATTRIBUTE_OP attribOp) {
PLDAP_ENTRY entry = entryOp->createEntry();
entry->dn = "utnurlID=00009,ou=so,dc=utn,dc=edu";
/* agrego el atributo a la entry
en modo delete */
entryOp->editAttribute(entry, attribOp->createAttribute("utnurlTitle", 1, "Pagina de Prueba para LDAP"));
sessionOp->editEntry(session, entry);
}
/**
* Se realiza una consulta al directorio en una determinada
* rama. Para iterar sobre los resultados se utiliza un
* patron Iterator que recorre cada una de las entries
*
*/
VOID selectEntries(PLDAP_SESSION session, PLDAP_SESSION_OP sessionOp, PLDAP_ENTRY_OP entryOp, PLDAP_ATTRIBUTE_OP attribOp) {
/* hago una consulta en una determinada
rama aplicando la siguiente condicion */
PLDAP_RESULT_SET resultSet = sessionOp->searchEntry(session, "ou=so,dc=utn,dc=edu", "utnurlKeywords=*");
PLDAP_ITERATOR iterator = NULL;
PLDAP_RECORD_OP recordOp = newLDAPRecordOperations();
/* itero sobre los registros obtenidos
a traves de un iterador que conoce
la implementacion del recorset */
for(iterator = resultSet->iterator; iterator->hasNext(resultSet);) {
PLDAP_RECORD record = iterator->next(resultSet);
printf("dn: %s\n", record->dn);
/* Itero sobre los campos de cada
uno de los record */
while(recordOp->hasNextField(record)) {
PLDAP_FIELD field = recordOp->nextField(record);
INT index = 0;
printf(" attribute: %s - values: %d\n", field->name, (int)field->valuesSize);
for(; index < field->valuesSize; index++) {
printf(" Value[%d]: %s\n", index, field->values[index]);
}
/* se libera la memoria utilizada
por el field si este ya no es
necesario. */
freeLDAPField(field);
}
/* libero los recursos consumidos
por el record */
freeLDAPRecord(record);
}
/* libero los recursos */
freeLDAPIterator(iterator);
freeLDAPRecordOperations(recordOp);
}
INT main(INT argc, PCHAR *argv) {
PLDAP_SESSION session;
PLDAP_CONTEXT context = newLDAPContext();
/* creo los objetos que me permiten operar sobre
un contexto y sobre una session */
PLDAP_CONTEXT_OP ctxOp = newLDAPContextOperations();
PLDAP_SESSION_OP sessionOp = newLDAPSessionOperations();
PLDAP_ENTRY_OP entryOp = newLDAPEntryOperations();
PLDAP_ATTRIBUTE_OP attribOp = newLDAPAttributeOperations();
/* inicia el context de ejecucion de ldap
en el host especificado */
ctxOp->initialize(context, "ldap://192.168.1.5:1389");
/* creo una session para comenzar a operar
sobre el direcotio ldap */
session = ctxOp->newSession(context, "cn=Directory Manager", "diego");
/* inicio la session con el server ldap */
sessionOp->startSession(session);
/* TODO: operacion de datos aqui */
/* insertEntry(session, sessionOp, entryOp, attribOp);
modifyEntry(session, sessionOp, entryOp, attribOp);
deleteEntry(session, sessionOp, entryOp, attribOp); */
selectEntries(session, sessionOp, entryOp, attribOp);
/* cierro la session con el servidor */
sessionOp->endSession(session);
/* libero los objectos de operaciones */
freeLDAPSession(session);
freeLDAPContext(context);
freeLDAPContextOperations(ctxOp);
freeLDAPSessionOperations(sessionOp);
return 0;
}