userdb-vpopmail.c revision 25757faf029c369a8318349dafe952e2358df1d8
76b43e4417bab52e913da39b5f5bc2a130d3f149Timo Sirainen/* Copyright (C) 2002-2003 Timo Sirainen */
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen/* Thanks to Courier-IMAP for showing how the vpopmail API should be used */
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen#include "config.h"
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen#undef HAVE_CONFIG_H
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen#if defined(PASSDB_VPOPMAIL) || defined(USERDB_VPOPMAIL)
f1901fd21906911f7be075c965ac882f6a87b4c3Timo Sirainen
63a61b7a739ae0f3f520215137d9c50f94d0f34fTimo Sirainen#include "common.h"
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen#include "userdb.h"
18565c69efcd7db003dbf27cf625ed822e889fb1Timo Sirainen#include "userdb-vpopmail.h"
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainenstruct vqpasswd *vpopmail_lookup_vqp(const char *user, const char *realm,
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen char vpop_user[VPOPMAIL_LIMIT],
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen char vpop_domain[VPOPMAIL_LIMIT])
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen{
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainen struct vqpasswd *vpw;
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainen
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainen if (realm != NULL) {
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainen if (strlen(user) >= VPOPMAIL_LIMIT ||
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainen strlen(realm) >= VPOPMAIL_LIMIT)
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainen return NULL;
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainen } else {
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 memset(vpop_user, '\0', VPOPMAIL_LIMIT);
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainen memset(vpop_domain, '\0', VPOPMAIL_LIMIT);
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainen
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainen if (parse_email(t_strdup_noconst(user), vpop_user, vpop_domain,
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainen VPOPMAIL_LIMIT-1) < 0) {
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen if (verbose) {
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen i_info("vpopmail(%s): parse_email() failed",
af1f4b17a92ca7b2661737e65c7849df289d3070Timo Sirainen user);
af1f4b17a92ca7b2661737e65c7849df289d3070Timo Sirainen }
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainen return NULL;
f1901fd21906911f7be075c965ac882f6a87b4c3Timo Sirainen }
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen }
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen
01cbf4ac5d44137ab434791be7f838d98d0fcf3bTimo Sirainen vpw = vauth_getpw(vpop_user, vpop_domain);
4b41116563110d00330896a568eff1078c382827Timo Sirainen if (vpw == NULL) {
4b41116563110d00330896a568eff1078c382827Timo Sirainen if (verbose)
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen i_info("vpopmail(%s): unknown user", user);
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen return NULL;
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen }
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen return vpw;
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen}
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen#ifdef USERDB_VPOPMAIL
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainenstatic struct user_data *vpopmail_lookup(const char *user, const char *realm)
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen{
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen char vpop_user[VPOPMAIL_LIMIT], vpop_domain[VPOPMAIL_LIMIT];
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen struct vqpasswd *vpw;
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen struct user_data *data;
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen uid_t uid;
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen gid_t gid;
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen pool_t pool;
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen if (realm != NULL)
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen user = t_strconcat(user, "@", realm, NULL);
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen
d30da25fb6be1f1c667d93767c9194000194b618Timo Sirainen vpw = vpopmail_lookup_vqp(user, realm, vpop_user, vpop_domain);
d30da25fb6be1f1c667d93767c9194000194b618Timo Sirainen if (vpw == NULL)
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen return NULL;
597dce34068d603fb759b4dff404b34049213e51Timo Sirainen
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 if (verbose) {
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen i_info("vpopmail(%s): vget_assign(%s) failed",
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen user, vpop_domain);
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen }
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen return NULL;
4b41116563110d00330896a568eff1078c382827Timo Sirainen }
910fa4e4204a73d3d24c03f3059dd24e727ca057Timo Sirainen
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen if (vpw->pw_dir == NULL || vpw->pw_dir[0] == '\0') {
f1901fd21906911f7be075c965ac882f6a87b4c3Timo Sirainen /* user's homedir doesn't exist yet, create it */
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen if (verbose) {
f1901fd21906911f7be075c965ac882f6a87b4c3Timo Sirainen i_info("vpopmail(%s): pw_dir isn't set, creating",
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen user);
6060b7c8edf8fce73470d0df6a2479b69b01c537Timo Sirainen }
7f773564b94e6054a40d3785cb63c29f1e4d4deeTimo Sirainen
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",
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen user, vpop_user, vpop_domain);
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen return NULL;
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen }
4b41116563110d00330896a568eff1078c382827Timo Sirainen
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen /* get the user again so pw_dir is visible */
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen vpw = vauth_getpw(vpop_user, vpop_domain);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen if (vpw == NULL)
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen return NULL;
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen }
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainen pool = pool_alloconly_create("user_data", 1024);
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen data = p_new(pool, struct user_data, 1);
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen data->pool = pool;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen data->uid = uid;
4b41116563110d00330896a568eff1078c382827Timo Sirainen data->gid = gid;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen data->virtual_user = p_strdup(data->pool, vpw->pw_name);
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainen data->home = p_strdup(data->pool, vpw->pw_dir);
345212e8f61ebf14ff4f80df26df9e655eb5121eTimo Sirainen
345212e8f61ebf14ff4f80df26df9e655eb5121eTimo Sirainen return data;
345212e8f61ebf14ff4f80df26df9e655eb5121eTimo Sirainen}
345212e8f61ebf14ff4f80df26df9e655eb5121eTimo Sirainen
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainenstruct userdb_module userdb_vpopmail = {
345212e8f61ebf14ff4f80df26df9e655eb5121eTimo Sirainen NULL, NULL,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen vpopmail_lookup
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen};
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen#endif
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen#endif
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen