[dovecot-cvs]
dovecot/src/auth Makefile.am, 1.28, 1.29 mech-login.c,
NONE, 1.1 mech.c, 1.27, 1.28
cras at dovecot.org
cras at dovecot.org
Thu Jul 22 16:42:04 EEST 2004
Update of /home/cvs/dovecot/src/auth
In directory talvi:/tmp/cvs-serv32366/src/auth
Modified Files:
Makefile.am mech.c
Added Files:
mech-login.c
Log Message:
Added LOGIN SASL mechanism. Patch by Andrey Panin
Index: Makefile.am
===================================================================
RCS file: /home/cvs/dovecot/src/auth/Makefile.am,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -d -r1.28 -r1.29
--- Makefile.am 2 Jul 2004 22:03:37 -0000 1.28
+++ Makefile.am 22 Jul 2004 13:42:02 -0000 1.29
@@ -29,6 +29,7 @@
mech-anonymous.c \
mech-cyrus-sasl2.c \
mech-plain.c \
+ mech-login.c \
mech-cram-md5.c \
mech-digest-md5.c \
mech-apop.c \
--- NEW FILE: mech-login.c ---
/*
* LOGIN authentication mechanism.
*
* Copyright (c) 2004 Andrey Panin <pazke at donpac.ru>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*/
#include "common.h"
#include "mech.h"
#include "passdb.h"
#include "safe-memset.h"
static void verify_callback(enum passdb_result result,
struct auth_request *request)
{
mech_auth_finish(request, NULL, 0, result == PASSDB_RESULT_OK);
}
static int
mech_login_auth_continue(struct auth_request *auth_request,
const unsigned char *data, size_t data_size,
mech_callback_t *callback)
{
struct auth_client_request_reply reply;
static const char prompt2[] = "Password:";
auth_request->callback = callback;
if (!auth_request->user) {
auth_request->user =
p_strndup(auth_request->pool, data, data_size);
if (!mech_is_valid_username(auth_request->user)) {
if (verbose) {
i_info("login(%s): invalid username",
get_log_prefix(auth_request));
}
mech_auth_finish(auth_request, NULL, 0, FALSE);
return TRUE;
}
mech_init_auth_client_reply(&reply);
reply.id = auth_request->id;
reply.result = AUTH_CLIENT_RESULT_CONTINUE;
reply.reply_idx = 0;
reply.data_size = strlen(prompt2);
callback(&reply, prompt2, auth_request->conn);
} else {
char *pass = p_strndup(unsafe_data_stack_pool, data, data_size);
passdb->verify_plain(auth_request, pass, verify_callback);
safe_memset(pass, 0, strlen(pass));
}
return TRUE;
}
static int
mech_login_auth_initial(struct auth_request *auth_request,
struct auth_client_request_new *request,
const unsigned char *data __attr_unused__,
mech_callback_t *callback)
{
struct auth_client_request_reply reply;
static const char prompt1[] = "Username:";
mech_init_auth_client_reply(&reply);
reply.id = request->id;
reply.result = AUTH_CLIENT_RESULT_CONTINUE;
reply.reply_idx = 0;
reply.data_size = strlen(prompt1);
callback(&reply, prompt1, auth_request->conn);
return TRUE;
}
static void mech_login_auth_free(struct auth_request *auth_request)
{
pool_unref(auth_request->pool);
}
static struct auth_request *mech_login_auth_new(void)
{
struct auth_request *auth;
pool_t pool;
pool = pool_alloconly_create("login_auth_request", 256);
auth = p_new(pool, struct auth_request, 1);
auth->refcount = 1;
auth->pool = pool;
auth->auth_initial = mech_login_auth_initial;
auth->auth_continue = mech_login_auth_continue;
auth->auth_free = mech_login_auth_free;
return auth;
}
const struct mech_module mech_login = {
"LOGIN",
MEMBER(plaintext) TRUE,
MEMBER(advertise) TRUE,
MEMBER(passdb_need_plain) TRUE,
MEMBER(passdb_need_credentials) FALSE,
mech_login_auth_new,
};
Index: mech.c
===================================================================
RCS file: /home/cvs/dovecot/src/auth/mech.c,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -d -r1.27 -r1.28
--- mech.c 2 Jul 2004 22:03:37 -0000 1.27
+++ mech.c 22 Jul 2004 13:42:02 -0000 1.28
@@ -384,6 +384,7 @@
}
extern struct mech_module mech_plain;
+extern struct mech_module mech_login;
extern struct mech_module mech_apop;
extern struct mech_module mech_cram_md5;
extern struct mech_module mech_digest_md5;
@@ -412,6 +413,8 @@
while (*mechanisms != NULL) {
if (strcasecmp(*mechanisms, "PLAIN") == 0)
mech_register_module(&mech_plain);
+ else if (strcasecmp(*mechanisms, "LOGIN") == 0)
+ mech_register_module(&mech_login);
else if (strcasecmp(*mechanisms, "APOP") == 0)
mech_register_module(&mech_apop);
else if (strcasecmp(*mechanisms, "CRAM-MD5") == 0)
@@ -474,6 +477,7 @@
timeout_remove(to_auth_failures);
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);
More information about the dovecot-cvs
mailing list