dovecot-2.1: lmtp: Added lmtp_rcpt_check_quota setting to check ...
dovecot at dovecot.org
dovecot at dovecot.org
Mon Sep 24 14:33:59 EEST 2012
details: http://hg.dovecot.org/dovecot-2.1/rev/cc7906697d19
changeset: 14730:cc7906697d19
user: Timo Sirainen <tss at iki.fi>
date: Mon Sep 24 14:33:52 2012 +0300
description:
lmtp: Added lmtp_rcpt_check_quota setting to check quota already on RCPT TO.
diffstat:
doc/example-config/conf.d/20-lmtp.conf | 4 ++
src/lmtp/commands.c | 48 +++++++++++++++++++++++++++++++--
src/lmtp/lmtp-settings.c | 2 +
src/lmtp/lmtp-settings.h | 1 +
4 files changed, 52 insertions(+), 3 deletions(-)
diffs (111 lines):
diff -r 94f9dfa7cbaf -r cc7906697d19 doc/example-config/conf.d/20-lmtp.conf
--- a/doc/example-config/conf.d/20-lmtp.conf Mon Sep 24 14:31:16 2012 +0300
+++ b/doc/example-config/conf.d/20-lmtp.conf Mon Sep 24 14:33:52 2012 +0300
@@ -10,7 +10,11 @@
# lda_mailbox_autocreate settings.
#lmtp_save_to_detail_mailbox = no
+# Verify quota before replying to RCPT TO. This adds a small overhead.
+#lmtp_rcpt_check_quota = no
+
protocol lmtp {
# Space separated list of plugins to load (default is global mail_plugins).
#mail_plugins = $mail_plugins
}
+
\ No newline at end of file
diff -r 94f9dfa7cbaf -r cc7906697d19 src/lmtp/commands.c
--- a/src/lmtp/commands.c Mon Sep 24 14:31:16 2012 +0300
+++ b/src/lmtp/commands.c Mon Sep 24 14:33:52 2012 +0300
@@ -444,6 +444,42 @@
*address = str_c(username);
}
+static int
+lmtp_rcpt_to_is_over_quota(struct client *client,
+ const struct mail_recipient *rcpt)
+{
+ struct mail_user *user;
+ struct mail_namespace *ns;
+ struct mailbox *box;
+ struct mailbox_status status;
+ const char *errstr;
+ enum mail_error error;
+ int ret;
+
+ if (!client->lmtp_set->lmtp_rcpt_check_quota)
+ return 0;
+
+ ret = mail_storage_service_next(storage_service,
+ rcpt->service_user, &user);
+ if (ret < 0)
+ return -1;
+
+ ns = mail_namespace_find_inbox(user->namespaces);
+ box = mailbox_alloc(ns->list, "INBOX", 0);
+ ret = mailbox_get_status(box, STATUS_CHECK_OVER_QUOTA, &status);
+ if (ret < 0) {
+ errstr = mailbox_get_last_error(box, &error);
+ if (error == MAIL_ERROR_NOSPACE) {
+ client_send_line(client, "552 5.2.2 <%s> %s",
+ rcpt->address, errstr);
+ ret = 1;
+ }
+ }
+ mailbox_free(&box);
+ mail_user_unref(&user);
+ return ret;
+}
+
int cmd_rcpt(struct client *client, const char *args)
{
struct mail_recipient rcpt;
@@ -516,9 +552,15 @@
rcpt.address = p_strdup(client->state_pool, address);
rcpt.detail = p_strdup(client->state_pool, detail);
- array_append(&client->state.rcpt_to, &rcpt, 1);
-
- client_send_line(client, "250 2.1.5 OK");
+ if ((ret = lmtp_rcpt_to_is_over_quota(client, &rcpt)) < 0) {
+ client_send_line(client, ERRSTR_TEMP_MAILBOX_FAIL,
+ rcpt.address);
+ return 0;
+ }
+ if (ret == 0) {
+ array_append(&client->state.rcpt_to, &rcpt, 1);
+ client_send_line(client, "250 2.1.5 OK");
+ }
return 0;
}
diff -r 94f9dfa7cbaf -r cc7906697d19 src/lmtp/lmtp-settings.c
--- a/src/lmtp/lmtp-settings.c Mon Sep 24 14:31:16 2012 +0300
+++ b/src/lmtp/lmtp-settings.c Mon Sep 24 14:33:52 2012 +0300
@@ -59,6 +59,7 @@
static const struct setting_define lmtp_setting_defines[] = {
DEF(SET_BOOL, lmtp_proxy),
DEF(SET_BOOL, lmtp_save_to_detail_mailbox),
+ DEF(SET_BOOL, lmtp_rcpt_check_quota),
DEF(SET_STR_VARS, login_greeting),
DEF(SET_STR, lmtp_address_translate),
@@ -68,6 +69,7 @@
static const struct lmtp_settings lmtp_default_settings = {
.lmtp_proxy = FALSE,
.lmtp_save_to_detail_mailbox = FALSE,
+ .lmtp_rcpt_check_quota = FALSE,
.login_greeting = PACKAGE_NAME" ready.",
.lmtp_address_translate = ""
};
diff -r 94f9dfa7cbaf -r cc7906697d19 src/lmtp/lmtp-settings.h
--- a/src/lmtp/lmtp-settings.h Mon Sep 24 14:31:16 2012 +0300
+++ b/src/lmtp/lmtp-settings.h Mon Sep 24 14:33:52 2012 +0300
@@ -7,6 +7,7 @@
struct lmtp_settings {
bool lmtp_proxy;
bool lmtp_save_to_detail_mailbox;
+ bool lmtp_rcpt_check_quota;
const char *login_greeting;
const char *lmtp_address_translate;
};
More information about the dovecot-cvs
mailing list