userdb-vpopmail.c revision d5abbb932a0a598f002da39a8b3326643b1b5efc
2e37d45867d081db150ab78dad303b9077aea24fTimo Sirainen/* Copyright (c) 2002-2008 Dovecot authors, see the included COPYING file */
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen/* Thanks to Courier-IMAP for showing how the vpopmail API should be used */
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen#if defined(PASSDB_VPOPMAIL) || defined(USERDB_VPOPMAIL)
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainenstruct vqpasswd *vpopmail_lookup_vqp(struct auth_request *request,
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(request->user, vpop_user, vpop_domain,
af1f4b17a92ca7b2661737e65c7849df289d3070Timo Sirainen "parse_email() failed");
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen "lookup user=%s domain=%s",
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen auth_request_log_info(request, "vpopmail", "unknown user");
b12a6d0e54318273acf0d0fb8b3f4c29f67b62b0Timo Sirainenstatic const char *
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainenuserdb_vpopmail_get_quota(const char *template, const char *vpop_str)
73247459cf41eb1e5ae5bc61354db46d3b05ee75Timo Sirainen tab = var_expand_table_build('q', format_maildirquota(vpop_str), '\0');
d22301419109ed4a38351715e6760011421dadecTimo Sirainenstatic void vpopmail_lookup(struct auth_request *auth_request,
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen struct userdb_module *_module = auth_request->userdb->userdb;
73247459cf41eb1e5ae5bc61354db46d3b05ee75Timo Sirainen char vpop_user[VPOPMAIL_LIMIT], vpop_domain[VPOPMAIL_LIMIT];
d30da25fb6be1f1c667d93767c9194000194b618Timo Sirainen vpw = vpopmail_lookup_vqp(auth_request, vpop_user, vpop_domain);
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen callback(USERDB_RESULT_USER_UNKNOWN, auth_request);
d22301419109ed4a38351715e6760011421dadecTimo 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 auth_request_log_info(auth_request, "vpopmail",
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen callback(USERDB_RESULT_INTERNAL_FAILURE, auth_request);
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen /* update the last login only when we're really */
ccc895c0358108d2304239063e940b7d75f364abTimo Sirainen if (vpw->pw_dir == NULL || vpw->pw_dir[0] == '\0') {
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen /* user's homedir doesn't exist yet, create it */
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen auth_request_log_info(auth_request, "vpopmail",
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen "pw_dir isn't set, creating");
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen if (make_user_dir(vpop_user, vpop_domain, uid, gid) == NULL) {
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen auth_request_log_error(auth_request, "vpopmail",
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen "make_user_dir(%s, %s) failed",
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen callback(USERDB_RESULT_INTERNAL_FAILURE, auth_request);
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen /* get the user again so pw_dir is visible */
4b41116563110d00330896a568eff1078c382827Timo Sirainen callback(USERDB_RESULT_INTERNAL_FAILURE, auth_request);
345212e8f61ebf14ff4f80df26df9e655eb5121eTimo Sirainen auth_request_set_userdb_field(auth_request, "uid", dec2str(uid));
345212e8f61ebf14ff4f80df26df9e655eb5121eTimo Sirainen auth_request_set_userdb_field(auth_request, "gid", dec2str(gid));
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen auth_request_set_userdb_field(auth_request, "home", vpw->pw_dir);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen quota = userdb_vpopmail_get_quota(module->quota_template_value,
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainenvpopmail_preinit(struct auth_userdb *auth_userdb, const char *args)
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen const char *const *tmp, *p;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen module = p_new(pool, struct vpopmail_userdb_module, 1);
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen for (tmp = t_strsplit(args, " "); *tmp != NULL; tmp++) {
5daa12cc1c862eec4f63df42227812d3514da2ccTimo Sirainen module->module.cache_key = p_strdup(pool, *tmp + 10);
5daa12cc1c862eec4f63df42227812d3514da2ccTimo Sirainen else if (strncmp(*tmp, "quota_template=", 15) == 0) {
5daa12cc1c862eec4f63df42227812d3514da2ccTimo Sirainen "quota_template missing '='");
e6aa82aeb50948cb47a45a1b61a9c16d6a162388Timo Sirainen module->quota_template_value = p_strdup(pool, p + 1);
bf9402875418faf11825cf11fbe06326b6086e3dTimo Sirainen i_fatal("vpopmail userdb: Unknown args: %s", *tmp);
bf9402875418faf11825cf11fbe06326b6086e3dTimo Sirainenstruct userdb_module_interface userdb_vpopmail = {