changeset 22407:40c49a64616d

quota-status: Support recipient_delimiter
author Aki Tuomi <aki.tuomi@dovecot.fi>
date Mon, 03 Jul 2017 18:40:47 +0300
parents 8b81cd47ede8
children a55322dacd7d
files src/plugins/quota/Makefile.am src/plugins/quota/quota-status-settings.c src/plugins/quota/quota-status-settings.h src/plugins/quota/quota-status.c
diffstat 4 files changed, 70 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/plugins/quota/Makefile.am	Mon Jul 03 18:31:56 2017 +0300
+++ b/src/plugins/quota/Makefile.am	Mon Jul 03 18:40:47 2017 +0300
@@ -62,7 +62,8 @@
 	doveadm-quota.c
 
 quota_status_SOURCES = \
-	quota-status.c
+	quota-status.c \
+	quota-status-settings.c
 
 quota_status_LDADD = \
 	$(quota_common_objects) \
@@ -104,6 +105,8 @@
 	quota-fs.h \
 	quota-plugin.h \
 	quota-private.h
+noinst_HEADERS = \
+	quota-status-settings.h
 
 EXTRA_DIST = rquota.x
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/plugins/quota/quota-status-settings.c	Mon Jul 03 18:40:47 2017 +0300
@@ -0,0 +1,37 @@
+/* Copyright (c) 2017 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "settings-parser.h"
+#include "service-settings.h"
+#include "mail-storage-settings.h"
+#include "quota-status-settings.h"
+
+#undef DEF
+#define DEF(type, name) \
+	{ type, #name, offsetof(struct quota_status_settings, name), NULL }
+
+static const struct setting_define quota_status_setting_defines[] = {
+	DEF(SET_STR, recipient_delimiter),
+
+	SETTING_DEFINE_LIST_END
+};
+
+static const struct quota_status_settings quota_status_default_settings = {
+	.recipient_delimiter = "+",
+};
+
+static const struct setting_parser_info *quota_status_setting_dependencies[] = {
+	NULL
+};
+
+const struct setting_parser_info quota_status_setting_parser_info = {
+	.module_name = "mail",
+	.defines = quota_status_setting_defines,
+	.defaults = &quota_status_default_settings,
+
+	.type_offset = (size_t)-1,
+	.struct_size = sizeof(struct quota_status_settings),
+
+	.parent_offset = (size_t)-1,
+	.dependencies = quota_status_setting_dependencies
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/plugins/quota/quota-status-settings.h	Mon Jul 03 18:40:47 2017 +0300
@@ -0,0 +1,10 @@
+#ifndef QUOTA_STATUS_SETTINGS_H
+#define QUOTA_STATUS_SETTINGS_H 1
+
+struct quota_status_settings {
+	char *recipient_delimiter;
+};
+
+extern const struct setting_parser_info quota_status_setting_parser_info;
+
+#endif
--- a/src/plugins/quota/quota-status.c	Mon Jul 03 18:31:56 2017 +0300
+++ b/src/plugins/quota/quota-status.c	Mon Jul 03 18:40:47 2017 +0300
@@ -4,14 +4,17 @@
 #include "ostream.h"
 #include "connection.h"
 #include "restrict-access.h"
+#include "settings-parser.h"
 #include "master-service.h"
 #include "master-service-settings.h"
 #include "mail-namespace.h"
 #include "mail-storage.h"
 #include "mail-storage-settings.h"
 #include "mail-storage-service.h"
+#include "message-address.h"
 #include "quota-private.h"
 #include "quota-plugin.h"
+#include "quota-status-settings.h"
 
 enum quota_protocol {
 	QUOTA_PROTOCOL_UNKNOWN = 0,
@@ -25,6 +28,7 @@
 	uoff_t size;
 };
 
+static struct quota_status_settings *quota_status_settings;
 static pool_t quota_status_pool;
 static enum quota_protocol protocol;
 static struct mail_storage_service_ctx *storage_service;
@@ -79,6 +83,8 @@
 	struct mail_storage_service_user *service_user;
 	struct mail_user *user;
 	const char *value = NULL, *error;
+	const char *detail ATTR_UNUSED;
+	char delim ATTR_UNUSED;
 	int ret;
 
 	if (client->recipient == NULL) {
@@ -87,8 +93,9 @@
 	}
 
 	i_zero(&input);
-	input.username = client->recipient;
-
+	message_detail_address_parse(quota_status_settings->recipient_delimiter,
+				     client->recipient, &input.username, &delim,
+				     &detail);
 	ret = mail_storage_service_lookup_next(storage_service, &input,
 					       &service_user, &user, &error);
 	restrict_access_allow_coredumps(TRUE);
@@ -186,15 +193,20 @@
 
 static void main_init(void)
 {
+	static const struct setting_parser_info *set_roots[] = {
+		&quota_status_setting_parser_info,
+		NULL
+	};
 	struct mail_storage_service_input input;
 	const struct setting_parser_info *user_info;
 	const struct setting_parser_context *set_parser;
 	const struct mail_user_settings *user_set;
+	const struct quota_status_settings *set;
 	const char *value, *error;
 	pool_t pool;
 
 	clients = connection_list_init(&client_set, &client_vfuncs);
-	storage_service = mail_storage_service_init(master_service, NULL,
+	storage_service = mail_storage_service_init(master_service, set_roots,
 		MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP |
 		MAIL_STORAGE_SERVICE_FLAG_TEMP_PRIV_DROP |
 		MAIL_STORAGE_SERVICE_FLAG_ENABLE_CORE_DUMPS |
@@ -213,6 +225,10 @@
 		i_fatal("%s", error);
 	user_set = master_service_settings_parser_get_others(master_service,
 							     set_parser)[0];
+	set = master_service_settings_get_others(master_service)[1];
+
+	quota_status_settings = settings_dup(&quota_status_setting_parser_info, set,
+					     quota_status_pool);
 	value = mail_user_set_plugin_getenv(user_set, "quota_status_nouser");
 	nouser_reply = p_strdup(quota_status_pool,
 				value != NULL ? value : "REJECT Unknown user");