changeset 12431:eeaf30cfad36

Fixed home=/home/./user style chrooting to work again.
author Timo Sirainen <tss@iki.fi>
date Tue, 16 Nov 2010 19:51:46 +0000
parents f78260c108b0
children 8793036f6de8
files src/lib-storage/mail-storage-service.c
diffstat 1 files changed, 17 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/mail-storage-service.c	Tue Nov 16 19:32:51 2010 +0000
+++ b/src/lib-storage/mail-storage-service.c	Tue Nov 16 19:51:46 2010 +0000
@@ -167,7 +167,9 @@
 		  const struct auth_user_reply *reply,
 		  const char **error_r)
 {
-	const char *const *str, *line;
+	const char *home = reply->home;
+	const char *chroot = reply->chroot;
+	const char *const *str, *line, *p;
 	unsigned int i, count;
 	int ret = 0;
 
@@ -181,18 +183,26 @@
 	if (reply->gid != (uid_t)-1)
 		set_keyval(ctx, user, "mail_gid", dec2str(reply->gid));
 
-	if (reply->home != NULL)
+	if (home != NULL && chroot == NULL &&
+	    *user->user_set->valid_chroot_dirs != '\0' &&
+	    (p = strstr(home, "/./")) != NULL) {
+		/* wu-ftpd like <chroot>/./<home> - check only if there's even
+		   a possibility of using them (non-empty valid_chroot_dirs) */
+		chroot = t_strdup_until(home, p);
+		home = p + 2;
+	}
+
+	if (home != NULL)
 		set_keyval(ctx, user, "mail_home", reply->home);
 
-	if (reply->chroot != NULL) {
-		if (!validate_chroot(user->user_set, reply->chroot)) {
+	if (chroot != NULL) {
+		if (!validate_chroot(user->user_set, chroot)) {
 			*error_r = t_strdup_printf(
 				"userdb returned invalid chroot directory: %s "
-				"(see valid_chroot_dirs setting)",
-				reply->chroot);
+				"(see valid_chroot_dirs setting)", chroot);
 			return -1;
 		}
-		set_keyval(ctx, user, "mail_chroot", reply->chroot);
+		set_keyval(ctx, user, "mail_chroot", chroot);
 	}
 
 	str = array_get(&reply->extra_fields, &count);