userdb-vpopmail.c revision 1b1595b23dea4343e8f9b65e390b7ecd03792b1d
5a580c3a38ced62d4bcc95b8ac7c4f2935b5d294Timo Sirainen/* Copyright (C) 2002-2003 Timo Sirainen */
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen/* Thanks to Courier-IMAP for showing how the vpopmail API should be used */
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen
6967fa47dde9f2726bd86019a50627dacf2d7509Timo Sirainen#include "config.h"
34830cefe1757de0ffca67acdc529d5bc8b06b66Timo Sirainen#undef HAVE_CONFIG_H
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen
6967fa47dde9f2726bd86019a50627dacf2d7509Timo Sirainen#if defined(PASSDB_VPOPMAIL) || defined(USERDB_VPOPMAIL)
0536ccb51d41e3078c3a9fa33e509fb4b2420f95Timo Sirainen
4499995f7029bafd85094694b6a14752ea34c9b3Timo Sirainen#include "common.h"
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen#include "userdb.h"
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen#include "userdb-vpopmail.h"
34830cefe1757de0ffca67acdc529d5bc8b06b66Timo Sirainen
34830cefe1757de0ffca67acdc529d5bc8b06b66Timo Sirainenstruct vqpasswd *vpopmail_lookup_vqp(const char *user,
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen char vpop_user[VPOPMAIL_LIMIT],
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen char vpop_domain[VPOPMAIL_LIMIT])
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen{
252db51b6c0a605163326b3ea5d09e9936ca3b29Timo Sirainen struct vqpasswd *vpw;
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen
fcca16701767c6b92227a9ee125de69d257882f6Timo Sirainen /* vpop_user must be zero-filled or parse_email() leaves an
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen extra character after the user name. we'll fill vpop_domain
d10cb4d7a80571af21f776c65604442bf09b1765Timo Sirainen as well just to be sure... */
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen memset(vpop_user, '\0', VPOPMAIL_LIMIT);
fcca16701767c6b92227a9ee125de69d257882f6Timo Sirainen memset(vpop_domain, '\0', VPOPMAIL_LIMIT);
fcca16701767c6b92227a9ee125de69d257882f6Timo Sirainen
fcca16701767c6b92227a9ee125de69d257882f6Timo Sirainen if (parse_email(t_strdup_noconst(user), vpop_user, vpop_domain,
5702c81e2d788449c3bc207eb9c19e539458ad9eTimo Sirainen VPOPMAIL_LIMIT-1) < 0) {
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen if (verbose) {
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen i_info("vpopmail(%s): parse_email() failed",
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen user);
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen }
6967fa47dde9f2726bd86019a50627dacf2d7509Timo Sirainen return NULL;
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen }
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen
e2ce8d4a6ac5d82a906178148453e7613fab9ba0Timo Sirainen vpw = vauth_getpw(vpop_user, vpop_domain);
e2ce8d4a6ac5d82a906178148453e7613fab9ba0Timo Sirainen if (vpw == NULL) {
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen if (verbose) {
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen i_info("vpopmail(%s): unknown user (%s@%s)",
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen user, vpop_user, vpop_domain);
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen }
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen return NULL;
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen }
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen return vpw;
a6f281d078ed03d555802c1a8e15fefce80132dcTimo Sirainen}
a6f281d078ed03d555802c1a8e15fefce80132dcTimo Sirainen
a6f281d078ed03d555802c1a8e15fefce80132dcTimo Sirainen#ifdef USERDB_VPOPMAIL
a6f281d078ed03d555802c1a8e15fefce80132dcTimo Sirainen
a6f281d078ed03d555802c1a8e15fefce80132dcTimo Sirainenstatic void vpopmail_lookup(const char *user, userdb_callback_t *callback,
a6f281d078ed03d555802c1a8e15fefce80132dcTimo Sirainen void *context)
a6f281d078ed03d555802c1a8e15fefce80132dcTimo Sirainen{
a6f281d078ed03d555802c1a8e15fefce80132dcTimo Sirainen char vpop_user[VPOPMAIL_LIMIT], vpop_domain[VPOPMAIL_LIMIT];
a94936bafd127680184da114c6a177b37ff656e5Timo Sirainen struct vqpasswd *vpw;
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen struct user_data data;
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen uid_t uid;
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen gid_t gid;
5702c81e2d788449c3bc207eb9c19e539458ad9eTimo Sirainen pool_t pool;
5702c81e2d788449c3bc207eb9c19e539458ad9eTimo Sirainen
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen vpw = vpopmail_lookup_vqp(user, vpop_user, vpop_domain);
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen if (vpw == NULL) {
a6f281d078ed03d555802c1a8e15fefce80132dcTimo Sirainen callback(NULL, context);
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen return;
6967fa47dde9f2726bd86019a50627dacf2d7509Timo Sirainen }
6967fa47dde9f2726bd86019a50627dacf2d7509Timo Sirainen
fcca16701767c6b92227a9ee125de69d257882f6Timo Sirainen /* we have to get uid/gid separately, because the gid field in
c1d4780bc0c9017e8e5d366b81e4fad31174c0adTimo Sirainen struct vqpasswd isn't really gid at all but just some flags... */
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen if (vget_assign(vpop_domain, NULL, 0, &uid, &gid) == NULL) {
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen if (verbose) {
252db51b6c0a605163326b3ea5d09e9936ca3b29Timo Sirainen i_info("vpopmail(%s): vget_assign(%s) failed",
a94936bafd127680184da114c6a177b37ff656e5Timo Sirainen user, vpop_domain);
a94936bafd127680184da114c6a177b37ff656e5Timo Sirainen }
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen callback(NULL, context);
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen return;
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen }
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen
597dba3488c648ffb375ee4a552bd52ac4346979Timo Sirainen if (vpw->pw_dir == NULL || vpw->pw_dir[0] == '\0') {
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen /* user's homedir doesn't exist yet, create it */
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen if (verbose) {
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen i_info("vpopmail(%s): pw_dir isn't set, creating",
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen user);
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen }
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen if (make_user_dir(vpop_user, vpop_domain, uid, gid) == NULL) {
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen i_error("vpopmail(%s): make_user_dir(%s, %s) failed",
7bcb308d0e13dfa48b483b0addccd889a77bb598Timo Sirainen user, vpop_user, vpop_domain);
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen callback(NULL, context);
7bcb308d0e13dfa48b483b0addccd889a77bb598Timo Sirainen return;
7bcb308d0e13dfa48b483b0addccd889a77bb598Timo Sirainen }
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen /* get the user again so pw_dir is visible */
fcca16701767c6b92227a9ee125de69d257882f6Timo Sirainen vpw = vauth_getpw(vpop_user, vpop_domain);
fcca16701767c6b92227a9ee125de69d257882f6Timo Sirainen if (vpw == NULL) {
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen callback(NULL, context);
fcca16701767c6b92227a9ee125de69d257882f6Timo Sirainen return;
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen }
5702c81e2d788449c3bc207eb9c19e539458ad9eTimo Sirainen }
34830cefe1757de0ffca67acdc529d5bc8b06b66Timo Sirainen
34830cefe1757de0ffca67acdc529d5bc8b06b66Timo Sirainen memset(&data, 0, sizeof(data));
4307c886579381dbb1897ea1388ae6978c96f560Timo Sirainen data.uid = uid;
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen data.gid = gid;
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen
34830cefe1757de0ffca67acdc529d5bc8b06b66Timo Sirainen data.virtual_user = vpw->pw_name;
5702c81e2d788449c3bc207eb9c19e539458ad9eTimo Sirainen data.home = vpw->pw_dir;
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen callback(&data, context);
2201e2cc1b3f744dac61c2bf8095bcb6b5719540Timo Sirainen}
597dba3488c648ffb375ee4a552bd52ac4346979Timo Sirainen
7bcb308d0e13dfa48b483b0addccd889a77bb598Timo Sirainenstruct userdb_module userdb_vpopmail = {
7bcb308d0e13dfa48b483b0addccd889a77bb598Timo Sirainen NULL, NULL,
7bcb308d0e13dfa48b483b0addccd889a77bb598Timo Sirainen vpopmail_lookup
7bcb308d0e13dfa48b483b0addccd889a77bb598Timo Sirainen};
7bcb308d0e13dfa48b483b0addccd889a77bb598Timo Sirainen
7bcb308d0e13dfa48b483b0addccd889a77bb598Timo Sirainen#endif
7bcb308d0e13dfa48b483b0addccd889a77bb598Timo Sirainen#endif
7bcb308d0e13dfa48b483b0addccd889a77bb598Timo Sirainen