userdb-vpopmail.c revision c5383a0ed56a188a7d5efaaa4c6f8243af432d65
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen/* Copyright (C) 2002-2003 Timo Sirainen */
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen/* Thanks to Courier-IMAP for showing how the vpopmail API should be used */
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen#if defined(PASSDB_VPOPMAIL) || defined(USERDB_VPOPMAIL)
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainenstruct vqpasswd *vpopmail_lookup_vqp(struct auth_request *request,
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... */
356303df200c991580bd24041996a070ad08c05eTimo Sirainen if (parse_email(request->user, vpop_user, vpop_domain,
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen "parse_email() failed");
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen auth_request_log_info(request, "vpopmail", "unknown user");
3b94ff5951db4d4eddb7a80ed4e3f61207202635Timo Sirainenstatic void vpopmail_lookup(struct auth_request *auth_request,
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen char vpop_user[VPOPMAIL_LIMIT], vpop_domain[VPOPMAIL_LIMIT];
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen vpw = vpopmail_lookup_vqp(auth_request, vpop_user, vpop_domain);
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen callback(USERDB_RESULT_USER_UNKNOWN, NULL, auth_request);
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",
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen callback(USERDB_RESULT_INTERNAL_FAILURE, NULL, auth_request);
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 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",
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen /* get the user again so pw_dir is visible */
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);
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen callback(USERDB_RESULT_OK, reply, auth_request);
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainenvpopmail_preinit(struct auth_userdb *auth_userdb, const char *args)
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen module = p_new(auth_userdb->auth->pool, struct userdb_module, 1);
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen module->cache_key = p_strconcat(auth_userdb->auth->pool,