On Tue, Nov 30, 2010 at 07:39:39PM -0600, Dan wrote:

> virtual_gid_maps = mysql:$config_directory/mysql_gids.cf
> virtual_minimum_uid = 2002
> virtual_uid_maps = mysql:$config_directory/mysql_uids.cf
>
> Mysql relevant table entries:
>
>  email                   domain       maildir
> te...@test.com          test2.com   test2.com/test2/Maildir/
>
>  uid  gid
> 2003  2001

And in /etc/group, what is group 2001?

> Now lets chmod 777 /website/vuser so that it can create directories under
> UID/GID=2003/2001 as it wants but in fact see that gid never is 2001.
> Gid 2001 under my system is vuser:
> sunsaturn:~# grep 2001 /etc/group
> vuser:*:2001:

Prove this by posting the output of:

        # tmp=$(mktemp /tmp/test.XXXXXX)
        # chown 2003:2001 "$tmp"
        # ls -l "$tmp"
        # rm "$tmp"

> sunsaturn:~# chmod 777 /website/vuser; cd /website/vuser

Never use world-writable directories in this context.

> Nov 30 19:28:03 sunsaturn postfix/virtual[23237]: DC276119C60: 
> to=<te...@test2.com>, relay=virtual, delay=0.01, delays=0.01/0/0/0, 
> dsn=2.0.0, status=sent (delivered to maildir)
> Nov 30 19:29:03 sunsaturn postfix/virtual[23237]: 3EA8C119C56: 
> to=<te...@test2.com>, relay=virtual, delay=372, delays=372/0/0/0, 
> dsn=2.0.0, status=sent (delivered to maildir)

> -rw-------  1 2003  postfix  347 Nov 30 19:28 
> test2.com/test2/Maildir/new/1291166883.V59Ib97008M906598.sunsaturn.com
> -rw-------  1 2003  postfix  347 Nov 30 19:29 
> test2.com/test2/Maildir/new/1291166943.V59Ib97001M911353.sunsaturn.com

Well Postfix asks the operating system nicely by setting its effective
uid and gid. If the operating system does not cooperate, you need to
find out why.

src/virtual/mailbox.c:deliver_mailbox():

    /* Look up the mailbox owner rights. Defer in case of trouble.  */
    uid_res = mail_addr_find(virtual_uid_maps, state.msg_attr.user,
                             IGNORE_EXTENSION);
    if (uid_res == 0) { /* error handling */  }
    if ((n = atol(uid_res)) < var_virt_minimum_uid) { /* error handling */  }
    usr_attr.uid = (uid_t) n;

    /* Look up the mailbox group rights. Defer in case of trouble.  */
    gid_res = mail_addr_find(virtual_gid_maps, state.msg_attr.user,
                             IGNORE_EXTENSION);
    if (gid_res == 0) { /* error handling */ }
    if ((n = atol(gid_res)) <= 0) { /* error handling */ }
    usr_attr.gid = (gid_t) n;

    if (msg_verbose)
        msg_info("%s[%d]: set user_attr: %s, uid = %u, gid = %u",
                 myname, state.level, usr_attr.mailbox,
                 (unsigned) usr_attr.uid, (unsigned) usr_attr.gid);

You can configure "virtual -v" in master.cf to see the uid/gid logged.

    /* Deliver to mailbox or to maildir. */
#define LAST_CHAR(s) (s[strlen(s) - 1])

    if (LAST_CHAR(usr_attr.mailbox) == '/')
        *statusp = deliver_maildir(state, usr_attr);
    else
        *statusp = deliver_mailbox_file(state, usr_attr);

src/virtual/mailbox.c:deliver_maildir():

    set_eugid(usr_attr.uid, usr_attr.gid);

    /* Creates files, writes data, ... */

    set_eugid(var_owner_uid, var_owner_gid);

-- 
        Viktor.

Reply via email to