passdb-sql.c revision 1e7252421b9c85b898fef7e75bd6422ef1f046e4
153bb1867986d6db392e2cfa711ad6231fce8abeJon A. Cruz/* Copyright (C) 2004 Timo Sirainen, Alex Howansky */
d754d035663e44cb000f1f2b41a2fe8bfcfebd6djucabluesstatic void sql_query_save_results(struct sql_result *result,
d754d035663e44cb000f1f2b41a2fe8bfcfebd6djucablues struct auth_request *auth_request = sql_request->auth_request;
6e369d7e74c36e07f5fb1e27d37923fbed7dd89cmental struct passdb_module *_module = auth_request->passdb->passdb;
6e369d7e74c36e07f5fb1e27d37923fbed7dd89cmental struct sql_passdb_module *module = (struct sql_passdb_module *)_module;
6e369d7e74c36e07f5fb1e27d37923fbed7dd89cmental unsigned int i, fields_count;
d297097bc1b9d4e074089ea5d649c2a0d270ff42nicholasbishop for (i = 0; i < fields_count; i++) {
3deb9b5ce0f058530cd0749009464b5afe8cf09cAlex Valavanis value = sql_result_get_field_value(result, i);
68991a79a8befd84ef9af0fd4ee9922e149c5205nicholasbishop auth_request_set_field(auth_request, name, value,
68991a79a8befd84ef9af0fd4ee9922e149c5205nicholasbishopstatic void sql_query_callback(struct sql_result *result,
d297097bc1b9d4e074089ea5d649c2a0d270ff42nicholasbishop struct auth_request *auth_request = sql_request->auth_request;
3deb9b5ce0f058530cd0749009464b5afe8cf09cAlex Valavanis passdb_result = PASSDB_RESULT_INTERNAL_FAILURE;
685292a24e42a23ca4fa7cc467398ce10fcfd453JucaBlues "Password query failed: %s",
d297097bc1b9d4e074089ea5d649c2a0d270ff42nicholasbishop } else if (ret == 0) {
d297097bc1b9d4e074089ea5d649c2a0d270ff42nicholasbishop auth_request_log_info(auth_request, "sql", "unknown user");
3deb9b5ce0f058530cd0749009464b5afe8cf09cAlex Valavanis /* Note that we really want to check if the password field is
6e369d7e74c36e07f5fb1e27d37923fbed7dd89cmental found. Just checking if password is set isn't enough,
3deb9b5ce0f058530cd0749009464b5afe8cf09cAlex Valavanis because with proxies we might want to return NULL as
6e369d7e74c36e07f5fb1e27d37923fbed7dd89cmental password. */
6e369d7e74c36e07f5fb1e27d37923fbed7dd89cmental "Password query must return a field named "
3deb9b5ce0f058530cd0749009464b5afe8cf09cAlex Valavanis "'password'");
3deb9b5ce0f058530cd0749009464b5afe8cf09cAlex Valavanis } else if (sql_result_next_row(result) > 0) {
6e369d7e74c36e07f5fb1e27d37923fbed7dd89cmental "Password query returned multiple matches");
3deb9b5ce0f058530cd0749009464b5afe8cf09cAlex Valavanis } else if (auth_request->passdb_password == NULL &&
6e369d7e74c36e07f5fb1e27d37923fbed7dd89cmental "Empty password returned without no_password");
3deb9b5ce0f058530cd0749009464b5afe8cf09cAlex Valavanis /* passdb_password may change on the way,
3deb9b5ce0f058530cd0749009464b5afe8cf09cAlex Valavanis so we'll need to strdup. */
3deb9b5ce0f058530cd0749009464b5afe8cf09cAlex Valavanis /* auth_request_set_field() sets scheme */
6e369d7e74c36e07f5fb1e27d37923fbed7dd89cmental passdb_handle_credentials(passdb_result, password, scheme,
6e369d7e74c36e07f5fb1e27d37923fbed7dd89cmental /* verify plain */
6e369d7e74c36e07f5fb1e27d37923fbed7dd89cmental sql_request->callback.verify_plain(passdb_result, auth_request);
6e369d7e74c36e07f5fb1e27d37923fbed7dd89cmental sql_request->callback.verify_plain(ret > 0 ? PASSDB_RESULT_OK :
cff0a1487c551f4d21d1d6da1c81335435814675Alex Valavanisstatic const char *
6e369d7e74c36e07f5fb1e27d37923fbed7dd89cmentalpassdb_sql_escape(const char *str, const struct auth_request *auth_request)
6e369d7e74c36e07f5fb1e27d37923fbed7dd89cmental struct passdb_module *_module = auth_request->passdb->passdb;
6e369d7e74c36e07f5fb1e27d37923fbed7dd89cmental struct sql_passdb_module *module = (struct sql_passdb_module *)_module;
9982f495cde2750b1c6446bfb152af73ab981512Johan Engelenstatic void sql_lookup_pass(struct passdb_sql_request *sql_request)
6e369d7e74c36e07f5fb1e27d37923fbed7dd89cmental struct sql_passdb_module *module = (struct sql_passdb_module *)_module;
328fffb9854baed083286c6ff41b8a040298b340nicholasbishop var_expand(query, module->conn->set.password_query,
328fffb9854baed083286c6ff41b8a040298b340nicholasbishop auth_request_get_var_expand_table(sql_request->auth_request,
b068af856bbc33238f425b3221426aa52e554ce0nicholasbishop auth_request_log_debug(sql_request->auth_request, "sql",
3deb9b5ce0f058530cd0749009464b5afe8cf09cAlex Valavanisstatic void sql_verify_plain(struct auth_request *request,
d297097bc1b9d4e074089ea5d649c2a0d270ff42nicholasbishop sql_request = p_new(request->pool, struct passdb_sql_request, 1);
3deb9b5ce0f058530cd0749009464b5afe8cf09cAlex Valavanis sql_request->callback.verify_plain = callback;
b068af856bbc33238f425b3221426aa52e554ce0nicholasbishopstatic void sql_lookup_credentials(struct auth_request *request,
b068af856bbc33238f425b3221426aa52e554ce0nicholasbishop sql_request = p_new(request->pool, struct passdb_sql_request, 1);
d297097bc1b9d4e074089ea5d649c2a0d270ff42nicholasbishop sql_request->callback.lookup_credentials = callback;
b068af856bbc33238f425b3221426aa52e554ce0nicholasbishopstatic void sql_set_credentials_callback(const char *error,
d297097bc1b9d4e074089ea5d649c2a0d270ff42nicholasbishop auth_request_log_error(sql_request->auth_request, "sql",
d297097bc1b9d4e074089ea5d649c2a0d270ff42nicholasbishop "Set credentials query failed: %s",
d297097bc1b9d4e074089ea5d649c2a0d270ff42nicholasbishop sql_request->callback.set_credentials(result,
e1340809e493886df96a707098af3f6923069ff8nicholasbishopstatic int sql_set_credentials(struct auth_request *request,
3deb9b5ce0f058530cd0749009464b5afe8cf09cAlex Valavanis (struct sql_passdb_module *) request->passdb->passdb;
d297097bc1b9d4e074089ea5d649c2a0d270ff42nicholasbishop request->mech_password = p_strdup(request->pool, new_credentials);
d297097bc1b9d4e074089ea5d649c2a0d270ff42nicholasbishop var_expand(query, module->conn->set.update_query,
d297097bc1b9d4e074089ea5d649c2a0d270ff42nicholasbishop sql_request = i_new(struct passdb_sql_request, 1);
d297097bc1b9d4e074089ea5d649c2a0d270ff42nicholasbishop sql_request->callback.set_credentials = callback;
d297097bc1b9d4e074089ea5d649c2a0d270ff42nicholasbishop transaction = sql_transaction_begin(module->conn->db);
d297097bc1b9d4e074089ea5d649c2a0d270ff42nicholasbishoppassdb_sql_preinit(struct auth_passdb *auth_passdb, const char *args)
d297097bc1b9d4e074089ea5d649c2a0d270ff42nicholasbishop module = p_new(auth_passdb->auth->pool, struct sql_passdb_module, 1);
e3b2acf99faddc117281614b33fe55e7c8141278nicholasbishop auth_cache_parse_key(auth_passdb->auth->pool,
e3b2acf99faddc117281614b33fe55e7c8141278nicholasbishop module->module.default_pass_scheme = conn->set.default_pass_scheme;
b068af856bbc33238f425b3221426aa52e554ce0nicholasbishopstatic void passdb_sql_init(struct passdb_module *_module,
b068af856bbc33238f425b3221426aa52e554ce0nicholasbishop module->module.blocking = (flags & SQL_DB_FLAG_BLOCKING) != 0;
375a47157c1740a5fdd9ad733c347a53381531abAlex Valavanisstatic void passdb_sql_deinit(struct passdb_module *_module)