annotate src/lib-dict-extra/dict-ldap.c @ 20066:f215c409c86d

lib-dict: Moved dict-ldap to lib-dict-extra This also allows moving lib-ldap away from LIBDOVECOT_SUBDIRS in src/Makefile.am, which was wrong because it's not really part of libdovecot.la.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 21 Apr 2016 18:58:10 +0300
parents src/lib-dict/dict-ldap.c@0ef427d75bab
children af1d619d2f55
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
19998
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1 /* Copyright (c) 2016 Dovecot authors, see the included COPYING memcached */
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
2
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
3 #include "lib.h"
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
4 #include "array.h"
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
5 #include "module-dir.h"
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
6 #include "str.h"
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
7 #include "istream.h"
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
8 #include "ostream.h"
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
9 #include "var-expand.h"
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
10 #include "connection.h"
20022
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
11 #include "llist.h"
19998
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
12 #include "ldap-client.h"
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
13 #include "dict.h"
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
14 #include "dict-private.h"
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
15 #include "dict-ldap-settings.h"
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
16
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
17 struct ldap_dict;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
18
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
19 struct dict_ldap_op {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
20 struct ldap_dict *dict;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
21 const struct dict_ldap_map *map;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
22 pool_t pool;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
23 unsigned long txid;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
24 struct dict_lookup_result res;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
25 dict_lookup_callback_t *callback;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
26 void *callback_ctx;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
27 };
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
28
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
29 struct ldap_dict {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
30 struct dict dict;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
31 struct dict_ldap_settings *set;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
32
20022
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
33 const char *uri;
19998
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
34 const char *username;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
35 const char *base_dn;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
36 enum ldap_scope scope;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
37
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
38 pool_t pool;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
39
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
40 struct ldap_client *client;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
41 struct ioloop *ioloop, *prev_ioloop;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
42
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
43 unsigned long last_txid;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
44 unsigned int pending;
20022
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
45
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
46 struct ldap_dict *prev,*next;
19998
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
47 };
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
48
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
49 static
20022
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
50 struct ldap_dict *ldap_dict_list;
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
51
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
52 static
19998
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
53 void ldap_dict_lookup_async(struct dict *dict, const char *key,
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
54 dict_lookup_callback_t *callback, void *context);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
55
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
56
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
57 static bool
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
58 dict_ldap_map_match(const struct dict_ldap_map *map, const char *path,
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
59 ARRAY_TYPE(const_string) *values, unsigned int *pat_len_r,
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
60 unsigned int *path_len_r, bool partial_ok, bool recurse)
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
61 {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
62 const char *path_start = path;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
63 const char *pat, *attribute, *p;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
64 unsigned int len;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
65
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
66 array_clear(values);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
67 pat = map->pattern;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
68 while (*pat != '\0' && *path != '\0') {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
69 if (*pat == '$') {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
70 /* variable */
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
71 pat++;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
72 if (*pat == '\0') {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
73 /* pattern ended with this variable,
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
74 it'll match the rest of the path */
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
75 len = strlen(path);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
76 if (partial_ok) {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
77 /* iterating - the last field never
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
78 matches fully. if there's a trailing
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
79 '/', drop it. */
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
80 pat--;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
81 if (path[len-1] == '/') {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
82 attribute = t_strndup(path, len-1);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
83 array_append(values, &attribute, 1);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
84 } else {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
85 array_append(values, &path, 1);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
86 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
87 } else {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
88 array_append(values, &path, 1);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
89 path += len;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
90 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
91 *path_len_r = path - path_start;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
92 *pat_len_r = pat - map->pattern;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
93 return TRUE;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
94 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
95 /* pattern matches until the next '/' in path */
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
96 p = strchr(path, '/');
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
97 if (p != NULL) {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
98 attribute = t_strdup_until(path, p);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
99 array_append(values, &attribute, 1);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
100 path = p;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
101 } else {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
102 /* no '/' anymore, but it'll still match a
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
103 partial */
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
104 array_append(values, &path, 1);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
105 path += strlen(path);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
106 pat++;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
107 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
108 } else if (*pat == *path) {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
109 pat++;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
110 path++;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
111 } else {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
112 return FALSE;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
113 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
114 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
115
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
116 *path_len_r = path - path_start;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
117 *pat_len_r = pat - map->pattern;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
118
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
119 if (*pat == '\0')
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
120 return *path == '\0';
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
121 else if (!partial_ok)
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
122 return FALSE;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
123 else {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
124 /* partial matches must end with '/'. */
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
125 if (pat != map->pattern && pat[-1] != '/')
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
126 return FALSE;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
127 /* if we're not recursing, there should be only one $variable
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
128 left. */
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
129 if (recurse)
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
130 return TRUE;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
131 return pat[0] == '$' && strchr(pat, '/') == NULL;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
132 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
133 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
134
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
135 static const struct dict_ldap_map *
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
136 ldap_dict_find_map(struct ldap_dict *dict, const char *path,
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
137 ARRAY_TYPE(const_string) *values)
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
138 {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
139 const struct dict_ldap_map *maps;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
140 unsigned int i, count, len;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
141
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
142 t_array_init(values, dict->set->max_attribute_count);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
143 maps = array_get(&dict->set->maps, &count);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
144 for (i = 0; i < count; i++) {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
145 if (dict_ldap_map_match(&maps[i], path, values,
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
146 &len, &len, FALSE, FALSE))
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
147 return &maps[i];
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
148 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
149 return NULL;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
150 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
151
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
152 static
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
153 int dict_ldap_connect(struct ldap_dict *dict, const char **error_r)
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
154 {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
155 struct ldap_client_settings set;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
156 memset(&set, 0, sizeof(set));
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
157 set.uri = dict->set->uri;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
158 set.bind_dn = dict->set->bind_dn;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
159 set.password = dict->set->password;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
160 set.timeout_secs = dict->set->timeout;
20021
ec90d9339b2a lib-ldap: Max idle time is seconds
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19999
diff changeset
161 set.max_idle_time_secs = dict->set->max_idle_time;
19998
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
162 set.debug = dict->set->debug;
20026
99c8c9870e3a lib-dict: Add option to enforce SSL
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20022
diff changeset
163 set.require_ssl = dict->set->require_ssl;
20027
d3715fc0031a lib-ldap: Allow disabling of TLS
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20026
diff changeset
164 set.start_tls = dict->set->start_tls;
19998
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
165 return ldap_client_init(&set, &dict->client, error_r);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
166 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
167
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
168 static
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
169 const char* ldap_dict_build_query(struct ldap_dict *dict, const struct dict_ldap_map *map, ARRAY_TYPE(const_string) *values, bool priv)
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
170 {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
171 const char *template;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
172 ARRAY(struct var_expand_table) exp;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
173 struct var_expand_table entry;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
174 string_t *query = t_str_new(64);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
175
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
176 t_array_init(&exp, 8);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
177 entry.key = '\0';
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
178 entry.value = dict->username;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
179 entry.long_key = "username";
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
180 array_append(&exp, &entry, 1);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
181
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
182 if (priv) {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
183 template = t_strdup_printf("(&(%s=%s)%s)", map->username_attribute, "%{username}", map->filter);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
184 } else {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
185 template = map->filter;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
186 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
187
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
188 for(size_t i = 0; i < array_count(values) && i < array_count(&(map->ldap_attributes)); i++) {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
189 struct var_expand_table entry;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
190 entry.value = *array_idx(values, i);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
191 entry.long_key = *array_idx(&(map->ldap_attributes), i);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
192 array_append(&exp, &entry, 1);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
193 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
194
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
195 array_append_zero(&exp);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
196
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
197 var_expand(query, template, array_idx(&exp, 0));
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
198
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
199 return str_c(query);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
200 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
201
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
202 static
20022
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
203 int ldap_dict_create(struct dict *dict_driver, const char *uri,
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
204 const struct dict_settings *set,
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
205 struct dict **dict_r, const char **error_r)
19998
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
206 {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
207 pool_t pool = pool_alloconly_create("ldap dict", 2048);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
208 struct ldap_dict *dict = p_new(pool, struct ldap_dict, 1);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
209 dict->pool = pool;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
210 dict->dict = *dict_driver;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
211 dict->username = p_strdup(pool, set->username);
20022
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
212 dict->uri = p_strdup(pool, uri);
19998
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
213 dict->set = dict_ldap_settings_read(pool, uri, error_r);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
214
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
215 if (dict->set == NULL) {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
216 pool_unref(&pool);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
217 return -1;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
218 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
219
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
220 if (dict_ldap_connect(dict, error_r) < 0) {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
221 pool_unref(&pool);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
222 return -1;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
223 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
224
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
225 *dict_r = (struct dict*)dict;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
226 *error_r = NULL;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
227
20022
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
228 DLLIST_PREPEND(&ldap_dict_list, dict);
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
229
19998
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
230 return 0;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
231 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
232
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
233 static
20022
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
234 int ldap_dict_init(struct dict *dict_driver, const char *uri,
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
235 const struct dict_settings *set,
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
236 struct dict **dict_r, const char **error_r)
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
237 {
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
238 /* reuse possible existing entry */
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
239 for(struct ldap_dict *ptr = ldap_dict_list;
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
240 ptr != NULL;
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
241 ptr = ptr->next) {
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
242 if (strcmp(ptr->uri, uri) == 0) {
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
243 *dict_r = (struct dict*)ptr;
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
244 return 0;
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
245 }
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
246 }
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
247 return ldap_dict_create(dict_driver, uri, set, dict_r, error_r);
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
248 }
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
249
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
250 static
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
251 void ldap_dict_deinit(struct dict *dict ATTR_UNUSED) {
19998
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
252 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
253
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
254 static
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
255 int ldap_dict_wait(struct dict *dict) {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
256 struct ldap_dict *ctx = (struct ldap_dict *)dict;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
257
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
258 i_assert(ctx->ioloop == NULL);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
259
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
260 ctx->prev_ioloop = current_ioloop;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
261 ctx->ioloop = io_loop_create();
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
262 ldap_client_switch_ioloop(ctx->client);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
263
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
264 do {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
265 io_loop_run(current_ioloop);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
266 } while (ctx->pending > 0);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
267
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
268 io_loop_set_current(ctx->prev_ioloop);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
269 ldap_client_switch_ioloop(ctx->client);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
270 io_loop_set_current(ctx->ioloop);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
271 io_loop_destroy(&ctx->ioloop);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
272 ctx->prev_ioloop = NULL;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
273
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
274 return 0;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
275 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
276
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
277 static
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
278 void ldap_dict_lookup_done(const struct dict_lookup_result *result, void *ctx)
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
279 {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
280 struct dict_lookup_result *res = ctx;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
281 *res = *result;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
282 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
283
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
284 static void
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
285 ldap_dict_lookup_callback(struct ldap_result *result, struct dict_ldap_op *op)
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
286 {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
287 pool_t pool = op->pool;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
288 struct ldap_search_iterator *iter;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
289 const struct ldap_entry *entry;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
290
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
291 op->dict->pending--;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
292
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
293 if (ldap_result_has_failed(result)) {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
294 op->res.ret = -1;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
295 op->res.error = ldap_result_get_error(result);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
296 } else {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
297 iter = ldap_search_iterator_init(result);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
298 entry = ldap_search_iterator_next(iter);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
299 if (entry != NULL) {
20028
0ef427d75bab lib-dict: Disable debug log unless debug enabled
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20027
diff changeset
300 if (op->dict->set->debug > 0)
0ef427d75bab lib-dict: Disable debug log unless debug enabled
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20027
diff changeset
301 i_debug("ldap_dict_lookup_callback got dn %s", ldap_entry_dn(entry));
19998
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
302 /* try extract value */
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
303 const char *const *values = ldap_entry_get_attribute(entry, op->map->value_attribute);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
304 if (values != NULL) {
20028
0ef427d75bab lib-dict: Disable debug log unless debug enabled
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20027
diff changeset
305 if (op->dict->set->debug > 0)
0ef427d75bab lib-dict: Disable debug log unless debug enabled
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20027
diff changeset
306 i_debug("ldap_dict_lookup_callback got attribute %s", op->map->value_attribute);
19998
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
307 op->res.ret = 1;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
308 op->res.value = p_strdup(op->pool, values[0]);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
309 } else {
20028
0ef427d75bab lib-dict: Disable debug log unless debug enabled
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20027
diff changeset
310 if (op->dict->set->debug > 0)
0ef427d75bab lib-dict: Disable debug log unless debug enabled
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20027
diff changeset
311 i_debug("ldap_dict_lookup_callback dit not get attribute %s", op->map->value_attribute);
19998
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
312 op->res.value = NULL;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
313 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
314 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
315 ldap_search_iterator_deinit(&iter);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
316 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
317 op->callback(&(op->res), op->callback_ctx);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
318 pool_unref(&pool);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
319 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
320
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
321 static
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
322 int ldap_dict_lookup(struct dict *dict, pool_t pool,
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
323 const char *key, const char **value_r)
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
324 {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
325 struct dict_lookup_result res;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
326 pool_t orig_pool = pool;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
327 int ret;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
328
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
329 T_BEGIN {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
330 ldap_dict_lookup_async(dict, key, ldap_dict_lookup_done, &res);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
331
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
332 if ((ret = ldap_dict_wait(dict)) == 0) {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
333 if (res.ret == 0) {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
334 *value_r = p_strdup(orig_pool, res.value);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
335 } else ret = res.ret;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
336 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
337 } T_END;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
338 return ret;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
339 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
340
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
341 /*
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
342 static
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
343 struct dict_iterate_context *ldap_dict_iterate_init(struct dict *dict,
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
344 const char *const *paths,
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
345 enum dict_iterate_flags flags)
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
346 {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
347 return NULL;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
348 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
349
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
350 static
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
351 bool ldap_dict_iterate(struct dict_iterate_context *ctx,
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
352 const char **key_r, const char **value_r)
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
353 {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
354 return FALSE;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
355 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
356
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
357 static
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
358 int ldap_dict_iterate_deinit(struct dict_iterate_context *ctx)
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
359 {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
360 return -1;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
361 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
362
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
363 static
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
364 struct dict_transaction_context ldap_dict_transaction_init(struct dict *dict);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
365
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
366 static
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
367 int ldap_dict_transaction_commit(struct dict_transaction_context *ctx,
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
368 bool async,
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
369 dict_transaction_commit_callback_t *callback,
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
370 void *context);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
371 static
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
372 void ldap_dict_transaction_rollback(struct dict_transaction_context *ctx);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
373
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
374 static
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
375 void ldap_dict_set(struct dict_transaction_context *ctx,
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
376 const char *key, const char *value);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
377 static
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
378 void ldap_dict_unset(struct dict_transaction_context *ctx,
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
379 const char *key);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
380 static
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
381 void ldap_dict_append(struct dict_transaction_context *ctx,
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
382 const char *key, const char *value);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
383 static
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
384 void ldap_dict_atomic_inc(struct dict_transaction_context *ctx,
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
385 const char *key, long long diff);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
386 */
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
387
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
388 static
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
389 void ldap_dict_lookup_async(struct dict *dict, const char *key,
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
390 dict_lookup_callback_t *callback, void *context)
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
391 {
19999
c7d2176aa48f dict-ldap: Compiler warning fix
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19998
diff changeset
392 struct ldap_search_input input;
19998
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
393 struct ldap_dict *ctx = (struct ldap_dict*)dict;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
394 struct dict_ldap_op *op;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
395 pool_t oppool = pool_alloconly_create("ldap dict lookup", 64);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
396 op = p_new(oppool, struct dict_ldap_op, 1);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
397 op->pool = oppool;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
398 op->dict = ctx;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
399 op->callback = callback;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
400 op->callback_ctx = context;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
401 op->txid = ctx->last_txid++;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
402
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
403 /* key needs to be transformed into something else */
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
404 ARRAY_TYPE(const_string) values;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
405 T_BEGIN {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
406 const char *attributes[2] = {0, 0};
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
407 t_array_init(&values, 8);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
408 const struct dict_ldap_map *map = ldap_dict_find_map(ctx, key, &values);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
409
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
410 if (map != NULL) {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
411 op->map = map;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
412 attributes[0] = map->value_attribute;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
413 /* build lookup */
19999
c7d2176aa48f dict-ldap: Compiler warning fix
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19998
diff changeset
414 memset(&input, 0, sizeof(input));
19998
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
415 input.base_dn = map->base_dn;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
416 input.scope = map->scope_val;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
417 input.filter = ldap_dict_build_query(ctx, map, &values, strncmp(key, DICT_PATH_PRIVATE, strlen(DICT_PATH_PRIVATE))==0);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
418 input.attributes = attributes;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
419 input.timeout_secs = ctx->set->timeout;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
420 ctx->pending++;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
421 ldap_search_start(ctx->client, &input, ldap_dict_lookup_callback, op);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
422 } else {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
423 op->res.error = "no such key";
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
424 callback(&(op->res), context);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
425 pool_unref(&oppool);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
426 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
427 } T_END;
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
428 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
429
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
430 struct dict dict_driver_ldap = {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
431 .name = "ldap",
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
432 {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
433 ldap_dict_init,
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
434 ldap_dict_deinit,
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
435 ldap_dict_wait,
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
436 ldap_dict_lookup,
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
437 NULL, /*ldap_dict_iterate_init,*/
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
438 NULL, /*ldap_dict_iterate,*/
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
439 NULL, /*ldap_dict_iterate_deinit,*/
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
440 NULL, /*ldap_transaction_init,*/
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
441 NULL, /*ldap_transaction_commit,*/
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
442 NULL, /*ldap_transaction_rollback,*/
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
443 NULL, /*ldap_set,*/
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
444 NULL, /*ldap_unset,*/
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
445 NULL, /*ldap_append,*/
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
446 NULL, /*ldap_atomic_inc,*/
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
447 ldap_dict_lookup_async
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
448 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
449 };
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
450
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
451 void dict_ldap_init(struct module *module ATTR_UNUSED);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
452 void dict_ldap_deinit(void);
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
453
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
454 void dict_ldap_init(struct module *module ATTR_UNUSED)
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
455 {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
456 dict_driver_register(&dict_driver_ldap);
20022
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
457 ldap_dict_list = NULL;
19998
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
458 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
459
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
460 void dict_ldap_deinit(void)
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
461 {
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
462 dict_driver_unregister(&dict_driver_ldap);
20022
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
463 /* destroy all server connections */
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
464 struct ldap_dict *ptr = ldap_dict_list;
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
465 ldap_dict_list = NULL;
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
466
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
467 while(ptr != NULL) {
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
468 ldap_client_deinit(&(ptr->client));
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
469 pool_t pool = ptr->pool;
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
470 ptr = ptr->next;
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
471 pool_unref(&pool);
2d04cf31950c lib-dict: Reuse LDAP connections
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20021
diff changeset
472 }
19998
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
473 }
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
474
00c0c0d7707b lib-dict: Add ldap driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
475 const char *dict_ldap_plugin_dependencies[] = { NULL };