userdb-vpopmail.c revision 25757faf029c369a8318349dafe952e2358df1d8
76b43e4417bab52e913da39b5f5bc2a130d3f149Timo Sirainen/* Copyright (C) 2002-2003 Timo Sirainen */
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen/* Thanks to Courier-IMAP for showing how the vpopmail API should be used */
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen#if defined(PASSDB_VPOPMAIL) || defined(USERDB_VPOPMAIL)
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainenstruct vqpasswd *vpopmail_lookup_vqp(const char *user, const char *realm,
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainen /* vpop_user must be zero-filled or parse_email() leaves an
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainen extra character after the user name. we'll fill vpop_domain
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainen as well just to be sure... */
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainen if (parse_email(t_strdup_noconst(user), vpop_user, vpop_domain,
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainenstatic struct user_data *vpopmail_lookup(const char *user, const char *realm)
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen char vpop_user[VPOPMAIL_LIMIT], vpop_domain[VPOPMAIL_LIMIT];
d30da25fb6be1f1c667d93767c9194000194b618Timo Sirainen vpw = vpopmail_lookup_vqp(user, realm, vpop_user, vpop_domain);
63a61b7a739ae0f3f520215137d9c50f94d0f34fTimo Sirainen /* we have to get uid/gid separately, because the gid field in
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen struct vqpasswd isn't really gid at all but just some flags... */
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen if (vget_assign(vpop_domain, NULL, 0, &uid, &gid) == NULL) {
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen i_info("vpopmail(%s): vget_assign(%s) failed",
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen if (vpw->pw_dir == NULL || vpw->pw_dir[0] == '\0') {
f1901fd21906911f7be075c965ac882f6a87b4c3Timo Sirainen /* user's homedir doesn't exist yet, create it */
f1901fd21906911f7be075c965ac882f6a87b4c3Timo Sirainen i_info("vpopmail(%s): pw_dir isn't set, creating",
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen if (make_user_dir(vpop_user, vpop_domain, uid, gid) == NULL) {
ccc895c0358108d2304239063e940b7d75f364abTimo Sirainen i_error("vpopmail(%s): make_user_dir(%s, %s) failed",
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen /* get the user again so pw_dir is visible */
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainen pool = pool_alloconly_create("user_data", 1024);
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen data->virtual_user = p_strdup(data->pool, vpw->pw_name);