mech.c revision 59beb411159176b39e48a52d60dd3239732e67b4
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen/* Copyright (c) 2002-2009 Dovecot authors, see the included COPYING file */
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen#include "auth-common.h"
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen#include "ioloop.h"
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen#include "mech.h"
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen#include "str.h"
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen#include "passdb.h"
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen
f1901fd21906911f7be075c965ac882f6a87b4c3Timo Sirainen#include <stdlib.h>
63a61b7a739ae0f3f520215137d9c50f94d0f34fTimo Sirainen
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainenstatic struct mech_module_list *mech_modules;
18565c69efcd7db003dbf27cf625ed822e889fb1Timo Sirainen
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainenvoid mech_register_module(const struct mech_module *module)
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen{
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen struct mech_module_list *list;
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen list = i_new(struct mech_module_list, 1);
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainen list->module = *module;
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainen
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainen list->next = mech_modules;
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainen mech_modules = list;
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainen}
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainen
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainenvoid mech_unregister_module(const struct mech_module *module)
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainen{
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainen struct mech_module_list **pos, *list;
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainen
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainen for (pos = &mech_modules; *pos != NULL; pos = &(*pos)->next) {
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainen if (strcmp((*pos)->module.mech_name, module->mech_name) == 0) {
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainen list = *pos;
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainen *pos = (*pos)->next;
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainen i_free(list);
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen break;
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen }
af1f4b17a92ca7b2661737e65c7849df289d3070Timo Sirainen }
af1f4b17a92ca7b2661737e65c7849df289d3070Timo Sirainen}
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainen
f1901fd21906911f7be075c965ac882f6a87b4c3Timo Sirainenconst struct mech_module *mech_module_find(const char *name)
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen{
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen struct mech_module_list *list;
01cbf4ac5d44137ab434791be7f838d98d0fcf3bTimo Sirainen
4b41116563110d00330896a568eff1078c382827Timo Sirainen for (list = mech_modules; list != NULL; list = list->next) {
4b41116563110d00330896a568eff1078c382827Timo Sirainen if (strcasecmp(list->module.mech_name, name) == 0)
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen return &list->module;
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen }
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen return NULL;
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen}
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainenvoid mech_generic_auth_initial(struct auth_request *request,
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen const unsigned char *data, size_t data_size)
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen{
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen if (data == NULL) {
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen request->callback(request, AUTH_CLIENT_RESULT_CONTINUE,
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen NULL, 0);
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen } else {
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen /* initial reply given, even if it was 0 bytes */
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen request->mech->auth_continue(request, data, data_size);
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen }
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen}
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainenvoid mech_generic_auth_free(struct auth_request *request)
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen{
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen pool_unref(&request->pool);
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen}
d30da25fb6be1f1c667d93767c9194000194b618Timo Sirainen
d30da25fb6be1f1c667d93767c9194000194b618Timo Sirainenextern const struct mech_module mech_plain;
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainenextern const struct mech_module mech_login;
597dce34068d603fb759b4dff404b34049213e51Timo Sirainenextern const struct mech_module mech_apop;
63a61b7a739ae0f3f520215137d9c50f94d0f34fTimo Sirainenextern const struct mech_module mech_cram_md5;
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainenextern const struct mech_module mech_digest_md5;
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainenextern const struct mech_module mech_external;
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainenextern const struct mech_module mech_ntlm;
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainenextern const struct mech_module mech_otp;
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainenextern const struct mech_module mech_skey;
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainenextern const struct mech_module mech_rpa;
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainenextern const struct mech_module mech_anonymous;
4b41116563110d00330896a568eff1078c382827Timo Sirainen#ifdef HAVE_GSSAPI
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainenextern const struct mech_module mech_gssapi;
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen#endif
f1901fd21906911f7be075c965ac882f6a87b4c3Timo Sirainen#ifdef HAVE_GSSAPI_SPNEGO
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainenextern const struct mech_module mech_gssapi_spnego;
f1901fd21906911f7be075c965ac882f6a87b4c3Timo Sirainen#endif
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainenextern const struct mech_module mech_winbind_ntlm;
6060b7c8edf8fce73470d0df6a2479b69b01c537Timo Sirainenextern const struct mech_module mech_winbind_spnego;
7f773564b94e6054a40d3785cb63c29f1e4d4deeTimo Sirainen
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainenvoid mech_init(const struct auth_settings *set)
ccc895c0358108d2304239063e940b7d75f364abTimo Sirainen{
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen mech_register_module(&mech_plain);
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen mech_register_module(&mech_login);
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen mech_register_module(&mech_apop);
4b41116563110d00330896a568eff1078c382827Timo Sirainen mech_register_module(&mech_cram_md5);
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen mech_register_module(&mech_digest_md5);
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen mech_register_module(&mech_external);
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen if (set->use_winbind) {
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen mech_register_module(&mech_winbind_ntlm);
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen mech_register_module(&mech_winbind_spnego);
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen } else {
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainen mech_register_module(&mech_ntlm);
8000c86be02008b74acc71fa422444dc432e2c01Timo Sirainen#if defined(HAVE_GSSAPI_SPNEGO) && defined(BUILTIN_GSSAPI)
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen mech_register_module(&mech_gssapi_spnego);
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen#endif
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen }
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen mech_register_module(&mech_otp);
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen mech_register_module(&mech_skey);
4b41116563110d00330896a568eff1078c382827Timo Sirainen mech_register_module(&mech_rpa);
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen mech_register_module(&mech_anonymous);
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen#ifdef BUILTIN_GSSAPI
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainen mech_register_module(&mech_gssapi);
345212e8f61ebf14ff4f80df26df9e655eb5121eTimo Sirainen#endif
345212e8f61ebf14ff4f80df26df9e655eb5121eTimo Sirainen}
345212e8f61ebf14ff4f80df26df9e655eb5121eTimo Sirainen
345212e8f61ebf14ff4f80df26df9e655eb5121eTimo Sirainenvoid mech_deinit(const struct auth_settings *set)
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen{
345212e8f61ebf14ff4f80df26df9e655eb5121eTimo Sirainen mech_unregister_module(&mech_plain);
8000c86be02008b74acc71fa422444dc432e2c01Timo Sirainen mech_unregister_module(&mech_login);
8000c86be02008b74acc71fa422444dc432e2c01Timo Sirainen mech_unregister_module(&mech_apop);
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen mech_unregister_module(&mech_cram_md5);
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen mech_unregister_module(&mech_digest_md5);
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen mech_unregister_module(&mech_external);
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen if (set->use_winbind) {
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen mech_unregister_module(&mech_winbind_ntlm);
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen mech_unregister_module(&mech_winbind_spnego);
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen } else {
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen mech_unregister_module(&mech_ntlm);
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen#if defined(HAVE_GSSAPI_SPNEGO) && defined(BUILTIN_GSSAPI)
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen mech_unregister_module(&mech_gssapi_spnego);
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen#endif
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen }
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen mech_unregister_module(&mech_otp);
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen mech_unregister_module(&mech_skey);
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen mech_unregister_module(&mech_rpa);
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen mech_unregister_module(&mech_anonymous);
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen#ifdef BUILTIN_GSSAPI
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen mech_unregister_module(&mech_gssapi);
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen#endif
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen}
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen