passdb-sql.c revision 9f431ccfb6932746db56245c8a3d3415717ef545
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen/* Copyright (C) 2004 Timo Sirainen, Alex Howansky */
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen lookup_credentials_callback_t *lookup_credentials;
c02a056b724abd6578fb8c4e439de0e94eaea6feTimo Sirainenstatic void result_save_extra_fields(struct sql_result *result,
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen struct auth_request *auth_request = sql_request->auth_request;
c02a056b724abd6578fb8c4e439de0e94eaea6feTimo Sirainen unsigned int i, fields_count;
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen extra = auth_request_extra_begin(auth_request);
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen fields_count = sql_result_get_fields_count(result);
c02a056b724abd6578fb8c4e439de0e94eaea6feTimo Sirainen for (i = 0; i < fields_count; i++) {
c02a056b724abd6578fb8c4e439de0e94eaea6feTimo Sirainen value = sql_result_get_field_value(result, i);
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen auth_request_extra_finish(extra, sql_request->password,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstatic void sql_query_callback(struct sql_result *result, void *context)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen struct passdb_sql_request *sql_request = context;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen struct auth_request *auth_request = sql_request->auth_request;
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen "Password query failed: %s",
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");
c02a056b724abd6578fb8c4e439de0e94eaea6feTimo Sirainen } else if ((idx = sql_result_find_field(result, "password")) < 0) {
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen "Password query must return a field named 'password'");
c02a056b724abd6578fb8c4e439de0e94eaea6feTimo Sirainen password = t_strdup(sql_result_get_field_value(result, idx));
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen result_save_extra_fields(result, idx, sql_request);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen /* make sure there was only one row returned */
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen "Password query returned multiple matches");
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen scheme = passdb_sql_conn->set.default_pass_scheme;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen /* verify plain */
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainen sql_request->callback.verify_plain(passdb_result, auth_request);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ret = password_verify(sql_request->password, password, scheme, user);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen } else if (ret == 0) {
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen auth_request_log_info(auth_request, "sql", "Password mismatch");
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen sql_request->callback.verify_plain(ret > 0 ? PASSDB_RESULT_OK :
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstatic void sql_lookup_pass(struct passdb_sql_request *sql_request)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen var_expand(query, passdb_sql_conn->set.password_query,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen auth_request_get_var_expand_table(sql_request->auth_request,
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen auth_request_log_debug(sql_request->auth_request, "sql",
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstatic void sql_verify_plain(struct auth_request *request, const char *password,
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen if (passdb_cache_verify_plain(request, passdb_sql_cache_key, password,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen sql_request = i_malloc(sizeof(struct passdb_sql_request) +
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen sql_request->callback.verify_plain = callback;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstatic void sql_lookup_credentials(struct auth_request *request,
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen if (passdb_cache_lookup_credentials(request, passdb_sql_cache_key,
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen scheme = passdb_sql_conn->set.default_pass_scheme;
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainen passdb_handle_credentials(result != NULL ? PASSDB_RESULT_OK :
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen sql_request = i_new(struct passdb_sql_request, 1);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen sql_request->callback.lookup_credentials = callback;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstatic void passdb_sql_preinit(const char *args)
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen auth_cache_parse_key(passdb_sql_conn->set.password_query);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstatic void passdb_sql_init(const char *args __attr_unused__)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstatic void passdb_sql_deinit(void)