passdb-sql.c revision f3d506e525a720f214020ca0f989a1966b30edae
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen/* Copyright (c) 2004-2010 Dovecot authors, see the included COPYING file */
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "auth-common.h"
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen#include "passdb.h"
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#ifdef PASSDB_SQL
5666a3d6a7ea89362b8d9e8b39b15424cd9d6388Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#include "str.h"
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen#include "strescape.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "var-expand.h"
573f0491a5733fe21fa062a455acb4790b4e0499Timo Sirainen#include "safe-memset.h"
573f0491a5733fe21fa062a455acb4790b4e0499Timo Sirainen#include "password-scheme.h"
573f0491a5733fe21fa062a455acb4790b4e0499Timo Sirainen#include "auth-cache.h"
573f0491a5733fe21fa062a455acb4790b4e0499Timo Sirainen#include "db-sql.h"
65f8fb656051f1059f7b5a2da9c5555adcc30439Timo Sirainen
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen#include <stdlib.h>
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen#include <string.h>
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainenstruct sql_passdb_module {
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen struct passdb_module module;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen struct sql_connection *conn;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen};
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenstruct passdb_sql_request {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen struct auth_request *auth_request;
f7539a17ea306191b53b8f5e752e228937df9ec3Timo Sirainen union {
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen verify_plain_callback_t *verify_plain;
2dd39e478269d6fb0bb26d12b394aa30ee965e38Timo Sirainen lookup_credentials_callback_t *lookup_credentials;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen set_credentials_callback_t *set_credentials;
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen } callback;
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen};
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainenstatic void sql_query_save_results(struct sql_result *result,
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen struct passdb_sql_request *sql_request)
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen{
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen struct auth_request *auth_request = sql_request->auth_request;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct passdb_module *_module = auth_request->passdb->passdb;
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen struct sql_passdb_module *module = (struct sql_passdb_module *)_module;
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen unsigned int i, fields_count;
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen const char *name, *value;
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen fields_count = sql_result_get_fields_count(result);
3e564425db51f3921ce4de11859777135fdedd15Timo Sirainen for (i = 0; i < fields_count; i++) {
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen name = sql_result_get_field_name(result, i);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen value = sql_result_get_field_value(result, i);
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen if (*name != '\0' && value != NULL) {
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen auth_request_set_field(auth_request, name, value,
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen module->conn->set.default_pass_scheme);
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen }
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen }
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen}
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainenstatic void sql_query_callback(struct sql_result *result,
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen struct passdb_sql_request *sql_request)
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen{
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen struct auth_request *auth_request = sql_request->auth_request;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen enum passdb_result passdb_result;
57a8c6a95e4bce3eeaba36985adb81c07dd683ffTimo Sirainen const char *user, *password, *scheme;
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen int ret;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen passdb_result = PASSDB_RESULT_INTERNAL_FAILURE;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen user = auth_request->user;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen password = NULL;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen ret = sql_result_next_row(result);
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen if (ret < 0) {
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen auth_request_log_error(auth_request, "sql",
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen "Password query failed: %s",
ff7056842f14fd3b30a2d327dfab165b9d15dd30Timo Sirainen sql_result_get_error(result));
ff7056842f14fd3b30a2d327dfab165b9d15dd30Timo Sirainen } else if (ret == 0) {
ff7056842f14fd3b30a2d327dfab165b9d15dd30Timo Sirainen auth_request_log_info(auth_request, "sql", "unknown user");
f1743785713e7632459d623d5df2108f4b93accbTimo Sirainen passdb_result = PASSDB_RESULT_USER_UNKNOWN;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen } else {
70ead6466f9baa8294e71fc2fba0a4f54f488b5eTimo Sirainen sql_query_save_results(result, sql_request);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
ccc895c0358108d2304239063e940b7d75f364abTimo Sirainen /* Note that we really want to check if the password field is
8d630c15a8ed6f85553467c3a231a273defca5f6Timo Sirainen found. Just checking if password is set isn't enough,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen because with proxies we might want to return NULL as
ee116df08d0fdab703483e18fe8076b2ef9fd9d7Timo Sirainen password. */
c5ab90cfad9cc3e33bcb1baeb30ffc82a7b7053aTimo Sirainen if (sql_result_find_field(result, "password") < 0) {
c5ab90cfad9cc3e33bcb1baeb30ffc82a7b7053aTimo Sirainen auth_request_log_error(auth_request, "sql",
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen "Password query must return a field named "
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen "'password'");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen } else if (sql_result_next_row(result) > 0) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen auth_request_log_error(auth_request, "sql",
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen "Password query returned multiple matches");
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen } else if (auth_request->passdb_password == NULL &&
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen !auth_request->no_password) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen auth_request_log_info(auth_request, "sql",
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen "Empty password returned without nopassword");
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen passdb_result = PASSDB_RESULT_PASSWORD_MISMATCH;
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen } else {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* passdb_password may change on the way,
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen so we'll need to strdup. */
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen password = t_strdup(auth_request->passdb_password);
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen passdb_result = PASSDB_RESULT_OK;
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen }
88187ee880b4829443e0d55ea7d145d9d5880217Timo Sirainen }
88187ee880b4829443e0d55ea7d145d9d5880217Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen scheme = password_get_scheme(&password);
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainen /* auth_request_set_field() sets scheme */
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainen i_assert(password == NULL || scheme != NULL);
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainen
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainen if (auth_request->credentials_scheme != NULL) {
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainen passdb_handle_credentials(passdb_result, password, scheme,
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainen sql_request->callback.lookup_credentials,
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainen auth_request);
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainen auth_request_unref(&auth_request);
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainen return;
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainen }
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen /* verify plain */
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen if (password == NULL) {
c979eeda1f46483d9c963e265786b701d7683d77Timo Sirainen sql_request->callback.verify_plain(passdb_result, auth_request);
c979eeda1f46483d9c963e265786b701d7683d77Timo Sirainen auth_request_unref(&auth_request);
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen return;
2584e86cc2d8c31ba30a4109cf4ba09d1e37e28aTimo Sirainen }
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen
4b41116563110d00330896a568eff1078c382827Timo Sirainen ret = auth_request_password_verify(auth_request,
4b41116563110d00330896a568eff1078c382827Timo Sirainen auth_request->mech_password,
4b41116563110d00330896a568eff1078c382827Timo Sirainen password, scheme, "sql");
5137d2d80255938a0f5fb8f3c1a21b34cf11ada3Timo Sirainen
5137d2d80255938a0f5fb8f3c1a21b34cf11ada3Timo Sirainen sql_request->callback.verify_plain(ret > 0 ? PASSDB_RESULT_OK :
5137d2d80255938a0f5fb8f3c1a21b34cf11ada3Timo Sirainen PASSDB_RESULT_PASSWORD_MISMATCH,
f81f4bc282cd1944cec187bae89c0701a416ed2aTimo Sirainen auth_request);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen auth_request_unref(&auth_request);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainenstatic const char *
b2c1349cf07410aefab0f5b17153af9e5cfcf48fTimo Sirainenpassdb_sql_escape(const char *str, const struct auth_request *auth_request)
96308127e006bb3b1108093bcf4cc1fd9481cb7aTimo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct passdb_module *_module = auth_request->passdb->passdb;
48270badadd82279bfe50ae3d187aea8b0b2b30eTimo Sirainen struct sql_passdb_module *module = (struct sql_passdb_module *)_module;
48270badadd82279bfe50ae3d187aea8b0b2b30eTimo Sirainen
48270badadd82279bfe50ae3d187aea8b0b2b30eTimo Sirainen return sql_escape_string(module->conn->db, str);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
61f5256ef248d35459b53534ae428bf6d016e1c5Timo Sirainen
cb05ecbd96ddb5e53c1850d27434541138a3f284Timo Sirainenstatic void sql_lookup_pass(struct passdb_sql_request *sql_request)
cb05ecbd96ddb5e53c1850d27434541138a3f284Timo Sirainen{
cb05ecbd96ddb5e53c1850d27434541138a3f284Timo Sirainen struct passdb_module *_module =
14ab4610b6038da6c5d0814fecabc6b74bc81a6bTimo Sirainen sql_request->auth_request->passdb->passdb;
14ab4610b6038da6c5d0814fecabc6b74bc81a6bTimo Sirainen struct sql_passdb_module *module = (struct sql_passdb_module *)_module;
14ab4610b6038da6c5d0814fecabc6b74bc81a6bTimo Sirainen string_t *query;
84ed9f8f3d0e5ed47607ef417618e49e4f865557Timo Sirainen
84ed9f8f3d0e5ed47607ef417618e49e4f865557Timo Sirainen query = t_str_new(512);
e3796bfd2bc0fd5ba664893d346df9334a5b3af0Timo Sirainen var_expand(query, module->conn->set.password_query,
e3796bfd2bc0fd5ba664893d346df9334a5b3af0Timo Sirainen auth_request_get_var_expand_table(sql_request->auth_request,
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen passdb_sql_escape));
5afa8e2edf4f313cd56e5909f92f39c3b5b7b4d3Timo Sirainen
5afa8e2edf4f313cd56e5909f92f39c3b5b7b4d3Timo Sirainen auth_request_log_debug(sql_request->auth_request, "sql",
408e5be344c9131fdebe771718a5bf49f88cc51cTimo Sirainen "query: %s", str_c(query));
408e5be344c9131fdebe771718a5bf49f88cc51cTimo Sirainen
408e5be344c9131fdebe771718a5bf49f88cc51cTimo Sirainen auth_request_ref(sql_request->auth_request);
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen sql_query(module->conn->db, str_c(query),
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen sql_query_callback, sql_request);
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen}
ecdce39e5ef4b62eefa9f5818f17d153fd5d710aTimo Sirainen
ecdce39e5ef4b62eefa9f5818f17d153fd5d710aTimo Sirainenstatic void sql_verify_plain(struct auth_request *request,
ecdce39e5ef4b62eefa9f5818f17d153fd5d710aTimo Sirainen const char *password ATTR_UNUSED,
ecdce39e5ef4b62eefa9f5818f17d153fd5d710aTimo Sirainen verify_plain_callback_t *callback)
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen{
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen struct passdb_sql_request *sql_request;
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen sql_request = p_new(request->pool, struct passdb_sql_request, 1);
b8835b8a21c617ceb82ddc5a176243faf36aa8f7Timo Sirainen sql_request->auth_request = request;
b8835b8a21c617ceb82ddc5a176243faf36aa8f7Timo Sirainen sql_request->callback.verify_plain = callback;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen sql_lookup_pass(sql_request);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainenstatic void sql_lookup_credentials(struct auth_request *request,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen lookup_credentials_callback_t *callback)
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen{
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen struct passdb_sql_request *sql_request;
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen
de58be41126e5d68008d2ea706d62ccdc1f29337Timo Sirainen sql_request = p_new(request->pool, struct passdb_sql_request, 1);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen sql_request->auth_request = request;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen sql_request->callback.lookup_credentials = callback;
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen
c4b376dd6e0c423006d7ac83a39253bcaf8e7c47Timo Sirainen sql_lookup_pass(sql_request);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
f3bb2fbe87425dc89a839908985af496f7f65702Timo Sirainenstatic void sql_set_credentials_callback(const char *error,
f3bb2fbe87425dc89a839908985af496f7f65702Timo Sirainen struct passdb_sql_request *sql_request)
a3ee5ce6ecc8e228ee69300fdd562d7ac8be89a7Timo Sirainen{
bd1b2615928a1e8be190cb0405754f0aec8cac2fTimo Sirainen if (error != NULL) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen auth_request_log_error(sql_request->auth_request, "sql",
e3aeeb634245e80d4f643f8d2eea11d6b72336d8Timo Sirainen "Set credentials query failed: %s",
e3aeeb634245e80d4f643f8d2eea11d6b72336d8Timo Sirainen error);
e3aeeb634245e80d4f643f8d2eea11d6b72336d8Timo Sirainen }
a423d985ba7261661475811c22b21b80ec765a71Timo Sirainen
2ebeb22b9a8a8bb7fbe2f2e2908478a220792b87Timo Sirainen sql_request->callback.
a423d985ba7261661475811c22b21b80ec765a71Timo Sirainen set_credentials(error == NULL, sql_request->auth_request);
bd4d0a1a7c0626452b8d82f37e3ec07267ac9896Timo Sirainen i_free(sql_request);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic int sql_set_credentials(struct auth_request *request,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char *new_credentials,
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen set_credentials_callback_t *callback)
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen{
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen struct sql_passdb_module *module =
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen (struct sql_passdb_module *) request->passdb->passdb;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen struct sql_transaction_context *transaction;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct passdb_sql_request *sql_request;
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen string_t *query;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen request->mech_password = p_strdup(request->pool, new_credentials);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen query = t_str_new(512);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen var_expand(query, module->conn->set.update_query,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen auth_request_get_var_expand_table(request,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen passdb_sql_escape));
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen sql_request = i_new(struct passdb_sql_request, 1);
64b5dcc136d6eb7ad90463e6cba9e16880ab52adTimo Sirainen sql_request->auth_request = request;
64b5dcc136d6eb7ad90463e6cba9e16880ab52adTimo Sirainen sql_request->callback.set_credentials = callback;
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen transaction = sql_transaction_begin(module->conn->db);
42507d758b053bb483de58fba55c73a9eb5d3fbaTimo Sirainen sql_update(transaction, str_c(query));
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen sql_transaction_commit(&transaction,
42507d758b053bb483de58fba55c73a9eb5d3fbaTimo Sirainen sql_set_credentials_callback, sql_request);
f23ede27743c1aa03eacbfc634d6a10de9110c91Timo Sirainen return 0;
f23ede27743c1aa03eacbfc634d6a10de9110c91Timo Sirainen}
f23ede27743c1aa03eacbfc634d6a10de9110c91Timo Sirainen
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainenstatic struct passdb_module *
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainenpassdb_sql_preinit(pool_t pool, const char *args)
47001341950b8588c5f3a96b75864dab48e279aeTimo Sirainen{
e156adefc1260d31a145df2f5e9b3c82050d4163Timo Sirainen struct sql_passdb_module *module;
e156adefc1260d31a145df2f5e9b3c82050d4163Timo Sirainen struct sql_connection *conn;
47001341950b8588c5f3a96b75864dab48e279aeTimo Sirainen
f81f4bc282cd1944cec187bae89c0701a416ed2aTimo Sirainen module = p_new(pool, struct sql_passdb_module, 1);
f81f4bc282cd1944cec187bae89c0701a416ed2aTimo Sirainen module->conn = conn = db_sql_init(args);
f81f4bc282cd1944cec187bae89c0701a416ed2aTimo Sirainen
f81f4bc282cd1944cec187bae89c0701a416ed2aTimo Sirainen module->module.cache_key =
f81f4bc282cd1944cec187bae89c0701a416ed2aTimo Sirainen auth_cache_parse_key(pool, conn->set.password_query);
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen module->module.default_pass_scheme = conn->set.default_pass_scheme;
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen return &module->module;
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainenstatic void passdb_sql_init(struct passdb_module *_module)
5fb3bff645380804c9db2510940c41db6b8fdb01Timo Sirainen{
5fb3bff645380804c9db2510940c41db6b8fdb01Timo Sirainen struct sql_passdb_module *module =
5fb3bff645380804c9db2510940c41db6b8fdb01Timo Sirainen (struct sql_passdb_module *)_module;
5fb3bff645380804c9db2510940c41db6b8fdb01Timo Sirainen enum sql_db_flags flags;
4bbd396aa6198c84f3f7763b6e8a63a26e97e141Timo Sirainen
4bbd396aa6198c84f3f7763b6e8a63a26e97e141Timo Sirainen flags = sql_get_flags(module->conn->db);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen module->module.blocking = (flags & SQL_DB_FLAG_BLOCKING) != 0;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen if (!module->module.blocking || worker)
0d86aa0d47f7393c669c084b34c0537b193688adTimo Sirainen sql_connect(module->conn->db);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainenstatic void passdb_sql_deinit(struct passdb_module *_module)
aa247243412a49f9bdebf7255e131dc6ece4ed46Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct sql_passdb_module *module =
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen (struct sql_passdb_module *)_module;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainen db_sql_unref(&module->conn);
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainen}
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenstruct passdb_module_interface passdb_sql = {
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen "sql",
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen passdb_sql_preinit,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen passdb_sql_init,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen passdb_sql_deinit,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen sql_verify_plain,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen sql_lookup_credentials,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen sql_set_credentials
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen};
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen#else
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenstruct passdb_module_interface passdb_sql = {
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen .name = "sql"
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen};
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen#endif
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen