dovecot-2.2: lmtp: Added lmtp_rcpt_check_quota setting to check ...

dovecot at dovecot.org dovecot at dovecot.org
Wed Sep 26 18:01:30 EEST 2012


details:   http://hg.dovecot.org/dovecot-2.2/rev/cc7906697d19
changeset: 15158: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