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;
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);