View | Details | Raw Unified | Return to bug 210274
Collapse All | Expand All

(-)dbmail/Makefile (+1 lines)
Lines 3-8 Link Here
3
3
4
PORTNAME=	dbmail
4
PORTNAME=	dbmail
5
PORTVERSION=	3.2.3
5
PORTVERSION=	3.2.3
6
PORTREVISION=	1
6
CATEGORIES=	mail
7
CATEGORIES=	mail
7
MASTER_SITES=	http://git.dbmail.eu/paul/dbmail/snapshot/ \
8
MASTER_SITES=	http://git.dbmail.eu/paul/dbmail/snapshot/ \
8
		http://www.dbmail.org/download/3.2/
9
		http://www.dbmail.org/download/3.2/
(-)dbmail/files/patch-0001-login_disabled-option-before-starttls-for-pop3 (+77 lines)
Line 0 Link Here
1
From ec74380db22e3d92641c972aa53823d02a56a5ad Mon Sep 17 00:00:00 2001
2
From: Paul J Stevens <p.stevens@lukkien.com>
3
Date: Wed, 18 Feb 2015 21:26:38 +0100
4
Subject: [PATCH 1/7] login_disabled option before starttls for pop3
5
6
---
7
 dbmail.conf |  5 +++++
8
 src/pop3.c  | 16 ++++++++++++++++
9
 2 files changed, 21 insertions(+)
10
11
diff --git ./dbmail.conf ./dbmail.conf
12
index 946e064..bf16d16 100644
13
--- ./dbmail.conf
14
+++ ./dbmail.conf
15
@@ -227,6 +227,11 @@ port                  = 110
16
 # You can set an alternate banner to display when connecting to the service
17
 # banner = DBMAIL pop3 server ready to rock
18
 
19
+# If TLS is enabled, login before starttls is normally
20
+# allowed. Use login_disabled=yes to change this
21
+#
22
+# login_disabled        = no
23
+
24
 # 
25
 # If yes, allows SMTP access from the host IP connecting by POP3.
26
 # This requires addition configuration of your MTA
27
diff --git ./src/pop3.c ./src/pop3.c
28
index cc0863b..d03f71a 100644
29
--- ./src/pop3.c
30
+++ ./src/pop3.c
31
@@ -366,6 +366,7 @@ int pop3(ClientSession_T *session, const char *buffer)
32
 	int found = 0;
33
 	//int indx = 0;
34
 	int validate_result;
35
+    bool login_disabled = FALSE;
36
 	uint64_t result, top_lines, top_messageid, user_idnr;
37
 	unsigned char *md5_apop_he;
38
 	struct message *msg;
39
@@ -431,6 +432,15 @@ int pop3(ClientSession_T *session, const char *buffer)
40
 		}
41
 	}
42
 
43
+    if (state == CLIENTSTATE_INITIAL_CONNECT) {
44
+        if (server_conf->ssl) {
45
+            Field_T val;
46
+            GETCONFIGVALUE("login_disabled", "POP", val);
47
+            if (SMATCH(val, "yes"))
48
+                login_disabled = TRUE;
49
+        }
50
+    }
51
+
52
 	switch (cmdtype) {
53
 		
54
 	case POP3_QUIT:
55
@@ -459,6 +469,9 @@ int pop3(ClientSession_T *session, const char *buffer)
56
 		if (state != CLIENTSTATE_INITIAL_CONNECT)
57
 			return pop3_error(session, "-ERR wrong command mode\r\n");
58
 
59
+        if (login_disabled && ! session->ci->sock->ssl_state)
60
+            return pop3_error(session, "-ERR try STLS\r\n");
61
+
62
 		if (session->username != NULL) {
63
 			/* reset username */
64
 			g_free(session->username);
65
@@ -478,6 +491,9 @@ int pop3(ClientSession_T *session, const char *buffer)
66
 		if (state != CLIENTSTATE_INITIAL_CONNECT)
67
 			return pop3_error(session, "-ERR wrong command mode\r\n");
68
 
69
+        if (login_disabled && ! session->ci->sock->ssl_state)
70
+            return pop3_error(session, "-ERR try STLS\r\n");
71
+
72
 		if (session->password != NULL) {
73
 			g_free(session->password);
74
 			session->password = NULL;
75
-- 
76
2.7.4 (Apple Git-66)
77
(-)dbmail/files/patch-0002-fix-compiler-warnings-for-GCC5 (+346 lines)
Line 0 Link Here
1
From c3badbdb282a5ffb411ee2b5062ed345896fb149 Mon Sep 17 00:00:00 2001
2
From: Paul J Stevens <p.stevens@lukkien.com>
3
Date: Fri, 8 Jan 2016 18:42:24 +0100
4
Subject: [PATCH 2/7] fix compiler warnings for GCC5
5
6
---
7
 src/dm_db.c           | 26 +++++++++++++-------------
8
 src/dm_mailbox.c      |  6 +++---
9
 src/dm_mailboxstate.c |  4 ++--
10
 src/dm_message.c      | 12 ++++++------
11
 src/dm_misc.c         |  6 +++---
12
 src/dm_sievescript.c  |  2 +-
13
 src/maintenance.c     |  2 +-
14
 src/modules/authsql.c | 12 ++++++------
15
 src/pop3.c            |  2 +-
16
 9 files changed, 36 insertions(+), 36 deletions(-)
17
18
diff --git ./src/dm_db.c ./src/dm_db.c
19
index 8d72214..feb0b34 100644
20
--- ./src/dm_db.c
21
+++ ./src/dm_db.c
22
@@ -1047,7 +1047,7 @@ int db_check_version(void)
23
 /* test existence of usermap table */
24
 int db_use_usermap(void)
25
 {
26
-	int use_usermap = TRUE;
27
+	volatile int use_usermap = TRUE;
28
 	Connection_T c = db_con_get();
29
 	TRY
30
 		if (! db_query(c, db_get_sql(SQL_TABLE_EXISTS), DBPFX, "usermap"))
31
@@ -1214,7 +1214,7 @@ static int dm_quota_user_validate(uint64_t user_idnr, uint64_t msg_size)
32
 int dm_quota_rebuild_user(uint64_t user_idnr)
33
 {
34
 	Connection_T c; ResultSet_T r; volatile int t = DM_SUCCESS;
35
-	uint64_t quotum = 0;
36
+	volatile uint64_t quotum = 0;
37
 
38
 	c = db_con_get();
39
 	TRY
40
@@ -1257,7 +1257,7 @@ int dm_quota_rebuild()
41
 
42
 	GList *quota = NULL;
43
 	struct used_quota *q;
44
-	int i = 0;
45
+	volatile int i = 0;
46
 	int result;
47
 
48
 	c = db_con_get();
49
@@ -1375,7 +1375,7 @@ int db_get_reply_body(uint64_t user_idnr, char **reply_body)
50
 uint64_t db_get_useridnr(uint64_t message_idnr)
51
 {
52
 	Connection_T c; ResultSet_T r;
53
-	uint64_t user_idnr = 0;
54
+	volatile uint64_t user_idnr = 0;
55
 	c = db_con_get();
56
 	TRY
57
 		r = db_query(c, "SELECT %smailboxes.owner_idnr FROM %smailboxes, %smessages "
58
@@ -1397,7 +1397,7 @@ uint64_t db_get_useridnr(uint64_t message_idnr)
59
 int db_log_ip(const char *ip)
60
 {
61
 	Connection_T c; ResultSet_T r; PreparedStatement_T s; volatile int t = DM_SUCCESS;
62
-	uint64_t id = 0;
63
+	volatile uint64_t id = 0;
64
 	
65
 	c = db_con_get();
66
 	TRY
67
@@ -1444,8 +1444,8 @@ int db_empty_mailbox(uint64_t user_idnr, int only_empty)
68
 	Connection_T c; ResultSet_T r; volatile int t = DM_SUCCESS;
69
 	GList *mboxids = NULL;
70
 	uint64_t *id;
71
-	unsigned i = 0;
72
-	int result = 0;
73
+	volatile unsigned i = 0;
74
+	volatile int result = 0;
75
 
76
 	c = db_con_get();
77
 
78
@@ -2165,7 +2165,7 @@ static int mailboxes_by_regex(uint64_t user_idnr, int only_subscribed, const cha
79
 	char *spattern;
80
 	char *namespace, *username;
81
 	GString *qs = NULL;
82
-	int n_rows = 0;
83
+	volatile int n_rows = 0;
84
 	PreparedStatement_T stmt;
85
 	int prml;
86
 	
87
@@ -2862,7 +2862,7 @@ int db_movemsg(uint64_t mailbox_to, uint64_t mailbox_from)
88
 #define EXPIRE_DAYS 3
89
 int db_mailbox_has_message_id(uint64_t mailbox_idnr, const char *messageid)
90
 {
91
-	int rows = 0;
92
+	volatile int rows = 0;
93
 	Connection_T c; ResultSet_T r; PreparedStatement_T s;
94
 	char expire[DEF_FRAGSIZE], partial[DEF_FRAGSIZE];
95
 	INIT_QUERY;
96
@@ -2909,7 +2909,7 @@ int db_mailbox_has_message_id(uint64_t mailbox_idnr, const char *messageid)
97
 static uint64_t message_get_size(uint64_t message_idnr)
98
 {
99
 	Connection_T c; ResultSet_T r;
100
-	uint64_t size = 0;
101
+	volatile uint64_t size = 0;
102
 
103
 	c = db_con_get();
104
 	TRY
105
@@ -3443,8 +3443,8 @@ int db_usermap_resolve(ClientBase_T *ci, const char *username, char *real_userna
106
 {
107
 	char clientsock[DM_SOCKADDR_LEN];
108
 	const char *userid = NULL, *sockok = NULL, *sockno = NULL, *login = NULL;
109
-	unsigned row = 0;
110
-	int result = TRUE;
111
+	volatile unsigned row = 0;
112
+	volatile int result = TRUE;
113
 	int score, bestscore = -1;
114
 	char *bestlogin = NULL, *bestuserid = NULL;
115
 	Connection_T c; ResultSet_T r; PreparedStatement_T s;
116
@@ -3653,7 +3653,7 @@ int db_user_validate(ClientBase_T *ci, const char *pwfield, uint64_t *user_idnr,
117
 {
118
 	int is_validated = 0;
119
 	char salt[13], cryptres[35];
120
-	int t = FALSE;
121
+	volatile int t = FALSE;
122
 	char dbpass[COLUMN_WIDTH+1];
123
        	char encode[COLUMN_WIDTH+1];
124
 	char hashstr[FIELDSIZE];
125
diff --git ./src/dm_mailbox.c ./src/dm_mailbox.c
126
index 3558b8e..6f4b99c 100644
127
--- ./src/dm_mailbox.c
128
+++ ./src/dm_mailbox.c
129
@@ -181,7 +181,7 @@ static int _mimeparts_dump(DbmailMailbox *self, GMimeStream *ostream)
130
 	uint64_t msgid, physid, *id;
131
 	DbmailMessage *m;
132
 	GTree *uids;
133
-	int count = 0;
134
+	volatile int count = 0;
135
 	PreparedStatement_T stmt;
136
 	Connection_T c; 
137
 	ResultSet_T r;
138
@@ -475,7 +475,7 @@ char * dbmail_mailbox_sorted_as_string(DbmailMailbox *self)
139
 	uint64_t *msn;
140
 
141
 	l = g_list_first(self->sorted);
142
-	if (! g_list_length(l)>0)
143
+	if (! (g_list_length(l) > 0))
144
 		return s;
145
 
146
 	t = g_string_new("");
147
@@ -1224,7 +1224,7 @@ static GTree * mailbox_search(DbmailMailbox *self, search_key *s)
148
 	char partial[DEF_FRAGSIZE];
149
 	Connection_T c; ResultSet_T r; PreparedStatement_T st;
150
 	GTree *ids;
151
-	char *inset = NULL;
152
+	volatile char *inset = NULL;
153
 	
154
 	GString *t;
155
 	String_T q;
156
diff --git ./src/dm_mailboxstate.c ./src/dm_mailboxstate.c
157
index 2ef3fd3..723689a 100644
158
--- ./src/dm_mailboxstate.c
159
+++ ./src/dm_mailboxstate.c
160
@@ -977,7 +977,7 @@ int MailboxState_hasPermission(T M, uint64_t userid, const char *right_flag)
161
 	if (! owner_id) {
162
 		result = db_get_mailbox_owner(mboxid, &owner_id);
163
 		MailboxState_setOwner(M, owner_id);
164
-		if (! result > 0)
165
+		if (! (result > 0))
166
 			return result;
167
 	}
168
 
169
@@ -1116,7 +1116,7 @@ int MailboxState_build_recent(T M)
170
 	return 0;
171
 }
172
 
173
-static long long int _update_recent(GList *slices, uint64_t seq)
174
+static long long int _update_recent(volatile GList *slices, uint64_t seq)
175
 {
176
 	INIT_QUERY;
177
 	Connection_T c;
178
diff --git ./src/dm_message.c ./src/dm_message.c
179
index 066634a..9d30d52 100644
180
--- ./src/dm_message.c
181
+++ ./src/dm_message.c
182
@@ -361,11 +361,11 @@ static DbmailMessage * _mime_retrieve(DbmailMessage *self)
183
        	ResultSet_T r;
184
 	char internal_date[SQL_INTERNALDATE_LEN];
185
 	GMimeContentType *mimetype = NULL;
186
-	int prevdepth, depth = 0, row = 0;
187
+	volatile int prevdepth, depth = 0, row = 0;
188
 	volatile int t = FALSE;
189
-	gboolean got_boundary = FALSE, prev_boundary = FALSE, is_header = TRUE, prev_header, finalized=FALSE;
190
-	gboolean prev_is_message = FALSE, is_message = FALSE;
191
-	String_T m = NULL, n = NULL;
192
+	volatile gboolean got_boundary = FALSE, prev_boundary = FALSE, is_header = TRUE, prev_header, finalized=FALSE;
193
+	volatile gboolean prev_is_message = FALSE, is_message = FALSE;
194
+	volatile String_T m = NULL, n = NULL;
195
 	const void *blob;
196
 	Field_T frag;
197
 
198
@@ -530,7 +530,7 @@ static gboolean store_mime_multipart(GMimeObject *object, DbmailMessage *m, cons
199
 {
200
 	const char *boundary;
201
 	const char *preface = NULL, *postface = NULL;
202
-	int n, i, c;
203
+	int n = 0, i, c;
204
 
205
 	g_return_val_if_fail(GMIME_IS_OBJECT(object), TRUE);
206
 
207
@@ -1977,7 +1977,7 @@ DbmailMessage * dbmail_message_construct(DbmailMessage *self,
208
 
209
 static int get_mailbox_from_filters(DbmailMessage *message, uint64_t useridnr, const char *mailbox, char *into, size_t into_n)
210
 {
211
-	int t = FALSE;
212
+	volatile int t = FALSE;
213
 	uint64_t anyone = 0;
214
 	PreparedStatement_T stmt;
215
 	Connection_T c;
216
diff --git ./src/dm_misc.c ./src/dm_misc.c
217
index e6ca9a0..1294930 100644
218
--- ./src/dm_misc.c
219
+++ ./src/dm_misc.c
220
@@ -1029,7 +1029,7 @@ int g_tree_merge(GTree *a, GTree *b, int condition)
221
 
222
 			type=g_strdup("AND");
223
 
224
-			if (! g_tree_nnodes(a) > 0)
225
+			if (! (g_tree_nnodes(a) > 0))
226
 				break;
227
 
228
 			/* delete from A all keys not in B */
229
@@ -1053,7 +1053,7 @@ int g_tree_merge(GTree *a, GTree *b, int condition)
230
 		case IST_SUBSEARCH_OR:
231
 			type=g_strdup("OR");
232
 			
233
-			if (! g_tree_nnodes(b) > 0)
234
+			if (! (g_tree_nnodes(b) > 0))
235
 				break;
236
 
237
 			merger->tree = a;
238
@@ -1081,7 +1081,7 @@ int g_tree_merge(GTree *a, GTree *b, int condition)
239
 		case IST_SUBSEARCH_NOT:
240
 			type=g_strdup("NOT");
241
 
242
-			if (! g_tree_nnodes(b) > 0)
243
+			if (! (g_tree_nnodes(b) > 0))
244
 				break;
245
 			
246
 			keys = g_tree_keys(b);
247
diff --git ./src/dm_sievescript.c ./src/dm_sievescript.c
248
index e163413..80f333d 100644
249
--- ./src/dm_sievescript.c
250
+++ ./src/dm_sievescript.c
251
@@ -132,7 +132,7 @@ int dm_sievescript_list(uint64_t user_idnr, GList **scriptlist)
252
 
253
 int dm_sievescript_rename(uint64_t user_idnr, char *scriptname, char *newname)
254
 {
255
-	int active = 0;
256
+	volatile int active = 0;
257
 	Connection_T c; ResultSet_T r; PreparedStatement_T s; volatile int t = FALSE;
258
 	assert(scriptname);
259
 
260
diff --git ./src/maintenance.c ./src/maintenance.c
261
index 2e46453..b4a020b 100644
262
--- ./src/maintenance.c
263
+++ ./src/maintenance.c
264
@@ -1012,7 +1012,7 @@ int do_migrate(int migrate_limit)
265
 {
266
 	Connection_T c; ResultSet_T r;
267
 	int id = 0;
268
-	int count = 0;
269
+	volatile int count = 0;
270
 	DbmailMessage *m;
271
 	
272
 	qprintf ("Migrate legacy 2.2.x messageblks to mimeparts...\n");
273
diff --git ./src/modules/authsql.c ./src/modules/authsql.c
274
index 49e1dc9..8e4829e 100644
275
--- ./src/modules/authsql.c
276
+++ ./src/modules/authsql.c
277
@@ -97,7 +97,7 @@ int auth_getclientid(uint64_t user_idnr, uint64_t * client_idnr)
278
 {
279
 	assert(client_idnr != NULL);
280
 	*client_idnr = 0;
281
-	C c; R r; int t = TRUE;
282
+	C c; R r; volatile int t = TRUE;
283
 
284
 	c = db_con_get();
285
 	TRY
286
@@ -118,7 +118,7 @@ int auth_getmaxmailsize(uint64_t user_idnr, uint64_t * maxmail_size)
287
 {
288
 	assert(maxmail_size != NULL);
289
 	*maxmail_size = 0;
290
-	C c; R r; int t = TRUE;
291
+	C c; R r; volatile int t = TRUE;
292
 	
293
 	c = db_con_get();
294
 	TRY
295
@@ -361,7 +361,7 @@ uint64_t auth_md5_validate(ClientBase_T *ci UNUSED, char *username,
296
 	uint64_t user_idnr = 0;
297
 	const char *dbpass;
298
 	C c; R r;
299
-	int t = FALSE;
300
+	volatile int t = FALSE;
301
 
302
 	/* lookup the user_idnr */
303
 	if (! auth_user_exists(username, &user_idnr))
304
@@ -430,7 +430,7 @@ char *auth_get_userid(uint64_t user_idnr)
305
 
306
 int auth_check_userid(uint64_t user_idnr)
307
 {
308
-	C c; R r; gboolean t = TRUE;
309
+	C c; R r; volatile gboolean t = TRUE;
310
 
311
 	c = db_con_get();
312
 	TRY
313
@@ -570,7 +570,7 @@ int auth_addalias_ext(const char *alias,
314
 
315
 int auth_removealias(uint64_t user_idnr, const char *alias)
316
 {
317
-	C c; S s; gboolean t = FALSE;
318
+	C c; S s; volatile gboolean t = FALSE;
319
 	
320
 	c = db_con_get();
321
 	TRY
322
@@ -590,7 +590,7 @@ int auth_removealias(uint64_t user_idnr, const char *alias)
323
 
324
 int auth_removealias_ext(const char *alias, const char *deliver_to)
325
 {
326
-	C c; S s; gboolean t = FALSE;
327
+	C c; S s; volatile gboolean t = FALSE;
328
 
329
 	c = db_con_get();
330
 	TRY
331
diff --git ./src/pop3.c ./src/pop3.c
332
index d03f71a..b7106d3 100644
333
--- ./src/pop3.c
334
+++ ./src/pop3.c
335
@@ -99,7 +99,7 @@ static int db_createsession(uint64_t user_idnr, ClientSession_T * session)
336
 {
337
 	Connection_T c; ResultSet_T r; volatile int t = DM_SUCCESS;
338
 	struct message *tmpmessage;
339
-	int message_counter = 0;
340
+	volatile int message_counter = 0;
341
 	const char *query_result;
342
 	uint64_t mailbox_idnr;
343
 	INIT_QUERY;
344
-- 
345
2.7.4 (Apple Git-66)
346
(-)dbmail/files/patch-0003-Fix-IMAP-mailbox-maintanence (+81 lines)
Line 0 Link Here
1
From f2d27f8727ae4159d356d63c1af6ac1a60b1261a Mon Sep 17 00:00:00 2001
2
From: Pavlo Lavrenenko <Pavlo.Lavrenenko@portaone.com>
3
Date: Thu, 21 May 2015 11:42:56 +0300
4
Subject: [PATCH 3/7] Fix IMAP mailbox maintanence
5
6
Update message's mailbox id in a separate explicit transaction to prevent
7
SQLException: ORA-01453 error on the next db_begin_transaction() call
8
(see db_mailbox_seq_update() next to 'UPDATE dbmail_messages SET mailbox_idnr'
9
query).
10
---
11
 src/dm_db.c       | 6 ++++++
12
 src/dm_db.h       | 1 +
13
 src/maintenance.c | 8 ++------
14
 3 files changed, 9 insertions(+), 6 deletions(-)
15
16
diff --git ./src/dm_db.c ./src/dm_db.c
17
index feb0b34..313b33f 100644
18
--- ./src/dm_db.c
19
+++ ./src/dm_db.c
20
@@ -4290,6 +4290,12 @@ void db_message_set_seq(uint64_t message_id, uint64_t seq)
21
 	END_TRY;
22
 }
23
 
24
+int db_move_message(uint64_t message_id, uint64_t mailbox_id)
25
+{
26
+	return db_update("UPDATE %smessages SET mailbox_idnr = %" PRIu64 " WHERE message_idnr = %" PRIu64 "",
27
+		DBPFX, mailbox_id, message_id);
28
+}
29
+
30
 int db_rehash_store(void)
31
 {
32
 	GList *ids = NULL;
33
diff --git ./src/dm_db.h ./src/dm_db.h
34
index 57aa256..84595d2 100644
35
--- ./src/dm_db.h
36
+++ ./src/dm_db.h
37
@@ -777,6 +777,7 @@ char * db_returning(const char *s);
38
 
39
 uint64_t db_mailbox_seq_update(uint64_t mailbox_id, uint64_t message_id);
40
 void db_message_set_seq(uint64_t message_id, uint64_t seq);
41
+int db_move_message(uint64_t message_id, uint64_t mailbox_id);
42
 
43
 int db_rehash_store(void);
44
 
45
diff --git ./src/maintenance.c ./src/maintenance.c
46
index b4a020b..24b818c 100644
47
--- ./src/maintenance.c
48
+++ ./src/maintenance.c
49
@@ -1184,7 +1184,7 @@ int do_erase_old(int days, char * mbtrash_name)
50
 /* Move message to Trash if the message is in INBOX mailbox and date less then passed date. */
51
 int do_move_old (int days, char * mbinbox_name, char * mbtrash_name)
52
 {
53
-	Connection_T c; ResultSet_T r; ResultSet_T r1; PreparedStatement_T s; PreparedStatement_T s1; PreparedStatement_T s2;
54
+	Connection_T c; ResultSet_T r; ResultSet_T r1; PreparedStatement_T s; PreparedStatement_T s1;
55
 	int skip = 1;
56
 	char expire [DEF_FRAGSIZE];
57
         uint64_t mailbox_to;
58
@@ -1200,9 +1200,7 @@ int do_move_old (int days, char * mbinbox_name, char * mbtrash_name)
59
 			      "WHERE mb.name = ? AND msg.status < %d "
60
 			      "AND phys.internal_date < %s", 
61
 			      DBPFX, DBPFX, DBPFX, MESSAGE_STATUS_DELETE, expire);
62
-
63
 	s1 = db_stmt_prepare(c, "SELECT mailbox_idnr FROM %smailboxes WHERE owner_idnr = ? AND name = ?", DBPFX);
64
-	s2 = db_stmt_prepare(c, "UPDATE %smessages SET mailbox_idnr = ? WHERE message_idnr = ?", DBPFX);
65
 
66
 	db_stmt_set_str(s, 1, mbinbox_name);
67
 
68
@@ -1225,9 +1223,7 @@ int do_move_old (int days, char * mbinbox_name, char * mbtrash_name)
69
 			} 
70
 
71
 			if (!skip) {
72
-				db_stmt_set_u64(s2,1,mailbox_to);
73
-				db_stmt_set_u64(s2,2,id);
74
-				db_stmt_exec(s2);
75
+				db_move_message(id, mailbox_to);
76
 				db_mailbox_seq_update(mailbox_to, 0);
77
 				db_mailbox_seq_update(mailbox_from, 0);
78
 			}
79
-- 
80
2.7.4 (Apple Git-66)
81
(-)dbmail/files/patch-0004-prevent-assertion-in-p_string_erase (+41 lines)
Line 0 Link Here
1
From b6f28ffa54e6533fd0d8676248d0c9bc6d4bd859 Mon Sep 17 00:00:00 2001
2
From: Paul J Stevens <p.stevens@lukkien.com>
3
Date: Sun, 10 Jan 2016 20:01:31 +0100
4
Subject: [PATCH 4/7] prevent assertion in p_string_erase
5
6
---
7
 src/dm_imapsession.c | 9 +++++----
8
 1 file changed, 5 insertions(+), 4 deletions(-)
9
10
diff --git ./src/dm_imapsession.c ./src/dm_imapsession.c
11
index dbf1834..67eae60 100644
12
--- ./src/dm_imapsession.c
13
+++ ./src/dm_imapsession.c
14
@@ -870,19 +870,20 @@ static void _imap_send_part(ImapSession *self, GMimeObject *part, body_fetch *bo
15
 	} else {
16
 		char *tmp = imap_get_logical_part(part,type);
17
 		String_T str = p_string_new(self->pool, tmp);
18
+		size_t len = p_string_len(str);
19
 		g_free(tmp);
20
 
21
-		if (p_string_len(str) < 1) {
22
+		if (len < 1) {
23
 			dbmail_imap_session_buff_printf(self, "] NIL");
24
 		} else {
25
 			uint64_t cnt = 0;
26
 			if (bodyfetch->octetcnt > 0) {
27
-				cnt = get_dumpsize(bodyfetch, p_string_len(str));
28
+				cnt = get_dumpsize(bodyfetch, len);
29
 				dbmail_imap_session_buff_printf(self, "]<%" PRIu64 "> {%" PRIu64 "}\r\n", bodyfetch->octetstart, cnt);
30
-				p_string_erase(str,0,bodyfetch->octetstart);
31
+				p_string_erase(str,0,min(bodyfetch->octetstart,len));
32
 				p_string_truncate(str,cnt);
33
 			} else {
34
-				dbmail_imap_session_buff_printf(self, "] {%" PRIu64 "}\r\n", p_string_len(str));
35
+				dbmail_imap_session_buff_printf(self, "] {%" PRIu64 "}\r\n", len);
36
 			}
37
 			dbmail_imap_session_buff_printf(self,"%s", p_string_str(str));
38
 		}
39
-- 
40
2.7.4 (Apple Git-66)
41
(-)dbmail/files/patch-0005-improve-crypt-authentication (+38 lines)
Line 0 Link Here
1
From b4b82aca1dd1c8aece722b8370da02b715e4bb53 Mon Sep 17 00:00:00 2001
2
From: Paul J Stevens <p.stevens@lukkien.com>
3
Date: Wed, 10 Feb 2016 09:14:41 +0100
4
Subject: [PATCH 5/7] improve crypt authentication
5
6
also don't segfault when spasswd is empty
7
---
8
 src/dm_db.c | 7 ++++++-
9
 1 file changed, 6 insertions(+), 1 deletion(-)
10
11
diff --git ./src/dm_db.c ./src/dm_db.c
12
index 313b33f..bfe9601 100644
13
--- ./src/dm_db.c
14
+++ ./src/dm_db.c
15
@@ -3687,6 +3687,10 @@ int db_user_validate(ClientBase_T *ci, const char *pwfield, uint64_t *user_idnr,
16
 		return t;
17
 	
18
 	if (! t) return FALSE;
19
+	if (! strlen(dbpass)) {
20
+		TRACE(TRACE_INFO, "Empty password for [%" PRIu64 "] in [%s]", *user_idnr, pwfield);
21
+	       	return FALSE;
22
+	}
23
 
24
 	if (SMATCH(encode, "")) {
25
 		TRACE(TRACE_DEBUG, "validating using plaintext passwords");
26
@@ -3699,7 +3703,8 @@ int db_user_validate(ClientBase_T *ci, const char *pwfield, uint64_t *user_idnr,
27
 
28
 	if (SMATCH(encode, "crypt")) {
29
 		TRACE(TRACE_DEBUG, "validating using crypt() encryption");
30
-		is_validated = (strcmp((const char *) crypt(password, dbpass), dbpass) == 0) ? 1 : 0;
31
+		strncpy(salt, dbpass, 2);
32
+		is_validated = (strcmp((const char *) crypt(password, salt), dbpass) == 0) ? 1 : 0;
33
 	} else if (SMATCH(encode, "md5")) {
34
 		/* get password */
35
 		if (strncmp(dbpass, "$1$", 3)) { // no match
36
-- 
37
2.7.4 (Apple Git-66)
38
(-)dbmail/files/patch-0006-simplify-log_query_time-duration-logic (+119 lines)
Line 0 Link Here
1
From f5b73b342b4a6cae1bb15340e5da7330e29319c1 Mon Sep 17 00:00:00 2001
2
From: Paul J Stevens <p.stevens@lukkien.com>
3
Date: Sat, 5 Mar 2016 18:43:12 +0100
4
Subject: [PATCH 6/7] simplify log_query_time duration logic
5
6
---
7
 src/dm_db.c            | 16 ++++++++--------
8
 src/dm_misc.c          | 12 ++++++++++++
9
 src/dm_misc.h          |  2 ++
10
 test/check_dbmail_db.c | 27 +++++++++++++++++++++++++++
11
 4 files changed, 49 insertions(+), 8 deletions(-)
12
13
diff --git ./src/dm_db.c ./src/dm_db.c
14
index bfe9601..429d0ae 100644
15
--- ./src/dm_db.c
16
+++ ./src/dm_db.c
17
@@ -354,14 +354,14 @@ void db_con_clear(Connection_T c)
18
 
19
 void log_query_time(char *query, struct timeval before, struct timeval after)
20
 {
21
-	double elapsed = ((double)after.tv_sec + ((double)after.tv_usec / 1000000)) - ((double)before.tv_sec + ((double)before.tv_usec / 1000000));
22
-	TRACE(TRACE_DATABASE, "last query took [%.3f] seconds", elapsed);
23
-	if (elapsed > (double)db_params.query_time_warning)
24
-		TRACE(TRACE_WARNING, "slow query [%s] took [%.3f] seconds", query, elapsed);
25
-	else if (elapsed > (double)db_params.query_time_notice)
26
-		TRACE(TRACE_NOTICE, "slow query [%s] took [%.3f] seconds", query, elapsed);
27
-	else if (elapsed > (double)db_params.query_time_info)
28
-		TRACE(TRACE_INFO, "slow query [%s] took [%.3f] seconds", query, elapsed);
29
+	unsigned int elapsed = (unsigned int)diff_time(before, after);
30
+	TRACE(TRACE_DATABASE, "last query took [%d] seconds", elapsed);
31
+	if (elapsed > db_params.query_time_warning)
32
+		TRACE(TRACE_WARNING, "slow query [%s] took [%d] seconds", query, elapsed);
33
+	else if (elapsed > db_params.query_time_notice)
34
+		TRACE(TRACE_NOTICE, "slow query [%s] took [%d] seconds", query, elapsed);
35
+	else if (elapsed > db_params.query_time_info)
36
+		TRACE(TRACE_INFO, "slow query [%s] took [%d] seconds", query, elapsed);
37
 	return;
38
 }
39
 
40
diff --git ./src/dm_misc.c ./src/dm_misc.c
41
index 1294930..e27ef34 100644
42
--- ./src/dm_misc.c
43
+++ ./src/dm_misc.c
44
@@ -2422,4 +2422,16 @@ void uint64_free(void *data)
45
 	mempool_push(small_pool, data, sizeof(uint64_t));
46
 }
47
 
48
+/*
49
+ * calculate the difference between two timeval values
50
+ * as number of seconds, using default rounding
51
+ */
52
+int diff_time(struct timeval before, struct timeval after)
53
+{
54
+	int tbefore = before.tv_sec * 1000000 + before.tv_usec;
55
+	int tafter = after.tv_sec * 1000000 + after.tv_usec;
56
+	int tdiff = tafter - tbefore;
57
+	return (int)rint((double)tdiff/1000000);
58
+}
59
+
60
 
61
diff --git ./src/dm_misc.h ./src/dm_misc.h
62
index a5dd04f..9660dfa 100644
63
--- ./src/dm_misc.h
64
+++ ./src/dm_misc.h
65
@@ -178,4 +178,6 @@ gchar * get_crlf_encoded_opt(const gchar *string, int dots);
66
 void strip_crlf(char *buffer);
67
 void uint64_free(void *);
68
 
69
+int diff_time(struct timeval before, struct timeval after);
70
+
71
 #endif
72
diff --git a/test/check_dbmail_db.c b/test/check_dbmail_db.c
73
index 47c34be..e6cb170 100644
74
--- a/test/check_dbmail_db.c
75
+++ b/test/check_dbmail_db.c
76
@@ -414,6 +414,32 @@ START_TEST(test_db_get_sql)
77
 }
78
 END_TEST
79
 
80
+START_TEST(test_diff_time)
81
+{
82
+	struct timeval before, after;
83
+	int diff;
84
+
85
+	before.tv_sec = 1; before.tv_usec = 0;
86
+	after.tv_sec = 2; after.tv_usec = 0;
87
+	diff = diff_time(before, after);
88
+	fail_unless(diff == 1);
89
+
90
+	before.tv_sec = 1; before.tv_usec = 1000000 - 1;
91
+	after.tv_sec = 2; after.tv_usec = 0;
92
+	diff = diff_time(before, after);
93
+	fail_unless(diff == 0);
94
+	
95
+	before.tv_sec = 1; before.tv_usec = 500001;
96
+	after.tv_sec = 2; after.tv_usec = 0;
97
+	diff = diff_time(before, after);
98
+	fail_unless(diff == 0);
99
+
100
+	before.tv_sec = 1; before.tv_usec = 499999;
101
+	after.tv_sec = 2; after.tv_usec = 0;
102
+	diff = diff_time(before, after);
103
+	fail_unless(diff == 1);
104
+}
105
+END_TEST
106
 
107
 Suite *dbmail_db_suite(void)
108
 {
109
@@ -435,6 +461,7 @@ Suite *dbmail_db_suite(void)
110
 	tcase_add_test(tc_db, test_mailbox_match_new);
111
 	tcase_add_test(tc_db, test_db_findmailbox_by_regex);
112
 	tcase_add_test(tc_db, test_db_get_sql);
113
+	tcase_add_test(tc_db, test_diff_time);
114
 
115
 	return s;
116
 }
117
-- 
118
2.7.4 (Apple Git-66)
119
(-)dbmail/files/patch-0007-Disconnect-IMAP-clients-if-only-few-free-FDs-left (+148 lines)
Line 0 Link Here
1
From 6b7eccfec4f76b7d9d1f865caf741ff3214b5964 Mon Sep 17 00:00:00 2001
2
From: Pavlo Lavrenenko <santa.ssh@gmail.com>
3
Date: Thu, 2 Jun 2016 08:18:51 +0300
4
Subject: [PATCH 7/7] Disconnect IMAP clients if only few free FDs left (#37)
5
6
After network connection to DB server goes down the processing of IMAP session
7
stalls: DB connection pool becomes exhausted as active connections do not
8
close till TCP timeout kicks in (true at least for Oracle). While DBMail still
9
accepts incoming connections it quickly reaches the RLIMIT_NOFILE and becomes
10
unresponsive. Send BYE response if the number of opened FDs reaches the
11
RLIMIT_NOFILE value.
12
---
13
 src/dbmail.h.in |  5 +++++
14
 src/dm_misc.c   | 20 ++++++++++++++++++++
15
 src/dm_misc.h   |  8 ++++++++
16
 src/imap4.c     | 23 ++++++++++++++++++++++-
17
 4 files changed, 55 insertions(+), 1 deletion(-)
18
19
diff --git ./src/dbmail.h.in ./src/dbmail.h.in
20
index d826dc3..17215ef 100644
21
--- ./src/dbmail.h.in
22
+++ ./src/dbmail.h.in
23
@@ -69,12 +69,14 @@
24
 #include <string.h>
25
 #include <strings.h>
26
 #include <sysexits.h>
27
+#include <dirent.h>
28
 #include <sys/types.h>
29
 #include <sys/stat.h>
30
 #include <sys/mman.h>
31
 #include <sys/socket.h>
32
 #include <sys/un.h>
33
 #include <sys/time.h>
34
+#include <sys/resource.h>
35
 #include <sys/wait.h>
36
 #include <sys/ipc.h>
37
 #include <sys/shm.h>
38
@@ -252,6 +254,9 @@
39
 /* input reading linelimit */
40
 #define MAX_LINESIZE (64*1024)
41
 
42
+/* minumun number of free file descriptors required to run the daemon */
43
+#define FREE_DF_THRESHOLD 16
44
+
45
 /* string length for query */
46
 #define DEF_QUERYSIZE (32*1024)
47
 #define DEF_FRAGSIZE 256
48
diff --git ./src/dm_misc.c ./src/dm_misc.c
49
index e27ef34..e795de1 100644
50
--- ./src/dm_misc.c
51
+++ ./src/dm_misc.c
52
@@ -104,6 +104,26 @@ int drop_privileges(char *newuser, char *newgroup)
53
 	return 0;
54
 }
55
 
56
+int get_opened_fd_count(void)
57
+{
58
+	DIR* dir = NULL;
59
+	struct dirent* entry = NULL;
60
+	char buf[32];
61
+	int fd_count = 0;
62
+
63
+	snprintf(buf, 32, "/proc/%i/fd/", getpid());
64
+
65
+	dir = opendir(buf);
66
+	if (dir == NULL)
67
+		return -1;
68
+
69
+	while ((entry = readdir(dir)) != NULL)
70
+		fd_count++;
71
+	closedir(dir);
72
+
73
+	return fd_count - 2; /* exclude '.' and '..' entries */
74
+}
75
+
76
 void create_unique_id(char *target, uint64_t message_idnr)
77
 {
78
 	char md5_str[FIELDSIZE];
79
diff --git ./src/dm_misc.h ./src/dm_misc.h
80
index 9660dfa..b6cf24f 100644
81
--- ./src/dm_misc.h
82
+++ ./src/dm_misc.h
83
@@ -45,6 +45,14 @@ void g_string_maybe_shrink(GString *s);
84
 int drop_privileges(char *newuser, char *newgroup);
85
 
86
 /**
87
+   \brief get the number of opened files (requires /proc mounted)
88
+   \return
89
+        - -1 on error
90
+        - number of opened files
91
+*/
92
+int get_opened_fd_count(void);
93
+
94
+/**
95
  * \brief create a unique id for a message (used for pop, stored per message)
96
  * \param target target string. Length should be UID_SIZE 
97
  * \param message_idnr message_idnr of message
98
diff --git ./src/imap4.c ./src/imap4.c
99
index 0532f2e..e523edc 100644
100
--- ./src/imap4.c
101
+++ ./src/imap4.c
102
@@ -351,6 +351,12 @@ static void send_greeting(ImapSession *session)
103
 	dbmail_imap_session_set_state(session, CLIENTSTATE_NON_AUTHENTICATED);
104
 }
105
 
106
+static void disconnect_user(ImapSession *session)
107
+{
108
+	imap_session_printf(session, "* BYE [Service unavailable.]\r\n");
109
+	imap_handle_abort(session);
110
+}
111
+
112
 /*
113
  * the default timeout callback */
114
 
115
@@ -601,6 +607,8 @@ int imap_handle_connection(client_sock *c)
116
 {
117
 	ImapSession *session;
118
 	ClientBase_T *ci;
119
+	struct rlimit fd_limit;
120
+	int fd_count;
121
 
122
 	ci = client_init(c);
123
 
124
@@ -617,7 +625,20 @@ int imap_handle_connection(client_sock *c)
125
 		Capa_remove(session->capa, "LOGINDISABLED");
126
 	}
127
 
128
-	send_greeting(session);
129
+	fd_count = get_opened_fd_count();
130
+	if (fd_count < 0 || getrlimit(RLIMIT_NPROC, &fd_limit) < 0) {
131
+		TRACE(TRACE_ERR,
132
+			"[%p] failed to retrieve fd limits, dropping client connection",
133
+			session);
134
+		disconnect_user(session);
135
+	} else if (fd_limit.rlim_cur - fd_count < FREE_DF_THRESHOLD) {
136
+		TRACE(TRACE_WARNING,
137
+			"[%p] fd count [%d], fd limit [%d], fd threshold [%d]: dropping client connection",
138
+			session, fd_count, fd_limit.rlim_cur, FREE_DF_THRESHOLD);
139
+		disconnect_user(session);
140
+	} else {
141
+		send_greeting(session);
142
+	}
143
 
144
 	reset_callbacks(session);
145
 
146
-- 
147
2.7.4 (Apple Git-66)
148

Return to bug 210274