userdb-vpopmail.c revision c5383a0ed56a188a7d5efaaa4c6f8243af432d65
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen/* Copyright (C) 2002-2003 Timo Sirainen */
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen/* Thanks to Courier-IMAP for showing how the vpopmail API should be used */
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
2fbc2a7c65d30e46803195ebb4547176b85c22c7Timo Sirainen#include "common.h"
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen#if defined(PASSDB_VPOPMAIL) || defined(USERDB_VPOPMAIL)
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen#include "userdb.h"
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen#include "userdb-vpopmail.h"
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainenstruct vqpasswd *vpopmail_lookup_vqp(struct auth_request *request,
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen char vpop_user[VPOPMAIL_LIMIT],
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen char vpop_domain[VPOPMAIL_LIMIT])
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen{
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen struct vqpasswd *vpw;
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
473080c7c0d25ddfdf77e7dfa0ba8f73c6c669d5Timo Sirainen /* vpop_user must be zero-filled or parse_email() leaves an
473080c7c0d25ddfdf77e7dfa0ba8f73c6c669d5Timo Sirainen extra character after the user name. we'll fill vpop_domain
473080c7c0d25ddfdf77e7dfa0ba8f73c6c669d5Timo Sirainen as well just to be sure... */
473080c7c0d25ddfdf77e7dfa0ba8f73c6c669d5Timo Sirainen memset(vpop_user, '\0', VPOPMAIL_LIMIT);
473080c7c0d25ddfdf77e7dfa0ba8f73c6c669d5Timo Sirainen memset(vpop_domain, '\0', VPOPMAIL_LIMIT);
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
356303df200c991580bd24041996a070ad08c05eTimo Sirainen if (parse_email(request->user, vpop_user, vpop_domain,
473080c7c0d25ddfdf77e7dfa0ba8f73c6c669d5Timo Sirainen VPOPMAIL_LIMIT-1) < 0) {
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen auth_request_log_info(request, "vpopmail",
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen "parse_email() failed");
473080c7c0d25ddfdf77e7dfa0ba8f73c6c669d5Timo Sirainen return NULL;
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen }
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen vpw = vauth_getpw(vpop_user, vpop_domain);
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen if (vpw == NULL) {
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen auth_request_log_info(request, "vpopmail", "unknown user");
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen return NULL;
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen }
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen return vpw;
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen}
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen#ifdef USERDB_VPOPMAIL
3b94ff5951db4d4eddb7a80ed4e3f61207202635Timo Sirainenstatic void vpopmail_lookup(struct auth_request *auth_request,
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen userdb_callback_t *callback)
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen{
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen char vpop_user[VPOPMAIL_LIMIT], vpop_domain[VPOPMAIL_LIMIT];
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen struct vqpasswd *vpw;
137ea7ca34005345aa2304a940149b7f3774d727Timo Sirainen struct auth_stream_reply *reply;
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen uid_t uid;
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen gid_t gid;
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen vpw = vpopmail_lookup_vqp(auth_request, vpop_user, vpop_domain);
22535a9e685e29214082878e37a267157044618eTimo Sirainen if (vpw == NULL) {
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen callback(USERDB_RESULT_USER_UNKNOWN, NULL, auth_request);
22535a9e685e29214082878e37a267157044618eTimo Sirainen return;
22535a9e685e29214082878e37a267157044618eTimo Sirainen }
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen /* we have to get uid/gid separately, because the gid field in
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen struct vqpasswd isn't really gid at all but just some flags... */
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen if (vget_assign(vpop_domain, NULL, 0, &uid, &gid) == NULL) {
356303df200c991580bd24041996a070ad08c05eTimo Sirainen auth_request_log_info(auth_request, "vpopmail",
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen "vget_assign(%s) failed", vpop_domain);
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen callback(USERDB_RESULT_INTERNAL_FAILURE, NULL, auth_request);
22535a9e685e29214082878e37a267157044618eTimo Sirainen return;
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen }
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen if (vpw->pw_dir == NULL || vpw->pw_dir[0] == '\0') {
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen /* user's homedir doesn't exist yet, create it */
356303df200c991580bd24041996a070ad08c05eTimo Sirainen auth_request_log_info(auth_request, "vpopmail",
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen "pw_dir isn't set, creating");
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen if (make_user_dir(vpop_user, vpop_domain, uid, gid) == NULL) {
356303df200c991580bd24041996a070ad08c05eTimo Sirainen auth_request_log_error(auth_request, "vpopmail",
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen "make_user_dir(%s, %s) failed",
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen vpop_user, vpop_domain);
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen callback(USERDB_RESULT_INTERNAL_FAILURE,
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen NULL, auth_request);
22535a9e685e29214082878e37a267157044618eTimo Sirainen return;
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen }
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen /* get the user again so pw_dir is visible */
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen vpw = vauth_getpw(vpop_user, vpop_domain);
22535a9e685e29214082878e37a267157044618eTimo Sirainen if (vpw == NULL) {
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen callback(USERDB_RESULT_INTERNAL_FAILURE,
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen NULL, auth_request);
22535a9e685e29214082878e37a267157044618eTimo Sirainen return;
22535a9e685e29214082878e37a267157044618eTimo Sirainen }
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen }
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
135e840738fe3ba38646ab3fe3ef7979fbae459fTimo Sirainen reply = auth_stream_reply_init(auth_request);
4a9275dd2adef9107e472d6b84e34b747c4d298fTimo Sirainen auth_stream_reply_add(reply, NULL, auth_request->user);
137ea7ca34005345aa2304a940149b7f3774d727Timo Sirainen auth_stream_reply_add(reply, "uid", dec2str(uid));
137ea7ca34005345aa2304a940149b7f3774d727Timo Sirainen auth_stream_reply_add(reply, "gid", dec2str(gid));
137ea7ca34005345aa2304a940149b7f3774d727Timo Sirainen auth_stream_reply_add(reply, "home", vpw->pw_dir);
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen callback(USERDB_RESULT_OK, reply, auth_request);
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen}
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainenstatic struct userdb_module *
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainenvpopmail_preinit(struct auth_userdb *auth_userdb, const char *args)
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen{
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen struct userdb_module *module;
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen module = p_new(auth_userdb->auth->pool, struct userdb_module, 1);
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen if (strncmp(args, "cache_key=", 10) == 0) {
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen module->cache_key = p_strconcat(auth_userdb->auth->pool,
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen args + 10, NULL);
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen }
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen return module;
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen}
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainenstruct userdb_module_interface userdb_vpopmail = {
1f1e81aab38d833d1c9cdc244c91fd762e0080d4Timo Sirainen "vpopmail",
1f1e81aab38d833d1c9cdc244c91fd762e0080d4Timo Sirainen
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen vpopmail_preinit,
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen NULL,
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen NULL,
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen vpopmail_lookup
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen};
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen#endif
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen#endif