dovecot-2.2: Merged changes from v2.1 tree.

dovecot at dovecot.org dovecot at dovecot.org
Thu Feb 21 13:21:33 EET 2013


details:   http://hg.dovecot.org/dovecot-2.2/rev/68e855648d92
changeset: 15874:68e855648d92
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Feb 21 13:21:18 2013 +0200
description:
Merged changes from v2.1 tree.

diffstat:

 .hgignore                                   |    1 +
 dovecot-config.in.in                        |    2 +-
 src/lib-storage/list/mailbox-list-fs-iter.c |    4 +
 src/login-common/ssl-proxy-openssl.c        |    3 +-
 src/plugins/quota/Makefile.am               |   39 +++++-
 src/plugins/quota/quota-status.c            |  205 ++++++++++++++++++++++++++++
 6 files changed, 251 insertions(+), 3 deletions(-)

diffs (truncated from 332 to 300 lines):

diff -r b0c4a5ce4933 -r 68e855648d92 .hgignore
--- a/.hgignore	Thu Feb 21 10:23:08 2013 +0200
+++ b/.hgignore	Thu Feb 21 13:21:18 2013 +0200
@@ -102,6 +102,7 @@
 src/plugins/fts/xml2text
 src/plugins/quota/rquota_xdr.c
 src/plugins/quota/rquota.h
+src/plugins/quota/quota-status
 
 syntax: regexp
 src/.*/test-[^\.]*$
diff -r b0c4a5ce4933 -r 68e855648d92 dovecot-config.in.in
--- a/dovecot-config.in.in	Thu Feb 21 10:23:08 2013 +0200
+++ b/dovecot-config.in.in	Thu Feb 21 13:21:18 2013 +0200
@@ -21,7 +21,7 @@
 LIBDOVECOT_INCLUDE="-I$(incdir) -I$(incdir)/src/lib -I$(incdir)/src/lib-dict -I$(incdir)/src/lib-dns -I$(incdir)/src/lib-http -I$(incdir)/src/lib-mail -I$(incdir)/src/lib-imap -I$(incdir)/src/lib-fs -I$(incdir)/src/lib-charset -I$(incdir)/src/lib-auth -I$(incdir)/src/lib-master -I$(incdir)/src/lib-ssl-iostream -I$(incdir)/src/lib-compression -I$(incdir)/src/lib-settings -I$(incdir)/src/lib-test"
 LIBDOVECOT_LDA_INCLUDE="-I$(incdir)/src/lib-lda -I$(incdir)/src/lda"
 LIBDOVECOT_DOVEADM_INCLUDE="-I$(incdir)/src/doveadm"
-LIBDOVECOT_STORAGE_INCLUDE="-I$(incdir)/src/lib-index -I$(incdir)/src/lib-storage -I$(incdir)/src/lib-storage/list -I$(incdir)/src/lib-storage/index -I$(incdir)/src/lib-storage/index/raw"
+LIBDOVECOT_STORAGE_INCLUDE="-I$(incdir)/src/lib-index -I$(incdir)/src/lib-storage -I$(incdir)/src/lib-storage/list -I$(incdir)/src/lib-storage/index -I$(incdir)/src/lib-storage/index/raw -I$(incdir)/src/plugins/quota"
 LIBDOVECOT_LOGIN_INCLUDE="-I$(incdir)/src/login-common"
 LIBDOVECOT_IMAP_INCLUDE="-I$(incdir)/src/imap"
 LIBDOVECOT_CONFIG_INCLUDE="-I$(incdir)/src/config"
diff -r b0c4a5ce4933 -r 68e855648d92 src/lib-storage/list/mailbox-list-fs-iter.c
--- a/src/lib-storage/list/mailbox-list-fs-iter.c	Thu Feb 21 10:23:08 2013 +0200
+++ b/src/lib-storage/list/mailbox-list-fs-iter.c	Thu Feb 21 13:21:18 2013 +0200
@@ -696,6 +696,10 @@
 		ctx->info.flags |= MAILBOX_NOSELECT;
 	} else if ((ns->flags & NAMESPACE_FLAG_INBOX_ANY) != 0 &&
 		   list_file_is_any_inbox(ctx, storage_name)) {
+		if ((ns->flags & NAMESPACE_FLAG_INBOX_USER) != 0) {
+			/* probably mbox inbox file */
+			return 0;
+		}
 		/* shared/user/INBOX */
 		ctx->info.flags &= ~(MAILBOX_NOSELECT | MAILBOX_NONEXISTENT);
 		ctx->info.flags |= MAILBOX_SELECT;
diff -r b0c4a5ce4933 -r 68e855648d92 src/login-common/ssl-proxy-openssl.c
--- a/src/login-common/ssl-proxy-openssl.c	Thu Feb 21 10:23:08 2013 +0200
+++ b/src/login-common/ssl-proxy-openssl.c	Thu Feb 21 13:21:18 2013 +0200
@@ -434,7 +434,8 @@
 	case SSL_ERROR_SSL:
 		if (ERR_GET_REASON(ERR_peek_error()) == ERR_R_MALLOC_FAILURE) {
 			i_error("OpenSSL malloc() failed. "
-				"You may need to increase login_process_size");
+				"You may need to increase service %s { vsz_limit }",
+				login_binary->process_name);
 		}
 		errstr = t_strdup_printf("%s failed: %s",
 					 func_name, ssl_last_error());
diff -r b0c4a5ce4933 -r 68e855648d92 src/plugins/quota/Makefile.am
--- a/src/plugins/quota/Makefile.am	Thu Feb 21 10:23:08 2013 +0200
+++ b/src/plugins/quota/Makefile.am	Thu Feb 21 13:21:18 2013 +0200
@@ -1,7 +1,10 @@
 doveadm_moduledir = $(moduledir)/doveadm
 
+pkglibexec_PROGRAMS = quota-status
+
 AM_CPPFLAGS = \
 	-I$(top_srcdir)/src/lib \
+	-I$(top_srcdir)/src/lib-master \
 	-I$(top_srcdir)/src/lib-dict \
 	-I$(top_srcdir)/src/lib-index \
 	-I$(top_srcdir)/src/lib-mail \
@@ -27,6 +30,17 @@
         quota-plugin.c \
 	quota-storage.c
 
+quota_common_objects = \
+	quota.lo \
+	quota-count.lo \
+	quota-fs.lo \
+	quota-dict.lo \
+	quota-dirsize.lo \
+	quota-maildir.lo \
+        quota-plugin.lo \
+	quota-storage.lo \
+	$(RQUOTA_XDR_LO)
+
 lib10_quota_plugin_la_SOURCES = $(quota_dist_sources)
 nodist_lib10_quota_plugin_la_SOURCES = $(RQUOTA_XDR)
 
@@ -36,8 +50,30 @@
 lib10_doveadm_quota_plugin_la_SOURCES = \
 	doveadm-quota.c
 
+quota_status_SOURCES = \
+	quota-status.c
+
+if !BUILD_SHARED_LIBS
+unused_objects = \
+	../../lib/mountpoint.o \
+	../../lib-imap/imap-util.o \
+	../../lib-storage/mail-search-parser-imap.o
+endif
+
+quota_status_LDADD = \
+	$(quota_common_objects) \
+	$(unused_objects) \
+	$(LIBDOVECOT_STORAGE) \
+	$(LIBDOVECOT) \
+	$(MODULE_LIBS)
+quota_status_DEPENDENCIES = \
+	$(quota_common_objects) \
+	$(LIBDOVECOT_STORAGE_DEPS) \
+	$(LIBDOVECOT_DEPS)
+
 if HAVE_RQUOTA
 RQUOTA_XDR = rquota_xdr.c
+RQUOTA_XDR_LO = rquota_xdr.lo
 #RQUOTA_X = /usr/include/rpcsvc/rquota.x
 RQUOTA_X = $(srcdir)/rquota.x
 rquota_xdr.c: Makefile $(RQUOTA_X)
@@ -59,7 +95,8 @@
 
 endif
 
-noinst_HEADERS = \
+pkginc_libdir=$(pkgincludedir)
+pkginc_lib_HEADERS = \
 	quota.h \
 	quota-fs.h \
 	quota-plugin.h \
diff -r b0c4a5ce4933 -r 68e855648d92 src/plugins/quota/quota-status.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/plugins/quota/quota-status.c	Thu Feb 21 13:21:18 2013 +0200
@@ -0,0 +1,205 @@
+/* Copyright (c) 2013 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "ostream.h"
+#include "connection.h"
+#include "restrict-access.h"
+#include "master-service.h"
+#include "mail-namespace.h"
+#include "mail-storage.h"
+#include "mail-storage-settings.h"
+#include "mail-storage-service.h"
+#include "quota-private.h"
+#include "quota-plugin.h"
+
+enum quota_protocol {
+	QUOTA_PROTOCOL_UNKNOWN = 0,
+	QUOTA_PROTOCOL_POSTFIX
+};
+
+struct quota_client {
+	struct connection conn;
+
+	char *recipient;
+};
+
+static enum quota_protocol protocol;
+static struct mail_storage_service_ctx *storage_service;
+static struct connection_list *clients;
+
+static void client_connected(struct master_service_connection *conn)
+{
+	struct quota_client *client;
+
+	client = i_new(struct quota_client, 1);
+	connection_init_server(clients, &client->conn,
+			       "(quota client)", conn->fd, conn->fd);
+	master_service_client_connection_accept(conn);
+}
+
+static void client_reset(struct quota_client *client)
+{
+	i_free_and_null(client->recipient);
+}
+
+static int quota_check(struct mail_user *user, const char **error_r)
+{
+	struct quota_user *quser = QUOTA_USER_CONTEXT(user);
+	struct mail_namespace *ns;
+	struct mailbox *box;
+	struct quota_transaction_context *ctx;
+	bool too_large;
+	int ret;
+
+	if (quser == NULL) {
+		/* no quota for user */
+		return 1;
+	}
+
+	ns = mail_namespace_find_inbox(user->namespaces);
+	box = mailbox_alloc(ns->list, "INBOX", 0);
+
+	ctx = quota_transaction_begin(box);
+	ret = quota_test_alloc(ctx, 1, &too_large);
+	quota_transaction_rollback(&ctx);
+
+	mailbox_free(&box);
+
+	if (ret < 0)
+		*error_r = "Internal quota calculation error";
+	else if (ret == 0)
+		*error_r = quser->quota->set->quota_exceeded_msg;
+	return ret;
+}
+
+static void client_handle_request(struct quota_client *client)
+{
+	struct mail_storage_service_input input;
+	struct mail_storage_service_user *service_user;
+	struct mail_user *user;
+	const char *error;
+	int ret;
+
+	if (client->recipient == NULL) {
+		o_stream_send_str(client->conn.output, "action=DUNNO\n\n");
+		return;
+	}
+
+	memset(&input, 0, sizeof(input));
+	input.username = client->recipient;
+
+	ret = mail_storage_service_lookup_next(storage_service, &input,
+					       &service_user, &user, &error);
+	restrict_access_allow_coredumps(TRUE);
+	if (ret == 0) {
+		o_stream_send_str(client->conn.output,
+				  "action=REJECT Unknown user\n\n");
+	} else if (ret > 0) {
+		if ((ret = quota_check(user, &error)) > 0)
+			o_stream_send_str(client->conn.output, "action=OK\n\n");
+		else if (ret == 0) {
+			o_stream_send_str(client->conn.output, t_strdup_printf(
+					  "action=552 5.2.2 %s\n\n", error));
+		}
+		mail_user_unref(&user);
+		mail_storage_service_user_free(&service_user);
+	}
+	if (ret < 0) {
+		o_stream_send_str(client->conn.output, t_strdup_printf(
+			"action=DEFER_IF_PERMIT %s\n\n", error));
+	}
+}
+
+static int client_input_line(struct connection *conn, const char *line)
+{
+	struct quota_client *client = (struct quota_client *)conn;
+
+	if (*line == '\0') {
+		o_stream_cork(conn->output);
+		client_handle_request(client);
+		o_stream_uncork(conn->output);
+		client_reset(client);
+		return 1;
+	}
+	if (client->recipient == NULL &&
+	    strncmp(line, "recipient=", 10) == 0)
+		client->recipient = i_strdup(line + 10);
+	return 1;
+}
+
+static void client_destroy(struct connection *conn)
+{
+	struct quota_client *client = (struct quota_client *)conn;
+
+	connection_deinit(&client->conn);
+	client_reset(client);
+	i_free(client);
+
+	master_service_client_connection_destroyed(master_service);
+}
+
+static struct connection_settings client_set = {
+	.input_max_size = (size_t)-1,
+	.output_max_size = (size_t)-1,
+	.client = FALSE
+};
+
+static const struct connection_vfuncs client_vfuncs = {
+	.destroy = client_destroy,
+	.input_line = client_input_line
+};
+
+static void main_preinit(void)
+{
+	restrict_access_by_env(NULL, FALSE);
+	restrict_access_allow_coredumps(TRUE);
+}
+
+static void main_init(void)
+{
+	clients = connection_list_init(&client_set, &client_vfuncs);
+	storage_service = mail_storage_service_init(master_service, NULL,
+		MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP |
+		MAIL_STORAGE_SERVICE_FLAG_TEMP_PRIV_DROP |
+		MAIL_STORAGE_SERVICE_FLAG_ENABLE_CORE_DUMPS |
+		MAIL_STORAGE_SERVICE_FLAG_NO_CHDIR);
+}
+
+static void main_deinit(void)
+{
+	connection_list_deinit(&clients);
+	mail_storage_service_deinit(&storage_service);
+}
+


More information about the dovecot-cvs mailing list