[Dovecot] %d interpolation problem fixed
William Ross
will at spanner.org
Wed Jan 18 04:33:46 EET 2006
On 6 Dec 2005, at 17:21, Timo Sirainen wrote:
> On Tue, 2005-12-06 at 17:11 +0000, William Ross wrote:
>> On 6 Dec 2005, at 16:51, Timo Sirainen wrote:
>>
>>> On Fri, 2005-10-28 at 17:52 +0200, Riccardo Bini wrote:
>>>>> I just wrote this: http://wiki.dovecot.org/Quota
>>>> Well... but you have to correct %n with vpopmail backend. %u in the
>>>> default_mail_env (like in the log) is always the user name without
>>>> the
>>>> domain....
>>>
>>> That's a bug in Dovecot's vpopmail code. I don't know why it doesn't
>>> work. Would be nice if someone using vpopmail fixed that..
>>
>> point me in the right direction and I'll have a go.
>
> src/auth/passdb-vpopmail.c
>
> If user logs in as user at domain, then they both should be in
> request->user string. %d is taken from there. I don't see request-
> >user
> being modified in that file either, so I think it should have worked..
I finally got round to working on this. I'm a perl programmer, and it
has all been very educational, so please bear with me :)
I was stuck because the domain name was not interpolated into the
Maildir path[0], when using the configuration recommended here:
http://wiki.dovecot.org/
QuestionsAndAnswers#head-153aa253aff40951a05cf238da4245b1cc1a4665
It turns out that the answer is really simple. You don't need to
supply a default_mail_env parameter with vpopmail and dovecot v1.x.
Indeed, you shouldn't: the path to the maildir is retrieved from
vpopmail and if you specify default_mail_env then it will be used in
place of that correct value. Also, it will be used wrongly, as there
is also an interpolation bug, and %d isn't replaced correctly.
The code in passdb-vpopmail and userdb-vpopmail works perfectly, by
the way: the login email address[1] is parsed correctly, the vpopmail
hookup is correct, and the vqpasswd struct that is returned by
vpopmail_lookup_vqp contains all the right values. eg (these are
debugging-for-dummies lines that I've scattered everywhere):
> dovecot: Jan 17 22:51:42 Info: auth(default): *
> vpopmail_verify_plain: now vpop_user = sysadmin, vpop_domain =
> spanner.org, request->user = sysadmin at spanner.org, vpw->pw_dir = /
> home/vpopmail/domains/spanner.org/sysadmin
in the callback method I got this tab-separated auth_reply_stream:
> dovecot: Jan 18 00:30:01 Info: auth(default): userdb_callback str:
> USER 2 sysadmin uid=7797 gid=2109 home=/home/
> vpopmail/domains/spanner.org/sysadmin
but I still saw these lines later:
> dovecot: Jan 18 01:31:46 Info: imap(sysadmin): maildir: root=/home/
> vpopmail/domains//sysadmin/Maildir, index=/home/vpopmail/domains//
> sysadmin/Maildir, control=, inbox=
I became suspicious, and tested with nonsense values in
default_mail_env: sure enough i got the same thing. During the userdb
stage we have the correct path to the maildir, but later on we see a
different value derived from the nonsense configuration I've just
entered. I guess that we're getting the initial value from vpopmail
and try the same thing but with no default_mail_env entry at all. It
works perfectly. I say some new words I have learned from my wife.
I don't know where the failure lies, but I can tell you that the
'user' value passed to get_var_expand_table (which comes from getenv
("USER")) contains only the first part of the email address. That's
probably not the intention, because get_var_expand_table then tries
to split it on @.
As it happens the home-directory value is passed to
get_var_expand_table as the expansion for %h, so this works too, in a
completely redundant way:
default_mail_env = maildir:%h
I've tested this with an new tarball of 1.0.beta1 and it works fine -
with the configuration change - so if this all sounds sane to you
then I'll update the wiki.
best,
will
[0] under vpopmail the maildir for the address brian at domain.com
usually lives somewhere like: /home/vpopmail/domains/domain.com/brian/,
[1] in order to disambiguate usernames, vpopmail has you log in with
your full email address as the user id. dovecot would therefore need
to split the email address and interpolate the fragments into the
maildir path to get to the right place. however, the vpopmail
password file also specifies the maildir for each user, which i guess
is what dovecot is using now.
More information about the dovecot
mailing list