userdb-sql.c revision bcb4e51a409d94ae670de96afb8483a4f7855294
bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2004-2018 Dovecot authors, see the included COPYING file */
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainenstatic void userdb_sql_iterate_next(struct userdb_iterate_context *_ctx);
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainenstatic int userdb_sql_iterate_deinit(struct userdb_iterate_context *_ctx);
137ea7ca34005345aa2304a940149b7f3774d727Timo Sirainensql_query_get_result(struct sql_result *result,
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen unsigned int i, fields_count;
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen fields_count = sql_result_get_fields_count(result);
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen for (i = 0; i < fields_count; i++) {
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen value = sql_result_get_field_value(result, i);
2cfe9983ce7a6280636ee12beccc2e865111967bTimo Sirainenstatic void sql_query_callback(struct sql_result *sql_result,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen struct auth_request *auth_request = sql_request->auth_request;
48010d123abfac8cb19f33f1fe12f33a7090089eTimo Sirainen struct userdb_module *_module = auth_request->userdb->userdb;
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen enum userdb_result result = USERDB_RESULT_INTERNAL_FAILURE;
6135260095e1704ed6edff9d00bdfc043c11429cTimo Sirainen auth_request_log_error(auth_request, AUTH_SUBSYS_DB,
48010d123abfac8cb19f33f1fe12f33a7090089eTimo Sirainen "User query failed: %s",
6135260095e1704ed6edff9d00bdfc043c11429cTimo Sirainen auth_request_log_error(auth_request, AUTH_SUBSYS_DB,
48010d123abfac8cb19f33f1fe12f33a7090089eTimo Sirainen "User query failed: %s "
48010d123abfac8cb19f33f1fe12f33a7090089eTimo Sirainen "(using built-in default user_query: %s)",
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen } else if (ret == 0) {
6135260095e1704ed6edff9d00bdfc043c11429cTimo Sirainen auth_request_log_unknown_user(auth_request, AUTH_SUBSYS_DB);
6fabfb7bbfd88d0c1de66981e52850f26067623bTimo Sirainen sql_query_get_result(sql_result, auth_request);
3c9783956dea385b322cd7fa6bf8c98c17a907a0Timo Sirainenstatic const char *
3c9783956dea385b322cd7fa6bf8c98c17a907a0Timo Sirainenuserdb_sql_escape(const char *str, const struct auth_request *auth_request)
3c9783956dea385b322cd7fa6bf8c98c17a907a0Timo Sirainen struct userdb_module *_module = auth_request->userdb->userdb;
3c9783956dea385b322cd7fa6bf8c98c17a907a0Timo Sirainen return sql_escape_string(module->conn->db, str);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstatic void userdb_sql_lookup(struct auth_request *auth_request,
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen struct userdb_module *_module = auth_request->userdb->userdb;
0f5dc4da3982053036be65190e44bf28a67b1ca2Timo Sirainen if (t_auth_request_var_expand(module->conn->set.user_query,
0f5dc4da3982053036be65190e44bf28a67b1ca2Timo Sirainen auth_request_log_error(auth_request, AUTH_SUBSYS_DB,
0f5dc4da3982053036be65190e44bf28a67b1ca2Timo Sirainen "Failed to expand user_query=%s: %s",
0f5dc4da3982053036be65190e44bf28a67b1ca2Timo Sirainen callback(USERDB_RESULT_INTERNAL_FAILURE, auth_request);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen sql_request = i_new(struct userdb_sql_request, 1);
38ceb710e2bc957a66a75c68957cb87746682a75Timo Sirainen auth_request_log_debug(auth_request, AUTH_SUBSYS_DB, "%s", query);
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainenstatic void sql_iter_query_callback(struct sql_result *sql_result,
e9371f899a3d4207a0ffd3923ea5ec7250cf5e75Timo Sirainenuserdb_sql_iterate_init(struct auth_request *auth_request,
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen userdb_iter_callback_t *callback, void *context)
e9371f899a3d4207a0ffd3923ea5ec7250cf5e75Timo Sirainen struct userdb_module *_module = auth_request->userdb->userdb;
0f5dc4da3982053036be65190e44bf28a67b1ca2Timo Sirainen if (t_auth_request_var_expand(module->conn->set.iterate_query,
0f5dc4da3982053036be65190e44bf28a67b1ca2Timo Sirainen auth_request_log_error(auth_request, AUTH_SUBSYS_DB,
0f5dc4da3982053036be65190e44bf28a67b1ca2Timo Sirainen "Failed to expand iterate_query=%s: %s",
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen ctx = i_new(struct sql_userdb_iterate_context, 1);
38ceb710e2bc957a66a75c68957cb87746682a75Timo Sirainen auth_request_log_debug(auth_request, AUTH_SUBSYS_DB, "%s", query);
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainenstatic int userdb_sql_iterate_get_user(struct sql_userdb_iterate_context *ctx,
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen const char **user_r)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen /* try user first */
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen idx = sql_result_find_field(ctx->result, "user");
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen *user_r = sql_result_get_field_value(ctx->result, idx);
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen /* username [+ domain]? */
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen idx = sql_result_find_field(ctx->result, "username");
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen /* no user or username, fail */
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen *user_r = sql_result_get_field_value(ctx->result, idx);
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen domain = sql_result_find_field_value(ctx->result, "domain");
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen *user_r = t_strconcat(*user_r, "@", domain, NULL);
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainenstatic void userdb_sql_iterate_next(struct userdb_iterate_context *_ctx)
e9371f899a3d4207a0ffd3923ea5ec7250cf5e75Timo Sirainen struct userdb_module *_module = _ctx->auth_request->userdb->userdb;
48010d123abfac8cb19f33f1fe12f33a7090089eTimo Sirainen struct sql_userdb_module *module = (struct sql_userdb_module *)_module;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen /* query not finished yet */
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen if (userdb_sql_iterate_get_user(ctx, &user) < 0)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen i_error("sql: Iterate query didn't return 'user' field");
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen i_error("sql: Iterate query returned NULL user");
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen } else if (ret < 0) {
48010d123abfac8cb19f33f1fe12f33a7090089eTimo Sirainen "(using built-in default iterate_query: %s)",
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainenstatic int userdb_sql_iterate_deinit(struct userdb_iterate_context *_ctx)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen /* sql query hasn't finished yet */
849969f639a00eab26791db3cb1b66430420c0cdTimo Sirainenuserdb_sql_preinit(pool_t pool, const char *args)
849969f639a00eab26791db3cb1b66430420c0cdTimo Sirainen module = p_new(pool, struct sql_userdb_module, 1);
849969f639a00eab26791db3cb1b66430420c0cdTimo Sirainen auth_cache_parse_key(pool, module->conn->set.user_query);
f3d506e525a720f214020ca0f989a1966b30edaeTimo Sirainenstatic void userdb_sql_init(struct userdb_module *_module)
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen _module->blocking = (flags & SQL_DB_FLAG_BLOCKING) != 0;
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainenstatic void userdb_sql_deinit(struct userdb_module *_module)