[dovecot-cvs] dovecot/src/auth auth-request.c, 1.32, 1.33 passdb-bsdauth.c, 1.11, 1.12 passdb-pam.c, 1.27, 1.28 passdb-passwd-file.c, 1.20, 1.21 passdb-passwd.c, 1.14, 1.15 passdb-shadow.c, 1.15, 1.16 passdb-vpopmail.c, 1.21, 1.22

cras at dovecot.org cras at dovecot.org
Sun Oct 16 15:49:17 EEST 2005


Update of /var/lib/cvs/dovecot/src/auth
In directory talvi:/tmp/cvs-serv2402/src/auth

Modified Files:
	auth-request.c passdb-bsdauth.c passdb-pam.c 
	passdb-passwd-file.c passdb-passwd.c passdb-shadow.c 
	passdb-vpopmail.c 
Log Message:
Make auth caching work with non-sql/ldap passdbs too.



Index: auth-request.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/auth/auth-request.c,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -d -r1.32 -r1.33
--- auth-request.c	16 Oct 2005 12:03:37 -0000	1.32
+++ auth-request.c	16 Oct 2005 12:49:14 -0000	1.33
@@ -202,8 +202,13 @@
 	}
 
 	if (request->passdb_password == NULL) {
-		/* save to cache only if we know the password */
-		return;
+		/* passdb didn't provide the correct password */
+		if (result != PASSDB_RESULT_OK ||
+		    request->mech_password == NULL)
+			return;
+
+		/* we can still cache valid password lookups though */
+		request->passdb_password = request->mech_password;
 	}
 
 	/* save all except the currently given password in cache */
@@ -323,6 +328,8 @@
 
 	if (request->mech_password == NULL)
 		request->mech_password = p_strdup(request->pool, password);
+	else
+		i_assert(request->mech_password == password);
 	request->private_callback.verify_plain = callback;
 
 	cache_key = passdb_cache == NULL ? NULL : passdb->cache_key;

Index: passdb-bsdauth.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/auth/passdb-bsdauth.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- passdb-bsdauth.c	1 Oct 2005 10:52:14 -0000	1.11
+++ passdb-bsdauth.c	16 Oct 2005 12:49:14 -0000	1.12
@@ -12,6 +12,9 @@
 #include <bsd_auth.h>
 #include <pwd.h>
 
+extern struct passdb_module passdb_bsdauth;
+static char *bsdauth_cache_key;
+
 static void
 bsdauth_verify_plain(struct auth_request *request, const char *password,
 		    verify_plain_callback_t *callback)
@@ -52,16 +55,28 @@
 	callback(PASSDB_RESULT_OK, request);
 }
 
+static void bsdauth_init(const char *args)
+{
+	bsdauth_cache_key = NULL;
+
+	if (strncmp(args, "cache_key=", 10) == 0)
+		bsdauth_cache_key = i_strdup(args + 10);
+
+	passdb_bsdauth.cache_key = bsdauth_cache_key;
+}
+
 static void bsdauth_deinit(void)
 {
 	endpwent();
+	i_free(bsdauth_cache_key);
 }
 
 struct passdb_module passdb_bsdauth = {
 	"bsdauth",
-	"%u", "CRYPT", FALSE,
+	NULL, NULL, FALSE,
 
-	NULL, NULL,
+	NULL,
+	bsdauth_init,
 	bsdauth_deinit,
 
 	bsdauth_verify_plain,

Index: passdb-pam.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/auth/passdb-pam.c,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -d -r1.27 -r1.28
--- passdb-pam.c	12 Oct 2005 17:14:21 -0000	1.27
+++ passdb-pam.c	16 Oct 2005 12:49:14 -0000	1.28
@@ -71,8 +71,10 @@
 	const char *pass;
 };
 
+extern struct passdb_module passdb_pam;
+
 static int pam_session;
-static char *service_name;
+static char *service_name, *pam_cache_key;
 static struct timeout *to_wait;
 
 static int pam_userpass_conv(int num_msg, linux_const struct pam_message **msg,
@@ -409,13 +411,17 @@
 
 	pam_session = FALSE;
 	service_name = i_strdup("dovecot");
+        pam_cache_key = NULL;
 
 	t_push();
 	t_args = t_strsplit(args, " ");
         for(i = 0; t_args[i] != NULL; i++) {
 		if (strcmp(t_args[i], "-session") == 0)
 			pam_session = TRUE;
-		else if (strcmp(t_args[i], "*") == 0) {
+		else if (strncmp(t_args[i], "cache_key=", 10) == 0) {
+			i_free(pam_cache_key);
+			pam_cache_key = i_strdup(t_args[i] + 10);
+		} else if (strcmp(t_args[i], "*") == 0) {
 			i_free(service_name);
 			service_name = NULL;
 		} else {
@@ -428,6 +434,7 @@
 	t_pop();
 
 	to_wait = NULL;
+        passdb_pam.cache_key = pam_cache_key;
 }
 
 static void pam_deinit(void)
@@ -435,6 +442,7 @@
 	if (to_wait != NULL)
 		timeout_remove(to_wait);
 	i_free(service_name);
+	i_free(pam_cache_key);
 }
 
 struct passdb_module passdb_pam = {

Index: passdb-passwd-file.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/auth/passdb-passwd-file.c,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -d -r1.20 -r1.21
--- passdb-passwd-file.c	16 Oct 2005 12:03:37 -0000	1.20
+++ passdb-passwd-file.c	16 Oct 2005 12:49:14 -0000	1.21
@@ -8,6 +8,9 @@
 #include "password-scheme.h"
 #include "db-passwd-file.h"
 
+#define PASSWD_FILE_CACHE_KEY "%u"
+#define PASSWD_FILE_DEFAULT_SCHEME "CRYPT"
+
 struct db_passwd_file *passdb_pwf = NULL;
 
 static void
@@ -26,7 +29,10 @@
 
 	crypted_pass = pu->password;
 	scheme = password_get_scheme(&crypted_pass);
-	if (scheme == NULL) scheme = "CRYPT";
+	if (scheme == NULL) scheme = PASSWD_FILE_DEFAULT_SCHEME;
+
+	/* save the password so cache can use it */
+	auth_request_set_field(request, "password", crypted_pass, scheme);
 
 	ret = password_verify(password, crypted_pass, scheme,
 			      request->user);
@@ -81,7 +87,9 @@
 
 struct passdb_module passdb_passwd_file = {
 	"passwd-file",
-	NULL, NULL, FALSE,
+	PASSWD_FILE_CACHE_KEY,
+	NULL,
+	FALSE,
 
 	NULL,
 	passwd_file_init,

Index: passdb-passwd.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/auth/passdb-passwd.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- passdb-passwd.c	1 Oct 2005 10:52:14 -0000	1.14
+++ passdb-passwd.c	16 Oct 2005 12:49:14 -0000	1.15
@@ -10,6 +10,9 @@
 
 #include <pwd.h>
 
+#define PASSWD_CACHE_KEY "%u"
+#define PASSWD_PASS_SCHEME "CRYPT"
+
 static void
 passwd_verify_plain(struct auth_request *request, const char *password,
 		    verify_plain_callback_t *callback)
@@ -31,6 +34,10 @@
 		return;
 	}
 
+	/* save the password so cache can use it */
+	auth_request_set_field(request, "password", pw->pw_passwd,
+			       PASSWD_PASS_SCHEME);
+
 	/* check if the password is valid */
 	result = strcmp(mycrypt(password, pw->pw_passwd), pw->pw_passwd) == 0;
 
@@ -56,7 +63,9 @@
 
 struct passdb_module passdb_passwd = {
 	"passwd",
-	"%u", "CRYPT", FALSE,
+        PASSWD_CACHE_KEY,
+        PASSWD_PASS_SCHEME,
+	FALSE,
 
 	NULL, NULL,
 	passwd_deinit,

Index: passdb-shadow.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/auth/passdb-shadow.c,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -d -r1.15 -r1.16
--- passdb-shadow.c	1 Oct 2005 10:52:14 -0000	1.15
+++ passdb-shadow.c	16 Oct 2005 12:49:14 -0000	1.16
@@ -10,6 +10,9 @@
 
 #include <shadow.h>
 
+#define SHADOW_CACHE_KEY "%u"
+#define SHADOW_PASS_SCHEME "CRYPT"
+
 static void
 shadow_verify_plain(struct auth_request *request, const char *password,
 		    verify_plain_callback_t *callback)
@@ -31,6 +34,10 @@
 		return;
 	}
 
+	/* save the password so cache can use it */
+	auth_request_set_field(request, "password", spw->sp_pwdp,
+			       SHADOW_PASS_SCHEME);
+
 	/* check if the password is valid */
 	result = strcmp(mycrypt(password, spw->sp_pwdp), spw->sp_pwdp) == 0;
 
@@ -56,7 +63,9 @@
 
 struct passdb_module passdb_shadow = {
 	"shadow",
-	"%u", "CRYPT", FALSE,
+        SHADOW_CACHE_KEY,
+        SHADOW_PASS_SCHEME,
+	FALSE,
 
 	NULL, NULL,
 	shadow_deinit,

Index: passdb-vpopmail.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/auth/passdb-vpopmail.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -d -r1.21 -r1.22
--- passdb-vpopmail.c	12 Jul 2005 12:58:47 -0000	1.21
+++ passdb-vpopmail.c	16 Oct 2005 12:49:14 -0000	1.22
@@ -14,7 +14,10 @@
 
 #include <stdlib.h>
 
+#define VPOPMAIL_DEFAULT_PASS_SCHEME "CRYPT"
+
 extern struct passdb_module passdb_vpopmail;
+static char *vpopmail_cache_key;
 
 static void
 vpopmail_verify_plain(struct auth_request *request, const char *password,
@@ -91,16 +94,30 @@
 	callback(PASSDB_RESULT_OK, request);
 }
 
+static void vpopmail_init(const char *args)
+{
+	vpopmail_cache_key = NULL;
+
+	if (strncmp(args, "cache_key=", 10) == 0)
+		vpopmail_cache_key = i_strdup(args + 10);
+
+	passdb_vpopmail.cache_key = vpopmail_cache_key;
+}
+
 static void vpopmail_deinit(void)
 {
 	vclose();
+	i_free(vpopmail_cache_key);
 }
 
 struct passdb_module passdb_vpopmail = {
 	"vpopmail",
-	"%u", "CRYPT", FALSE,
+	NULL,
+	VPOPMAIL_DEFAULT_PASS_SCHEME,
+	FALSE,
 
-	NULL, NULL,
+	NULL,
+	vpopmail_init,
 	vpopmail_deinit,
 
 	vpopmail_verify_plain,



More information about the dovecot-cvs mailing list