33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen/*
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen * LOGIN authentication mechanism.
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen *
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen * Copyright (c) 2004 Andrey Panin <pazke@donpac.ru>
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen *
e074ffeaee1ce283bd42f167c6810e3d013f8218Timo Sirainen * This software is released under the MIT license.
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen */
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen
08d6658a4e2ec8104cd1307f6baa75fdb07a24f8Mark Washenberger#include "auth-common.h"
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen#include "mech.h"
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen#include "passdb.h"
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen#include "safe-memset.h"
08d6658a4e2ec8104cd1307f6baa75fdb07a24f8Mark Washenberger#include "mech-plain-common.h"
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainenstatic void
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainenmech_login_auth_continue(struct auth_request *request,
78ed6a99e980228a75fa59cff84327dc0ea82857Timo Sirainen const unsigned char *data, size_t data_size)
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen{
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen static const char prompt2[] = "Password:";
97c339398f1aba6f315b55a9b6ee6b020e33bea4Timo Sirainen const char *username, *error;
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen if (request->user == NULL) {
97c339398f1aba6f315b55a9b6ee6b020e33bea4Timo Sirainen username = t_strndup(data, data_size);
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen
97c339398f1aba6f315b55a9b6ee6b020e33bea4Timo Sirainen if (!auth_request_set_username(request, username, &error)) {
6135260095e1704ed6edff9d00bdfc043c11429cTimo Sirainen auth_request_log_info(request, AUTH_SUBSYS_MECH, "%s", error);
e80203675151ef9d4f3f850cf02041042eb13096Timo Sirainen auth_request_fail(request);
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen return;
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen }
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen
50782de8a9d5ebe11ee61496b4e695a1d3875230Timo Sirainen auth_request_handler_reply_continue(request, prompt2,
50782de8a9d5ebe11ee61496b4e695a1d3875230Timo Sirainen strlen(prompt2));
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen } else {
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen char *pass = p_strndup(unsafe_data_stack_pool, data, data_size);
462b8c71015b2483cff3c59fa3668246dc72dfceAndrey Panin auth_request_verify_plain(request, pass, plain_verify_callback);
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen safe_memset(pass, 0, strlen(pass));
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen }
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen}
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainenstatic void
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainenmech_login_auth_initial(struct auth_request *request,
1e3a608d8d0e08cb7d549718fbfbcc148fdb236fTimo Sirainen const unsigned char *data, size_t data_size)
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen{
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen static const char prompt1[] = "Username:";
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen
1e3a608d8d0e08cb7d549718fbfbcc148fdb236fTimo Sirainen if (data_size == 0) {
50782de8a9d5ebe11ee61496b4e695a1d3875230Timo Sirainen auth_request_handler_reply_continue(request, prompt1,
50782de8a9d5ebe11ee61496b4e695a1d3875230Timo Sirainen strlen(prompt1));
1e3a608d8d0e08cb7d549718fbfbcc148fdb236fTimo Sirainen } else {
1e3a608d8d0e08cb7d549718fbfbcc148fdb236fTimo Sirainen mech_login_auth_continue(request, data, data_size);
1e3a608d8d0e08cb7d549718fbfbcc148fdb236fTimo Sirainen }
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen}
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen
4ac5448461b63de9637de839fbc611a3d503287cTimo Sirainenstatic struct auth_request *mech_login_auth_new(void)
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen{
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen struct auth_request *request;
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen pool_t pool;
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen
1b81b28b2e7856748cffd7d01052a944b6c80b23Timo Sirainen pool = pool_alloconly_create(MEMPOOL_GROWING"login_auth_request", 2048);
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen request = p_new(pool, struct auth_request, 1);
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen request->pool = pool;
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen return request;
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen}
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainenconst struct mech_module mech_login = {
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen "LOGIN",
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .flags = MECH_SEC_PLAINTEXT,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .passdb_need = MECH_PASSDB_NEED_VERIFY_PLAIN,
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen mech_login_auth_new,
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen mech_login_auth_initial,
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen mech_login_auth_continue,
e70d5895795732b8247ab9abb045b438e954bc46Timo Sirainen mech_generic_auth_free
33c6d5807b449463e9b81db5ec99fe027cc1b984Timo Sirainen};