mech.c revision 704fbadd78375da18dcaf2c5d93ac8cfe2c61358
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2002-2008 Dovecot authors, see the included COPYING file */
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen#include "common.h"
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen#include "ioloop.h"
0536ccb51d41e3078c3a9fa33e509fb4b2420f95Timo Sirainen#include "mech.h"
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen#include "str.h"
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen#include "passdb.h"
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen#include <stdlib.h>
9929820d587fb6aa527a6baf89267b06950921c2Timo Sirainen
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainenstatic struct mech_module_list *mech_modules;
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainenvoid mech_register_module(const struct mech_module *module)
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen{
9929820d587fb6aa527a6baf89267b06950921c2Timo Sirainen struct mech_module_list *list;
9929820d587fb6aa527a6baf89267b06950921c2Timo Sirainen
9929820d587fb6aa527a6baf89267b06950921c2Timo Sirainen list = i_new(struct mech_module_list, 1);
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen list->module = *module;
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen list->next = mech_modules;
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen mech_modules = list;
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen}
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainenvoid mech_unregister_module(const struct mech_module *module)
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen{
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen struct mech_module_list **pos, *list;
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen for (pos = &mech_modules; *pos != NULL; pos = &(*pos)->next) {
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen if (strcmp((*pos)->module.mech_name, module->mech_name) == 0) {
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen list = *pos;
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen *pos = (*pos)->next;
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen i_free(list);
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen break;
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen }
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen }
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen}
9929820d587fb6aa527a6baf89267b06950921c2Timo Sirainen
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainenconst struct mech_module *mech_module_find(const char *name)
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen{
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen struct mech_module_list *list;
9929820d587fb6aa527a6baf89267b06950921c2Timo Sirainen
9929820d587fb6aa527a6baf89267b06950921c2Timo Sirainen for (list = mech_modules; list != NULL; list = list->next) {
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen if (strcasecmp(list->module.mech_name, name) == 0)
8f32e59200da904613506f5649ffa4d9f5989cebTimo Sirainen return &list->module;
8f32e59200da904613506f5649ffa4d9f5989cebTimo Sirainen }
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen return NULL;
9929820d587fb6aa527a6baf89267b06950921c2Timo Sirainen}
9929820d587fb6aa527a6baf89267b06950921c2Timo Sirainen
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainenvoid mech_generic_auth_initial(struct auth_request *request,
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen const unsigned char *data, size_t data_size)
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen{
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen if (data_size == 0) {
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen request->callback(request, AUTH_CLIENT_RESULT_CONTINUE,
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen NULL, 0);
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen } else {
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen request->mech->auth_continue(request, data, data_size);
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen }
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen}
9a755930537f13e9746c4fc8c1bc42a83e52275eTimo Sirainen
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainenvoid mech_generic_auth_free(struct auth_request *request)
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainen{
a067446575cf5ce63f4a64fa0eb4aac16e591e89Timo Sirainen pool_unref(&request->pool);
a067446575cf5ce63f4a64fa0eb4aac16e591e89Timo Sirainen}
a067446575cf5ce63f4a64fa0eb4aac16e591e89Timo Sirainen
8f32e59200da904613506f5649ffa4d9f5989cebTimo Sirainenextern const struct mech_module mech_plain;
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainenextern const struct mech_module mech_login;
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainenextern const struct mech_module mech_apop;
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainenextern const struct mech_module mech_cram_md5;
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainenextern const struct mech_module mech_digest_md5;
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainenextern const struct mech_module mech_ntlm;
8b247780e911909a9fdc47f69ce6d1478902ad98Timo Sirainenextern const struct mech_module mech_otp;
9a755930537f13e9746c4fc8c1bc42a83e52275eTimo Sirainenextern const struct mech_module mech_skey;
9a755930537f13e9746c4fc8c1bc42a83e52275eTimo Sirainenextern const struct mech_module mech_rpa;
b565a6a7a66fb9f224d00c06a950e3c1c585c18eTimo Sirainenextern const struct mech_module mech_anonymous;
#ifdef HAVE_GSSAPI
extern const struct mech_module mech_gssapi;
#endif
#ifdef HAVE_GSSAPI_SPNEGO
extern const struct mech_module mech_gssapi_spnego;
#endif
extern const struct mech_module mech_winbind_ntlm;
extern const struct mech_module mech_winbind_spnego;
void mech_init(void)
{
mech_register_module(&mech_plain);
mech_register_module(&mech_login);
mech_register_module(&mech_apop);
mech_register_module(&mech_cram_md5);
mech_register_module(&mech_digest_md5);
if (getenv("NTLM_USE_WINBIND") != NULL)
mech_register_module(&mech_winbind_ntlm);
else
mech_register_module(&mech_ntlm);
mech_register_module(&mech_winbind_spnego);
mech_register_module(&mech_otp);
mech_register_module(&mech_skey);
mech_register_module(&mech_rpa);
mech_register_module(&mech_anonymous);
#ifdef BUILTIN_GSSAPI
mech_register_module(&mech_gssapi);
#ifdef HAVE_GSSAPI_SPNEGO
mech_register_module(&mech_gssapi_spnego);
#endif
#endif
}
void mech_deinit(void)
{
mech_unregister_module(&mech_plain);
mech_unregister_module(&mech_login);
mech_unregister_module(&mech_apop);
mech_unregister_module(&mech_cram_md5);
mech_unregister_module(&mech_digest_md5);
if (getenv("NTLM_USE_WINBIND") != NULL)
mech_unregister_module(&mech_winbind_ntlm);
else
mech_unregister_module(&mech_ntlm);
mech_unregister_module(&mech_winbind_spnego);
mech_unregister_module(&mech_otp);
mech_unregister_module(&mech_skey);
mech_unregister_module(&mech_rpa);
mech_unregister_module(&mech_anonymous);
#ifdef BUILTIN_GSSAPI
mech_unregister_module(&mech_gssapi);
#ifdef HAVE_GSSAPI_SPNEGO
mech_unregister_module(&mech_gssapi_spnego);
#endif
#endif
}