DTS Application Library  0.2.3
Application library containing referenced objects and interfaces to common libraries
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
openldap.c
Go to the documentation of this file.
1 #include <ldap.h>
2 #include <ldap_schema.h>
3 #include <lber.h>
4 #include <sasl/sasl.h>
5 #include <stdlib.h>
6 #include <stdint.h>
7 #include <stdio.h>
8 #include <ctype.h>
9 #include <sys/time.h>
10 #include <stdarg.h>
11 
12 #include "include/dtsapp.h"
13 
14 static struct ldap_results *_dtsldapsearch(struct ldap_conn *ldap, const char *base, int scope,
15  const char *filter, char **attrs, int b64enc, int *err);
16 
23 /*
24  * http://www.opensource.apple.com/source/OpenLDAP/OpenLDAP-186/OpenLDAP/libraries/liblutil/sasl.c
25  */
26 
28 struct sasl_defaults {
30  const char *mech;
32  const char *realm;
34  const char *authcid;
36  const char *passwd;
38  const char *authzid;
39 };
40 
42 struct ldap_simple {
44  const char *dn;
46  struct berval *cred;
47 };
48 
50 struct ldap_conn {
52  LDAP *ldap;
54  char *uri;
56  int timelim;
58  int limit;
60  LDAPControl **sctrlsp;
65 };
66 
68 struct ldap_modify {
70  const char *dn;
72  struct bucket_list *bl[3];
73 };
74 
76 struct ldap_add {
78  const char *dn;
80  struct bucket_list *bl;
81 };
82 
84 struct ldap_modval {
86  const char *value;
88  struct ldap_modval *next;
89 };
90 
92 struct ldap_modreq {
94  const char *attr;
96  int cnt;
98  struct ldap_modval *first;
100  struct ldap_modval *last;
101 };
102 
103 static int ldap_count(LDAP *ld, LDAPMessage *message, int *err);
104 static struct ldap_entry *ldap_getent(LDAP *ld, LDAPMessage **msgptr, LDAPMessage *result, int b64enc, int *err);
105 static int dts_sasl_interact(LDAP *ld, unsigned flags, void *defaults, void *in );
106 
107 static void free_simple(void *data) {
108  struct ldap_simple *simple = data;
109  struct berval *bv = simple->cred;
110 
111  if (bv && bv->bv_val) {
112  free(bv->bv_val);
113  }
114  if (bv) {
115  free(bv);
116  }
117  if (simple->dn) {
118  free((void *)simple->dn);
119  }
120 }
121 
122 static void free_modval(void *data) {
123  struct ldap_modval *modv = data;
124 
125  if (modv->value) {
126  free((void *)modv->value);
127  }
128 }
129 
130 static void free_modreq(void *data) {
131  struct ldap_modreq *modr = data;
132  struct ldap_modval *modv;
133 
134  if (modr->attr) {
135  free((void *)modr->attr);
136  }
137  for(modv = modr->first; modv; modv = modv->next) {
138  objunref(modv);
139  }
140 }
141 
142 static void free_modify(void *data) {
143  struct ldap_modify *lmod = data;
144  int cnt;
145  if (lmod->dn) {
146  free((void *)lmod->dn);
147  }
148 
149  for(cnt=0; cnt < 3; cnt++) {
150  if (lmod->bl[cnt]) {
151  objunref(lmod->bl[cnt]);
152  }
153  }
154 }
155 
156 static void free_add(void *data) {
157  struct ldap_add *lmod = data;
158 
159  if (lmod->dn) {
160  free((void *)lmod->dn);
161  }
162 
163  if (lmod->bl) {
164  objunref(lmod->bl);
165  }
166 }
167 
168 static void free_sasl(void *data) {
169  struct sasl_defaults *sasl = data;
170 
171  if (sasl->mech) {
172  free((void *)sasl->mech);
173  }
174  if (sasl->realm) {
175  free((void *)sasl->realm);
176  }
177  if (sasl->authcid) {
178  free((void *)sasl->authcid);
179  }
180  if (sasl->passwd) {
181  free((void *)sasl->passwd);
182  }
183  if (sasl->authzid) {
184  free((void *)sasl->authzid);
185  }
186 }
187 
188 static void free_ldapconn(void *data) {
189  struct ldap_conn *ld = data;
190 
191 
192  if (ld->uri) {
193  free(ld->uri);
194  }
195  if (ld->ldap) {
196  ldap_unbind_ext_s(ld->ldap, ld->sctrlsp, NULL);
197  }
198  if (ld->sasl) {
199  objunref(ld->sasl);
200  }
201  if (ld->simple) {
202  objunref(ld->simple);
203  }
204 }
205 
206 static void free_result(void *data) {
207  struct ldap_results *res = data;
208  if (res->entries) {
209  objunref(res->entries);
210  }
211 }
212 
213 static void free_entry(void *data) {
214  struct ldap_entry *ent = data;
215  struct ldap_attr *la;
216 
217  if (ent->prev) {
218  ent->prev->next = ent->next;
219  }
220  if (ent->next) {
221  ent->next->prev = ent->prev;
222  }
223 
224  if (ent->dn) {
225  ldap_memfree((void *)ent->dn);
226  }
227  if (ent->rdn) {
228  objunref(ent->rdn);
229  }
230  if (ent->dnufn) {
231  free((void *)ent->dnufn);
232  }
233  if (ent->attrs) {
234  objunref(ent->attrs);
235  }
236  if (ent->first_attr) {
237  for(la = ent->first_attr; la; la = la->next) {
238  objunref(la);
239  }
240  }
241 }
242 
243 static void free_rdnarr(void *data) {
244  struct ldap_rdn **rdn = data;
245 
246  for(; *rdn; rdn++) {
247  objunref(*rdn);
248  }
249 }
250 
251 static void free_rdn(void *data) {
252  struct ldap_rdn *rdn = data;
253 
254  if (rdn->name) {
255  objunref((void *)rdn->name);
256  }
257  if (rdn->value) {
258  objunref((void *)rdn->value);
259  }
260 }
261 
262 static void free_attr(void *data) {
263  struct ldap_attr *la = data;
264  if (la->next) {
265  la->next->prev = la->prev;
266  }
267  if (la->prev) {
268  la->prev->next = la->next;
269  }
270  ldap_memfree((char *)la->name);
271  if (la->vals) {
272  objunref(la->vals);
273  }
274 }
275 
276 static void free_attrvalarr(void *data) {
277  struct ldap_attrval **av = data;
278  for(; *av; av++) {
279  objunref(*av);
280  }
281 }
282 
283 static void free_attrval(void *data) {
284  struct ldap_attrval *av = data;
285  if (av->buffer) {
286  objunref(av->buffer);
287  }
288 }
289 
290 static int32_t modify_hash(const void *data, int key) {
291  int ret;
292  const struct ldap_modreq *modr = data;
293  const char *hashkey = (key) ? data : modr->attr;
294 
295  if (hashkey) {
296  ret = jenhash(hashkey, strlen(hashkey), 0);
297  } else {
298  ret = jenhash(modr, sizeof(modr), 0);
299  }
300  return(ret);
301 }
302 
303 static int ldap_rebind_proc(LDAP *ld, LDAP_CONST char *url, ber_tag_t request, ber_int_t msgid, void *params) {
304  struct ldap_conn *ldap = params;
305  int res = LDAP_UNAVAILABLE;
306 
307  if (!objref(ldap)) {
308  return LDAP_UNAVAILABLE;
309  }
310 
311  if (ldap->sasl) {
312  int sasl_flags = LDAP_SASL_AUTOMATIC | LDAP_SASL_QUIET;
313  struct sasl_defaults *sasl = ldap->sasl;
314 
315  res = ldap_sasl_interactive_bind_s(ld, NULL, sasl->mech, ldap->sctrlsp , NULL, sasl_flags, dts_sasl_interact, sasl);
316  } else
317  if (ldap->simple) {
318  struct ldap_simple *simple = ldap->simple;
319 
320  res = ldap_sasl_bind_s(ld, simple->dn, LDAP_SASL_SIMPLE, simple->cred, ldap->sctrlsp, NULL, NULL);
321  }
322 
323  objunref(ldap);
324  return res;
325 }
326 
335 extern struct ldap_conn *ldap_connect(const char *uri, enum ldap_starttls starttls, int timelimit, int limit, int debug, int *err) {
336  struct ldap_conn *ld;
337  int version = 3;
338  int res, sslres;
339  struct timeval timeout;
340 
341  if (!(ld = objalloc(sizeof(*ld), free_ldapconn))) {
342  return NULL;
343  }
344 
345  ld->uri = strdup(uri);
346  ld->sctrlsp = NULL;
347  ld->timelim = timelimit;
348  ld->limit = limit;
349  ld->sasl = NULL;
350 
351  if ((res = ldap_initialize(&ld->ldap, ld->uri) != LDAP_SUCCESS)) {
352  objunref(ld);
353  ld = NULL;
354  } else {
355  if (debug) {
356  ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, &debug);
357  ber_set_option(NULL, LBER_OPT_DEBUG_LEVEL, &debug);
358  }
359  if (timelimit) {
360  timeout.tv_sec = timelimit;
361  timeout.tv_usec = 0;
362  ldap_set_option(ld->ldap, LDAP_OPT_NETWORK_TIMEOUT, (void *)&timeout);
363  }
364  ldap_set_option(ld->ldap, LDAP_OPT_PROTOCOL_VERSION, &version);
365  ldap_set_option(ld->ldap, LDAP_OPT_REFERRALS, (void *)LDAP_OPT_ON);
366  ldap_set_rebind_proc(ld->ldap, ldap_rebind_proc, ld);
367 
368  if ((starttls != LDAP_STARTTLS_NONE) & !ldap_tls_inplace(ld->ldap) && (sslres = ldap_start_tls_s(ld->ldap, ld->sctrlsp, NULL))) {
369  if (starttls == LDAP_STARTTLS_ENFORCE) {
370  objunref(ld);
371  ld = NULL;
372  res = sslres;
373  }
374  }
375  }
376  *err = res;
377  return ld;
378 }
379 
380 static int interaction(unsigned flags, sasl_interact_t *interact, struct sasl_defaults *defaults) {
381  const char *res = interact->defresult;
382 
383  switch( interact->id ) {
384  case SASL_CB_GETREALM:
385  if (defaults->realm) {
386  res = defaults->realm;
387  }
388  break;
389  case SASL_CB_AUTHNAME:
390  if (defaults->authcid) {
391  res = defaults->authcid;
392  }
393  break;
394  case SASL_CB_PASS:
395  if (defaults->passwd) {
396  res = defaults->passwd;
397  }
398  break;
399  case SASL_CB_USER:
400  if (defaults->authzid) {
401  res = defaults->authzid;
402  }
403  break;
404  }
405 
406  interact->result = (res) ? res : "";
407  interact->len = strlen(interact->result);
408 
409  return LDAP_SUCCESS;
410 }
411 
412 static int dts_sasl_interact(LDAP *ld, unsigned flags, void *defaults, void *in ) {
413  sasl_interact_t *interact = in;
414 
415  if (!ld) {
416  return LDAP_PARAM_ERROR;
417  }
418 
419  while( interact->id != SASL_CB_LIST_END ) {
420  int rc = interaction(flags, interact, defaults);
421  if (rc) {
422  return rc;
423  }
424  interact++;
425  }
426  return LDAP_SUCCESS;
427 }
428 
434 extern int ldap_simplebind(struct ldap_conn *ld, const char *dn, const char *passwd) {
435  struct ldap_simple *simple;
436  struct berval *cred;
437  int res, len = 0;
438 
439  if (!objref(ld)) {
440  return LDAP_UNAVAILABLE;
441  }
442 
443  if (passwd) {
444  len = strlen(passwd);
445  }
446  simple = objalloc(sizeof(*simple), free_simple);
447  cred = calloc(sizeof(*cred), 1);
448  cred->bv_val = malloc(len);
449  memcpy(cred->bv_val, passwd, len);
450  cred->bv_len=len;
451  simple->cred = cred;
452  simple->dn = strdup(dn);
453 
454  objlock(ld);
455  if (ld->simple) {
456  objunref(ld->simple);
457  }
458  ld->simple = simple;
459  res = ldap_sasl_bind_s(ld->ldap, simple->dn, LDAP_SASL_SIMPLE, simple->cred, ld->sctrlsp, NULL, NULL);
460  objunlock(ld);
461  objunref(ld);
462  return res;
463 }
464 
478 extern int ldap_simplerebind(struct ldap_conn *ldap, const char *initialdn, const char *initialpw, const char *base, const char *filter,
479  const char *uidrdn, const char *uid, const char *passwd) {
480  int res, flen;
481  struct ldap_results *results;
482  const char *sfilt;
483 
484  if (!objref(ldap)) {
485  return LDAP_UNAVAILABLE;
486  }
487 
488  if ((res = ldap_simplebind(ldap, initialdn, initialpw))) {
489  objunref(ldap);
490  return res;
491  }
492 
493  flen=strlen(uidrdn) + strlen(filter) + strlen(uid) + 7;
494  sfilt = malloc(flen);
495  snprintf((char *)sfilt, flen, "(&(%s=%s)%s)", uidrdn, uid, filter);
496 
497  if (!(results = ldap_search_sub(ldap, base, sfilt, 0, &res, uidrdn, NULL))) {
498  free((void *)sfilt);
499  objunref(ldap);
500  return res;
501  }
502  free((void *)sfilt);
503 
504  if (results->count != 1) {
505  objunref(results);
506  objunref(ldap);
507  return LDAP_INAPPROPRIATE_AUTH;
508  }
509 
510  res = ldap_simplebind(ldap, results->first_entry->dn, passwd);
511  objunref(ldap);
512  objunref(results);
513  return res;
514 }
515 
524 extern int ldap_saslbind(struct ldap_conn *ld, const char *mech, const char *realm, const char *authcid, const char *passwd, const char *authzid ) {
525  struct sasl_defaults *sasl;
526  int res, sasl_flags = LDAP_SASL_AUTOMATIC | LDAP_SASL_QUIET;
527 
528  if (!objref(ld)) {
529  return LDAP_UNAVAILABLE;
530  }
531 
532  if (!(sasl = objalloc(sizeof(*sasl), free_sasl))) {
533  return LDAP_NO_MEMORY;
534  }
535 
536  ALLOC_CONST(sasl->passwd, passwd);
537 
538  if (mech) {
539  ALLOC_CONST(sasl->mech, mech);
540  } else {
541  ldap_get_option(ld->ldap, LDAP_OPT_X_SASL_MECH, &sasl->mech);
542  }
543 
544  if (realm) {
545  ALLOC_CONST(sasl->realm, realm);
546  } else {
547  ldap_get_option(ld->ldap, LDAP_OPT_X_SASL_REALM, &sasl->realm );
548  }
549 
550  if (authcid) {
551  ALLOC_CONST(sasl->authcid, authcid);
552  } else {
553  ldap_get_option(ld->ldap, LDAP_OPT_X_SASL_AUTHCID, &sasl->authcid );
554  }
555 
556  if (authzid) {
557  ALLOC_CONST(sasl->authzid, authzid);
558  } else {
559  ldap_get_option(ld->ldap, LDAP_OPT_X_SASL_AUTHZID, &sasl->authzid );
560  }
561 
562  objlock(ld);
563  if (ld->sasl) {
564  objunref(ld->sasl);
565  }
566  ld->sasl = sasl;
567  res = ldap_sasl_interactive_bind_s(ld->ldap, NULL, sasl->mech, ld->sctrlsp , NULL, sasl_flags, dts_sasl_interact, sasl);
568  objunlock(ld);
569  objunref(ld);
570  return res;
571 }
572 
576 extern const char *ldap_errmsg(int res) {
577  return ldap_err2string(res);
578 }
579 
580 static int32_t searchresults_hash(const void *data, int key) {
581  int ret;
582  const struct ldap_entry *ent = data;
583  const char *hashkey = (key) ? data : ent->dn;
584 
585  if (hashkey) {
586  ret = jenhash(hashkey, strlen(hashkey), 0);
587  } else {
588  ret = jenhash(ent, sizeof(ent), 0);
589  }
590  return(ret);
591 }
592 
601 extern struct ldap_results *ldap_search_sub(struct ldap_conn *ld, const char *base, const char *filter, int b64enc, int *res, ...) {
602  va_list a_list;
603  char *attr, **tmp, **attrs = NULL;
604  int cnt = 1;
605 
606  va_start(a_list, res);
607  while (( attr=va_arg(a_list, void *))) {
608  cnt++;
609  }
610  va_end(a_list);
611 
612  if (cnt > 1) {
613  tmp = attrs = malloc(sizeof(void *)*cnt);
614 
615  va_start(a_list, res);
616  while (( attr=va_arg(a_list, char *))) {
617  *tmp = attr;
618  tmp++;
619  }
620  va_end(a_list);
621  *tmp=NULL;
622  }
623 
624  return _dtsldapsearch(ld, base, LDAP_SCOPE_SUBTREE, filter, attrs, b64enc, res);
625 }
626 
635 extern struct ldap_results *ldap_search_one(struct ldap_conn *ld, const char *base, const char *filter, int b64enc, int *res, ...) {
636  va_list a_list;
637  char *attr, **tmp, **attrs = NULL;
638  int cnt = 1;
639 
640  va_start(a_list, res);
641  while (( attr=va_arg(a_list, void *))) {
642  cnt++;
643  }
644  va_end(a_list);
645 
646  if (cnt > 1) {
647  tmp = attrs = malloc(sizeof(void *)*cnt);
648 
649  va_start(a_list, res);
650  while (( attr=va_arg(a_list, char *))) {
651  *tmp = attr;
652  tmp++;
653  }
654  va_end(a_list);
655  *tmp=NULL;
656  }
657 
658  return _dtsldapsearch(ld, base, LDAP_SCOPE_ONELEVEL, filter, attrs, b64enc, res);
659 }
660 
669 extern struct ldap_results *ldap_search_base(struct ldap_conn *ld, const char *base, const char *filter, int b64enc, int *res, ...) {
670  va_list a_list;
671  char *attr, **tmp, **attrs = NULL;
672  int cnt = 1;
673 
674  va_start(a_list, res);
675  while (( attr=va_arg(a_list, void *))) {
676  cnt++;
677  }
678  va_end(a_list);
679 
680  if (cnt > 1) {
681  tmp = attrs = malloc(sizeof(void *)*cnt);
682 
683  va_start(a_list, res);
684  while (( attr=va_arg(a_list, char *))) {
685  *tmp = attr;
686  tmp++;
687  }
688  va_end(a_list);
689  *tmp=NULL;
690  }
691 
692  return _dtsldapsearch(ld, base, LDAP_SCOPE_BASE, filter, attrs, b64enc, res);
693 }
694 
695 
696 int ldap_count(LDAP *ld, LDAPMessage *message, int *err) {
697  int x;
698 
699  objlock(ld);
700  x = ldap_count_entries(ld, message);
701  objunlock(ld);
702 
703  if (!err) {
704  return x;
705  }
706 
707  if (x < 0) {
708  objlock(ld);
709  ldap_get_option(ld, LDAP_OPT_RESULT_CODE, err);
710  objunlock(ld);
711  } else {
712  *err = LDAP_SUCCESS;
713  }
714  return x;
715 }
716 
717 static char *ldap_getdn(LDAP *ld, LDAPMessage *message, int *err) {
718  char *dn;
719 
720  objlock(ld);
721  dn = ldap_get_dn(ld, message);
722  objunlock(ld);
723 
724  if (!err) {
725  return dn;
726  }
727 
728  if (!dn) {
729  objlock(ld);
730  ldap_get_option(ld, LDAP_OPT_RESULT_CODE, err);
731  objunlock(ld);
732  } else {
733  *err = LDAP_SUCCESS;
734  }
735 
736  return dn;
737 }
738 
739 static char *ldap_getattribute(LDAP *ld, LDAPMessage *message, BerElement **berptr, int *err) {
740  BerElement *ber = *berptr;
741  char *attr = NULL;
742 
743  objlock(ld);
744  if (ber) {
745  attr = ldap_next_attribute(ld, message, ber);
746  } else {
747  attr = ldap_first_attribute(ld, message, berptr);
748  }
749  if (!err) {
750  objunlock(ld);
751  return attr;
752  }
753 
754  if (!attr) {
755  ldap_get_option(ld, LDAP_OPT_RESULT_CODE, err);
756  } else {
757  *err = LDAP_SUCCESS;
758  }
759 
760  objunlock(ld);
761  return attr;
762 }
763 
764 static char *ldap_encattr(void *attrval, int b64enc, enum ldap_attrtype *type) {
765  struct berval *val = attrval;
766  char *aval = NULL;
767  int len, pos, atype;
768 
769  len = val->bv_len;
770  for(pos=0; isprint(val->bv_val[pos]); pos++)
771  ;
772  if (pos == len) {
773  aval = objalloc(val->bv_len+1, NULL);
774  strncpy(aval, val->bv_val, objsize(aval));
775  atype = LDAP_ATTRTYPE_CHAR;
776  } else
777  if (b64enc) {
778  aval = b64enc_buf(val->bv_val, val->bv_len, 0);
779  atype = LDAP_ATTRTYPE_B64;
780  } else {
781  aval = objalloc(val->bv_len, NULL);
782  memcpy(aval, val->bv_val, objsize(aval));
783  atype = LDAP_ATTRTYPE_OCTET;
784  }
785 
786  if (type) {
787  *type = atype;
788  }
789 
790  return aval;
791 }
792 
793 static struct berval **ldap_attrvals(LDAP *ld, LDAPMessage *message, char *attr, int *cnt, int *err) {
794  struct berval **vals = NULL;
795 
796  objlock(ld);
797  vals = ldap_get_values_len(ld, message, attr);
798  objunlock(ld);
799 
800  if (cnt) {
801  *cnt = ldap_count_values_len(vals);
802  }
803 
804  if (!err) {
805  return vals;
806  }
807 
808  if (!vals) {
809  ldap_get_option(ld, LDAP_OPT_RESULT_CODE, err);
810  } else {
811  *err = LDAP_SUCCESS;
812  }
813 
814  return vals;
815 }
816 
817 static int32_t ldapattr_hash(const void *data, int key) {
818  int ret;
819  const struct ldap_attr *la = data;
820  const char *hashkey = (key) ? data : la->name;
821 
822  if (hashkey) {
823  ret = jenhash(hashkey, strlen(hashkey), 0);
824  } else {
825  ret = jenhash(la, sizeof(la), 0);
826  }
827  return(ret);
828 }
829 
830 static struct bucket_list *attr2bl(LDAP *ld, LDAPMessage *message, struct ldap_attr **first, int b64enc, int *res) {
831  BerElement *ber = NULL;
832  struct bucket_list *bl;
833  struct ldap_attr *la, *prev = NULL;
834  struct ldap_attrval *lav, **lavals;
835  struct berval **tmp, **vals = NULL;
836  enum ldap_attrtype type;
837  char *attr;
838  int cnt;
839  char *eval;
840 
841  if (!(bl = create_bucketlist(4, ldapattr_hash))) {
842  if (res) {
843  *res = LDAP_NO_MEMORY;
844  }
845  return NULL;
846  }
847 
848  while((attr = ldap_getattribute(ld, message, &ber, res))) {
849  tmp = vals = ldap_attrvals(ld, message, attr, &cnt, res);
850  la = objalloc(sizeof(*la), free_attr);
851  if (first && !*first) {
852  *first = la;
853  }
854  la->next = NULL;
855  if (prev) {
856  prev->next = la;
857  la->prev = prev;
858  } else {
859  la->prev = NULL;
860  }
861  prev = la;
862  lavals = objalloc(sizeof(void *) * (cnt+1), free_attrvalarr);
863  if (!lavals || !la) {
864  if (res) {
865  *res = LDAP_NO_MEMORY;
866  }
867  if (la) {
868  objunref(la);
869  }
870  if (lavals) {
871  objunref(lavals);
872  }
873  objunref(bl);
874  ldap_value_free_len(vals);
875  if (ber) {
876  ber_free(ber, 0);
877  }
878  return NULL;
879  }
880  la->vals = lavals;
881  la->name = attr;
882  la->count = cnt;
883 
884  for(; *tmp; tmp++) {
885  struct berval *bval = *tmp;
886 
887  *lavals = lav = objalloc(sizeof(*lav), free_attrval);
888  lavals++;
889 
890  eval = ldap_encattr(bval, b64enc, &type);
891  if (!eval || !lav) {
892  if (res) {
893  *res = LDAP_NO_MEMORY;
894  }
895  objunref(bl);
896  objunref(la);
897  if (eval) {
898  objunref(eval);
899  }
900  ldap_value_free_len(vals);
901  if (ber) {
902  ber_free(ber, 0);
903  }
904  return NULL;
905  }
906  lav->len = bval->bv_len;
907  lav->buffer = eval;
908  lav->type = type;
909  }
910  *lavals = NULL;
911  ldap_value_free_len(vals);
912  addtobucket(bl, la);
913  objunref(la);
914  }
915  if (ber) {
916  ber_free(ber, 0);
917  }
918  return bl;
919 }
920 
921 struct ldap_entry *ldap_getent(LDAP *ld, LDAPMessage **msgptr, LDAPMessage *result, int b64enc, int *err) {
922  LDAPMessage *message = *msgptr;
923  struct ldap_entry *ent = NULL;
924  struct ldap_rdn *lrdn, *prev = NULL, *first = NULL;
925  struct ldap_rdn **rdns;
926  LDAPDN dnarr;
927  LDAPRDN rdnarr;
928  LDAPAVA *rdn;
929  int res, cnt, tlen=0, dccnt=0;
930 
931  objlock(ld);
932  if (message) {
933  message = ldap_next_entry(ld, message);
934  } else {
935  message = ldap_first_entry(ld, result);
936  }
937  *msgptr = message;
938  objunlock(ld);
939 
940  if (message && !(ent = objalloc(sizeof(*ent), free_entry))) {
941  if (!err) {
942  *err = LDAP_NO_MEMORY;
943  }
944  return NULL;
945  } else
946  if (!message) {
947  if (err) {
948  objlock(ld);
949  ldap_get_option(ld, LDAP_OPT_RESULT_CODE, err);
950  objunlock(ld);
951  }
952  return NULL;
953  }
954 
955  if (!(ent->dn = ldap_getdn(ld, message, &res))) {
956  if (err) {
957  *err = res;
958  }
959  objunref(ent);
960  return NULL;
961  }
962 
963  objlock(ld);
964  if ((res = ldap_str2dn(ent->dn, &dnarr, LDAP_DN_PEDANTIC))) {
965  objunlock(ld);
966  if (err) {
967  *err = res;
968  }
969  objunref(ent);
970  return NULL;
971  }
972  objunlock(ld);
973 
974  ent->rdncnt = 0;
975  for (cnt=0; dnarr[cnt]; cnt++) {
976  rdnarr = dnarr[cnt];
977  for (; *rdnarr; rdnarr++) {
978  if (!(lrdn = objalloc(sizeof(*lrdn), free_rdn))) {
979  for(lrdn = first; lrdn; lrdn=lrdn->next) {
980  objunref(lrdn);
981  }
982  objunref(ent);
983  if (err) {
984  *err = LDAP_NO_MEMORY;
985  }
986  return NULL;
987  }
988 
989  ent->rdncnt++;
990 
991  if (!first) {
992  first = lrdn;
993  }
994 
995  rdn = *rdnarr;
996  ALLOC_CONST(lrdn->name, rdn->la_attr.bv_val);
997  ALLOC_CONST(lrdn->value, rdn->la_value.bv_val);
998 
999  if (!strcmp("dc", rdn->la_attr.bv_val)) {
1000  dccnt++;
1001  }
1002  tlen += rdn->la_value.bv_len;
1003  lrdn->next = NULL;
1004  if (prev) {
1005  prev->next = lrdn;
1006  lrdn->prev = prev;
1007  } else {
1008  lrdn->prev = NULL;
1009  }
1010  prev = lrdn;
1011  }
1012  }
1013  ldap_dnfree(dnarr);
1014 
1015  ent->dnufn = calloc(tlen + (ent->rdncnt-dccnt)*2+dccnt, 1);
1016  ent->rdn = rdns = objalloc(sizeof(void *) * (ent->rdncnt+1), free_rdnarr);
1017 
1018  if (!ent->dnufn || !ent->rdn) {
1019  for(lrdn = first; lrdn; lrdn=lrdn->next) {
1020  objunref(lrdn);
1021  }
1022  objunref(ent);
1023  if (err) {
1024  *err = LDAP_NO_MEMORY;
1025  }
1026  }
1027 
1028  for(lrdn = first; lrdn ; lrdn = lrdn->next) {
1029  strcat((char *)ent->dnufn, lrdn->value);
1030  if (lrdn->next && !strcmp(lrdn->name, "dc")) {
1031  strcat((char *)ent->dnufn, ".");
1032  } else
1033  if (lrdn->next) {
1034  strcat((char *)ent->dnufn, ", ");
1035  }
1036  *rdns = lrdn;
1037  rdns++;
1038  }
1039  *rdns = NULL;
1040 
1041  if (!(ent->attrs = attr2bl(ld, message, &ent->first_attr, b64enc, &res))) {
1042  if (err) {
1043  *err = res;
1044  }
1045  objunref(ent);
1046  return NULL;
1047  }
1048 
1049  if (err) {
1050  *err = LDAP_SUCCESS;
1051  }
1052 
1053  return ent;
1054 }
1055 
1059 extern void ldap_unref_attr(struct ldap_entry *entry, struct ldap_attr *attr) {
1060  if (!entry || !attr) {
1061  return;
1062  }
1063 
1064  if (objcnt(attr) > 1) {
1065  objunref(attr);
1066  } else {
1067  if (attr == entry->first_attr) {
1068  entry->first_attr = attr->next;
1069  }
1070  remove_bucket_item(entry->attrs, attr);
1071  }
1072 }
1073 
1077 extern void ldap_unref_entry(struct ldap_results *results, struct ldap_entry *entry) {
1078  if (!results || !entry) {
1079  return;
1080  }
1081 
1082  if (objcnt(entry) > 1) {
1083  objunref(entry);
1084  } else {
1085  if (entry == results->first_entry) {
1086  results->first_entry = entry->next;
1087  }
1088  remove_bucket_item(results->entries, entry);
1089  }
1090 }
1091 
1096 extern struct ldap_entry *ldap_getentry(struct ldap_results *results, const char *dn) {
1097  if (!results || !dn) {
1098  return NULL;
1099  }
1100  return (struct ldap_entry *)bucket_list_find_key(results->entries, dn);
1101 }
1102 
1103 
1108 extern struct ldap_attr *ldap_getattr(struct ldap_entry *entry, const char *attr) {
1109  if (!entry || !entry->attrs) {
1110  return NULL;
1111  }
1112  return (struct ldap_attr *)bucket_list_find_key(entry->attrs, attr);
1113 }
1114 
1118 extern struct ldap_modify *ldap_modifyinit(const char *dn) {
1119  struct ldap_modify *mod;
1120  int cnt;
1121 
1122  if (!(mod = objalloc(sizeof(*mod), free_modify))) {
1123  return NULL;
1124  }
1125 
1126  ALLOC_CONST(mod->dn, dn);
1127  if (!mod->dn) {
1128  objunref(mod);
1129  return NULL;
1130  }
1131 
1132  for(cnt=0; cnt < 3; cnt++) {
1133  if (!(mod->bl[cnt] = create_bucketlist(4, modify_hash))) {
1134  objunref(mod);
1135  return NULL;
1136  }
1137  }
1138 
1139  return mod;
1140 }
1141 
1142 static struct ldap_modreq *new_modreq(struct bucket_list *modtype, const char *attr) {
1143  struct ldap_modreq *modr;
1144 
1145  if (!(modr = objalloc(sizeof(*modr), free_modreq))) {
1146  return NULL;
1147  }
1148 
1149  ALLOC_CONST(modr->attr, attr);
1150  if (!modr->attr || !addtobucket(modtype, modr)) {
1151  objunref(modr);
1152  modr = NULL;
1153  }
1154  return modr;
1155 }
1156 
1157 static struct ldap_modreq *getmodreq(struct ldap_modify *lmod, const char *attr, int modop) {
1158  struct bucket_list *bl = NULL;
1159  struct ldap_modreq *modr = NULL;
1160 
1161  switch (modop) {
1162  case LDAP_MOD_REPLACE:
1163  bl = lmod->bl[0];
1164  break;
1165  case LDAP_MOD_DELETE:
1166  bl = lmod->bl[1];
1167  break;
1168  case LDAP_MOD_ADD:
1169  bl = lmod->bl[2];
1170  break;
1171  }
1172 
1173  if (bl && !(modr = bucket_list_find_key(bl, attr))) {
1174  if (!(modr = new_modreq(bl, attr))) {
1175  return NULL;
1176  }
1177  }
1178  return modr;
1179 }
1180 
1181 static int add_modifyval(struct ldap_modreq *modr, const char *value) {
1182  struct ldap_modval *newval;
1183 
1184  if (!(newval = objalloc(sizeof(*newval), free_modval))) {
1185  return 1;
1186  }
1187 
1188  ALLOC_CONST(newval->value, value);
1189  if (!newval->value) {
1190  objunref(newval);
1191  return 1;
1192  }
1193 
1194  if (!modr->first) {
1195  modr->first = newval;
1196  }
1197  if (modr->last) {
1198  modr->last->next = newval;
1199  }
1200  modr->cnt++;
1201  modr->last = newval;
1202 
1203  return 0;
1204 }
1205 
1211 extern int ldap_mod_del(struct ldap_modify *lmod, const char *attr, ...) {
1212  va_list a_list;
1213  char *val;
1214  struct ldap_modreq *modr;
1215 
1216  if (!(modr = getmodreq(lmod, attr, LDAP_MOD_DELETE))) {
1217  return 1;
1218  }
1219 
1220  va_start(a_list, attr);
1221  while((val = va_arg(a_list, void *))) {
1222  if (add_modifyval(modr, val)) {
1223  objunref(modr);
1224  return(1);
1225  }
1226  }
1227 
1228  objunref(modr);
1229  va_end(a_list);
1230  return 0;
1231 }
1232 
1238 extern int ldap_mod_add(struct ldap_modify *lmod, const char *attr, ...) {
1239  va_list a_list;
1240  char *val;
1241  struct ldap_modreq *modr;
1242 
1243  if (!(modr = getmodreq(lmod, attr, LDAP_MOD_ADD))) {
1244  return 1;
1245  }
1246 
1247  va_start(a_list, attr);
1248  while((val = va_arg(a_list, void *))) {
1249  if (add_modifyval(modr, val)) {
1250  objunref(modr);
1251  return(1);
1252  }
1253  }
1254 
1255  objunref(modr);
1256  va_end(a_list);
1257  return 0;
1258 }
1259 
1265 extern int ldap_mod_rep(struct ldap_modify *lmod, const char *attr, ...) {
1266  va_list a_list;
1267  char *val;
1268  struct ldap_modreq *modr;
1269 
1270  if (!(modr = getmodreq(lmod, attr, LDAP_MOD_REPLACE))) {
1271  return 1;
1272  }
1273 
1274  va_start(a_list, attr);
1275  while((val = va_arg(a_list, void *))) {
1276  if (add_modifyval(modr, val)) {
1277  objunref(modr);
1278  return(1);
1279  }
1280  }
1281 
1282  objunref(modr);
1283  va_end(a_list);
1284  return 0;
1285 }
1286 
1287 static LDAPMod *ldap_reqtoarr(struct ldap_modreq *modr, int type) {
1288  LDAPMod *modi;
1289  const char **mval;
1290  struct ldap_modval *modv;
1291 
1292  if (!(modi = calloc(sizeof(LDAPMod), 1))) {
1293  return NULL;
1294  }
1295 
1296  if (!(modi->mod_values = calloc(sizeof(void *), modr->cnt+1))) {
1297  free(modi);
1298  return NULL;
1299  }
1300 
1301  switch (type) {
1302  case 0:
1303  modi->mod_op = LDAP_MOD_REPLACE;
1304  break;
1305  case 1:
1306  modi->mod_op = LDAP_MOD_DELETE;
1307  break;
1308  case 2:
1309  modi->mod_op = LDAP_MOD_ADD;
1310  break;
1311  default
1312  :
1313  modi->mod_op = 0;
1314  break;
1315  }
1316 
1317  if (!(modi->mod_type = strdup(modr->attr))) {
1318  free(modi);
1319  return NULL;
1320  }
1321 
1322  mval = (const char **)modi->mod_values;
1323  for(modv = modr->first; modv; modv=modv->next) {
1324  if (!(*mval = strdup(modv->value))) {
1325  ldap_mods_free(&modi, 0);
1326  return NULL;
1327  }
1328  mval++;
1329  }
1330  *mval = NULL;
1331 
1332  return modi;
1333 }
1334 
1339 extern int ldap_domodify(struct ldap_conn *ld, struct ldap_modify *lmod) {
1340  struct bucket_loop *bloop;
1341  struct ldap_modreq *modr;
1342  LDAPMod **modarr, **tmp, *item;
1343  int cnt, tot=0, res;
1344 
1345  if (!objref(ld)) {
1346  return LDAP_UNAVAILABLE;
1347  }
1348 
1349  for(cnt = 0; cnt < 3; cnt++) {
1350  tot += bucket_list_cnt(lmod->bl[cnt]);
1351  }
1352  tmp = modarr = calloc(sizeof(void *), (tot+1));
1353 
1354  for(cnt = 0; cnt < 3; cnt++) {
1355  bloop = init_bucket_loop(lmod->bl[cnt]);
1356  while(bloop && ((modr = next_bucket_loop(bloop)))) {
1357  if (!(item = ldap_reqtoarr(modr, cnt))) {
1358  ldap_mods_free(modarr, 1);
1359  objunref(ld);
1360  return LDAP_NO_MEMORY;
1361  }
1362  *tmp = item;
1363  tmp++;
1364  objunref(modr);
1365  }
1366  objunref(bloop);
1367  }
1368  *tmp = NULL;
1369 
1370  objlock(ld);
1371  res = ldap_modify_ext_s(ld->ldap, lmod->dn, modarr, ld->sctrlsp, NULL);
1372  objunlock(ld);
1373  ldap_mods_free(modarr, 1);
1374  objunref(ld);
1375  return res;
1376 }
1377 
1384 extern int ldap_mod_delattr(struct ldap_conn *ldap, const char *dn, const char *attr, const char *value) {
1385  struct ldap_modify *lmod;
1386  int res;
1387 
1388  if (!(lmod = ldap_modifyinit(dn))) {
1389  return LDAP_NO_MEMORY;
1390  }
1391  if (ldap_mod_del(lmod, attr, value, NULL)) {
1392  objunref(lmod);
1393  return LDAP_NO_MEMORY;
1394  }
1395 
1396  res = ldap_domodify(ldap, lmod);
1397  objunref(lmod);
1398  return res;
1399 }
1400 
1406 extern int ldap_mod_remattr(struct ldap_conn *ldap, const char *dn, const char *attr) {
1407  return ldap_mod_delattr(ldap, dn, attr, NULL);
1408 }
1409 
1416 extern int ldap_mod_addattr(struct ldap_conn *ldap, const char *dn, const char *attr, const char *value) {
1417  int res = 0;
1418  struct ldap_modify *lmod;
1419 
1420  if (!(lmod = ldap_modifyinit(dn))) {
1421  return LDAP_NO_MEMORY;
1422  }
1423 
1424  if (ldap_mod_add(lmod, attr, value, NULL)) {
1425  objunref(lmod);
1426  return LDAP_NO_MEMORY;
1427  }
1428 
1429  res = ldap_domodify(ldap, lmod);
1430  objunref(lmod);
1431  return res;
1432 }
1433 
1434 
1441 extern int ldap_mod_repattr(struct ldap_conn *ldap, const char *dn, const char *attr, const char *value) {
1442  struct ldap_modify *lmod;
1443  int res;
1444 
1445  if (!(lmod = ldap_modifyinit(dn))) {
1446  return LDAP_NO_MEMORY;
1447  }
1448 
1449  if (ldap_mod_rep(lmod, attr, value, NULL)) {
1450  objunref(lmod);
1451  return LDAP_NO_MEMORY;
1452  }
1453 
1454  res = ldap_domodify(ldap, lmod);
1455  objunref(lmod);
1456  return res;
1457 }
1458 
1462 extern struct ldap_add *ldap_addinit(const char *dn) {
1463  struct ldap_add *mod;
1464 
1465  if (!(mod = objalloc(sizeof(*mod), free_add))) {
1466  return NULL;
1467  }
1468 
1469  ALLOC_CONST(mod->dn, dn);
1470  if (!mod->dn) {
1471  objunref(mod);
1472  return NULL;
1473  }
1474 
1475  if (!(mod->bl = create_bucketlist(4, modify_hash))) {
1476  objunref(mod);
1477  return NULL;
1478  }
1479 
1480  return mod;
1481 }
1482 
1483 static struct ldap_modreq *getaddreq(struct ldap_add *ladd, const char *attr) {
1484  struct bucket_list *bl = ladd->bl;
1485  struct ldap_modreq *modr = NULL;
1486 
1487  if (bl && !(modr = bucket_list_find_key(bl, attr))) {
1488  if (!(modr = new_modreq(bl, attr))) {
1489  return NULL;
1490  }
1491  }
1492  return modr;
1493 }
1494 
1500 extern int ldap_add_attr(struct ldap_add *ladd, const char *attr, ...) {
1501  va_list a_list;
1502  char *val;
1503  struct ldap_modreq *modr;
1504 
1505  if (!(modr = getaddreq(ladd, attr))) {
1506  return 1;
1507  }
1508 
1509  va_start(a_list, attr);
1510  while((val = va_arg(a_list, void *))) {
1511  if (add_modifyval(modr, val)) {
1512  objunref(modr);
1513  return(1);
1514  }
1515  }
1516 
1517  objunref(modr);
1518  va_end(a_list);
1519  return 0;
1520 }
1521 
1526 extern int ldap_doadd(struct ldap_conn *ld, struct ldap_add *ladd) {
1527  struct bucket_loop *bloop;
1528  struct ldap_modreq *modr;
1529  LDAPMod **modarr, **tmp, *item;
1530  int tot=0, res;
1531 
1532  tot = bucket_list_cnt(ladd->bl);
1533  tmp = modarr = calloc(sizeof(void *), (tot+1));
1534 
1535  bloop = init_bucket_loop(ladd->bl);
1536  while(bloop && ((modr = next_bucket_loop(bloop)))) {
1537  if (!(item = ldap_reqtoarr(modr, -1))) {
1538  ldap_mods_free(modarr, 1);
1539  return LDAP_NO_MEMORY;
1540  }
1541  *tmp = item;
1542  tmp++;
1543  objunref(modr);
1544  }
1545  objunref(bloop);
1546  *tmp = NULL;
1547 
1548  objlock(ld);
1549  res = ldap_modify_ext_s(ld->ldap, ladd->dn, modarr, ld->sctrlsp, NULL);
1550  objunlock(ld);
1551  ldap_mods_free(modarr, 1);
1552 
1553  return res;
1554 }
1555 
1556 
1559 struct ldap_results *_dtsldapsearch(struct ldap_conn *ldap, const char *base, int scope, const char *filter, char **attrs, int b64enc, int *err) {
1560  struct timeval timeout;
1561  struct ldap_results *results;
1562  struct ldap_entry *lent, *prev = NULL;
1563  LDAPMessage *result, *message = NULL;
1564  int res = LDAP_SUCCESS;
1565 
1566  if (!objref(ldap)) {
1567  if (err) {
1568  *err = LDAP_UNAVAILABLE;
1569  }
1570  if (attrs) {
1571  free(attrs);
1572  }
1573  return NULL;
1574  }
1575 
1576  if ((results = objalloc(sizeof(*results), free_result))) {
1577  results->entries = create_bucketlist(4, searchresults_hash);
1578  }
1579 
1580  timeout.tv_sec = ldap->timelim;
1581  timeout.tv_usec = 0;
1582 
1583  objlock(ldap);
1584  if (!results || !results->entries ||
1585  (res = ldap_search_ext_s(ldap->ldap, base, scope, filter, attrs, 0, ldap->sctrlsp, NULL, &timeout, ldap->limit, &result))) {
1586  objunlock(ldap);
1587  objunref(ldap);
1588  objunref(results);
1589  ldap_msgfree(result);
1590  if (err) {
1591  *err = (!results || !results->entries) ? LDAP_NO_MEMORY : res;
1592  }
1593  if (attrs) {
1594  free(attrs);
1595  }
1596  return NULL;
1597  }
1598  objunlock(ldap);
1599 
1600  if (attrs) {
1601  free(attrs);
1602  }
1603 
1604  if ((results->count = ldap_count(ldap->ldap, result, err)) < 0) {
1605  objunref(ldap);
1606  objunref(results);
1607  ldap_msgfree(result);
1608  return NULL;
1609  }
1610 
1611  while((lent = ldap_getent(ldap->ldap, &message, result, b64enc, err))) {
1612  if (!results->first_entry) {
1613  results->first_entry = lent;
1614  }
1615  if (!addtobucket(results->entries, lent)) {
1616  res = LDAP_NO_MEMORY;
1617  objunref(lent);
1618  break;
1619  }
1620  lent->next = NULL;
1621  if (prev) {
1622  prev->next = lent;
1623  lent->prev = prev;
1624  } else {
1625  lent->prev = NULL;
1626  }
1627  prev = lent;
1628  objunref(lent);
1629  }
1630  ldap_msgfree(result);
1631 
1632  if (err) {
1633  *err = res;
1634  }
1635 
1636  if (res) {
1637  objunref(results);
1638  results = NULL;
1639  }
1640 
1641  objunref(ldap);
1642  return results;
1643 }
int ldap_mod_remattr(struct ldap_conn *ldap, const char *dn, const char *attr)
Delete a attribute from a DN.
Definition: openldap.c:1406
SSL not attempted at all.
Definition: dtsapp.h:699
void ldap_unref_attr(struct ldap_entry *entry, struct ldap_attr *attr)
Remove a attribute from a entry.
Definition: openldap.c:1059
const char * ldap_errmsg(int res)
Return LDAP error for a ldap error.
Definition: openldap.c:576
Bucket iterator.
Definition: refobj.c:97
int ldap_mod_delattr(struct ldap_conn *ldap, const char *dn, const char *attr, const char *value)
Delete a value from a attribute in a DN.
Definition: openldap.c:1384
struct ldap_rdn * next
Next RDN element.
Definition: dtsapp.h:723
struct ldap_simple * simple
LDAP Simple bind information.
Definition: openldap.c:64
const char * dn
Distingushed Name.
Definition: openldap.c:44
void * create_bucketlist(int bitmask, blisthash hash_function)
Definition: refobj.c:356
int ldap_simplerebind(struct ldap_conn *ld, const char *initialdn, const char *initialpw, const char *base, const char *filter, const char *uidrdn, const char *uid, const char *passwd)
Bind to LDAP connection using rebind.
Definition: openldap.c:478
const char * dn
LDAP distiguished name.
Definition: dtsapp.h:755
int ldap_simplebind(struct ldap_conn *ld, const char *dn, const char *passwd)
Bind to the connection with simple bind requireing a distingushed name and password.
Definition: openldap.c:434
LDAPControl ** sctrlsp
LDAP control.
Definition: openldap.c:60
const char * authcid
Auth ID.
Definition: openldap.c:34
LDAP Simple bind.
Definition: openldap.c:42
int ldap_domodify(struct ldap_conn *ld, struct ldap_modify *lmod)
Apply the modification to the server.
Definition: openldap.c:1339
int objref(void *data)
Reference a object.
Definition: refobj.c:153
const char * mech
SASL Mechanisim.
Definition: openldap.c:30
struct ldap_results * ldap_search_base(struct ldap_conn *ld, const char *base, const char *filter, int b64enc, int *res,...)
Search LDAP connection base.
Definition: openldap.c:669
struct ldap_attr * first_attr
First attr (head of list).
Definition: dtsapp.h:767
LDAP results.
Definition: dtsapp.h:775
struct ldap_add * ldap_addinit(const char *dn)
Create a reference to add a new DN.
Definition: openldap.c:1462
struct ldap_entry * ldap_getentry(struct ldap_results *results, const char *dn)
Find and return the entry from the results for a specific dn.
Definition: openldap.c:1096
struct ldap_modval * last
Linked list tail.
Definition: openldap.c:100
char * buffer
Value buffer.
Definition: dtsapp.h:735
int objlock(void *data)
Lock the reference.
Definition: refobj.c:269
struct bucket_list * bl
bucket containing item to add
Definition: openldap.c:80
ldap_starttls
SSL connection requirements.
Definition: dtsapp.h:697
const char * attr
Attribute modified.
Definition: openldap.c:94
Plain text.
Definition: dtsapp.h:709
int ldap_mod_repattr(struct ldap_conn *ldap, const char *dn, const char *attr, const char *value)
Replace the value of a attribute in a DN.
Definition: openldap.c:1441
void * objalloc(int size, objdestroy)
Allocate a referenced lockable object.
Definition: refobj.c:129
LDAP attribute value.
Definition: dtsapp.h:729
int count
Number of entries.
Definition: dtsapp.h:777
int limit
Results limit.
Definition: openldap.c:58
const char * dn
Distingushed name.
Definition: openldap.c:78
int bucket_list_cnt(struct bucket_list *blist)
Return number of items in the list.
Definition: refobj.c:552
const char * name
RDN element name.
Definition: dtsapp.h:719
struct ldap_attrval ** vals
Attribute value array.
Definition: dtsapp.h:745
const char * realm
SASL Realm.
Definition: openldap.c:32
struct bucket_list * bl[3]
Bucket list containg modify / modify_add / delete requests.
Definition: openldap.c:72
Linked list of mod values.
Definition: openldap.c:84
void ldap_unref_entry(struct ldap_results *results, struct ldap_entry *entry)
Remove a entry from a result.
Definition: openldap.c:1077
int objcnt(void *data)
Return current reference count.
Definition: refobj.c:222
void * next_bucket_loop(struct bucket_loop *bloop)
Return a reference to the next item in the list this could be the first item.
Definition: refobj.c:662
const char * authzid
Proxy auth ID.
Definition: openldap.c:38
LDAP entry.
Definition: dtsapp.h:753
struct ldap_modval * next
Next Value.
Definition: openldap.c:88
struct ldap_modify * ldap_modifyinit(const char *dn)
Create a modification reference for a DN.
Definition: openldap.c:1118
struct ldap_rdn * prev
Previous RDN element.
Definition: dtsapp.h:725
Base64 encoded.
Definition: dtsapp.h:711
DTS Application library API Include file.
struct sasl_defaults * sasl
SASL auth information.
Definition: openldap.c:62
int ldap_mod_rep(struct ldap_modify *lmod, const char *attr,...)
Replace a attribute.
Definition: openldap.c:1265
LDAP Relative distingushed name linked list.
Definition: dtsapp.h:717
const char * value
Value.
Definition: openldap.c:86
int ldap_mod_addattr(struct ldap_conn *ldap, const char *dn, const char *attr, const char *value)
Add a value for a attribute in a DN.
Definition: openldap.c:1416
struct ldap_entry * first_entry
Linked list of entries.
Definition: dtsapp.h:779
int rdncnt
RDN element count.
Definition: dtsapp.h:759
struct ldap_entry * prev
Previous entry.
Definition: dtsapp.h:771
const char * passwd
Password.
Definition: openldap.c:36
int ldap_saslbind(struct ldap_conn *ld, const char *mech, const char *realm, const char *authcid, const char *passwd, const char *authzid)
Bind to the server with SASL.
Definition: openldap.c:524
int count
Value count.
Definition: dtsapp.h:743
int ldap_mod_del(struct ldap_modify *lmod, const char *attr,...)
Delete values from a attribute.
Definition: openldap.c:1211
SSL is required.
Definition: dtsapp.h:703
struct berval * cred
Credentials (password).
Definition: openldap.c:46
SASL Paramaters used in authentification.
Definition: openldap.c:28
int ldap_mod_add(struct ldap_modify *lmod, const char *attr,...)
Add values to a attribute.
Definition: openldap.c:1238
struct ldap_attr * ldap_getattr(struct ldap_entry *entry, const char *attr)
Find and return attribute in a entry.
Definition: openldap.c:1108
struct ldap_results * ldap_search_one(struct ldap_conn *ld, const char *base, const char *filter, int b64enc, int *res,...)
Search LDAP connection one level.
Definition: openldap.c:635
LDAP Add structure.
Definition: openldap.c:76
ldap_attrtype
LDAP attribute types.
Definition: dtsapp.h:707
const char * name
Name of attribute.
Definition: dtsapp.h:741
struct ldap_entry * next
Next entry.
Definition: dtsapp.h:769
int ldap_doadd(struct ldap_conn *ld, struct ldap_add *ladd)
Write new DN to server.
Definition: openldap.c:1526
struct ldap_conn * ldap_connect(const char *uri, enum ldap_starttls starttls, int timelimit, int limit, int debug, int *err)
Connect to a LDAP server.
Definition: openldap.c:335
int cnt
Count.
Definition: openldap.c:96
int objunlock(void *data)
Unlock a reference.
Definition: refobj.c:301
struct bucket_list * attrs
Bucket list of attributes.
Definition: dtsapp.h:765
int timelim
Time limit.
Definition: openldap.c:56
LDAP mod request.
Definition: openldap.c:92
int len
Size of buffer.
Definition: dtsapp.h:731
const char * value
RDN element value.
Definition: dtsapp.h:721
char * uri
Address.
Definition: openldap.c:54
enum ldap_attrtype type
Data type stored in buffer.
Definition: dtsapp.h:733
struct ldap_modval * first
Linked list head.
Definition: openldap.c:98
struct ldap_results * ldap_search_sub(struct ldap_conn *ld, const char *base, const char *filter, int b64enc, int *res,...)
Search LDAP connection subtree.
Definition: openldap.c:601
const char * dn
Distingushed name.
Definition: openldap.c:70
LDAP * ldap
LDAP pointer.
Definition: openldap.c:52
#define jenhash(key, length, initval)
Define jenhash as hashlittle on big endian it should be hashbig.
Definition: dtsapp.h:914
Binary data.
Definition: dtsapp.h:713
char * b64enc(const char *message, int nonl)
Base 64 encode a string.
Definition: util.c:539
struct ldap_attr * next
Next attribute.
Definition: dtsapp.h:747
LDAP connection.
Definition: openldap.c:50
#define ALLOC_CONST(const_var, val)
Macro to assign values to char const.
Definition: dtsapp.h:959
int objsize(void *data)
Size requested for data.
Definition: refobj.c:246
const char * dnufn
LDAP user format distingushed name.
Definition: dtsapp.h:757
struct bucket_list * entries
Bucket list of entries.
Definition: dtsapp.h:781
int addtobucket(struct bucket_list *blist, void *data)
Add a reference to the bucketlist.
Definition: refobj.c:428
void * bucket_list_find_key(struct bucket_list *list, const void *key)
Find and return a reference to a item matching supplied key.
Definition: refobj.c:572
void remove_bucket_item(struct bucket_list *blist, void *data)
Remove and unreference a item from the list.
Definition: refobj.c:517
struct ldap_rdn ** rdn
RDN element array.
Definition: dtsapp.h:761
int objunref(void *data)
Drop reference held.
Definition: refobj.c:184
LDAP Modify structure.
Definition: openldap.c:68
LDAP attirbute.
Definition: dtsapp.h:739
char * b64enc_buf(const char *message, uint32_t len, int nonl)
Base 64 encode a buffer.
Definition: util.c:506
int ldap_add_attr(struct ldap_add *ladd, const char *attr,...)
Add a attribute to new DN.
Definition: openldap.c:1500
struct bucket_loop * init_bucket_loop(struct bucket_list *blist)
Create a bucket list iterator to safely iterate the list.
Definition: refobj.c:640
struct ldap_attr * prev
Previous attribute.
Definition: dtsapp.h:749
Bucket list, hold hashed objects in buckets.
Definition: refobj.c:75