Link Here
|
1 |
--- src/mod_auth.c.orig 2016-07-16 10:06:16 UTC |
|
|
2 |
+++ src/mod_auth.c |
3 |
@@ -13,6 +13,7 @@ |
4 |
#include <errno.h> |
5 |
#include <fcntl.h> |
6 |
#include <unistd.h> |
7 |
+#include <mysql/mysql.h> |
8 |
|
9 |
handler_t auth_ldap_init(server *srv, mod_auth_plugin_config *s); |
10 |
|
11 |
@@ -84,6 +85,19 @@ FREE_FUNC(mod_auth_free) { |
12 |
|
13 |
if (s->ldap) ldap_unbind_s(s->ldap); |
14 |
#endif |
15 |
+ buffer_free(s->auth_mysql_host); |
16 |
+ buffer_free(s->auth_mysql_user); |
17 |
+ buffer_free(s->auth_mysql_pass); |
18 |
+ buffer_free(s->auth_mysql_db); |
19 |
+ buffer_free(s->auth_mysql_socket); |
20 |
+ buffer_free(s->auth_mysql_users_table); |
21 |
+ buffer_free(s->auth_mysql_col_user); |
22 |
+ buffer_free(s->auth_mysql_col_pass); |
23 |
+ buffer_free(s->auth_mysql_col_realm); |
24 |
+ buffer_free(s->auth_mysql_domains_table); |
25 |
+ buffer_free(s->auth_mysql_col_domain); |
26 |
+ buffer_free(s->auth_mysql_domains_table_col_domain_id); |
27 |
+ buffer_free(s->auth_mysql_users_table_col_domain_id); |
28 |
|
29 |
free(s); |
30 |
} |
31 |
@@ -122,6 +136,21 @@ static int mod_auth_patch_connection(ser |
32 |
PATCH(ldap_filter_post); |
33 |
#endif |
34 |
|
35 |
+ PATCH(auth_mysql_host); |
36 |
+ PATCH(auth_mysql_user); |
37 |
+ PATCH(auth_mysql_pass); |
38 |
+ PATCH(auth_mysql_db); |
39 |
+ PATCH(auth_mysql_port); |
40 |
+ PATCH(auth_mysql_socket); |
41 |
+ PATCH(auth_mysql_users_table); |
42 |
+ PATCH(auth_mysql_col_user); |
43 |
+ PATCH(auth_mysql_col_pass); |
44 |
+ PATCH(auth_mysql_col_realm); |
45 |
+ PATCH(auth_mysql_domains_table); |
46 |
+ PATCH(auth_mysql_col_domain); |
47 |
+ PATCH(auth_mysql_domains_table_col_domain_id); |
48 |
+ PATCH(auth_mysql_users_table_col_domain_id); |
49 |
+ |
50 |
/* skip the first, the global context */ |
51 |
for (i = 1; i < srv->config_context->used; i++) { |
52 |
data_config *dc = (data_config *)srv->config_context->data[i]; |
53 |
@@ -171,6 +200,34 @@ static int mod_auth_patch_connection(ser |
54 |
PATCH(auth_ldap_bindpw); |
55 |
} else if (buffer_is_equal_string(du->key, CONST_STR_LEN("auth.backend.ldap.allow-empty-pw"))) { |
56 |
PATCH(auth_ldap_allow_empty_pw); |
57 |
+ } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("auth.backend.mysql.host"))) { |
58 |
+ PATCH(auth_mysql_host); |
59 |
+ } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("auth.backend.mysql.user"))) { |
60 |
+ PATCH(auth_mysql_user); |
61 |
+ } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("auth.backend.mysql.pass"))) { |
62 |
+ PATCH(auth_mysql_pass); |
63 |
+ } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("auth.backend.mysql.db"))) { |
64 |
+ PATCH(auth_mysql_db); |
65 |
+ } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("auth.backend.mysql.port"))) { |
66 |
+ PATCH(auth_mysql_port); |
67 |
+ } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("auth.backend.mysql.socket"))) { |
68 |
+ PATCH(auth_mysql_user); |
69 |
+ } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("auth.backend.mysql.users_table"))) { |
70 |
+ PATCH(auth_mysql_users_table); |
71 |
+ } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("auth.backend.mysql.col_user"))) { |
72 |
+ PATCH(auth_mysql_col_user); |
73 |
+ } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("auth.backend.mysql.col_pass"))) { |
74 |
+ PATCH(auth_mysql_col_pass); |
75 |
+ } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("auth.backend.mysql.col_realm"))) { |
76 |
+ PATCH(auth_mysql_col_realm); |
77 |
+ } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("auth.backend.mysql.domains_table"))) { |
78 |
+ PATCH(auth_mysql_domains_table); |
79 |
+ } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("auth.backend.mysql.col_domain"))) { |
80 |
+ PATCH(auth_mysql_col_domain); |
81 |
+ } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("auth.backend.mysql.domains_table_col_domain_id"))) { |
82 |
+ PATCH(auth_mysql_domains_table_col_domain_id); |
83 |
+ } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("auth.backend.mysql.users_table_col_domain_id"))) { |
84 |
+ PATCH(auth_mysql_users_table_col_domain_id); |
85 |
} |
86 |
} |
87 |
} |
88 |
@@ -362,10 +419,25 @@ SETDEFAULTS_FUNC(mod_auth_set_defaults) |
89 |
{ "auth.backend.ldap.starttls", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_CONNECTION }, /* 8 */ |
90 |
{ "auth.backend.ldap.bind-dn", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, /* 9 */ |
91 |
{ "auth.backend.ldap.bind-pw", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, /* 10 */ |
92 |
- { "auth.backend.ldap.allow-empty-pw", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_CONNECTION }, /* 11 */ |
93 |
+ { "auth.backend.ldap.allow-empty-pw", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_CONNECTION }, |
94 |
{ "auth.backend.htdigest.userfile", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, /* 12 */ |
95 |
{ "auth.backend.htpasswd.userfile", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, /* 13 */ |
96 |
{ "auth.debug", NULL, T_CONFIG_SHORT, T_CONFIG_SCOPE_CONNECTION }, /* 14 */ |
97 |
+ { "auth.backend.mysql.host", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, |
98 |
+ { "auth.backend.mysql.user", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, |
99 |
+ { "auth.backend.mysql.pass", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, |
100 |
+ { "auth.backend.mysql.db", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, |
101 |
+ { "auth.backend.mysql.port", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, |
102 |
+ { "auth.backend.mysql.socket", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, |
103 |
+ { "auth.backend.mysql.users_table", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, |
104 |
+ { "auth.backend.mysql.col_user", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, |
105 |
+ { "auth.backend.mysql.col_pass", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, |
106 |
+ { "auth.backend.mysql.col_realm", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, /* 23 */ |
107 |
+ { "auth.backend.mysql.domains_table", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, |
108 |
+ { "auth.backend.mysql.col_domain", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, |
109 |
+ { "auth.backend.mysql.domains_table_col_domain_id", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, |
110 |
+ { "auth.backend.mysql.users_table_col_domain_id", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, /* 27 */ |
111 |
+ |
112 |
{ NULL, NULL, T_CONFIG_UNSET, T_CONFIG_SCOPE_UNSET } |
113 |
}; |
114 |
|
115 |
@@ -394,6 +466,22 @@ SETDEFAULTS_FUNC(mod_auth_set_defaults) |
116 |
s->auth_debug = 0; |
117 |
|
118 |
s->auth_require = array_init(); |
119 |
+ s->mysql_conn = NULL; |
120 |
+ s->auth_mysql_host = buffer_init(); |
121 |
+ s->auth_mysql_user = buffer_init(); |
122 |
+ s->auth_mysql_pass = buffer_init(); |
123 |
+ s->auth_mysql_db = buffer_init(); |
124 |
+ s->auth_mysql_port = buffer_init(); |
125 |
+ s->auth_mysql_socket = buffer_init(); |
126 |
+ s->auth_mysql_users_table = buffer_init(); |
127 |
+ s->auth_mysql_col_user = buffer_init(); |
128 |
+ s->auth_mysql_col_pass = buffer_init(); |
129 |
+ s->auth_mysql_col_realm = buffer_init(); |
130 |
+ s->auth_mysql_domains_table = buffer_init(); |
131 |
+ s->auth_mysql_col_domain = buffer_init(); |
132 |
+ s->auth_mysql_domains_table_col_domain_id = buffer_init(); |
133 |
+ s->auth_mysql_users_table_col_domain_id = buffer_init(); |
134 |
+ |
135 |
|
136 |
#ifdef USE_LDAP |
137 |
s->ldap_filter_pre = buffer_init(); |
138 |
@@ -416,7 +504,20 @@ SETDEFAULTS_FUNC(mod_auth_set_defaults) |
139 |
cv[12].destination = s->auth_htdigest_userfile; |
140 |
cv[13].destination = s->auth_htpasswd_userfile; |
141 |
cv[14].destination = &(s->auth_debug); |
142 |
- |
143 |
+ cv[15].destination = s->auth_mysql_host; |
144 |
+ cv[16].destination = s->auth_mysql_user; |
145 |
+ cv[17].destination = s->auth_mysql_pass; |
146 |
+ cv[18].destination = s->auth_mysql_db; |
147 |
+ cv[19].destination = s->auth_mysql_port; |
148 |
+ cv[20].destination = s->auth_mysql_socket; |
149 |
+ cv[21].destination = s->auth_mysql_users_table; |
150 |
+ cv[22].destination = s->auth_mysql_col_user; |
151 |
+ cv[23].destination = s->auth_mysql_col_pass; |
152 |
+ cv[24].destination = s->auth_mysql_col_realm; |
153 |
+ cv[25].destination = s->auth_mysql_domains_table; |
154 |
+ cv[26].destination = s->auth_mysql_col_domain; |
155 |
+ cv[27].destination = s->auth_mysql_domains_table_col_domain_id; |
156 |
+ cv[28].destination = s->auth_mysql_users_table_col_domain_id; |
157 |
p->config_storage[i] = s; |
158 |
|
159 |
if (0 != config_insert_values_global(srv, config->value, cv, i == 0 ? T_CONFIG_SCOPE_SERVER : T_CONFIG_SCOPE_CONNECTION)) { |
160 |
@@ -432,6 +533,8 @@ SETDEFAULTS_FUNC(mod_auth_set_defaults) |
161 |
s->auth_backend = AUTH_BACKEND_PLAIN; |
162 |
} else if (0 == strcmp(s->auth_backend_conf->ptr, "ldap")) { |
163 |
s->auth_backend = AUTH_BACKEND_LDAP; |
164 |
+ } else if (0 == strcmp(s->auth_backend_conf->ptr, "mysql")) { |
165 |
+ s->auth_backend = AUTH_BACKEND_MYSQL; |
166 |
} else { |
167 |
log_error_write(srv, __FILE__, __LINE__, "sb", "auth.backend not supported:", s->auth_backend_conf); |
168 |
|
169 |
@@ -573,6 +676,31 @@ SETDEFAULTS_FUNC(mod_auth_set_defaults) |
170 |
return (ret); |
171 |
break; |
172 |
} |
173 |
+ case AUTH_BACKEND_MYSQL: { |
174 |
+ int port = atoi(s->auth_mysql_port->ptr); |
175 |
+ |
176 |
+ /* ignore if auth_mysql_socket is invalid */ |
177 |
+ if (p->conf.auth_mysql_socket == NULL) |
178 |
+ return HANDLER_GO_ON; |
179 |
+ if (p->conf.auth_mysql_socket->ptr != NULL) |
180 |
+ if (0 == strcmp(s->auth_mysql_socket->ptr, "")) s->auth_mysql_socket->ptr = NULL; |
181 |
+ |
182 |
+ s->mysql_conn = mysql_init(NULL); |
183 |
+ if (!mysql_real_connect(s->mysql_conn, s->auth_mysql_host->ptr, s->auth_mysql_user->ptr, s->auth_mysql_pass->ptr, s->auth_mysql_db->ptr, port, NULL, 0)) |
184 |
+ { |
185 |
+ log_error_write(srv, __FILE__, __LINE__, "sbsbsbsbss", |
186 |
+ "opening connection to mysql:", s->auth_mysql_host, |
187 |
+ "user:", s->auth_mysql_user, |
188 |
+ "pass:", s->auth_mysql_pass, |
189 |
+ "db:", s->auth_mysql_db, |
190 |
+ "failed:", strerror(errno)); |
191 |
+ |
192 |
+ return HANDLER_ERROR; |
193 |
+ } |
194 |
+ mysql_close(s->mysql_conn); |
195 |
+ |
196 |
+ break; |
197 |
+ } |
198 |
default: |
199 |
break; |
200 |
} |