userdb-sql.c revision 6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* Copyright (C) 2004 Timo Sirainen, Alex Howansky */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
ee359fe1384507fed6c2274e7bfe81d288de4542Stephen Gallagher#include "config.h"
33396dc46ea52c18f47db1b5d590880806521005Sumit Bose#undef HAVE_CONFIG_H
ee359fe1384507fed6c2274e7bfe81d288de4542Stephen Gallagher
33396dc46ea52c18f47db1b5d590880806521005Sumit Bose#ifdef USERDB_SQL
703dc1eb5b050b24235a6640f271d34ea008cf98Jan Engelhardt
703dc1eb5b050b24235a6640f271d34ea008cf98Jan Engelhardt#include "common.h"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#include "str.h"
324fb26ba803a999bedc29e93c46c84f27abf5b7Sumit Bose#include "strescape.h"
324fb26ba803a999bedc29e93c46c84f27abf5b7Sumit Bose#include "var-expand.h"
324fb26ba803a999bedc29e93c46c84f27abf5b7Sumit Bose#include "db-sql.h"
324fb26ba803a999bedc29e93c46c84f27abf5b7Sumit Bose#include "userdb.h"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#include <stdlib.h>
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher#include <string.h>
e65df5b966b27e13283c65f59f99ac44781e0333Simo Sorce
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstruct userdb_sql_request {
002f84aea86371aa079b867c0ec39396b97109d3Lukas Slebodnik struct auth_request *auth_request;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher userdb_callback_t *callback;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher void *context;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher};
87d3b47abba6a40fcf809c85a2b138bc1013d9c5Jakub Hrozek
87d3b47abba6a40fcf809c85a2b138bc1013d9c5Jakub Hrozekstatic struct sql_connection *userdb_sql_conn;
deeadf40db3a1eec64cf030e54afc4cb8612a8d5Lukas Slebodnik
ccf340e56364851f2e5b75e52d3d63701b662954Lukas Slebodnikstatic void sql_query_callback(struct sql_result *result, void *context)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct userdb_sql_request *sql_request = context;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct auth_request *auth_request = sql_request->auth_request;
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher struct user_data user;
cc98edd9479d4622634a1275c98058916c14059aStephen Gallagher const char *uid, *gid;
ee359fe1384507fed6c2274e7bfe81d288de4542Stephen Gallagher int ret;
cc98edd9479d4622634a1275c98058916c14059aStephen Gallagher
d3da1c165cdb4c1ec126a8f4b6b544ca415b9d20Pavel Březina uid = gid = NULL;
d3da1c165cdb4c1ec126a8f4b6b544ca415b9d20Pavel Březina ret = sql_result_next_row(result);
d3da1c165cdb4c1ec126a8f4b6b544ca415b9d20Pavel Březina if (ret < 0) {
c481179da5d5b53ce16d8784c0bd2857ffc2f061Lukas Slebodnik i_error("sql(%s): User query failed: %s",
1183d29d87c5c7439cf2364b7d7324d4a13b6e35Stephen Gallagher get_log_prefix(auth_request),
002f84aea86371aa079b867c0ec39396b97109d3Lukas Slebodnik sql_result_get_error(result));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher } else if (ret == 0) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (verbose) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher i_error("sql(%s): User not found",
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher get_log_prefix(auth_request));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher } else {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher uid = sql_result_find_field_value(result, "uid");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (uid == NULL) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher i_error("sql(%s): Password query didn't return uid, "
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher "or it was NULL", get_log_prefix(auth_request));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
c89589fa349f38214c9cb8d9389c0fd557e5dca2Simo Sorce gid = sql_result_find_field_value(result, "gid");
c89589fa349f38214c9cb8d9389c0fd557e5dca2Simo Sorce if (gid == NULL) {
c89589fa349f38214c9cb8d9389c0fd557e5dca2Simo Sorce i_error("sql(%s): Password query didn't return gid, "
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek "or it was NULL", get_log_prefix(auth_request));
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek }
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek }
c89589fa349f38214c9cb8d9389c0fd557e5dca2Simo Sorce
c89589fa349f38214c9cb8d9389c0fd557e5dca2Simo Sorce if (uid == NULL || gid == NULL)
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek sql_request->callback(NULL, sql_request->context);
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek else {
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek memset(&user, 0, sizeof(user));
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek user.virtual_user = auth_request->user;
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek user.system_user =
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek sql_result_find_field_value(result, "system_user");
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek user.home = sql_result_find_field_value(result, "home");
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek user.mail = sql_result_find_field_value(result, "mail");
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek user.uid = (uid_t)strtoul(uid, NULL, 10);
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek user.gid = (gid_t)strtoul(gid, NULL, 10);
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek sql_request->callback(&user, sql_request->context);
48130eef6c5c64a07094b9e8582ba358b2048f24Jakub Hrozek }
48130eef6c5c64a07094b9e8582ba358b2048f24Jakub Hrozek}
48130eef6c5c64a07094b9e8582ba358b2048f24Jakub Hrozek
48130eef6c5c64a07094b9e8582ba358b2048f24Jakub Hrozekstatic void userdb_sql_lookup(struct auth_request *auth_request,
1658c567191c35beaddffafdb079abe33248037bLukas Slebodnik userdb_callback_t *callback, void *context)
1658c567191c35beaddffafdb079abe33248037bLukas Slebodnik{
1658c567191c35beaddffafdb079abe33248037bLukas Slebodnik struct userdb_sql_request *sql_request;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher string_t *query;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher query = t_str_new(512);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher var_expand(query, userdb_sql_conn->set.user_query,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher auth_request_get_var_expand_table(auth_request,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher str_escape));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
d921c1eba437662437847279f251a0a5d8f70127Maxim sql_request = i_new(struct userdb_sql_request, 1);
d921c1eba437662437847279f251a0a5d8f70127Maxim sql_request->callback = callback;
d921c1eba437662437847279f251a0a5d8f70127Maxim sql_request->context = context;
d921c1eba437662437847279f251a0a5d8f70127Maxim sql_request->auth_request = auth_request;
d921c1eba437662437847279f251a0a5d8f70127Maxim
d921c1eba437662437847279f251a0a5d8f70127Maxim sql_query(userdb_sql_conn->db, str_c(query),
d921c1eba437662437847279f251a0a5d8f70127Maxim sql_query_callback, sql_request);
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer}
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzerstatic void userdb_sql_preinit(const char *args)
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer{
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer userdb_sql_conn = db_sql_init(args);
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer}
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer
327127bb7fcc07f882209f029e14026de1b23c94Maximstatic void userdb_sql_init(const char *args __attr_unused__)
327127bb7fcc07f882209f029e14026de1b23c94Maxim{
327127bb7fcc07f882209f029e14026de1b23c94Maxim db_sql_connect(userdb_sql_conn);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic void userdb_sql_deinit(void)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher db_sql_unref(userdb_sql_conn);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
eb2e21b764d03544d8161e9956d7f70b07b75f77Simo Sorcestruct userdb_module userdb_sql = {
bc9235cfb80bd64a3bfa959e8d26d5ad1be0bdf4Jakub Hrozek userdb_sql_preinit,
bc9235cfb80bd64a3bfa959e8d26d5ad1be0bdf4Jakub Hrozek userdb_sql_init,
07d82f79d2970a08628ebf71343441ec55faa6faPavel Březina userdb_sql_deinit,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher userdb_sql_lookup
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher};
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#endif
4b6a0d0b3d42e5fdb457f47d9adfa5e66b160256Stephen Gallagher