userdb-sql.c revision 48010d123abfac8cb19f33f1fe12f33a7090089e
bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2004-2010 Dovecot authors, see the included COPYING file */
2d3aac5be07b96f72cf0551fac35ac74a4f07770Timo Sirainenstatic void userdb_sql_iterate_next(struct userdb_iterate_context *_ctx);
2d3aac5be07b96f72cf0551fac35ac74a4f07770Timo Sirainenstatic int userdb_sql_iterate_deinit(struct userdb_iterate_context *_ctx);
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainensql_query_get_result(struct sql_result *result,
f0569d9fbb25c8437760be69f194595a841ad711Timo Sirainen unsigned int i, fields_count;
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen fields_count = sql_result_get_fields_count(result);
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen for (i = 0; i < fields_count; i++) {
f0569d9fbb25c8437760be69f194595a841ad711Timo Sirainen value = sql_result_get_field_value(result, i);
12d34ab79772e0748a1daef30fa749dfe3036608Timo Sirainenstatic void sql_query_callback(struct sql_result *sql_result,
12d34ab79772e0748a1daef30fa749dfe3036608Timo Sirainen struct auth_request *auth_request = sql_request->auth_request;
f0569d9fbb25c8437760be69f194595a841ad711Timo Sirainen struct userdb_module *_module = auth_request->userdb->userdb;
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen enum userdb_result result = USERDB_RESULT_INTERNAL_FAILURE;
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen "User query failed: %s",
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen "User query failed: %s "
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen "(using built-in default user_query: %s)",
9aa52288a4b53186d81b0ec9afa7d9e0a8ee8753Timo Sirainen } else if (ret == 0) {
9aa52288a4b53186d81b0ec9afa7d9e0a8ee8753Timo Sirainen auth_request_log_info(auth_request, "sql", "Unknown user");
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen sql_query_get_result(sql_result, auth_request);
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainenstatic const char *
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainenuserdb_sql_escape(const char *str, const struct auth_request *auth_request)
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen struct userdb_module *_module = auth_request->userdb->userdb;
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen return sql_escape_string(module->conn->db, str);
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainenstatic void userdb_sql_lookup(struct auth_request *auth_request,
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen struct userdb_module *_module = auth_request->userdb->userdb;
8bb360f9e5de1c25e4f875205bb06e8bf15dae14Timo Sirainen var_expand(query, module->conn->set.user_query,
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen auth_request_get_var_expand_table(auth_request,
821984ecb6c90696f35c32a8dc4c8a60f9e98f99Timo Sirainen sql_request = i_new(struct userdb_sql_request, 1);
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen auth_request_log_debug(auth_request, "sql", "%s", str_c(query));
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainenstatic void sql_iter_query_callback(struct sql_result *sql_result,
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainenuserdb_sql_iterate_init(struct userdb_module *userdb,
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen userdb_iter_callback_t *callback, void *context)
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen ctx = i_new(struct sql_userdb_iterate_context, 1);
2054222e84cb972842cc4de88e16516bef41b542Timo Sirainen sql_query(module->conn->db, module->conn->set.iterate_query,
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainenstatic int userdb_sql_iterate_get_user(struct sql_userdb_iterate_context *ctx,
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen const char **user_r)
2054222e84cb972842cc4de88e16516bef41b542Timo Sirainen /* try user first */
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen idx = sql_result_find_field(ctx->result, "user");
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen *user_r = sql_result_get_field_value(ctx->result, idx);
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen /* username [+ domain]? */
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen idx = sql_result_find_field(ctx->result, "username");
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen /* no user or username, fail */
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen *user_r = sql_result_get_field_value(ctx->result, idx);
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen domain = sql_result_find_field_value(ctx->result, "domain");
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen *user_r = t_strconcat(*user_r, "@", domain, NULL);
8bb360f9e5de1c25e4f875205bb06e8bf15dae14Timo Sirainenstatic void userdb_sql_iterate_next(struct userdb_iterate_context *_ctx)
7f773564b94e6054a40d3785cb63c29f1e4d4deeTimo Sirainen struct sql_userdb_module *module = (struct sql_userdb_module *)_module;
33ae95df45c9b5ec51332a6b39eb5322038686b9Timo Sirainen /* query not finished yet */
2054222e84cb972842cc4de88e16516bef41b542Timo Sirainen if (userdb_sql_iterate_get_user(ctx, &user) < 0)
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen i_error("sql: Iterate query didn't return 'user' field");
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen i_error("sql: Iterate query returned NULL user");
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen } else if (ret < 0) {
d371507847d62ba311b4bcc23d18f45c3d0f1a38Timo Sirainen "(using built-in default iterate_query: %s)",
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic int userdb_sql_iterate_deinit(struct userdb_iterate_context *_ctx)
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen /* sql query hasn't finished yet */
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainenuserdb_sql_preinit(pool_t pool, const char *args)
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen module = p_new(pool, struct sql_userdb_module, 1);
08b30498acefc69e223baf7eda6429be98cc3a10Timo Sirainen auth_cache_parse_key(pool, module->conn->set.user_query);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic void userdb_sql_init(struct userdb_module *_module)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen _module->blocking = (flags & SQL_DB_FLAG_BLOCKING) != 0;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic void userdb_sql_deinit(struct userdb_module *_module)