[dovecot-cvs] dovecot: Added quota_template parameter to userdb vpopmail.
dovecot at dovecot.org
dovecot at dovecot.org
Tue Jun 12 19:17:28 EEST 2007
details: http://hg.dovecot.org/dovecot/rev/4c62af215aca
changeset: 5705:4c62af215aca
user: Timo Sirainen <tss at iki.fi>
date: Tue Jun 12 19:17:24 2007 +0300
description:
Added quota_template parameter to userdb vpopmail.
diffstat:
2 files changed, 58 insertions(+), 7 deletions(-)
dovecot-example.conf | 2 +
src/auth/userdb-vpopmail.c | 63 +++++++++++++++++++++++++++++++++++++++-----
diffs (123 lines):
diff -r 4bf8438b497f -r 4c62af215aca dovecot-example.conf
--- a/dovecot-example.conf Tue Jun 12 18:54:23 2007 +0300
+++ b/dovecot-example.conf Tue Jun 12 19:17:24 2007 +0300
@@ -881,6 +881,8 @@ auth default {
# vpopmail authentication <doc/wiki/AuthDatabase.VPopMail.txt>
#passdb vpopmail {
# [cache_key=<key>] - See cache_key in PAM for explanation.
+ # [quota_template=<template>] - %q expands to Maildir++ quota
+ # (eg. quota_template=quota_rule=*:backend=%q)
#args =
#}
diff -r 4bf8438b497f -r 4c62af215aca src/auth/userdb-vpopmail.c
--- a/src/auth/userdb-vpopmail.c Tue Jun 12 18:54:23 2007 +0300
+++ b/src/auth/userdb-vpopmail.c Tue Jun 12 19:17:24 2007 +0300
@@ -5,8 +5,17 @@
#include "common.h"
#if defined(PASSDB_VPOPMAIL) || defined(USERDB_VPOPMAIL)
+#include "str.h"
+#include "var-expand.h"
#include "userdb.h"
#include "userdb-vpopmail.h"
+
+struct vpopmail_userdb_module {
+ struct userdb_module module;
+
+ const char *quota_template_key;
+ const char *quota_template_value;
+};
struct vqpasswd *vpopmail_lookup_vqp(struct auth_request *request,
char vpop_user[VPOPMAIL_LIMIT],
@@ -41,12 +50,33 @@ struct vqpasswd *vpopmail_lookup_vqp(str
}
#ifdef USERDB_VPOPMAIL
+
+static const char *
+userdb_vpopmail_get_quota(const char *template, const char *vpop_str)
+{
+ const struct var_expand_table *tab;
+ string_t *quota;
+
+ if (template == NULL || *vpop_str == '\0' ||
+ strcmp(vpop_str, "NOQUOTA") == 0)
+ return "";
+
+ tab = var_expand_table_build('q', format_maildirquota(vpop_str), '\0');
+ quota = t_str_new(128);
+ var_expand(quota, template, tab);
+ return str_c(quota);
+}
+
static void vpopmail_lookup(struct auth_request *auth_request,
userdb_callback_t *callback)
{
+ struct userdb_module *_module = auth_request->userdb->userdb;
+ struct vpopmail_userdb_module *module =
+ (struct vpopmail_userdb_module *)_module;
char vpop_user[VPOPMAIL_LIMIT], vpop_domain[VPOPMAIL_LIMIT];
struct vqpasswd *vpw;
struct auth_stream_reply *reply;
+ const char *quota;
uid_t uid;
gid_t gid;
@@ -67,7 +97,8 @@ static void vpopmail_lookup(struct auth_
if (auth_request->successful) {
/* update the last login only when we're really */
- vset_lastauth(vpop_user, vpop_domain, auth_request->service);
+ vset_lastauth(vpop_user, vpop_domain,
+ t_strdup_noconst(auth_request->service));
}
if (vpw->pw_dir == NULL || vpw->pw_dir[0] == '\0') {
@@ -99,21 +130,39 @@ static void vpopmail_lookup(struct auth_
auth_stream_reply_add(reply, "gid", dec2str(gid));
auth_stream_reply_add(reply, "home", vpw->pw_dir);
+ quota = userdb_vpopmail_get_quota(module->quota_template_value,
+ vpw->pw_shell);
+ if (*quota != '\0')
+ auth_stream_reply_add(reply, module->quota_template_key, quota);
+
callback(USERDB_RESULT_OK, reply, auth_request);
}
static struct userdb_module *
vpopmail_preinit(struct auth_userdb *auth_userdb, const char *args)
{
- struct userdb_module *module;
+ struct vpopmail_userdb_module *module;
+ const char *const *tmp, *p;
+ pool_t pool = auth_userdb->auth->pool;
- module = p_new(auth_userdb->auth->pool, struct userdb_module, 1);
+ module = p_new(pool, struct vpopmail_userdb_module, 1);
- if (strncmp(args, "cache_key=", 10) == 0) {
- module->cache_key = p_strconcat(auth_userdb->auth->pool,
- args + 10, NULL);
+ for (tmp = t_strsplit(args, " "); *tmp != NULL; tmp++) {
+ if (strncmp(*tmp, "cache_key=", 10) == 0)
+ module->module.cache_key = p_strdup(pool, *tmp + 10);
+ else if (strncmp(*tmp, "quota_template=", 15) == 0) {
+ p = strchr(*tmp + 15, '=');
+ if (p == NULL) {
+ i_fatal("vpopmail userdb: "
+ "quota_template missing '='");
+ }
+ module->quota_template_key =
+ p_strdup_until(pool, *tmp + 15, p);
+ module->quota_template_value = p_strdup(pool, p + 1);
+ } else
+ i_fatal("vpopmail userdb: Unknown args: %s", *tmp);
}
- return module;
+ return &module->module;
}
struct userdb_module_interface userdb_vpopmail = {
More information about the dovecot-cvs
mailing list