]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Fixed home=/home/./user style chrooting to work again.
authorTimo Sirainen <tss@iki.fi>
Tue, 16 Nov 2010 19:51:46 +0000 (19:51 +0000)
committerTimo Sirainen <tss@iki.fi>
Tue, 16 Nov 2010 19:51:46 +0000 (19:51 +0000)
src/lib-storage/mail-storage-service.c

index 49f618c7a3d47a9fc99ae535116e197fe8f1686e..cd99f50d75151d6e26863ec1ffcea32f3e30758d 100644 (file)
@@ -167,7 +167,9 @@ user_reply_handle(struct mail_storage_service_ctx *ctx,
                  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 @@ user_reply_handle(struct mail_storage_service_ctx *ctx,
        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);