Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/auth/db-ldap.c @ 6148:668a768fc8fd HEAD
Removed deprecated pass_attrs and user_attrs configuration method.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 25 Jul 2007 09:11:43 +0300 |
parents | 45a12a1bd299 |
children | a744ae38a9e1 |
rev | line source |
---|---|
4426
b8089cf41c96
Check for sasl.h and sasl/sasl.h existence and use the one that's found. If
Timo Sirainen <tss@iki.fi>
parents:
4415
diff
changeset
|
1 /* Copyright (C) 2003-2006 Timo Sirainen */ |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
3474
9096b7957413
Removed direct config.h including. I'm not sure why it was done before,
Timo Sirainen <tss@iki.fi>
parents:
3306
diff
changeset
|
3 #include "common.h" |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #if defined(PASSDB_LDAP) || defined(USERDB_LDAP) |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 |
1075
f1401fa7ab03
auth process fixes, LDAP seems to be working (with the kludge define or
Timo Sirainen <tss@iki.fi>
parents:
1062
diff
changeset
|
7 #include "network.h" |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "ioloop.h" |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include "hash.h" |
1189
2cb8e2136283
Escape special chars in username if needed.
Timo Sirainen <tss@iki.fi>
parents:
1182
diff
changeset
|
10 #include "str.h" |
5884
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
11 #include "var-expand.h" |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 #include "settings.h" |
3502
5e78500f1aee
user_global_uid and user_global_gid settings weren't working. Also changed
Timo Sirainen <tss@iki.fi>
parents:
3474
diff
changeset
|
13 #include "userdb.h" |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 #include "db-ldap.h" |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 #include <stddef.h> |
1610
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1330
diff
changeset
|
17 #include <stdlib.h> |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 |
4426
b8089cf41c96
Check for sasl.h and sasl/sasl.h existence and use the one that's found. If
Timo Sirainen <tss@iki.fi>
parents:
4415
diff
changeset
|
19 #define HAVE_LDAP_SASL |
4427
ffafc8583e06
Prefer sasl/sasl.h. Require SASL v2, otherwise disable it.
Timo Sirainen <tss@iki.fi>
parents:
4426
diff
changeset
|
20 #ifdef HAVE_SASL_SASL_H |
ffafc8583e06
Prefer sasl/sasl.h. Require SASL v2, otherwise disable it.
Timo Sirainen <tss@iki.fi>
parents:
4426
diff
changeset
|
21 # include <sasl/sasl.h> |
ffafc8583e06
Prefer sasl/sasl.h. Require SASL v2, otherwise disable it.
Timo Sirainen <tss@iki.fi>
parents:
4426
diff
changeset
|
22 #elif defined (HAVE_SASL_H) |
4426
b8089cf41c96
Check for sasl.h and sasl/sasl.h existence and use the one that's found. If
Timo Sirainen <tss@iki.fi>
parents:
4415
diff
changeset
|
23 # include <sasl.h> |
b8089cf41c96
Check for sasl.h and sasl/sasl.h existence and use the one that's found. If
Timo Sirainen <tss@iki.fi>
parents:
4415
diff
changeset
|
24 #else |
b8089cf41c96
Check for sasl.h and sasl/sasl.h existence and use the one that's found. If
Timo Sirainen <tss@iki.fi>
parents:
4415
diff
changeset
|
25 # undef HAVE_LDAP_SASL |
b8089cf41c96
Check for sasl.h and sasl/sasl.h existence and use the one that's found. If
Timo Sirainen <tss@iki.fi>
parents:
4415
diff
changeset
|
26 #endif |
4427
ffafc8583e06
Prefer sasl/sasl.h. Require SASL v2, otherwise disable it.
Timo Sirainen <tss@iki.fi>
parents:
4426
diff
changeset
|
27 #if SASL_VERSION_MAJOR < 2 |
ffafc8583e06
Prefer sasl/sasl.h. Require SASL v2, otherwise disable it.
Timo Sirainen <tss@iki.fi>
parents:
4426
diff
changeset
|
28 # undef HAVE_LDAP_SASL |
ffafc8583e06
Prefer sasl/sasl.h. Require SASL v2, otherwise disable it.
Timo Sirainen <tss@iki.fi>
parents:
4426
diff
changeset
|
29 #endif |
4426
b8089cf41c96
Check for sasl.h and sasl/sasl.h existence and use the one that's found. If
Timo Sirainen <tss@iki.fi>
parents:
4415
diff
changeset
|
30 |
4806 | 31 #ifndef LDAP_SASL_QUIET |
32 # define LDAP_SASL_QUIET 0 /* Doesn't exist in Solaris LDAP */ | |
33 #endif | |
34 | |
1181
ac7dbb236b59
Rather than block for two seconds, we can just call ldap_result() again if
Timo Sirainen <tss@iki.fi>
parents:
1143
diff
changeset
|
35 /* Older versions may require calling ldap_result() twice */ |
ac7dbb236b59
Rather than block for two seconds, we can just call ldap_result() again if
Timo Sirainen <tss@iki.fi>
parents:
1143
diff
changeset
|
36 #if LDAP_VENDOR_VERSION <= 20112 |
1086
067130d609b7
Define OPENLDAP_ASYNC_WORKAROUND
Timo Sirainen <tss@iki.fi>
parents:
1075
diff
changeset
|
37 # define OPENLDAP_ASYNC_WORKAROUND |
067130d609b7
Define OPENLDAP_ASYNC_WORKAROUND
Timo Sirainen <tss@iki.fi>
parents:
1075
diff
changeset
|
38 #endif |
067130d609b7
Define OPENLDAP_ASYNC_WORKAROUND
Timo Sirainen <tss@iki.fi>
parents:
1075
diff
changeset
|
39 |
2325
7613e0f68513
Fixed to compile with Solaris LDAP library
Timo Sirainen <tss@iki.fi>
parents:
1910
diff
changeset
|
40 /* Solaris LDAP library doesn't have LDAP_OPT_SUCCESS */ |
7613e0f68513
Fixed to compile with Solaris LDAP library
Timo Sirainen <tss@iki.fi>
parents:
1910
diff
changeset
|
41 #ifndef LDAP_OPT_SUCCESS |
7613e0f68513
Fixed to compile with Solaris LDAP library
Timo Sirainen <tss@iki.fi>
parents:
1910
diff
changeset
|
42 # define LDAP_OPT_SUCCESS LDAP_SUCCESS |
7613e0f68513
Fixed to compile with Solaris LDAP library
Timo Sirainen <tss@iki.fi>
parents:
1910
diff
changeset
|
43 #endif |
7613e0f68513
Fixed to compile with Solaris LDAP library
Timo Sirainen <tss@iki.fi>
parents:
1910
diff
changeset
|
44 |
5884
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
45 struct db_ldap_result_iterate_context { |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
46 struct ldap_connection *conn; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
47 LDAPMessage *entry; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
48 struct auth_request *auth_request; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
49 |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
50 struct hash_table *attr_map; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
51 struct var_expand_table *var_table; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
52 |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
53 char *attr, **vals; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
54 const char *name, *value, *template, *val_1_arr[2]; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
55 BerElement *ber; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
56 |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
57 string_t *var, *debug; |
6144
d779b7220e23
LDAP crashfixes. Based on patch by Katsu Yamamoto.
Timo Sirainen <tss@iki.fi>
parents:
5884
diff
changeset
|
58 unsigned int value_idx; |
5884
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
59 }; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
60 |
5474
331337b735c9
Added type checks to setting defines.
Timo Sirainen <tss@iki.fi>
parents:
5040
diff
changeset
|
61 #define DEF_STR(name) DEF_STRUCT_STR(name, ldap_settings) |
331337b735c9
Added type checks to setting defines.
Timo Sirainen <tss@iki.fi>
parents:
5040
diff
changeset
|
62 #define DEF_INT(name) DEF_STRUCT_INT(name, ldap_settings) |
331337b735c9
Added type checks to setting defines.
Timo Sirainen <tss@iki.fi>
parents:
5040
diff
changeset
|
63 #define DEF_BOOL(name) DEF_STRUCT_BOOL(name, ldap_settings) |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 static struct setting_def setting_defs[] = { |
5474
331337b735c9
Added type checks to setting defines.
Timo Sirainen <tss@iki.fi>
parents:
5040
diff
changeset
|
66 DEF_STR(hosts), |
331337b735c9
Added type checks to setting defines.
Timo Sirainen <tss@iki.fi>
parents:
5040
diff
changeset
|
67 DEF_STR(uris), |
331337b735c9
Added type checks to setting defines.
Timo Sirainen <tss@iki.fi>
parents:
5040
diff
changeset
|
68 DEF_STR(dn), |
331337b735c9
Added type checks to setting defines.
Timo Sirainen <tss@iki.fi>
parents:
5040
diff
changeset
|
69 DEF_STR(dnpass), |
331337b735c9
Added type checks to setting defines.
Timo Sirainen <tss@iki.fi>
parents:
5040
diff
changeset
|
70 DEF_BOOL(auth_bind), |
331337b735c9
Added type checks to setting defines.
Timo Sirainen <tss@iki.fi>
parents:
5040
diff
changeset
|
71 DEF_STR(auth_bind_userdn), |
331337b735c9
Added type checks to setting defines.
Timo Sirainen <tss@iki.fi>
parents:
5040
diff
changeset
|
72 DEF_BOOL(tls), |
331337b735c9
Added type checks to setting defines.
Timo Sirainen <tss@iki.fi>
parents:
5040
diff
changeset
|
73 DEF_BOOL(sasl_bind), |
331337b735c9
Added type checks to setting defines.
Timo Sirainen <tss@iki.fi>
parents:
5040
diff
changeset
|
74 DEF_STR(sasl_mech), |
331337b735c9
Added type checks to setting defines.
Timo Sirainen <tss@iki.fi>
parents:
5040
diff
changeset
|
75 DEF_STR(sasl_realm), |
331337b735c9
Added type checks to setting defines.
Timo Sirainen <tss@iki.fi>
parents:
5040
diff
changeset
|
76 DEF_STR(sasl_authz_id), |
331337b735c9
Added type checks to setting defines.
Timo Sirainen <tss@iki.fi>
parents:
5040
diff
changeset
|
77 DEF_STR(deref), |
331337b735c9
Added type checks to setting defines.
Timo Sirainen <tss@iki.fi>
parents:
5040
diff
changeset
|
78 DEF_STR(scope), |
331337b735c9
Added type checks to setting defines.
Timo Sirainen <tss@iki.fi>
parents:
5040
diff
changeset
|
79 DEF_STR(base), |
331337b735c9
Added type checks to setting defines.
Timo Sirainen <tss@iki.fi>
parents:
5040
diff
changeset
|
80 DEF_INT(ldap_version), |
331337b735c9
Added type checks to setting defines.
Timo Sirainen <tss@iki.fi>
parents:
5040
diff
changeset
|
81 DEF_STR(user_attrs), |
331337b735c9
Added type checks to setting defines.
Timo Sirainen <tss@iki.fi>
parents:
5040
diff
changeset
|
82 DEF_STR(user_filter), |
331337b735c9
Added type checks to setting defines.
Timo Sirainen <tss@iki.fi>
parents:
5040
diff
changeset
|
83 DEF_STR(pass_attrs), |
331337b735c9
Added type checks to setting defines.
Timo Sirainen <tss@iki.fi>
parents:
5040
diff
changeset
|
84 DEF_STR(pass_filter), |
331337b735c9
Added type checks to setting defines.
Timo Sirainen <tss@iki.fi>
parents:
5040
diff
changeset
|
85 DEF_STR(default_pass_scheme), |
3913
af15aab60ff1
Settings' default listing wasn't ended properly, which could have caused
Timo Sirainen <tss@iki.fi>
parents:
3908
diff
changeset
|
86 |
af15aab60ff1
Settings' default listing wasn't ended properly, which could have caused
Timo Sirainen <tss@iki.fi>
parents:
3908
diff
changeset
|
87 { 0, NULL, 0 } |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 }; |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 struct ldap_settings default_ldap_settings = { |
1910 | 91 MEMBER(hosts) NULL, |
92 MEMBER(uris) NULL, | |
1075
f1401fa7ab03
auth process fixes, LDAP seems to be working (with the kludge define or
Timo Sirainen <tss@iki.fi>
parents:
1062
diff
changeset
|
93 MEMBER(dn) NULL, |
f1401fa7ab03
auth process fixes, LDAP seems to be working (with the kludge define or
Timo Sirainen <tss@iki.fi>
parents:
1062
diff
changeset
|
94 MEMBER(dnpass) NULL, |
3771
4b6d962485b9
Added authentication bind support. Patch by J.M. Maurer.
Timo Sirainen <tss@iki.fi>
parents:
3731
diff
changeset
|
95 MEMBER(auth_bind) FALSE, |
3840
935f12d0d2fe
Added fast authbinding and auth_bind_userdn setting. Patch by Geff
Timo Sirainen <tss@iki.fi>
parents:
3771
diff
changeset
|
96 MEMBER(auth_bind_userdn) NULL, |
4415
b91816cd1d16
Added TLS support for LDAP if the library supports it.
Timo Sirainen <tss@iki.fi>
parents:
4405
diff
changeset
|
97 MEMBER(tls) FALSE, |
4319
31a28cd0b020
Added support for SASL binding. Patch by Geert Jansen
Timo Sirainen <tss@iki.fi>
parents:
4295
diff
changeset
|
98 MEMBER(sasl_bind) FALSE, |
31a28cd0b020
Added support for SASL binding. Patch by Geert Jansen
Timo Sirainen <tss@iki.fi>
parents:
4295
diff
changeset
|
99 MEMBER(sasl_mech) NULL, |
31a28cd0b020
Added support for SASL binding. Patch by Geert Jansen
Timo Sirainen <tss@iki.fi>
parents:
4295
diff
changeset
|
100 MEMBER(sasl_realm) NULL, |
31a28cd0b020
Added support for SASL binding. Patch by Geert Jansen
Timo Sirainen <tss@iki.fi>
parents:
4295
diff
changeset
|
101 MEMBER(sasl_authz_id) NULL, |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 MEMBER(deref) "never", |
1135
81930fff13cf
passdb ldap added. fixes to userdb ldap.
Timo Sirainen <tss@iki.fi>
parents:
1086
diff
changeset
|
103 MEMBER(scope) "subtree", |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 MEMBER(base) NULL, |
1282 | 105 MEMBER(ldap_version) 2, |
6147
45a12a1bd299
Changed default pass_attrs and user_attrs to use the new format.
Timo Sirainen <tss@iki.fi>
parents:
6144
diff
changeset
|
106 MEMBER(user_attrs) "homeDirectory=home,uidNumber=uid,gidNumber=gid", |
3094
d78e9a31b6d8
Move default filters/attrs to setting defaults rather than check it from
Timo Sirainen <tss@iki.fi>
parents:
2994
diff
changeset
|
107 MEMBER(user_filter) "(&(objectClass=posixAccount)(uid=%u))", |
6147
45a12a1bd299
Changed default pass_attrs and user_attrs to use the new format.
Timo Sirainen <tss@iki.fi>
parents:
6144
diff
changeset
|
108 MEMBER(pass_attrs) "uid=user,userPassword=password", |
3094
d78e9a31b6d8
Move default filters/attrs to setting defaults rather than check it from
Timo Sirainen <tss@iki.fi>
parents:
2994
diff
changeset
|
109 MEMBER(pass_filter) "(&(objectClass=posixAccount)(uid=%u))", |
5872
93bd157917ca
Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents:
5554
diff
changeset
|
110 MEMBER(default_pass_scheme) "crypt" |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 }; |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 |
1143
50f10a7a3bad
Use the same LDAP connection for both userdb and passdb if config_path is
Timo Sirainen <tss@iki.fi>
parents:
1141
diff
changeset
|
113 static struct ldap_connection *ldap_connections = NULL; |
50f10a7a3bad
Use the same LDAP connection for both userdb and passdb if config_path is
Timo Sirainen <tss@iki.fi>
parents:
1141
diff
changeset
|
114 |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
115 static int db_ldap_bind(struct ldap_connection *conn); |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3840
diff
changeset
|
116 static void ldap_conn_close(struct ldap_connection *conn, bool flush_requests); |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 static int deref2str(const char *str) |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 { |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 if (strcasecmp(str, "never") == 0) |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 return LDAP_DEREF_NEVER; |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 if (strcasecmp(str, "searching") == 0) |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 return LDAP_DEREF_SEARCHING; |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 if (strcasecmp(str, "finding") == 0) |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 return LDAP_DEREF_FINDING; |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
126 if (strcasecmp(str, "always") == 0) |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 return LDAP_DEREF_ALWAYS; |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 i_fatal("LDAP: Unknown deref option '%s'", str); |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 } |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
131 |
1135
81930fff13cf
passdb ldap added. fixes to userdb ldap.
Timo Sirainen <tss@iki.fi>
parents:
1086
diff
changeset
|
132 static int scope2str(const char *str) |
81930fff13cf
passdb ldap added. fixes to userdb ldap.
Timo Sirainen <tss@iki.fi>
parents:
1086
diff
changeset
|
133 { |
81930fff13cf
passdb ldap added. fixes to userdb ldap.
Timo Sirainen <tss@iki.fi>
parents:
1086
diff
changeset
|
134 if (strcasecmp(str, "base") == 0) |
81930fff13cf
passdb ldap added. fixes to userdb ldap.
Timo Sirainen <tss@iki.fi>
parents:
1086
diff
changeset
|
135 return LDAP_SCOPE_BASE; |
81930fff13cf
passdb ldap added. fixes to userdb ldap.
Timo Sirainen <tss@iki.fi>
parents:
1086
diff
changeset
|
136 if (strcasecmp(str, "onelevel") == 0) |
81930fff13cf
passdb ldap added. fixes to userdb ldap.
Timo Sirainen <tss@iki.fi>
parents:
1086
diff
changeset
|
137 return LDAP_SCOPE_ONELEVEL; |
81930fff13cf
passdb ldap added. fixes to userdb ldap.
Timo Sirainen <tss@iki.fi>
parents:
1086
diff
changeset
|
138 if (strcasecmp(str, "subtree") == 0) |
81930fff13cf
passdb ldap added. fixes to userdb ldap.
Timo Sirainen <tss@iki.fi>
parents:
1086
diff
changeset
|
139 return LDAP_SCOPE_SUBTREE; |
81930fff13cf
passdb ldap added. fixes to userdb ldap.
Timo Sirainen <tss@iki.fi>
parents:
1086
diff
changeset
|
140 |
81930fff13cf
passdb ldap added. fixes to userdb ldap.
Timo Sirainen <tss@iki.fi>
parents:
1086
diff
changeset
|
141 i_fatal("LDAP: Unknown scope option '%s'", str); |
81930fff13cf
passdb ldap added. fixes to userdb ldap.
Timo Sirainen <tss@iki.fi>
parents:
1086
diff
changeset
|
142 } |
81930fff13cf
passdb ldap added. fixes to userdb ldap.
Timo Sirainen <tss@iki.fi>
parents:
1086
diff
changeset
|
143 |
5006
129aa779a7f8
Last change for making ldap_bind() error handling better was actually
Timo Sirainen <tss@iki.fi>
parents:
4996
diff
changeset
|
144 static int ldap_get_errno(struct ldap_connection *conn) |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 { |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
146 int ret, err; |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 ret = ldap_get_option(conn->ld, LDAP_OPT_ERROR_NUMBER, (void *) &err); |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 if (ret != LDAP_SUCCESS) { |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 i_error("LDAP: Can't get error number: %s", |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 ldap_err2string(ret)); |
5006
129aa779a7f8
Last change for making ldap_bind() error handling better was actually
Timo Sirainen <tss@iki.fi>
parents:
4996
diff
changeset
|
152 return -1; |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 } |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 |
5006
129aa779a7f8
Last change for making ldap_bind() error handling better was actually
Timo Sirainen <tss@iki.fi>
parents:
4996
diff
changeset
|
155 return err; |
129aa779a7f8
Last change for making ldap_bind() error handling better was actually
Timo Sirainen <tss@iki.fi>
parents:
4996
diff
changeset
|
156 } |
129aa779a7f8
Last change for making ldap_bind() error handling better was actually
Timo Sirainen <tss@iki.fi>
parents:
4996
diff
changeset
|
157 |
129aa779a7f8
Last change for making ldap_bind() error handling better was actually
Timo Sirainen <tss@iki.fi>
parents:
4996
diff
changeset
|
158 const char *ldap_get_error(struct ldap_connection *conn) |
129aa779a7f8
Last change for making ldap_bind() error handling better was actually
Timo Sirainen <tss@iki.fi>
parents:
4996
diff
changeset
|
159 { |
129aa779a7f8
Last change for making ldap_bind() error handling better was actually
Timo Sirainen <tss@iki.fi>
parents:
4996
diff
changeset
|
160 return ldap_err2string(ldap_get_errno(conn)); |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 } |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
162 |
4772
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
163 void db_ldap_add_delayed_request(struct ldap_connection *conn, |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
164 struct ldap_request *request) |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
165 { |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
166 request->next = NULL; |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
167 |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
168 if (conn->delayed_requests_head == NULL) |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
169 conn->delayed_requests_head = request; |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
170 else |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
171 conn->delayed_requests_tail->next = request; |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
172 conn->delayed_requests_tail = request; |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
173 } |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
174 |
5037
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
175 static void db_ldap_handle_next_delayed_request(struct ldap_connection *conn) |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
176 { |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
177 struct ldap_request *request; |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
178 |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
179 if (conn->delayed_requests_head == NULL) |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
180 return; |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
181 |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
182 request = conn->delayed_requests_head; |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
183 conn->delayed_requests_head = request->next; |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
184 if (conn->delayed_requests_head == NULL) |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
185 conn->delayed_requests_tail = NULL; |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
186 |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
187 conn->retrying = TRUE; |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
188 if (request->filter == NULL) |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
189 request->callback(conn, request, NULL); |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
190 else |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
191 db_ldap_search(conn, request, conn->set.ldap_scope); |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
192 conn->retrying = FALSE; |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
193 } |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
194 |
3771
4b6d962485b9
Added authentication bind support. Patch by J.M. Maurer.
Timo Sirainen <tss@iki.fi>
parents:
3731
diff
changeset
|
195 void db_ldap_search(struct ldap_connection *conn, struct ldap_request *request, |
4b6d962485b9
Added authentication bind support. Patch by J.M. Maurer.
Timo Sirainen <tss@iki.fi>
parents:
3731
diff
changeset
|
196 int scope) |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
197 { |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
198 int msgid; |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 |
4742 | 200 if (db_ldap_connect(conn) < 0) { |
201 request->callback(conn, request, NULL); | |
202 return; | |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
203 } |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
204 |
5037
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
205 if (conn->connected && !conn->binding) { |
4751 | 206 if (conn->last_auth_bind) { |
207 /* switch back to the default dn before doing the | |
208 search request. */ | |
209 if (db_ldap_bind(conn) < 0) { | |
210 request->callback(conn, request, NULL); | |
211 return; | |
212 } | |
5554
522c50117d5d
Queue userdb lookup request until bind is finished (with auth_bind=yes).
Timo Sirainen <tss@iki.fi>
parents:
5474
diff
changeset
|
213 db_ldap_add_delayed_request(conn, request); |
522c50117d5d
Queue userdb lookup request until bind is finished (with auth_bind=yes).
Timo Sirainen <tss@iki.fi>
parents:
5474
diff
changeset
|
214 return; |
4751 | 215 } |
216 | |
217 msgid = ldap_search(conn->ld, request->base, scope, | |
218 request->filter, request->attributes, 0); | |
219 if (msgid == -1) { | |
220 i_error("LDAP: ldap_search() failed (filter %s): %s", | |
221 request->filter, ldap_get_error(conn)); | |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
222 request->callback(conn, request, NULL); |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
223 return; |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
224 } |
4772
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
225 hash_insert(conn->requests, POINTER_CAST(msgid), request); |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
226 } else { |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
227 db_ldap_add_delayed_request(conn, request); |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
228 } |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
229 } |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
230 |
3731
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
231 static void ldap_conn_retry_requests(struct ldap_connection *conn) |
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
232 { |
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
233 struct hash_table *old_requests; |
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
234 struct hash_iterate_context *iter; |
4772
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
235 struct ldap_request *request, **p, *next; |
3731
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
236 void *key, *value; |
4772
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
237 bool have_hash_binds = FALSE; |
3731
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
238 |
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
239 i_assert(conn->connected); |
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
240 |
4772
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
241 if (hash_size(conn->requests) == 0 && |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
242 conn->delayed_requests_head == NULL) |
3731
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
243 return; |
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
244 |
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
245 old_requests = conn->requests; |
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
246 conn->requests = hash_create(default_pool, conn->pool, 0, NULL, NULL); |
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
247 |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
248 conn->retrying = TRUE; |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
249 /* first retry all the search requests */ |
3731
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
250 iter = hash_iterate_init(old_requests); |
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
251 while (hash_iterate(iter, &key, &value)) { |
4772
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
252 request = value; |
3731
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
253 |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
254 if (request->filter == NULL) { |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
255 /* bind request */ |
4772
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
256 have_hash_binds = TRUE; |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
257 } else { |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
258 i_assert(conn->connected); |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
259 db_ldap_search(conn, request, conn->set.ldap_scope); |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
260 } |
3731
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
261 } |
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
262 hash_iterate_deinit(iter); |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
263 |
4772
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
264 /* then delayed search requests */ |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
265 p = &conn->delayed_requests_head; |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
266 while (*p != NULL) { |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
267 request = *p; |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
268 |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
269 if (request->filter != NULL) { |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
270 *p = request->next; |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
271 |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
272 i_assert(conn->connected); |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
273 db_ldap_search(conn, request, conn->set.ldap_scope); |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
274 } else { |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
275 p = &(*p)->next; |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
276 } |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
277 } |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
278 |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
279 if (have_hash_binds && conn->set.auth_bind) { |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
280 /* next retry all the bind requests. without auth binds the |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
281 only bind request can be the initial connection binding, |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
282 which we don't care to retry. */ |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
283 iter = hash_iterate_init(old_requests); |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
284 while (hash_iterate(iter, &key, &value)) { |
4772
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
285 request = value; |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
286 |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
287 if (request->filter == NULL) |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
288 request->callback(conn, request, NULL); |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
289 } |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
290 hash_iterate_deinit(iter); |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
291 } |
4772
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
292 if (conn->delayed_requests_head != NULL && conn->set.auth_bind) { |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
293 request = conn->delayed_requests_head; |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
294 for (; request != NULL; request = next) { |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
295 next = request->next; |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
296 |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
297 i_assert(request->filter == NULL); |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
298 request->callback(conn, request, NULL); |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
299 } |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
300 } |
3731
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
301 hash_destroy(old_requests); |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
302 |
4772
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
303 i_assert(conn->delayed_requests_head == NULL); |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
304 conn->delayed_requests_tail = NULL; |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
305 conn->retrying = FALSE; |
3731
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
306 } |
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
307 |
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
308 static void ldap_conn_reconnect(struct ldap_connection *conn) |
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
309 { |
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
310 ldap_conn_close(conn, FALSE); |
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
311 |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
312 if (db_ldap_connect(conn) < 0) { |
3731
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
313 /* failed to reconnect. fail all requests. */ |
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
314 ldap_conn_close(conn, TRUE); |
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
315 } |
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
316 } |
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
317 |
4907
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
318 static void ldap_input(struct ldap_connection *conn) |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
319 { |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
320 struct ldap_request *request; |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
321 struct timeval timeout; |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
322 LDAPMessage *res; |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
323 int ret, msgid; |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
324 |
5037
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
325 for (;;) { |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
326 if (conn->ld == NULL) |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
327 return; |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
328 |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
329 memset(&timeout, 0, sizeof(timeout)); |
1181
ac7dbb236b59
Rather than block for two seconds, we can just call ldap_result() again if
Timo Sirainen <tss@iki.fi>
parents:
1143
diff
changeset
|
330 ret = ldap_result(conn->ld, LDAP_RES_ANY, 1, &timeout, &res); |
1075
f1401fa7ab03
auth process fixes, LDAP seems to be working (with the kludge define or
Timo Sirainen <tss@iki.fi>
parents:
1062
diff
changeset
|
331 #ifdef OPENLDAP_ASYNC_WORKAROUND |
1181
ac7dbb236b59
Rather than block for two seconds, we can just call ldap_result() again if
Timo Sirainen <tss@iki.fi>
parents:
1143
diff
changeset
|
332 if (ret == 0) { |
ac7dbb236b59
Rather than block for two seconds, we can just call ldap_result() again if
Timo Sirainen <tss@iki.fi>
parents:
1143
diff
changeset
|
333 /* try again, there may be another in buffer */ |
ac7dbb236b59
Rather than block for two seconds, we can just call ldap_result() again if
Timo Sirainen <tss@iki.fi>
parents:
1143
diff
changeset
|
334 ret = ldap_result(conn->ld, LDAP_RES_ANY, 1, |
ac7dbb236b59
Rather than block for two seconds, we can just call ldap_result() again if
Timo Sirainen <tss@iki.fi>
parents:
1143
diff
changeset
|
335 &timeout, &res); |
ac7dbb236b59
Rather than block for two seconds, we can just call ldap_result() again if
Timo Sirainen <tss@iki.fi>
parents:
1143
diff
changeset
|
336 } |
1075
f1401fa7ab03
auth process fixes, LDAP seems to be working (with the kludge define or
Timo Sirainen <tss@iki.fi>
parents:
1062
diff
changeset
|
337 #endif |
5037
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
338 if (ret <= 0) |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
339 break; |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
340 |
1210 | 341 msgid = ldap_msgid(res); |
342 request = hash_lookup(conn->requests, POINTER_CAST(msgid)); | |
343 if (request == NULL) { | |
344 i_error("LDAP: Reply with unknown msgid %d", | |
345 msgid); | |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
346 } else { |
1210 | 347 hash_remove(conn->requests, POINTER_CAST(msgid)); |
348 request->callback(conn, request, res); | |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
349 } |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
350 |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
351 ldap_msgfree(res); |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
352 } |
5037
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
353 |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
354 if (ret < 0) { |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
355 i_error("LDAP: ldap_result() failed: %s", |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
356 ldap_get_error(conn)); |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
357 ldap_conn_reconnect(conn); |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
358 } else { |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
359 if (!conn->binding) |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
360 db_ldap_handle_next_delayed_request(conn); |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
361 } |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
362 } |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
363 |
4426
b8089cf41c96
Check for sasl.h and sasl/sasl.h existence and use the one that's found. If
Timo Sirainen <tss@iki.fi>
parents:
4415
diff
changeset
|
364 #ifdef HAVE_LDAP_SASL |
4405
fe17f63521ea
Compiler warning fixes and some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents:
4319
diff
changeset
|
365 static int |
fe17f63521ea
Compiler warning fixes and some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents:
4319
diff
changeset
|
366 sasl_interact(LDAP *ld __attr_unused__, unsigned flags __attr_unused__, |
fe17f63521ea
Compiler warning fixes and some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents:
4319
diff
changeset
|
367 void *defaults, void *interact) |
4319
31a28cd0b020
Added support for SASL binding. Patch by Geert Jansen
Timo Sirainen <tss@iki.fi>
parents:
4295
diff
changeset
|
368 { |
4426
b8089cf41c96
Check for sasl.h and sasl/sasl.h existence and use the one that's found. If
Timo Sirainen <tss@iki.fi>
parents:
4415
diff
changeset
|
369 struct ldap_sasl_bind_context *context = defaults; |
4319
31a28cd0b020
Added support for SASL binding. Patch by Geert Jansen
Timo Sirainen <tss@iki.fi>
parents:
4295
diff
changeset
|
370 sasl_interact_t *in; |
4405
fe17f63521ea
Compiler warning fixes and some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents:
4319
diff
changeset
|
371 const char *str; |
4319
31a28cd0b020
Added support for SASL binding. Patch by Geert Jansen
Timo Sirainen <tss@iki.fi>
parents:
4295
diff
changeset
|
372 |
4405
fe17f63521ea
Compiler warning fixes and some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents:
4319
diff
changeset
|
373 for (in = interact; in->id != SASL_CB_LIST_END; in++) { |
fe17f63521ea
Compiler warning fixes and some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents:
4319
diff
changeset
|
374 switch (in->id) { |
4319
31a28cd0b020
Added support for SASL binding. Patch by Geert Jansen
Timo Sirainen <tss@iki.fi>
parents:
4295
diff
changeset
|
375 case SASL_CB_GETREALM: |
4405
fe17f63521ea
Compiler warning fixes and some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents:
4319
diff
changeset
|
376 str = context->realm; |
4319
31a28cd0b020
Added support for SASL binding. Patch by Geert Jansen
Timo Sirainen <tss@iki.fi>
parents:
4295
diff
changeset
|
377 break; |
31a28cd0b020
Added support for SASL binding. Patch by Geert Jansen
Timo Sirainen <tss@iki.fi>
parents:
4295
diff
changeset
|
378 case SASL_CB_AUTHNAME: |
4405
fe17f63521ea
Compiler warning fixes and some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents:
4319
diff
changeset
|
379 str = context->authcid; |
4319
31a28cd0b020
Added support for SASL binding. Patch by Geert Jansen
Timo Sirainen <tss@iki.fi>
parents:
4295
diff
changeset
|
380 break; |
31a28cd0b020
Added support for SASL binding. Patch by Geert Jansen
Timo Sirainen <tss@iki.fi>
parents:
4295
diff
changeset
|
381 case SASL_CB_USER: |
4405
fe17f63521ea
Compiler warning fixes and some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents:
4319
diff
changeset
|
382 str = context->authzid; |
4319
31a28cd0b020
Added support for SASL binding. Patch by Geert Jansen
Timo Sirainen <tss@iki.fi>
parents:
4295
diff
changeset
|
383 break; |
31a28cd0b020
Added support for SASL binding. Patch by Geert Jansen
Timo Sirainen <tss@iki.fi>
parents:
4295
diff
changeset
|
384 case SASL_CB_PASS: |
4405
fe17f63521ea
Compiler warning fixes and some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents:
4319
diff
changeset
|
385 str = context->passwd; |
fe17f63521ea
Compiler warning fixes and some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents:
4319
diff
changeset
|
386 break; |
fe17f63521ea
Compiler warning fixes and some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents:
4319
diff
changeset
|
387 default: |
fe17f63521ea
Compiler warning fixes and some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents:
4319
diff
changeset
|
388 str = NULL; |
4319
31a28cd0b020
Added support for SASL binding. Patch by Geert Jansen
Timo Sirainen <tss@iki.fi>
parents:
4295
diff
changeset
|
389 break; |
31a28cd0b020
Added support for SASL binding. Patch by Geert Jansen
Timo Sirainen <tss@iki.fi>
parents:
4295
diff
changeset
|
390 } |
4405
fe17f63521ea
Compiler warning fixes and some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents:
4319
diff
changeset
|
391 if (str != NULL) { |
fe17f63521ea
Compiler warning fixes and some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents:
4319
diff
changeset
|
392 in->len = strlen(str); |
fe17f63521ea
Compiler warning fixes and some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents:
4319
diff
changeset
|
393 in->result = str; |
4319
31a28cd0b020
Added support for SASL binding. Patch by Geert Jansen
Timo Sirainen <tss@iki.fi>
parents:
4295
diff
changeset
|
394 } |
31a28cd0b020
Added support for SASL binding. Patch by Geert Jansen
Timo Sirainen <tss@iki.fi>
parents:
4295
diff
changeset
|
395 |
31a28cd0b020
Added support for SASL binding. Patch by Geert Jansen
Timo Sirainen <tss@iki.fi>
parents:
4295
diff
changeset
|
396 } |
31a28cd0b020
Added support for SASL binding. Patch by Geert Jansen
Timo Sirainen <tss@iki.fi>
parents:
4295
diff
changeset
|
397 return LDAP_SUCCESS; |
31a28cd0b020
Added support for SASL binding. Patch by Geert Jansen
Timo Sirainen <tss@iki.fi>
parents:
4295
diff
changeset
|
398 } |
4426
b8089cf41c96
Check for sasl.h and sasl/sasl.h existence and use the one that's found. If
Timo Sirainen <tss@iki.fi>
parents:
4415
diff
changeset
|
399 #endif |
4319
31a28cd0b020
Added support for SASL binding. Patch by Geert Jansen
Timo Sirainen <tss@iki.fi>
parents:
4295
diff
changeset
|
400 |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
401 static int db_ldap_connect_finish(struct ldap_connection *conn, int ret) |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
402 { |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
403 if (ret == LDAP_SERVER_DOWN) { |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
404 i_error("LDAP: Can't connect to server: %s", |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
405 conn->set.uris != NULL ? |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
406 conn->set.uris : conn->set.hosts); |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
407 return -1; |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
408 } |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
409 if (ret != LDAP_SUCCESS) { |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
410 i_error("LDAP: binding failed (dn %s): %s", |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
411 conn->set.dn == NULL ? "(none)" : conn->set.dn, |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
412 ldap_get_error(conn)); |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
413 return -1; |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
414 } |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
415 |
4751 | 416 if (!conn->connected) { |
417 conn->connected = TRUE; | |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
418 |
4751 | 419 /* in case there are requests waiting, retry them */ |
420 ldap_conn_retry_requests(conn); | |
421 } | |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
422 return 0; |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
423 } |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
424 |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
425 static void db_ldap_bind_callback(struct ldap_connection *conn, |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
426 struct ldap_request *ldap_request, |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
427 LDAPMessage *res) |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
428 { |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
429 int ret; |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
430 |
5037
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
431 conn->binding = FALSE; |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
432 conn->connecting = FALSE; |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
433 i_free(ldap_request); |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
434 |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
435 if (res == NULL) { |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
436 /* aborted */ |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
437 return; |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
438 } |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
439 |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
440 ret = ldap_result2error(conn->ld, res, FALSE); |
4751 | 441 if (db_ldap_connect_finish(conn, ret) < 0) { |
442 /* lost connection, close it */ | |
443 ldap_conn_close(conn, TRUE); | |
444 } | |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
445 } |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
446 |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
447 static int db_ldap_bind(struct ldap_connection *conn) |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
448 { |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
449 struct ldap_request *ldap_request; |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
450 int msgid; |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
451 |
5037
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
452 i_assert(!conn->binding); |
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
453 |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
454 ldap_request = i_new(struct ldap_request, 1); |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
455 ldap_request->callback = db_ldap_bind_callback; |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
456 ldap_request->context = conn; |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
457 |
4996
cfef56a6bf4a
If ldap_bind() fails directly, log the "ldap server down" errors more nicely.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
458 msgid = ldap_bind(conn->ld, conn->set.dn, conn->set.dnpass, |
cfef56a6bf4a
If ldap_bind() fails directly, log the "ldap server down" errors more nicely.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
459 LDAP_AUTH_SIMPLE); |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
460 if (msgid == -1) { |
5006
129aa779a7f8
Last change for making ldap_bind() error handling better was actually
Timo Sirainen <tss@iki.fi>
parents:
4996
diff
changeset
|
461 db_ldap_connect_finish(conn, ldap_get_errno(conn)); |
4742 | 462 i_free(ldap_request); |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
463 return -1; |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
464 } |
4751 | 465 |
466 conn->connecting = TRUE; | |
5037
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
467 conn->binding = TRUE; |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
468 hash_insert(conn->requests, POINTER_CAST(msgid), ldap_request); |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
469 |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
470 /* we're binding back to the original DN, not doing an |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
471 authentication bind */ |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
472 conn->last_auth_bind = FALSE; |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
473 return 0; |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
474 } |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
475 |
4742 | 476 static void db_ldap_get_fd(struct ldap_connection *conn) |
477 { | |
478 int ret; | |
479 | |
480 /* get the connection's fd */ | |
481 ret = ldap_get_option(conn->ld, LDAP_OPT_DESC, (void *)&conn->fd); | |
482 if (ret != LDAP_SUCCESS) { | |
483 i_fatal("LDAP: Can't get connection fd: %s", | |
484 ldap_err2string(ret)); | |
485 } | |
486 i_assert(conn->fd != -1); | |
487 net_set_nonblock(conn->fd, TRUE); | |
488 } | |
489 | |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
490 int db_ldap_connect(struct ldap_connection *conn) |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
491 { |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
492 unsigned int ldap_version; |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
493 int ret; |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
494 |
4742 | 495 if (conn->connected || conn->connecting) |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
496 return 0; |
5037
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
497 i_assert(!conn->binding); |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
498 |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
499 if (conn->ld == NULL) { |
1910 | 500 if (conn->set.uris != NULL) { |
2325
7613e0f68513
Fixed to compile with Solaris LDAP library
Timo Sirainen <tss@iki.fi>
parents:
1910
diff
changeset
|
501 #ifdef LDAP_HAVE_INITIALIZE |
1910 | 502 if (ldap_initialize(&conn->ld, conn->set.uris) != LDAP_SUCCESS) |
503 conn->ld = NULL; | |
2325
7613e0f68513
Fixed to compile with Solaris LDAP library
Timo Sirainen <tss@iki.fi>
parents:
1910
diff
changeset
|
504 #else |
7613e0f68513
Fixed to compile with Solaris LDAP library
Timo Sirainen <tss@iki.fi>
parents:
1910
diff
changeset
|
505 i_fatal("LDAP: Your LDAP library doesn't support " |
7613e0f68513
Fixed to compile with Solaris LDAP library
Timo Sirainen <tss@iki.fi>
parents:
1910
diff
changeset
|
506 "'uris' setting, use 'hosts' instead."); |
7613e0f68513
Fixed to compile with Solaris LDAP library
Timo Sirainen <tss@iki.fi>
parents:
1910
diff
changeset
|
507 #endif |
1910 | 508 } else |
509 conn->ld = ldap_init(conn->set.hosts, LDAP_PORT); | |
510 | |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
511 if (conn->ld == NULL) |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
512 i_fatal("LDAP: ldap_init() failed with hosts: %s", |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
513 conn->set.hosts); |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
514 |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
515 ret = ldap_set_option(conn->ld, LDAP_OPT_DEREF, |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
516 (void *)&conn->set.ldap_deref); |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
517 if (ret != LDAP_SUCCESS) { |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
518 i_fatal("LDAP: Can't set deref option: %s", |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
519 ldap_err2string(ret)); |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
520 } |
1282 | 521 |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
522 /* If SASL binds are used, the protocol version needs to be |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
523 at least 3 */ |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
524 ldap_version = conn->set.sasl_bind && |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
525 conn->set.ldap_version < 3 ? 3 : |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
526 conn->set.ldap_version; |
1282 | 527 ret = ldap_set_option(conn->ld, LDAP_OPT_PROTOCOL_VERSION, |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
528 (void *)&ldap_version); |
1282 | 529 if (ret != LDAP_OPT_SUCCESS) { |
530 i_fatal("LDAP: Can't set protocol version %u: %s", | |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
531 ldap_version, ldap_err2string(ret)); |
1282 | 532 } |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
533 } |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
534 |
4415
b91816cd1d16
Added TLS support for LDAP if the library supports it.
Timo Sirainen <tss@iki.fi>
parents:
4405
diff
changeset
|
535 if (conn->set.tls) { |
b91816cd1d16
Added TLS support for LDAP if the library supports it.
Timo Sirainen <tss@iki.fi>
parents:
4405
diff
changeset
|
536 #ifdef LDAP_HAVE_START_TLS_S |
b91816cd1d16
Added TLS support for LDAP if the library supports it.
Timo Sirainen <tss@iki.fi>
parents:
4405
diff
changeset
|
537 ret = ldap_start_tls_s(conn->ld, NULL, NULL); |
b91816cd1d16
Added TLS support for LDAP if the library supports it.
Timo Sirainen <tss@iki.fi>
parents:
4405
diff
changeset
|
538 if (ret != LDAP_SUCCESS) { |
b91816cd1d16
Added TLS support for LDAP if the library supports it.
Timo Sirainen <tss@iki.fi>
parents:
4405
diff
changeset
|
539 i_error("LDAP: ldap_start_tls_s() failed: %s", |
b91816cd1d16
Added TLS support for LDAP if the library supports it.
Timo Sirainen <tss@iki.fi>
parents:
4405
diff
changeset
|
540 ldap_err2string(ret)); |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
541 return -1; |
4415
b91816cd1d16
Added TLS support for LDAP if the library supports it.
Timo Sirainen <tss@iki.fi>
parents:
4405
diff
changeset
|
542 } |
b91816cd1d16
Added TLS support for LDAP if the library supports it.
Timo Sirainen <tss@iki.fi>
parents:
4405
diff
changeset
|
543 #else |
b91816cd1d16
Added TLS support for LDAP if the library supports it.
Timo Sirainen <tss@iki.fi>
parents:
4405
diff
changeset
|
544 i_error("LDAP: Your LDAP library doesn't support TLS"); |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
545 return -1; |
4415
b91816cd1d16
Added TLS support for LDAP if the library supports it.
Timo Sirainen <tss@iki.fi>
parents:
4405
diff
changeset
|
546 #endif |
b91816cd1d16
Added TLS support for LDAP if the library supports it.
Timo Sirainen <tss@iki.fi>
parents:
4405
diff
changeset
|
547 } |
b91816cd1d16
Added TLS support for LDAP if the library supports it.
Timo Sirainen <tss@iki.fi>
parents:
4405
diff
changeset
|
548 |
4319
31a28cd0b020
Added support for SASL binding. Patch by Geert Jansen
Timo Sirainen <tss@iki.fi>
parents:
4295
diff
changeset
|
549 if (conn->set.sasl_bind) { |
4426
b8089cf41c96
Check for sasl.h and sasl/sasl.h existence and use the one that's found. If
Timo Sirainen <tss@iki.fi>
parents:
4415
diff
changeset
|
550 #ifdef HAVE_LDAP_SASL |
b8089cf41c96
Check for sasl.h and sasl/sasl.h existence and use the one that's found. If
Timo Sirainen <tss@iki.fi>
parents:
4415
diff
changeset
|
551 struct ldap_sasl_bind_context context; |
b8089cf41c96
Check for sasl.h and sasl/sasl.h existence and use the one that's found. If
Timo Sirainen <tss@iki.fi>
parents:
4415
diff
changeset
|
552 |
b8089cf41c96
Check for sasl.h and sasl/sasl.h existence and use the one that's found. If
Timo Sirainen <tss@iki.fi>
parents:
4415
diff
changeset
|
553 memset(&context, 0, sizeof(context)); |
4319
31a28cd0b020
Added support for SASL binding. Patch by Geert Jansen
Timo Sirainen <tss@iki.fi>
parents:
4295
diff
changeset
|
554 context.authcid = conn->set.dn; |
31a28cd0b020
Added support for SASL binding. Patch by Geert Jansen
Timo Sirainen <tss@iki.fi>
parents:
4295
diff
changeset
|
555 context.passwd = conn->set.dnpass; |
31a28cd0b020
Added support for SASL binding. Patch by Geert Jansen
Timo Sirainen <tss@iki.fi>
parents:
4295
diff
changeset
|
556 context.realm = conn->set.sasl_realm; |
31a28cd0b020
Added support for SASL binding. Patch by Geert Jansen
Timo Sirainen <tss@iki.fi>
parents:
4295
diff
changeset
|
557 context.authzid = conn->set.sasl_authz_id; |
31a28cd0b020
Added support for SASL binding. Patch by Geert Jansen
Timo Sirainen <tss@iki.fi>
parents:
4295
diff
changeset
|
558 |
4743 | 559 /* There doesn't seem to be a way to do SASL binding |
560 asynchronously.. */ | |
4405
fe17f63521ea
Compiler warning fixes and some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents:
4319
diff
changeset
|
561 ret = ldap_sasl_interactive_bind_s(conn->ld, NULL, |
fe17f63521ea
Compiler warning fixes and some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents:
4319
diff
changeset
|
562 conn->set.sasl_mech, |
4319
31a28cd0b020
Added support for SASL binding. Patch by Geert Jansen
Timo Sirainen <tss@iki.fi>
parents:
4295
diff
changeset
|
563 NULL, NULL, LDAP_SASL_QUIET, |
31a28cd0b020
Added support for SASL binding. Patch by Geert Jansen
Timo Sirainen <tss@iki.fi>
parents:
4295
diff
changeset
|
564 sasl_interact, &context); |
4743 | 565 if (db_ldap_connect_finish(conn, ret) < 0) |
566 return -1; | |
567 db_ldap_get_fd(conn); | |
4426
b8089cf41c96
Check for sasl.h and sasl/sasl.h existence and use the one that's found. If
Timo Sirainen <tss@iki.fi>
parents:
4415
diff
changeset
|
568 #else |
b8089cf41c96
Check for sasl.h and sasl/sasl.h existence and use the one that's found. If
Timo Sirainen <tss@iki.fi>
parents:
4415
diff
changeset
|
569 i_fatal("LDAP: sasl_bind=yes but no SASL support compiled in"); |
b8089cf41c96
Check for sasl.h and sasl/sasl.h existence and use the one that's found. If
Timo Sirainen <tss@iki.fi>
parents:
4415
diff
changeset
|
570 #endif |
4319
31a28cd0b020
Added support for SASL binding. Patch by Geert Jansen
Timo Sirainen <tss@iki.fi>
parents:
4295
diff
changeset
|
571 } else { |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
572 if (db_ldap_bind(conn) < 0) |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
573 return -1; |
4742 | 574 db_ldap_get_fd(conn); |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
575 } |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
576 |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
577 conn->io = io_add(conn->fd, IO_READ, ldap_input, conn); |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
578 return 0; |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
579 } |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
580 |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3840
diff
changeset
|
581 static void ldap_conn_close(struct ldap_connection *conn, bool flush_requests) |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
582 { |
1897
1e6ed8045f2b
Changed hash_foreach() to iterator.
Timo Sirainen <tss@iki.fi>
parents:
1709
diff
changeset
|
583 struct hash_iterate_context *iter; |
4772
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
584 struct ldap_request *request, *next; |
1897
1e6ed8045f2b
Changed hash_foreach() to iterator.
Timo Sirainen <tss@iki.fi>
parents:
1709
diff
changeset
|
585 void *key, *value; |
1e6ed8045f2b
Changed hash_foreach() to iterator.
Timo Sirainen <tss@iki.fi>
parents:
1709
diff
changeset
|
586 |
3731
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
587 if (flush_requests) { |
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
588 iter = hash_iterate_init(conn->requests); |
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
589 while (hash_iterate(iter, &key, &value)) { |
4772
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
590 request = value; |
1897
1e6ed8045f2b
Changed hash_foreach() to iterator.
Timo Sirainen <tss@iki.fi>
parents:
1709
diff
changeset
|
591 |
3731
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
592 request->callback(conn, request, NULL); |
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
593 } |
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
594 hash_iterate_deinit(iter); |
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
595 hash_clear(conn->requests, FALSE); |
4772
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
596 |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
597 request = conn->delayed_requests_head; |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
598 for (; request != NULL; request = next) { |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
599 next = request->next; |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
600 |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
601 request->callback(conn, request, NULL); |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
602 } |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
603 conn->delayed_requests_head = NULL; |
d36a5df3f492
Handle LDAP requests while being disconnected more correctly.
Timo Sirainen <tss@iki.fi>
parents:
4751
diff
changeset
|
604 conn->delayed_requests_tail = NULL; |
1897
1e6ed8045f2b
Changed hash_foreach() to iterator.
Timo Sirainen <tss@iki.fi>
parents:
1709
diff
changeset
|
605 } |
1210 | 606 |
607 conn->connected = FALSE; | |
5037
d7198e2682c6
Do ldap_bind() only when there are no requests waiting, and don't do
Timo Sirainen <tss@iki.fi>
parents:
5006
diff
changeset
|
608 conn->binding = FALSE; |
1210 | 609 |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
610 if (conn->io != NULL) |
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
611 io_remove(&conn->io); |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
612 |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
613 if (conn->ld != NULL) { |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
614 ldap_unbind(conn->ld); |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
615 conn->ld = NULL; |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
616 } |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
617 conn->fd = -1; |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
618 } |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
619 |
3158
8849f2e380d1
userdb can now return extra parameters to master. Removed special handling
Timo Sirainen <tss@iki.fi>
parents:
3094
diff
changeset
|
620 void db_ldap_set_attrs(struct ldap_connection *conn, const char *attrlist, |
3306
aebed9a9edac
If both userdb and passdb used LDAP the later one was overriding first one's
Timo Sirainen <tss@iki.fi>
parents:
3212
diff
changeset
|
621 char ***attr_names_r, struct hash_table *attr_map, |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
622 const char *skip_attr) |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
623 { |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
624 const char *const *attr; |
3158
8849f2e380d1
userdb can now return extra parameters to master. Removed special handling
Timo Sirainen <tss@iki.fi>
parents:
3094
diff
changeset
|
625 char *name, *value, *p; |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
626 unsigned int i, j, size; |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
627 |
3158
8849f2e380d1
userdb can now return extra parameters to master. Removed special handling
Timo Sirainen <tss@iki.fi>
parents:
3094
diff
changeset
|
628 if (*attrlist == '\0') |
8849f2e380d1
userdb can now return extra parameters to master. Removed special handling
Timo Sirainen <tss@iki.fi>
parents:
3094
diff
changeset
|
629 return; |
8849f2e380d1
userdb can now return extra parameters to master. Removed special handling
Timo Sirainen <tss@iki.fi>
parents:
3094
diff
changeset
|
630 |
8849f2e380d1
userdb can now return extra parameters to master. Removed special handling
Timo Sirainen <tss@iki.fi>
parents:
3094
diff
changeset
|
631 t_push(); |
8849f2e380d1
userdb can now return extra parameters to master. Removed special handling
Timo Sirainen <tss@iki.fi>
parents:
3094
diff
changeset
|
632 attr = t_strsplit(attrlist, ","); |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
633 |
3212 | 634 /* @UNSAFE */ |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
635 for (size = 0; attr[size] != NULL; size++) ; |
3306
aebed9a9edac
If both userdb and passdb used LDAP the later one was overriding first one's
Timo Sirainen <tss@iki.fi>
parents:
3212
diff
changeset
|
636 *attr_names_r = p_new(conn->pool, char *, size + 1); |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
637 |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
638 for (i = j = 0; i < size; i++) { |
3158
8849f2e380d1
userdb can now return extra parameters to master. Removed special handling
Timo Sirainen <tss@iki.fi>
parents:
3094
diff
changeset
|
639 p = strchr(attr[i], '='); |
6148
668a768fc8fd
Removed deprecated pass_attrs and user_attrs configuration method.
Timo Sirainen <tss@iki.fi>
parents:
6147
diff
changeset
|
640 if (p == NULL) |
668a768fc8fd
Removed deprecated pass_attrs and user_attrs configuration method.
Timo Sirainen <tss@iki.fi>
parents:
6147
diff
changeset
|
641 name = value = p_strdup(conn->pool, attr[i]); |
668a768fc8fd
Removed deprecated pass_attrs and user_attrs configuration method.
Timo Sirainen <tss@iki.fi>
parents:
6147
diff
changeset
|
642 else { |
3158
8849f2e380d1
userdb can now return extra parameters to master. Removed special handling
Timo Sirainen <tss@iki.fi>
parents:
3094
diff
changeset
|
643 name = p_strdup_until(conn->pool, attr[i], p); |
8849f2e380d1
userdb can now return extra parameters to master. Removed special handling
Timo Sirainen <tss@iki.fi>
parents:
3094
diff
changeset
|
644 value = p_strdup(conn->pool, p + 1); |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
645 } |
3158
8849f2e380d1
userdb can now return extra parameters to master. Removed special handling
Timo Sirainen <tss@iki.fi>
parents:
3094
diff
changeset
|
646 |
4816
8ac2a2d27364
Cleanup: Don't put string literals into non-const pointers.
Timo Sirainen <tss@iki.fi>
parents:
4806
diff
changeset
|
647 if (*name != '\0' && |
8ac2a2d27364
Cleanup: Don't put string literals into non-const pointers.
Timo Sirainen <tss@iki.fi>
parents:
4806
diff
changeset
|
648 (skip_attr == NULL || strcmp(skip_attr, value) != 0)) { |
3306
aebed9a9edac
If both userdb and passdb used LDAP the later one was overriding first one's
Timo Sirainen <tss@iki.fi>
parents:
3212
diff
changeset
|
649 hash_insert(attr_map, name, value); |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
650 (*attr_names_r)[j++] = name; |
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
651 } |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
652 } |
3158
8849f2e380d1
userdb can now return extra parameters to master. Removed special handling
Timo Sirainen <tss@iki.fi>
parents:
3094
diff
changeset
|
653 t_pop(); |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
654 } |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
655 |
5884
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
656 struct var_expand_table * |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
657 db_ldap_value_get_var_expand_table(struct auth_request *auth_request) |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
658 { |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
659 const struct var_expand_table *auth_table; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
660 struct var_expand_table *table; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
661 unsigned int count; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
662 |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
663 auth_table = auth_request_get_var_expand_table(auth_request, NULL); |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
664 for (count = 0; auth_table[count].key != '\0'; count++) ; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
665 count++; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
666 |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
667 table = t_new(struct var_expand_table, count + 1); |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
668 table[0].key = '$'; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
669 memcpy(table + 1, auth_table, sizeof(*table) * count); |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
670 return table; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
671 } |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
672 |
1330
7cde19dbe754
Moved auth_username_chars from db-pgsql to generic for all. Some other
Timo Sirainen <tss@iki.fi>
parents:
1282
diff
changeset
|
673 #define IS_LDAP_ESCAPED_CHAR(c) \ |
7cde19dbe754
Moved auth_username_chars from db-pgsql to generic for all. Some other
Timo Sirainen <tss@iki.fi>
parents:
1282
diff
changeset
|
674 ((c) == '*' || (c) == '(' || (c) == ')' || (c) == '\\') |
7cde19dbe754
Moved auth_username_chars from db-pgsql to generic for all. Some other
Timo Sirainen <tss@iki.fi>
parents:
1282
diff
changeset
|
675 |
4295
4fc637010202
Escape SQL strings using sql_escape_string(). Fixes the problems with
Timo Sirainen <tss@iki.fi>
parents:
4180
diff
changeset
|
676 const char *ldap_escape(const char *str, |
4fc637010202
Escape SQL strings using sql_escape_string(). Fixes the problems with
Timo Sirainen <tss@iki.fi>
parents:
4180
diff
changeset
|
677 const struct auth_request *auth_request __attr_unused__) |
1189
2cb8e2136283
Escape special chars in username if needed.
Timo Sirainen <tss@iki.fi>
parents:
1182
diff
changeset
|
678 { |
2cb8e2136283
Escape special chars in username if needed.
Timo Sirainen <tss@iki.fi>
parents:
1182
diff
changeset
|
679 const char *p; |
1330
7cde19dbe754
Moved auth_username_chars from db-pgsql to generic for all. Some other
Timo Sirainen <tss@iki.fi>
parents:
1282
diff
changeset
|
680 string_t *ret; |
1189
2cb8e2136283
Escape special chars in username if needed.
Timo Sirainen <tss@iki.fi>
parents:
1182
diff
changeset
|
681 |
2cb8e2136283
Escape special chars in username if needed.
Timo Sirainen <tss@iki.fi>
parents:
1182
diff
changeset
|
682 for (p = str; *p != '\0'; p++) { |
1330
7cde19dbe754
Moved auth_username_chars from db-pgsql to generic for all. Some other
Timo Sirainen <tss@iki.fi>
parents:
1282
diff
changeset
|
683 if (IS_LDAP_ESCAPED_CHAR(*p)) |
1189
2cb8e2136283
Escape special chars in username if needed.
Timo Sirainen <tss@iki.fi>
parents:
1182
diff
changeset
|
684 break; |
2cb8e2136283
Escape special chars in username if needed.
Timo Sirainen <tss@iki.fi>
parents:
1182
diff
changeset
|
685 } |
2cb8e2136283
Escape special chars in username if needed.
Timo Sirainen <tss@iki.fi>
parents:
1182
diff
changeset
|
686 |
2cb8e2136283
Escape special chars in username if needed.
Timo Sirainen <tss@iki.fi>
parents:
1182
diff
changeset
|
687 if (*p == '\0') |
2cb8e2136283
Escape special chars in username if needed.
Timo Sirainen <tss@iki.fi>
parents:
1182
diff
changeset
|
688 return str; |
2cb8e2136283
Escape special chars in username if needed.
Timo Sirainen <tss@iki.fi>
parents:
1182
diff
changeset
|
689 |
1330
7cde19dbe754
Moved auth_username_chars from db-pgsql to generic for all. Some other
Timo Sirainen <tss@iki.fi>
parents:
1282
diff
changeset
|
690 ret = t_str_new((size_t) (p - str) + 64); |
7cde19dbe754
Moved auth_username_chars from db-pgsql to generic for all. Some other
Timo Sirainen <tss@iki.fi>
parents:
1282
diff
changeset
|
691 str_append_n(ret, str, (size_t) (p - str)); |
7cde19dbe754
Moved auth_username_chars from db-pgsql to generic for all. Some other
Timo Sirainen <tss@iki.fi>
parents:
1282
diff
changeset
|
692 |
1189
2cb8e2136283
Escape special chars in username if needed.
Timo Sirainen <tss@iki.fi>
parents:
1182
diff
changeset
|
693 for (; *p != '\0'; p++) { |
1330
7cde19dbe754
Moved auth_username_chars from db-pgsql to generic for all. Some other
Timo Sirainen <tss@iki.fi>
parents:
1282
diff
changeset
|
694 if (IS_LDAP_ESCAPED_CHAR(*p)) |
7cde19dbe754
Moved auth_username_chars from db-pgsql to generic for all. Some other
Timo Sirainen <tss@iki.fi>
parents:
1282
diff
changeset
|
695 str_append_c(ret, '\\'); |
7cde19dbe754
Moved auth_username_chars from db-pgsql to generic for all. Some other
Timo Sirainen <tss@iki.fi>
parents:
1282
diff
changeset
|
696 str_append_c(ret, *p); |
1189
2cb8e2136283
Escape special chars in username if needed.
Timo Sirainen <tss@iki.fi>
parents:
1182
diff
changeset
|
697 } |
1330
7cde19dbe754
Moved auth_username_chars from db-pgsql to generic for all. Some other
Timo Sirainen <tss@iki.fi>
parents:
1282
diff
changeset
|
698 return str_c(ret); |
1189
2cb8e2136283
Escape special chars in username if needed.
Timo Sirainen <tss@iki.fi>
parents:
1182
diff
changeset
|
699 } |
2cb8e2136283
Escape special chars in username if needed.
Timo Sirainen <tss@iki.fi>
parents:
1182
diff
changeset
|
700 |
5884
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
701 struct db_ldap_result_iterate_context * |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
702 db_ldap_result_iterate_init(struct ldap_connection *conn, LDAPMessage *entry, |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
703 struct auth_request *auth_request, |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
704 struct hash_table *attr_map) |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
705 { |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
706 struct db_ldap_result_iterate_context *ctx; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
707 |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
708 ctx = t_new(struct db_ldap_result_iterate_context, 1); |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
709 ctx->conn = conn; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
710 ctx->entry = entry; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
711 ctx->auth_request = auth_request; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
712 ctx->attr_map = attr_map; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
713 |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
714 if (auth_request->auth->verbose_debug) |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
715 ctx->debug = t_str_new(256); |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
716 |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
717 ctx->attr = ldap_first_attribute(conn->ld, entry, &ctx->ber); |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
718 return ctx; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
719 } |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
720 |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
721 static void |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
722 db_ldap_result_iterate_finish(struct db_ldap_result_iterate_context *ctx) |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
723 { |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
724 if (ctx->debug != NULL && str_len(ctx->debug) > 0) { |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
725 auth_request_log_debug(ctx->auth_request, "ldap", |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
726 "result: %s", str_c(ctx->debug) + 1); |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
727 } |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
728 |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
729 ber_free(ctx->ber, 0); |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
730 } |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
731 |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
732 static void |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
733 db_ldap_result_change_attr(struct db_ldap_result_iterate_context *ctx) |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
734 { |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
735 ctx->name = hash_lookup(ctx->attr_map, ctx->attr); |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
736 |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
737 if (ctx->debug != NULL) { |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
738 str_printfa(ctx->debug, " %s(%s)=", ctx->attr, |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
739 ctx->name != NULL ? ctx->name : "?unknown?"); |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
740 } |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
741 |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
742 if (ctx->name == NULL || *ctx->name == '\0') { |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
743 ctx->value = NULL; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
744 return; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
745 } |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
746 |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
747 if (strchr(ctx->name, '%') != NULL && |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
748 (ctx->template = strchr(ctx->name, '=')) != NULL) { |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
749 /* we want to use variables */ |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
750 ctx->name = t_strdup_until(ctx->name, ctx->template); |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
751 ctx->template++; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
752 if (ctx->var_table == NULL) { |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
753 ctx->var_table = db_ldap_value_get_var_expand_table( |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
754 ctx->auth_request); |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
755 ctx->var = t_str_new(256); |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
756 } |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
757 } |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
758 |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
759 ctx->vals = ldap_get_values(ctx->conn->ld, ctx->entry, |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
760 ctx->attr); |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
761 ctx->value = ctx->vals[0]; |
6144
d779b7220e23
LDAP crashfixes. Based on patch by Katsu Yamamoto.
Timo Sirainen <tss@iki.fi>
parents:
5884
diff
changeset
|
762 ctx->value_idx = 0; |
5884
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
763 } |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
764 |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
765 static void |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
766 db_ldap_result_return_value(struct db_ldap_result_iterate_context *ctx) |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
767 { |
6144
d779b7220e23
LDAP crashfixes. Based on patch by Katsu Yamamoto.
Timo Sirainen <tss@iki.fi>
parents:
5884
diff
changeset
|
768 bool first = ctx->value_idx == 0; |
5884
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
769 |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
770 if (ctx->template != NULL) { |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
771 ctx->var_table[0].value = ctx->value; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
772 str_truncate(ctx->var, 0); |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
773 var_expand(ctx->var, ctx->template, ctx->var_table); |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
774 ctx->value = str_c(ctx->var); |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
775 } |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
776 |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
777 if (ctx->debug != NULL) { |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
778 if (!first) |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
779 str_append_c(ctx->debug, '/'); |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
780 if (ctx->auth_request->auth->verbose_debug_passwords || |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
781 strcmp(ctx->name, "password") != 0) |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
782 str_append(ctx->debug, ctx->value); |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
783 else |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
784 str_append(ctx->debug, PASSWORD_HIDDEN_STR); |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
785 } |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
786 } |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
787 |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
788 static bool db_ldap_result_int_next(struct db_ldap_result_iterate_context *ctx) |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
789 { |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
790 while (ctx->attr != NULL) { |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
791 if (ctx->vals == NULL) { |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
792 /* a new attribute */ |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
793 db_ldap_result_change_attr(ctx); |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
794 } else { |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
795 /* continuing existing attribute */ |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
796 if (ctx->value != NULL) |
6144
d779b7220e23
LDAP crashfixes. Based on patch by Katsu Yamamoto.
Timo Sirainen <tss@iki.fi>
parents:
5884
diff
changeset
|
797 ctx->value = ctx->vals[++ctx->value_idx]; |
5884
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
798 } |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
799 |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
800 if (ctx->value != NULL) { |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
801 db_ldap_result_return_value(ctx); |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
802 return TRUE; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
803 } |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
804 |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
805 ldap_value_free(ctx->vals); ctx->vals = NULL; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
806 ldap_memfree(ctx->attr); |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
807 ctx->attr = ldap_next_attribute(ctx->conn->ld, ctx->entry, |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
808 ctx->ber); |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
809 } |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
810 |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
811 db_ldap_result_iterate_finish(ctx); |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
812 return FALSE; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
813 } |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
814 |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
815 bool db_ldap_result_iterate_next(struct db_ldap_result_iterate_context *ctx, |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
816 const char **name_r, const char **value_r) |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
817 { |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
818 if (!db_ldap_result_int_next(ctx)) |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
819 return FALSE; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
820 |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
821 *name_r = ctx->name; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
822 *value_r = ctx->value; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
823 return TRUE; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
824 } |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
825 |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
826 bool db_ldap_result_iterate_next_all(struct db_ldap_result_iterate_context *ctx, |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
827 const char **name_r, |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
828 const char *const **values_r) |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
829 { |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
830 if (!db_ldap_result_int_next(ctx)) |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
831 return FALSE; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
832 |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
833 if (ctx->template != NULL) { |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
834 /* we can use only one value with templates */ |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
835 ctx->val_1_arr[0] = ctx->value; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
836 *values_r = ctx->val_1_arr; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
837 } else { |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
838 *values_r = (const char *const *)ctx->vals; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
839 } |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
840 ctx->value = NULL; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
841 *name_r = ctx->name; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
842 return TRUE; |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
843 } |
1c1dee40e495
Moved generic LDAP result iteration to db_ldap. It also supports now
Timo Sirainen <tss@iki.fi>
parents:
5872
diff
changeset
|
844 |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
845 static const char *parse_setting(const char *key, const char *value, |
4907
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
846 struct ldap_connection *conn) |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
847 { |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
848 return parse_setting_from_defs(conn->pool, setting_defs, |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
849 &conn->set, key, value); |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
850 } |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
851 |
1143
50f10a7a3bad
Use the same LDAP connection for both userdb and passdb if config_path is
Timo Sirainen <tss@iki.fi>
parents:
1141
diff
changeset
|
852 static struct ldap_connection *ldap_conn_find(const char *config_path) |
50f10a7a3bad
Use the same LDAP connection for both userdb and passdb if config_path is
Timo Sirainen <tss@iki.fi>
parents:
1141
diff
changeset
|
853 { |
50f10a7a3bad
Use the same LDAP connection for both userdb and passdb if config_path is
Timo Sirainen <tss@iki.fi>
parents:
1141
diff
changeset
|
854 struct ldap_connection *conn; |
50f10a7a3bad
Use the same LDAP connection for both userdb and passdb if config_path is
Timo Sirainen <tss@iki.fi>
parents:
1141
diff
changeset
|
855 |
50f10a7a3bad
Use the same LDAP connection for both userdb and passdb if config_path is
Timo Sirainen <tss@iki.fi>
parents:
1141
diff
changeset
|
856 for (conn = ldap_connections; conn != NULL; conn = conn->next) { |
50f10a7a3bad
Use the same LDAP connection for both userdb and passdb if config_path is
Timo Sirainen <tss@iki.fi>
parents:
1141
diff
changeset
|
857 if (strcmp(conn->config_path, config_path) == 0) |
50f10a7a3bad
Use the same LDAP connection for both userdb and passdb if config_path is
Timo Sirainen <tss@iki.fi>
parents:
1141
diff
changeset
|
858 return conn; |
50f10a7a3bad
Use the same LDAP connection for both userdb and passdb if config_path is
Timo Sirainen <tss@iki.fi>
parents:
1141
diff
changeset
|
859 } |
50f10a7a3bad
Use the same LDAP connection for both userdb and passdb if config_path is
Timo Sirainen <tss@iki.fi>
parents:
1141
diff
changeset
|
860 |
50f10a7a3bad
Use the same LDAP connection for both userdb and passdb if config_path is
Timo Sirainen <tss@iki.fi>
parents:
1141
diff
changeset
|
861 return NULL; |
50f10a7a3bad
Use the same LDAP connection for both userdb and passdb if config_path is
Timo Sirainen <tss@iki.fi>
parents:
1141
diff
changeset
|
862 } |
50f10a7a3bad
Use the same LDAP connection for both userdb and passdb if config_path is
Timo Sirainen <tss@iki.fi>
parents:
1141
diff
changeset
|
863 |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
864 struct ldap_connection *db_ldap_init(const char *config_path) |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
865 { |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
866 struct ldap_connection *conn; |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
867 pool_t pool; |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
868 |
1143
50f10a7a3bad
Use the same LDAP connection for both userdb and passdb if config_path is
Timo Sirainen <tss@iki.fi>
parents:
1141
diff
changeset
|
869 /* see if it already exists */ |
50f10a7a3bad
Use the same LDAP connection for both userdb and passdb if config_path is
Timo Sirainen <tss@iki.fi>
parents:
1141
diff
changeset
|
870 conn = ldap_conn_find(config_path); |
50f10a7a3bad
Use the same LDAP connection for both userdb and passdb if config_path is
Timo Sirainen <tss@iki.fi>
parents:
1141
diff
changeset
|
871 if (conn != NULL) { |
50f10a7a3bad
Use the same LDAP connection for both userdb and passdb if config_path is
Timo Sirainen <tss@iki.fi>
parents:
1141
diff
changeset
|
872 conn->refcount++; |
50f10a7a3bad
Use the same LDAP connection for both userdb and passdb if config_path is
Timo Sirainen <tss@iki.fi>
parents:
1141
diff
changeset
|
873 return conn; |
50f10a7a3bad
Use the same LDAP connection for both userdb and passdb if config_path is
Timo Sirainen <tss@iki.fi>
parents:
1141
diff
changeset
|
874 } |
50f10a7a3bad
Use the same LDAP connection for both userdb and passdb if config_path is
Timo Sirainen <tss@iki.fi>
parents:
1141
diff
changeset
|
875 |
3908
afe21b6d4b68
Give a clear error message if SQL/LDAP configuration file path was left
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
876 if (*config_path == '\0') |
afe21b6d4b68
Give a clear error message if SQL/LDAP configuration file path was left
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
877 i_fatal("LDAP: Configuration file path not given"); |
afe21b6d4b68
Give a clear error message if SQL/LDAP configuration file path was left
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
878 |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
879 pool = pool_alloconly_create("ldap_connection", 1024); |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
880 conn = p_new(pool, struct ldap_connection, 1); |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
881 conn->pool = pool; |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
882 |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
883 conn->refcount = 1; |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
884 conn->requests = hash_create(default_pool, pool, 0, NULL, NULL); |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
885 |
4741
deccf9e1aebc
LDAP code changes: If auth binds are used, bind back to the default dn
Timo Sirainen <tss@iki.fi>
parents:
4624
diff
changeset
|
886 conn->fd = -1; |
1143
50f10a7a3bad
Use the same LDAP connection for both userdb and passdb if config_path is
Timo Sirainen <tss@iki.fi>
parents:
1141
diff
changeset
|
887 conn->config_path = p_strdup(pool, config_path); |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
888 conn->set = default_ldap_settings; |
4903
204d7edc7cdc
Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents:
4816
diff
changeset
|
889 if (!settings_read(config_path, NULL, parse_setting, |
204d7edc7cdc
Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents:
4816
diff
changeset
|
890 null_settings_section_callback, conn)) |
1610
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1330
diff
changeset
|
891 exit(FATAL_DEFAULT); |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
892 |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
893 if (conn->set.base == NULL) |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
894 i_fatal("LDAP: No base given"); |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
895 |
4006
0e8f0647504b
Check that uris and hosts settings are correct.
Timo Sirainen <tss@iki.fi>
parents:
3913
diff
changeset
|
896 if (conn->set.uris == NULL && conn->set.hosts == NULL) |
0e8f0647504b
Check that uris and hosts settings are correct.
Timo Sirainen <tss@iki.fi>
parents:
3913
diff
changeset
|
897 i_fatal("LDAP: No uris or hosts set"); |
0e8f0647504b
Check that uris and hosts settings are correct.
Timo Sirainen <tss@iki.fi>
parents:
3913
diff
changeset
|
898 #ifndef LDAP_HAVE_INITIALIZE |
4180
92b572fbb88a
If LDAP library didn't have ldap_initialize() function, we always complained
Timo Sirainen <tss@iki.fi>
parents:
4006
diff
changeset
|
899 if (conn->set.uris != NULL) { |
4006
0e8f0647504b
Check that uris and hosts settings are correct.
Timo Sirainen <tss@iki.fi>
parents:
3913
diff
changeset
|
900 i_fatal("LDAP: Dovecot compiled without support for LDAP uris " |
0e8f0647504b
Check that uris and hosts settings are correct.
Timo Sirainen <tss@iki.fi>
parents:
3913
diff
changeset
|
901 "(ldap_initialize not found)"); |
0e8f0647504b
Check that uris and hosts settings are correct.
Timo Sirainen <tss@iki.fi>
parents:
3913
diff
changeset
|
902 } |
0e8f0647504b
Check that uris and hosts settings are correct.
Timo Sirainen <tss@iki.fi>
parents:
3913
diff
changeset
|
903 #endif |
0e8f0647504b
Check that uris and hosts settings are correct.
Timo Sirainen <tss@iki.fi>
parents:
3913
diff
changeset
|
904 |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
905 conn->set.ldap_deref = deref2str(conn->set.deref); |
3502
5e78500f1aee
user_global_uid and user_global_gid settings weren't working. Also changed
Timo Sirainen <tss@iki.fi>
parents:
3474
diff
changeset
|
906 conn->set.ldap_scope = scope2str(conn->set.scope); |
5e78500f1aee
user_global_uid and user_global_gid settings weren't working. Also changed
Timo Sirainen <tss@iki.fi>
parents:
3474
diff
changeset
|
907 |
1143
50f10a7a3bad
Use the same LDAP connection for both userdb and passdb if config_path is
Timo Sirainen <tss@iki.fi>
parents:
1141
diff
changeset
|
908 conn->next = ldap_connections; |
50f10a7a3bad
Use the same LDAP connection for both userdb and passdb if config_path is
Timo Sirainen <tss@iki.fi>
parents:
1141
diff
changeset
|
909 ldap_connections = conn; |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
910 return conn; |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
911 } |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
912 |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
913 void db_ldap_unref(struct ldap_connection **_conn) |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
914 { |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
915 struct ldap_connection *conn = *_conn; |
3657
0c10475d9968
Separated passdb_module's interface and the actual data struct. Now it's
Timo Sirainen <tss@iki.fi>
parents:
3502
diff
changeset
|
916 struct ldap_connection **p; |
0c10475d9968
Separated passdb_module's interface and the actual data struct. Now it's
Timo Sirainen <tss@iki.fi>
parents:
3502
diff
changeset
|
917 |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
918 *_conn = NULL; |
3657
0c10475d9968
Separated passdb_module's interface and the actual data struct. Now it's
Timo Sirainen <tss@iki.fi>
parents:
3502
diff
changeset
|
919 i_assert(conn->refcount >= 0); |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
920 if (--conn->refcount > 0) |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
921 return; |
3657
0c10475d9968
Separated passdb_module's interface and the actual data struct. Now it's
Timo Sirainen <tss@iki.fi>
parents:
3502
diff
changeset
|
922 |
0c10475d9968
Separated passdb_module's interface and the actual data struct. Now it's
Timo Sirainen <tss@iki.fi>
parents:
3502
diff
changeset
|
923 for (p = &ldap_connections; *p != NULL; p = &(*p)->next) { |
0c10475d9968
Separated passdb_module's interface and the actual data struct. Now it's
Timo Sirainen <tss@iki.fi>
parents:
3502
diff
changeset
|
924 if (*p == conn) { |
0c10475d9968
Separated passdb_module's interface and the actual data struct. Now it's
Timo Sirainen <tss@iki.fi>
parents:
3502
diff
changeset
|
925 *p = conn->next; |
0c10475d9968
Separated passdb_module's interface and the actual data struct. Now it's
Timo Sirainen <tss@iki.fi>
parents:
3502
diff
changeset
|
926 break; |
0c10475d9968
Separated passdb_module's interface and the actual data struct. Now it's
Timo Sirainen <tss@iki.fi>
parents:
3502
diff
changeset
|
927 } |
0c10475d9968
Separated passdb_module's interface and the actual data struct. Now it's
Timo Sirainen <tss@iki.fi>
parents:
3502
diff
changeset
|
928 } |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
929 |
3731
0a7beabfe332
If LDAP lookup fails because connection gets closed, try retrying it again
Timo Sirainen <tss@iki.fi>
parents:
3657
diff
changeset
|
930 ldap_conn_close(conn, TRUE); |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
931 |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
932 hash_destroy(conn->requests); |
3306
aebed9a9edac
If both userdb and passdb used LDAP the later one was overriding first one's
Timo Sirainen <tss@iki.fi>
parents:
3212
diff
changeset
|
933 if (conn->pass_attr_map != NULL) |
aebed9a9edac
If both userdb and passdb used LDAP the later one was overriding first one's
Timo Sirainen <tss@iki.fi>
parents:
3212
diff
changeset
|
934 hash_destroy(conn->pass_attr_map); |
aebed9a9edac
If both userdb and passdb used LDAP the later one was overriding first one's
Timo Sirainen <tss@iki.fi>
parents:
3212
diff
changeset
|
935 if (conn->user_attr_map != NULL) |
aebed9a9edac
If both userdb and passdb used LDAP the later one was overriding first one's
Timo Sirainen <tss@iki.fi>
parents:
3212
diff
changeset
|
936 hash_destroy(conn->user_attr_map); |
1062
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
937 pool_unref(conn->pool); |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
938 } |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
939 |
0522a0315d2f
Cleanups, LDAP support compiles again and generally looks ok, even if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
940 #endif |