annotate src/plugins/quota/quota-status.c @ 14991:b986ac5e1d98

quota-status: Keep the config connection open.
author Timo Sirainen <tss@iki.fi>
date Tue, 30 Jul 2013 13:26:40 +0300
parents 578b911f355b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14908
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1 /* Copyright (c) 2013 Dovecot authors, see the included COPYING file */
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "ostream.h"
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "connection.h"
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "restrict-access.h"
14952
c6b4a639cae1 quota-status: Unknown recipients caused a crash.
Timo Sirainen <tss@iki.fi>
parents: 14948
diff changeset
7 #include "settings-parser.h"
14908
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "master-service.h"
14952
c6b4a639cae1 quota-status: Unknown recipients caused a crash.
Timo Sirainen <tss@iki.fi>
parents: 14948
diff changeset
9 #include "master-service-settings.h"
14908
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "mail-namespace.h"
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #include "mail-storage.h"
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include "mail-storage-settings.h"
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include "mail-storage-service.h"
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #include "quota-private.h"
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 #include "quota-plugin.h"
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16
14954
8e9f1c744516 quota-status: Fixed compiling with old Solaris.
Timo Sirainen <tss@iki.fi>
parents: 14952
diff changeset
17 #include <stdio.h>
8e9f1c744516 quota-status: Fixed compiling with old Solaris.
Timo Sirainen <tss@iki.fi>
parents: 14952
diff changeset
18 #include <unistd.h>
8e9f1c744516 quota-status: Fixed compiling with old Solaris.
Timo Sirainen <tss@iki.fi>
parents: 14952
diff changeset
19
14908
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 enum quota_protocol {
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 QUOTA_PROTOCOL_UNKNOWN = 0,
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 QUOTA_PROTOCOL_POSTFIX
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 };
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 struct quota_client {
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 struct connection conn;
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 char *recipient;
14946
2493ec20df8c quota-status: If size parameter is given, use it to check quota.
Timo Sirainen <tss@iki.fi>
parents: 14909
diff changeset
29 uoff_t size;
14908
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 };
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 static enum quota_protocol protocol;
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 static struct mail_storage_service_ctx *storage_service;
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 static struct connection_list *clients;
14952
c6b4a639cae1 quota-status: Unknown recipients caused a crash.
Timo Sirainen <tss@iki.fi>
parents: 14948
diff changeset
35 static char *nouser_reply;
14908
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 static void client_connected(struct master_service_connection *conn)
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 {
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 struct quota_client *client;
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 client = i_new(struct quota_client, 1);
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 connection_init_server(clients, &client->conn,
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 "(quota client)", conn->fd, conn->fd);
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 master_service_client_connection_accept(conn);
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 }
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 static void client_reset(struct quota_client *client)
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 {
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 i_free_and_null(client->recipient);
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 }
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51
14946
2493ec20df8c quota-status: If size parameter is given, use it to check quota.
Timo Sirainen <tss@iki.fi>
parents: 14909
diff changeset
52 static int
14990
578b911f355b quota-status: Added quota_status_toolarge message for mails larger than user's quota limit.
Timo Sirainen <tss@iki.fi>
parents: 14989
diff changeset
53 quota_check(struct mail_user *user, uoff_t mail_size,
578b911f355b quota-status: Added quota_status_toolarge message for mails larger than user's quota limit.
Timo Sirainen <tss@iki.fi>
parents: 14989
diff changeset
54 const char **error_r, bool *too_large_r)
14908
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 {
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 struct quota_user *quser = QUOTA_USER_CONTEXT(user);
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 struct mail_namespace *ns;
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 struct mailbox *box;
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 struct quota_transaction_context *ctx;
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 int ret;
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 if (quser == NULL) {
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 /* no quota for user */
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 return 1;
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 }
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 ns = mail_namespace_find_inbox(user->namespaces);
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 box = mailbox_alloc(ns->list, "INBOX", 0);
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 ctx = quota_transaction_begin(box);
14990
578b911f355b quota-status: Added quota_status_toolarge message for mails larger than user's quota limit.
Timo Sirainen <tss@iki.fi>
parents: 14989
diff changeset
71 ret = quota_test_alloc(ctx, I_MAX(1, mail_size), too_large_r);
14908
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 quota_transaction_rollback(&ctx);
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 mailbox_free(&box);
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 if (ret < 0)
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 *error_r = "Internal quota calculation error";
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 else if (ret == 0)
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 *error_r = quser->quota->set->quota_exceeded_msg;
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 return ret;
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 }
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 static void client_handle_request(struct quota_client *client)
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 {
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 struct mail_storage_service_input input;
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 struct mail_storage_service_user *service_user;
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 struct mail_user *user;
14947
c7da636a09c4 quota-status: Added quota_status_(success|nouser|overquota) settings.
Timo Sirainen <tss@iki.fi>
parents: 14946
diff changeset
88 const char *value = NULL, *error;
14990
578b911f355b quota-status: Added quota_status_toolarge message for mails larger than user's quota limit.
Timo Sirainen <tss@iki.fi>
parents: 14989
diff changeset
89 bool too_large;
14908
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 int ret;
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92 if (client->recipient == NULL) {
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93 o_stream_send_str(client->conn.output, "action=DUNNO\n\n");
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 return;
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95 }
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97 memset(&input, 0, sizeof(input));
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98 input.username = client->recipient;
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 ret = mail_storage_service_lookup_next(storage_service, &input,
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 &service_user, &user, &error);
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102 restrict_access_allow_coredumps(TRUE);
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103 if (ret == 0) {
14952
c6b4a639cae1 quota-status: Unknown recipients caused a crash.
Timo Sirainen <tss@iki.fi>
parents: 14948
diff changeset
104 value = nouser_reply;
14908
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105 } else if (ret > 0) {
14990
578b911f355b quota-status: Added quota_status_toolarge message for mails larger than user's quota limit.
Timo Sirainen <tss@iki.fi>
parents: 14989
diff changeset
106 if ((ret = quota_check(user, client->size, &error, &too_large)) > 0) {
14947
c7da636a09c4 quota-status: Added quota_status_(success|nouser|overquota) settings.
Timo Sirainen <tss@iki.fi>
parents: 14946
diff changeset
107 /* under quota */
c7da636a09c4 quota-status: Added quota_status_(success|nouser|overquota) settings.
Timo Sirainen <tss@iki.fi>
parents: 14946
diff changeset
108 value = mail_user_plugin_getenv(user, "quota_status_success");
c7da636a09c4 quota-status: Added quota_status_(success|nouser|overquota) settings.
Timo Sirainen <tss@iki.fi>
parents: 14946
diff changeset
109 if (value == NULL)
c7da636a09c4 quota-status: Added quota_status_(success|nouser|overquota) settings.
Timo Sirainen <tss@iki.fi>
parents: 14946
diff changeset
110 value = "OK";
c7da636a09c4 quota-status: Added quota_status_(success|nouser|overquota) settings.
Timo Sirainen <tss@iki.fi>
parents: 14946
diff changeset
111 } else if (ret == 0) {
14990
578b911f355b quota-status: Added quota_status_toolarge message for mails larger than user's quota limit.
Timo Sirainen <tss@iki.fi>
parents: 14989
diff changeset
112 if (too_large) {
578b911f355b quota-status: Added quota_status_toolarge message for mails larger than user's quota limit.
Timo Sirainen <tss@iki.fi>
parents: 14989
diff changeset
113 /* even over maximum quota */
578b911f355b quota-status: Added quota_status_toolarge message for mails larger than user's quota limit.
Timo Sirainen <tss@iki.fi>
parents: 14989
diff changeset
114 value = mail_user_plugin_getenv(user, "quota_status_toolarge");
578b911f355b quota-status: Added quota_status_toolarge message for mails larger than user's quota limit.
Timo Sirainen <tss@iki.fi>
parents: 14989
diff changeset
115 }
578b911f355b quota-status: Added quota_status_toolarge message for mails larger than user's quota limit.
Timo Sirainen <tss@iki.fi>
parents: 14989
diff changeset
116 if (value == NULL)
578b911f355b quota-status: Added quota_status_toolarge message for mails larger than user's quota limit.
Timo Sirainen <tss@iki.fi>
parents: 14989
diff changeset
117 value = mail_user_plugin_getenv(user, "quota_status_overquota");
14947
c7da636a09c4 quota-status: Added quota_status_(success|nouser|overquota) settings.
Timo Sirainen <tss@iki.fi>
parents: 14946
diff changeset
118 if (value == NULL)
14989
b73639f92610 quota-status: Removed extra newlines from default quota_status_overquota message.
Timo Sirainen <tss@iki.fi>
parents: 14966
diff changeset
119 value = t_strdup_printf("554 5.2.2 %s", error);
14908
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120 }
14966
30c257f2504a quota-status: If quota_status_* settings are set, don't free them before using.
Timo Sirainen <tss@iki.fi>
parents: 14960
diff changeset
121 value = t_strdup(value); /* user's pool is being freed */
14908
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122 mail_user_unref(&user);
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123 mail_storage_service_user_free(&service_user);
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 }
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 if (ret < 0) {
14947
c7da636a09c4 quota-status: Added quota_status_(success|nouser|overquota) settings.
Timo Sirainen <tss@iki.fi>
parents: 14946
diff changeset
126 /* temporary failure */
14908
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127 o_stream_send_str(client->conn.output, t_strdup_printf(
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128 "action=DEFER_IF_PERMIT %s\n\n", error));
14947
c7da636a09c4 quota-status: Added quota_status_(success|nouser|overquota) settings.
Timo Sirainen <tss@iki.fi>
parents: 14946
diff changeset
129 } else {
c7da636a09c4 quota-status: Added quota_status_(success|nouser|overquota) settings.
Timo Sirainen <tss@iki.fi>
parents: 14946
diff changeset
130 o_stream_send_str(client->conn.output,
c7da636a09c4 quota-status: Added quota_status_(success|nouser|overquota) settings.
Timo Sirainen <tss@iki.fi>
parents: 14946
diff changeset
131 t_strdup_printf("action=%s\n\n", value));
14908
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132 }
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133 }
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135 static int client_input_line(struct connection *conn, const char *line)
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136 {
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137 struct quota_client *client = (struct quota_client *)conn;
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139 if (*line == '\0') {
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 o_stream_cork(conn->output);
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141 client_handle_request(client);
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142 o_stream_uncork(conn->output);
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143 client_reset(client);
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144 return 1;
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 }
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146 if (client->recipient == NULL &&
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 strncmp(line, "recipient=", 10) == 0)
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148 client->recipient = i_strdup(line + 10);
14946
2493ec20df8c quota-status: If size parameter is given, use it to check quota.
Timo Sirainen <tss@iki.fi>
parents: 14909
diff changeset
149 else if (strncmp(line, "size=", 5) == 0) {
2493ec20df8c quota-status: If size parameter is given, use it to check quota.
Timo Sirainen <tss@iki.fi>
parents: 14909
diff changeset
150 if (str_to_uoff(line+5, &client->size) < 0)
2493ec20df8c quota-status: If size parameter is given, use it to check quota.
Timo Sirainen <tss@iki.fi>
parents: 14909
diff changeset
151 client->size = 0;
2493ec20df8c quota-status: If size parameter is given, use it to check quota.
Timo Sirainen <tss@iki.fi>
parents: 14909
diff changeset
152 }
14908
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153 return 1;
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154 }
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 static void client_destroy(struct connection *conn)
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 {
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 struct quota_client *client = (struct quota_client *)conn;
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 connection_deinit(&client->conn);
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 client_reset(client);
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162 i_free(client);
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164 master_service_client_connection_destroyed(master_service);
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165 }
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167 static struct connection_settings client_set = {
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 .input_max_size = (size_t)-1,
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169 .output_max_size = (size_t)-1,
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
170 .client = FALSE
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171 };
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 static const struct connection_vfuncs client_vfuncs = {
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 .destroy = client_destroy,
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175 .input_line = client_input_line
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176 };
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178 static void main_preinit(void)
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 {
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180 restrict_access_by_env(NULL, FALSE);
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181 restrict_access_allow_coredumps(TRUE);
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 }
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
184 static void main_init(void)
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185 {
14952
c6b4a639cae1 quota-status: Unknown recipients caused a crash.
Timo Sirainen <tss@iki.fi>
parents: 14948
diff changeset
186 struct mail_storage_service_input input;
c6b4a639cae1 quota-status: Unknown recipients caused a crash.
Timo Sirainen <tss@iki.fi>
parents: 14948
diff changeset
187 const struct setting_parser_info *user_info;
c6b4a639cae1 quota-status: Unknown recipients caused a crash.
Timo Sirainen <tss@iki.fi>
parents: 14948
diff changeset
188 const struct setting_parser_context *set_parser;
c6b4a639cae1 quota-status: Unknown recipients caused a crash.
Timo Sirainen <tss@iki.fi>
parents: 14948
diff changeset
189 const struct mail_user_settings *user_set;
c6b4a639cae1 quota-status: Unknown recipients caused a crash.
Timo Sirainen <tss@iki.fi>
parents: 14948
diff changeset
190 const char *value, *error;
c6b4a639cae1 quota-status: Unknown recipients caused a crash.
Timo Sirainen <tss@iki.fi>
parents: 14948
diff changeset
191 pool_t pool;
c6b4a639cae1 quota-status: Unknown recipients caused a crash.
Timo Sirainen <tss@iki.fi>
parents: 14948
diff changeset
192
14908
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193 clients = connection_list_init(&client_set, &client_vfuncs);
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194 storage_service = mail_storage_service_init(master_service, NULL,
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP |
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196 MAIL_STORAGE_SERVICE_FLAG_TEMP_PRIV_DROP |
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197 MAIL_STORAGE_SERVICE_FLAG_ENABLE_CORE_DUMPS |
14909
f12f2f2f7459 quota-status: Load plugins after all.
Timo Sirainen <tss@iki.fi>
parents: 14908
diff changeset
198 MAIL_STORAGE_SERVICE_FLAG_NO_CHDIR);
14952
c6b4a639cae1 quota-status: Unknown recipients caused a crash.
Timo Sirainen <tss@iki.fi>
parents: 14948
diff changeset
199
c6b4a639cae1 quota-status: Unknown recipients caused a crash.
Timo Sirainen <tss@iki.fi>
parents: 14948
diff changeset
200 memset(&input, 0, sizeof(input));
c6b4a639cae1 quota-status: Unknown recipients caused a crash.
Timo Sirainen <tss@iki.fi>
parents: 14948
diff changeset
201 input.service = "quota-status";
c6b4a639cae1 quota-status: Unknown recipients caused a crash.
Timo Sirainen <tss@iki.fi>
parents: 14948
diff changeset
202 input.module = "mail";
c6b4a639cae1 quota-status: Unknown recipients caused a crash.
Timo Sirainen <tss@iki.fi>
parents: 14948
diff changeset
203 input.username = "";
c6b4a639cae1 quota-status: Unknown recipients caused a crash.
Timo Sirainen <tss@iki.fi>
parents: 14948
diff changeset
204
c6b4a639cae1 quota-status: Unknown recipients caused a crash.
Timo Sirainen <tss@iki.fi>
parents: 14948
diff changeset
205 pool = pool_alloconly_create("service all settings", 4096);
c6b4a639cae1 quota-status: Unknown recipients caused a crash.
Timo Sirainen <tss@iki.fi>
parents: 14948
diff changeset
206 if (mail_storage_service_read_settings(storage_service, &input, pool,
c6b4a639cae1 quota-status: Unknown recipients caused a crash.
Timo Sirainen <tss@iki.fi>
parents: 14948
diff changeset
207 &user_info, &set_parser,
c6b4a639cae1 quota-status: Unknown recipients caused a crash.
Timo Sirainen <tss@iki.fi>
parents: 14948
diff changeset
208 &error) < 0)
c6b4a639cae1 quota-status: Unknown recipients caused a crash.
Timo Sirainen <tss@iki.fi>
parents: 14948
diff changeset
209 i_fatal("%s", error);
c6b4a639cae1 quota-status: Unknown recipients caused a crash.
Timo Sirainen <tss@iki.fi>
parents: 14948
diff changeset
210 user_set = settings_parser_get_list(set_parser)[1];
c6b4a639cae1 quota-status: Unknown recipients caused a crash.
Timo Sirainen <tss@iki.fi>
parents: 14948
diff changeset
211 value = mail_user_set_plugin_getenv(user_set, "quota_status_nouser");
c6b4a639cae1 quota-status: Unknown recipients caused a crash.
Timo Sirainen <tss@iki.fi>
parents: 14948
diff changeset
212 nouser_reply = value != NULL ? i_strdup(value) :
c6b4a639cae1 quota-status: Unknown recipients caused a crash.
Timo Sirainen <tss@iki.fi>
parents: 14948
diff changeset
213 i_strdup("REJECT Unknown user");
c6b4a639cae1 quota-status: Unknown recipients caused a crash.
Timo Sirainen <tss@iki.fi>
parents: 14948
diff changeset
214 pool_unref(&pool);
14908
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215 }
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
217 static void main_deinit(void)
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 {
14952
c6b4a639cae1 quota-status: Unknown recipients caused a crash.
Timo Sirainen <tss@iki.fi>
parents: 14948
diff changeset
219 i_free(nouser_reply);
14908
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220 connection_list_deinit(&clients);
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221 mail_storage_service_deinit(&storage_service);
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 }
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224 int main(int argc, char *argv[])
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 {
14991
b986ac5e1d98 quota-status: Keep the config connection open.
Timo Sirainen <tss@iki.fi>
parents: 14990
diff changeset
226 enum master_service_flags service_flags =
b986ac5e1d98 quota-status: Keep the config connection open.
Timo Sirainen <tss@iki.fi>
parents: 14990
diff changeset
227 MASTER_SERVICE_FLAG_KEEP_CONFIG_OPEN;
14908
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 int c;
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230 protocol = QUOTA_PROTOCOL_UNKNOWN;
14991
b986ac5e1d98 quota-status: Keep the config connection open.
Timo Sirainen <tss@iki.fi>
parents: 14990
diff changeset
231 master_service = master_service_init("quota-status", service_flags,
14908
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232 &argc, &argv, "p:");
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 while ((c = master_getopt(master_service)) > 0) {
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234 switch (c) {
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
235 case 'p':
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
236 if (strcmp(optarg, "postfix") == 0)
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 protocol = QUOTA_PROTOCOL_POSTFIX;
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 else
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 i_fatal("Unknown -p parameter: '%s'", optarg);
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 break;
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241 default:
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 return FATAL_DEFAULT;
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243 }
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 }
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 if (protocol == QUOTA_PROTOCOL_UNKNOWN)
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 i_fatal("Missing -p parameter");
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
247
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248 master_service_init_log(master_service, "doveadm: ");
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249 main_preinit();
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
250 master_service_init_finish(master_service);
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
252 main_init();
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253 master_service_run(master_service, client_connected);
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
254 main_deinit();
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255 master_service_deinit(&master_service);
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
256 return 0;
980be1dc80c2 Added quota-status service for asking if user is over quota.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
257 }