userdb-sql.c revision e59faf65ce864fe95dc00f5d52b8323cdbd0608a
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen/* Copyright (c) 2004-2010 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;
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen enum userdb_result result = USERDB_RESULT_INTERNAL_FAILURE;
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen "User query failed: %s",
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen } else if (ret == 0) {
b323e76cf555fa6031f3dbbdedeac0df2fff3778Timo Sirainen auth_request_log_info(auth_request, "sql", "Unknown user");
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;
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen var_expand(query, module->conn->set.user_query,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen auth_request_get_var_expand_table(auth_request,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen sql_request = i_new(struct userdb_sql_request, 1);
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen auth_request_log_debug(auth_request, "sql", "%s", str_c(query));
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainenstatic void sql_iter_query_callback(struct sql_result *sql_result,
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainenuserdb_sql_iterate_init(struct auth_userdb *userdb,
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen userdb_iter_callback_t *callback, void *context)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen ctx = i_new(struct sql_userdb_iterate_context, 1);
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen sql_query(module->conn->db, module->conn->set.iterate_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)
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) {
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainenstatic int userdb_sql_iterate_deinit(struct userdb_iterate_context *_ctx)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen /* sql query hasn't finished yet */
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainenuserdb_sql_preinit(struct auth_userdb *auth_userdb, const char *args)
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen module = p_new(auth_userdb->auth->pool, struct sql_userdb_module, 1);
b42f37ae6f65ed986315b6885568d32115e589b1Timo 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)