passdb-sql.c revision 9f431ccfb6932746db56245c8a3d3415717ef545
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen/* Copyright (C) 2004 Timo Sirainen, Alex Howansky */
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen#include "config.h"
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen#undef HAVE_CONFIG_H
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen#ifdef PASSDB_SQL
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen#include "common.h"
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen#include "str.h"
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen#include "strescape.h"
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen#include "var-expand.h"
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen#include "password-scheme.h"
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen#include "db-sql.h"
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen#include "passdb.h"
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen#include "passdb-cache.h"
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen#include <stdlib.h>
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen#include <string.h>
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstruct passdb_sql_request {
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen struct auth_request *auth_request;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen enum passdb_credentials credentials;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen union {
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen verify_plain_callback_t *verify_plain;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen lookup_credentials_callback_t *lookup_credentials;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen } callback;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen char password[1];
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen};
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstatic struct sql_connection *passdb_sql_conn;
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainenstatic char *passdb_sql_cache_key;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
c02a056b724abd6578fb8c4e439de0e94eaea6feTimo Sirainenstatic void result_save_extra_fields(struct sql_result *result,
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen unsigned int skip_idx,
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen struct passdb_sql_request *sql_request)
c02a056b724abd6578fb8c4e439de0e94eaea6feTimo Sirainen{
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen struct auth_request *auth_request = sql_request->auth_request;
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen struct auth_request_extra *extra;
c02a056b724abd6578fb8c4e439de0e94eaea6feTimo Sirainen unsigned int i, fields_count;
c02a056b724abd6578fb8c4e439de0e94eaea6feTimo Sirainen const char *name, *value;
c02a056b724abd6578fb8c4e439de0e94eaea6feTimo Sirainen
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen extra = auth_request_extra_begin(auth_request);
c02a056b724abd6578fb8c4e439de0e94eaea6feTimo Sirainen
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen fields_count = sql_result_get_fields_count(result);
c02a056b724abd6578fb8c4e439de0e94eaea6feTimo Sirainen for (i = 0; i < fields_count; i++) {
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen if (i == skip_idx)
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen continue;
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen
c02a056b724abd6578fb8c4e439de0e94eaea6feTimo Sirainen name = sql_result_get_field_name(result, i);
c02a056b724abd6578fb8c4e439de0e94eaea6feTimo Sirainen value = sql_result_get_field_value(result, i);
c02a056b724abd6578fb8c4e439de0e94eaea6feTimo Sirainen
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen if (value != NULL)
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen auth_request_extra_next(extra, name, value);
c02a056b724abd6578fb8c4e439de0e94eaea6feTimo Sirainen }
c02a056b724abd6578fb8c4e439de0e94eaea6feTimo Sirainen
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen auth_request_extra_finish(extra, sql_request->password,
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen passdb_sql_cache_key);
c02a056b724abd6578fb8c4e439de0e94eaea6feTimo Sirainen}
c02a056b724abd6578fb8c4e439de0e94eaea6feTimo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstatic void sql_query_callback(struct sql_result *result, void *context)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen{
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen struct passdb_sql_request *sql_request = context;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen struct auth_request *auth_request = sql_request->auth_request;
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainen enum passdb_result passdb_result;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen const char *user, *password, *scheme;
c02a056b724abd6578fb8c4e439de0e94eaea6feTimo Sirainen int ret, idx;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainen passdb_result = PASSDB_RESULT_USER_UNKNOWN;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen user = auth_request->user;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen password = NULL;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ret = sql_result_next_row(result);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if (ret < 0) {
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen auth_request_log_error(auth_request, "sql",
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen "Password query failed: %s",
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen sql_result_get_error(result));
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainen passdb_result = PASSDB_RESULT_INTERNAL_FAILURE;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen } else if (ret == 0) {
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen auth_request_log_info(auth_request, "sql", "unknown user");
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen if (passdb_cache != NULL) {
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen auth_cache_insert(passdb_cache, auth_request,
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen passdb_sql_cache_key, "");
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen }
c02a056b724abd6578fb8c4e439de0e94eaea6feTimo Sirainen } else if ((idx = sql_result_find_field(result, "password")) < 0) {
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen auth_request_log_error(auth_request, "sql",
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen "Password query must return a field named 'password'");
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen } else {
c02a056b724abd6578fb8c4e439de0e94eaea6feTimo Sirainen password = t_strdup(sql_result_get_field_value(result, idx));
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen result_save_extra_fields(result, idx, sql_request);
fd64760dc8b2f8586b9fb91b0458389b4e625d46Timo Sirainen passdb_result = PASSDB_RESULT_OK;
c02a056b724abd6578fb8c4e439de0e94eaea6feTimo Sirainen }
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
c02a056b724abd6578fb8c4e439de0e94eaea6feTimo Sirainen if (ret > 0) {
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen /* make sure there was only one row returned */
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if (sql_result_next_row(result) > 0) {
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen auth_request_log_error(auth_request, "sql",
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen "Password query returned multiple matches");
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen password = NULL;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen }
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen }
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen scheme = password_get_scheme(&password);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if (scheme == NULL) {
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen scheme = passdb_sql_conn->set.default_pass_scheme;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen i_assert(scheme != NULL);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen }
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if (sql_request->credentials != -1) {
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainen passdb_handle_credentials(passdb_result,
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainen sql_request->credentials, password, scheme,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen sql_request->callback.lookup_credentials,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen auth_request);
9c93e2e3e35bff1bddbe59cef7be296aa24bd79dTimo Sirainen i_free(sql_request);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen return;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen }
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen /* verify plain */
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if (password == NULL) {
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainen sql_request->callback.verify_plain(passdb_result, auth_request);
9c93e2e3e35bff1bddbe59cef7be296aa24bd79dTimo Sirainen i_free(sql_request);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen return;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen }
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ret = password_verify(sql_request->password, password, scheme, user);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if (ret < 0) {
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen auth_request_log_error(auth_request, "sql",
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen "Unknown password scheme %s", scheme);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen } else if (ret == 0) {
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen auth_request_log_info(auth_request, "sql", "Password mismatch");
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen }
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen sql_request->callback.verify_plain(ret > 0 ? PASSDB_RESULT_OK :
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainen PASSDB_RESULT_PASSWORD_MISMATCH,
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainen auth_request);
9c93e2e3e35bff1bddbe59cef7be296aa24bd79dTimo Sirainen i_free(sql_request);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen}
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstatic void sql_lookup_pass(struct passdb_sql_request *sql_request)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen{
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen string_t *query;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen query = t_str_new(512);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen var_expand(query, passdb_sql_conn->set.password_query,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen auth_request_get_var_expand_table(sql_request->auth_request,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen str_escape));
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen auth_request_log_debug(sql_request->auth_request, "sql",
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen "query: %s", str_c(query));
a7bee3930831a9261fa6180d02af29c484d862e9Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen sql_query(passdb_sql_conn->db, str_c(query),
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen sql_query_callback, sql_request);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen}
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstatic void sql_verify_plain(struct auth_request *request, const char *password,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen verify_plain_callback_t *callback)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen{
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen struct passdb_sql_request *sql_request;
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen enum passdb_result result;
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen if (passdb_cache_verify_plain(request, passdb_sql_cache_key, password,
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen passdb_sql_conn->set.default_pass_scheme,
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen &result)) {
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen callback(result, request);
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen return;
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen }
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen sql_request = i_malloc(sizeof(struct passdb_sql_request) +
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen strlen(password));
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen sql_request->auth_request = request;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen sql_request->credentials = -1;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen sql_request->callback.verify_plain = callback;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen strcpy(sql_request->password, password);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen sql_lookup_pass(sql_request);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen}
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstatic void sql_lookup_credentials(struct auth_request *request,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen enum passdb_credentials credentials,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen lookup_credentials_callback_t *callback)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen{
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen struct passdb_sql_request *sql_request;
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen const char *result, *scheme;
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen if (passdb_cache_lookup_credentials(request, passdb_sql_cache_key,
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen &result, &scheme)) {
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen if (scheme == NULL)
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen scheme = passdb_sql_conn->set.default_pass_scheme;
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainen passdb_handle_credentials(result != NULL ? PASSDB_RESULT_OK :
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainen PASSDB_RESULT_USER_UNKNOWN,
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainen credentials, result, scheme,
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen callback, request);
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen return;
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen }
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen sql_request = i_new(struct passdb_sql_request, 1);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen sql_request->auth_request = request;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen sql_request->credentials = credentials;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen sql_request->callback.lookup_credentials = callback;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen sql_lookup_pass(sql_request);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen}
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstatic void passdb_sql_preinit(const char *args)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen{
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen passdb_sql_conn = db_sql_init(args);
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen passdb_sql_cache_key =
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen auth_cache_parse_key(passdb_sql_conn->set.password_query);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen}
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstatic void passdb_sql_init(const char *args __attr_unused__)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen{
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen db_sql_connect(passdb_sql_conn);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen}
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstatic void passdb_sql_deinit(void)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen{
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen db_sql_unref(passdb_sql_conn);
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen i_free(passdb_sql_cache_key);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen}
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstruct passdb_module passdb_sql = {
1f1e81aab38d833d1c9cdc244c91fd762e0080d4Timo Sirainen "sql",
1f1e81aab38d833d1c9cdc244c91fd762e0080d4Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen passdb_sql_preinit,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen passdb_sql_init,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen passdb_sql_deinit,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen sql_verify_plain,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen sql_lookup_credentials
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen};
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen#endif