Mercurial > dovecot > original-hg > dovecot-2.1
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 |
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 } |