[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