passdb-vpopmail.c revision 4dc1510cd6e8f78cded5cb7a01fc77df1cf29008
bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (C) 2002-2003 Timo Sirainen */
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch/* Thanks to Courier-IMAP for showing how the vpopmail API should be used */
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#include "config.h"
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#undef HAVE_CONFIG_H
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#ifdef PASSDB_VPOPMAIL
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#include "common.h"
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#include "safe-memset.h"
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#include "passdb.h"
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#include "password-scheme.h"
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#include "mycrypt.h"
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#include "userdb-vpopmail.h"
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#include <stdlib.h>
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Boschstatic void
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Boschvpopmail_verify_plain(struct auth_request *request, const char *password,
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch verify_plain_callback_t *callback)
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch{
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch char vpop_user[VPOPMAIL_LIMIT], vpop_domain[VPOPMAIL_LIMIT];
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch struct vqpasswd *vpw;
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch const char *crypted_pass;
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch const char *scheme;
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch int ret;
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch vpw = vpopmail_lookup_vqp(request->user,
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch vpop_user, vpop_domain);
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch if (vpw == NULL) {
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch callback(PASSDB_RESULT_USER_UNKNOWN, request);
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch return;
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch }
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch if (((vpw->pw_gid & NO_IMAP) != 0 &&
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch strcmp(request->protocol, "IMAP") == 0) ||
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch ((vpw->pw_gid & NO_POP) != 0 &&
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch strcmp(request->protocol, "POP3") == 0)) {
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch if (verbose) {
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch i_info("vpopmail(%s): %s disabled",
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch get_log_prefix(request), request->protocol);
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch }
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch callback(PASSDB_RESULT_USER_DISABLED, request);
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch return;
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch }
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch crypted_pass = vpw->pw_passwd;
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch scheme = password_get_scheme(&crypted_pass);
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch if (scheme == NULL) scheme = "CRYPT";
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch ret = password_verify(password, crypted_pass, scheme, request->user);
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch safe_memset(vpw->pw_passwd, 0, strlen(vpw->pw_passwd));
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch if (vpw->pw_clear_passwd != NULL) {
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch safe_memset(vpw->pw_clear_passwd, 0,
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch strlen(vpw->pw_clear_passwd));
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch }
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch if (ret <= 0) {
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch if (ret < 0) {
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch i_error("vpopmail(%s): Unknown password scheme %s",
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch get_log_prefix(request), scheme);
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch } else if (verbose) {
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch i_info("vpopmail(%s): password mismatch",
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch get_log_prefix(request));
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch }
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch callback(PASSDB_RESULT_PASSWORD_MISMATCH, request);
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch return;
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch }
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#ifdef HAVE_VPOPMAIL_OPEN_SMTP_RELAY
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch if (strcmp(request->protocol, "POP3") == 0 ||
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch strcmp(request->protocol, "IMAP") == 0) {
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch const char *host = net_ip2addr(&request->remote_ip);
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch if (host != NULL) {
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch /* use putenv() directly rather than env_put() which
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch would leak memory every time we got here. use a
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch static buffer for putenv() as SUSv2 requirements
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch would otherwise corrupt our environment later. */
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch static char ip_env[256];
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch i_snprintf(ip_env, sizeof(ip_env),
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch "TCPREMOTEIP=%s", host);
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch putenv(ip_env);
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch open_smtp_relay();
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch }
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch }
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#endif
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch callback(PASSDB_RESULT_OK, request);
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch}
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Boschstatic void vpopmail_deinit(void)
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch{
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch vclose();
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch}
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Boschstruct passdb_module passdb_vpopmail = {
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch NULL,
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch vpopmail_deinit,
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch vpopmail_verify_plain,
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch NULL
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch};
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#endif
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch