mail/dbmail: adopt latest fixes from git:
- login_disabled option before starttls for pop3 - fix compiler warnings for GCC5 - Fix IMAP mailbox maintanence - prevent assertion in p_string_erase - improve crypt authentication, also don't segfault when spasswd is empty - simplify log_query_time duration logic - Disconnect IMAP clients if only few free FDs left - Add primary key constraint to dbmail_authlog - Rework temporary connection failures - Give sensible default for retry 120s - Add retries for binding and searching - Bump search timeout to 60s - Increase ldap timeout to 600s 10 mins - Refactor deprecated functions - Get timeout from config - Remove redundant event_assign - Remove deprecated non functioning g_mem_profile - Add definition for authldap_free - Revert inadvertent event_assign removal - Reduce failed LDAP connection for search to error - Update LDAP to non deprecated search - Clear the ldap connection - Update ldap deprecated unbind - Fix typo - Update to ldap_unbind_ext_s and remove redundant sigaction - Rebalance commit rollback - Ensure mailbox2dbmail is using Python 2 - Tidy mailbox2dbmail man page - Update description of pid file location in server man page - Boundaries fixups ordering of parts do not add newline on - Prepend headers during delivery - Allow for systems that don't use proc PR: 210274 Submitted by: fluffy
This commit is contained in:
parent
2c81169cb0
commit
9eff14e488
Notes:
svn2git
2021-03-31 03:12:20 +00:00
svn path=/head/; revision=434749
@ -32,11 +32,11 @@ SIEVE_DESC= Sieve mail sorting language support
|
||||
OPTIONS_SUB= yes
|
||||
|
||||
INSTALL_TARGET= install-strip
|
||||
USE_AUTOTOOLS= autoheader autoconf
|
||||
USE_LDCONFIG= ${PREFIX}/lib/dbmail
|
||||
USE_RC_SUBR= dbmail-pop3d dbmail-lmtpd dbmail-imapd dbmail-timsieved
|
||||
USE_OPENSSL= yes
|
||||
USES= gmake libtool pkgconfig shebangfix tar:bzip2
|
||||
USES= autoreconf gmake libtool pkgconfig shebangfix ssl tar:bzip2
|
||||
GNU_CONFIGURE= yes
|
||||
|
||||
SHEBANG_FILES= man/fixsp.pl
|
||||
|
||||
CPPFLAGS+= -I${LOCALBASE}/include
|
||||
|
@ -0,0 +1,77 @@
|
||||
From ec74380db22e3d92641c972aa53823d02a56a5ad Mon Sep 17 00:00:00 2001
|
||||
From: Paul J Stevens <p.stevens@lukkien.com>
|
||||
Date: Wed, 18 Feb 2015 21:26:38 +0100
|
||||
Subject: [PATCH 01/33] login_disabled option before starttls for pop3
|
||||
|
||||
---
|
||||
dbmail.conf | 5 +++++
|
||||
src/pop3.c | 16 ++++++++++++++++
|
||||
2 files changed, 21 insertions(+)
|
||||
|
||||
diff --git dbmail.conf dbmail.conf
|
||||
index 946e064..bf16d16 100644
|
||||
--- dbmail.conf
|
||||
+++ dbmail.conf
|
||||
@@ -227,6 +227,11 @@ port = 110
|
||||
# You can set an alternate banner to display when connecting to the service
|
||||
# banner = DBMAIL pop3 server ready to rock
|
||||
|
||||
+# If TLS is enabled, login before starttls is normally
|
||||
+# allowed. Use login_disabled=yes to change this
|
||||
+#
|
||||
+# login_disabled = no
|
||||
+
|
||||
#
|
||||
# If yes, allows SMTP access from the host IP connecting by POP3.
|
||||
# This requires addition configuration of your MTA
|
||||
diff --git src/pop3.c src/pop3.c
|
||||
index cc0863b..d03f71a 100644
|
||||
--- src/pop3.c
|
||||
+++ src/pop3.c
|
||||
@@ -366,6 +366,7 @@ int pop3(ClientSession_T *session, const char *buffer)
|
||||
int found = 0;
|
||||
//int indx = 0;
|
||||
int validate_result;
|
||||
+ bool login_disabled = FALSE;
|
||||
uint64_t result, top_lines, top_messageid, user_idnr;
|
||||
unsigned char *md5_apop_he;
|
||||
struct message *msg;
|
||||
@@ -431,6 +432,15 @@ int pop3(ClientSession_T *session, const char *buffer)
|
||||
}
|
||||
}
|
||||
|
||||
+ if (state == CLIENTSTATE_INITIAL_CONNECT) {
|
||||
+ if (server_conf->ssl) {
|
||||
+ Field_T val;
|
||||
+ GETCONFIGVALUE("login_disabled", "POP", val);
|
||||
+ if (SMATCH(val, "yes"))
|
||||
+ login_disabled = TRUE;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
switch (cmdtype) {
|
||||
|
||||
case POP3_QUIT:
|
||||
@@ -459,6 +469,9 @@ int pop3(ClientSession_T *session, const char *buffer)
|
||||
if (state != CLIENTSTATE_INITIAL_CONNECT)
|
||||
return pop3_error(session, "-ERR wrong command mode\r\n");
|
||||
|
||||
+ if (login_disabled && ! session->ci->sock->ssl_state)
|
||||
+ return pop3_error(session, "-ERR try STLS\r\n");
|
||||
+
|
||||
if (session->username != NULL) {
|
||||
/* reset username */
|
||||
g_free(session->username);
|
||||
@@ -478,6 +491,9 @@ int pop3(ClientSession_T *session, const char *buffer)
|
||||
if (state != CLIENTSTATE_INITIAL_CONNECT)
|
||||
return pop3_error(session, "-ERR wrong command mode\r\n");
|
||||
|
||||
+ if (login_disabled && ! session->ci->sock->ssl_state)
|
||||
+ return pop3_error(session, "-ERR try STLS\r\n");
|
||||
+
|
||||
if (session->password != NULL) {
|
||||
g_free(session->password);
|
||||
session->password = NULL;
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
346
mail/dbmail/files/patch-0002-fix-compiler-warnings-for-GCC5
Normal file
346
mail/dbmail/files/patch-0002-fix-compiler-warnings-for-GCC5
Normal file
@ -0,0 +1,346 @@
|
||||
From c3badbdb282a5ffb411ee2b5062ed345896fb149 Mon Sep 17 00:00:00 2001
|
||||
From: Paul J Stevens <p.stevens@lukkien.com>
|
||||
Date: Fri, 8 Jan 2016 18:42:24 +0100
|
||||
Subject: [PATCH 02/33] fix compiler warnings for GCC5
|
||||
|
||||
---
|
||||
src/dm_db.c | 26 +++++++++++++-------------
|
||||
src/dm_mailbox.c | 6 +++---
|
||||
src/dm_mailboxstate.c | 4 ++--
|
||||
src/dm_message.c | 12 ++++++------
|
||||
src/dm_misc.c | 6 +++---
|
||||
src/dm_sievescript.c | 2 +-
|
||||
src/maintenance.c | 2 +-
|
||||
src/modules/authsql.c | 12 ++++++------
|
||||
src/pop3.c | 2 +-
|
||||
9 files changed, 36 insertions(+), 36 deletions(-)
|
||||
|
||||
diff --git src/dm_db.c src/dm_db.c
|
||||
index 8d72214..feb0b34 100644
|
||||
--- src/dm_db.c
|
||||
+++ src/dm_db.c
|
||||
@@ -1047,7 +1047,7 @@ int db_check_version(void)
|
||||
/* test existence of usermap table */
|
||||
int db_use_usermap(void)
|
||||
{
|
||||
- int use_usermap = TRUE;
|
||||
+ volatile int use_usermap = TRUE;
|
||||
Connection_T c = db_con_get();
|
||||
TRY
|
||||
if (! db_query(c, db_get_sql(SQL_TABLE_EXISTS), DBPFX, "usermap"))
|
||||
@@ -1214,7 +1214,7 @@ static int dm_quota_user_validate(uint64_t user_idnr, uint64_t msg_size)
|
||||
int dm_quota_rebuild_user(uint64_t user_idnr)
|
||||
{
|
||||
Connection_T c; ResultSet_T r; volatile int t = DM_SUCCESS;
|
||||
- uint64_t quotum = 0;
|
||||
+ volatile uint64_t quotum = 0;
|
||||
|
||||
c = db_con_get();
|
||||
TRY
|
||||
@@ -1257,7 +1257,7 @@ int dm_quota_rebuild()
|
||||
|
||||
GList *quota = NULL;
|
||||
struct used_quota *q;
|
||||
- int i = 0;
|
||||
+ volatile int i = 0;
|
||||
int result;
|
||||
|
||||
c = db_con_get();
|
||||
@@ -1375,7 +1375,7 @@ int db_get_reply_body(uint64_t user_idnr, char **reply_body)
|
||||
uint64_t db_get_useridnr(uint64_t message_idnr)
|
||||
{
|
||||
Connection_T c; ResultSet_T r;
|
||||
- uint64_t user_idnr = 0;
|
||||
+ volatile uint64_t user_idnr = 0;
|
||||
c = db_con_get();
|
||||
TRY
|
||||
r = db_query(c, "SELECT %smailboxes.owner_idnr FROM %smailboxes, %smessages "
|
||||
@@ -1397,7 +1397,7 @@ uint64_t db_get_useridnr(uint64_t message_idnr)
|
||||
int db_log_ip(const char *ip)
|
||||
{
|
||||
Connection_T c; ResultSet_T r; PreparedStatement_T s; volatile int t = DM_SUCCESS;
|
||||
- uint64_t id = 0;
|
||||
+ volatile uint64_t id = 0;
|
||||
|
||||
c = db_con_get();
|
||||
TRY
|
||||
@@ -1444,8 +1444,8 @@ int db_empty_mailbox(uint64_t user_idnr, int only_empty)
|
||||
Connection_T c; ResultSet_T r; volatile int t = DM_SUCCESS;
|
||||
GList *mboxids = NULL;
|
||||
uint64_t *id;
|
||||
- unsigned i = 0;
|
||||
- int result = 0;
|
||||
+ volatile unsigned i = 0;
|
||||
+ volatile int result = 0;
|
||||
|
||||
c = db_con_get();
|
||||
|
||||
@@ -2165,7 +2165,7 @@ static int mailboxes_by_regex(uint64_t user_idnr, int only_subscribed, const cha
|
||||
char *spattern;
|
||||
char *namespace, *username;
|
||||
GString *qs = NULL;
|
||||
- int n_rows = 0;
|
||||
+ volatile int n_rows = 0;
|
||||
PreparedStatement_T stmt;
|
||||
int prml;
|
||||
|
||||
@@ -2862,7 +2862,7 @@ int db_movemsg(uint64_t mailbox_to, uint64_t mailbox_from)
|
||||
#define EXPIRE_DAYS 3
|
||||
int db_mailbox_has_message_id(uint64_t mailbox_idnr, const char *messageid)
|
||||
{
|
||||
- int rows = 0;
|
||||
+ volatile int rows = 0;
|
||||
Connection_T c; ResultSet_T r; PreparedStatement_T s;
|
||||
char expire[DEF_FRAGSIZE], partial[DEF_FRAGSIZE];
|
||||
INIT_QUERY;
|
||||
@@ -2909,7 +2909,7 @@ int db_mailbox_has_message_id(uint64_t mailbox_idnr, const char *messageid)
|
||||
static uint64_t message_get_size(uint64_t message_idnr)
|
||||
{
|
||||
Connection_T c; ResultSet_T r;
|
||||
- uint64_t size = 0;
|
||||
+ volatile uint64_t size = 0;
|
||||
|
||||
c = db_con_get();
|
||||
TRY
|
||||
@@ -3443,8 +3443,8 @@ int db_usermap_resolve(ClientBase_T *ci, const char *username, char *real_userna
|
||||
{
|
||||
char clientsock[DM_SOCKADDR_LEN];
|
||||
const char *userid = NULL, *sockok = NULL, *sockno = NULL, *login = NULL;
|
||||
- unsigned row = 0;
|
||||
- int result = TRUE;
|
||||
+ volatile unsigned row = 0;
|
||||
+ volatile int result = TRUE;
|
||||
int score, bestscore = -1;
|
||||
char *bestlogin = NULL, *bestuserid = NULL;
|
||||
Connection_T c; ResultSet_T r; PreparedStatement_T s;
|
||||
@@ -3653,7 +3653,7 @@ int db_user_validate(ClientBase_T *ci, const char *pwfield, uint64_t *user_idnr,
|
||||
{
|
||||
int is_validated = 0;
|
||||
char salt[13], cryptres[35];
|
||||
- int t = FALSE;
|
||||
+ volatile int t = FALSE;
|
||||
char dbpass[COLUMN_WIDTH+1];
|
||||
char encode[COLUMN_WIDTH+1];
|
||||
char hashstr[FIELDSIZE];
|
||||
diff --git src/dm_mailbox.c src/dm_mailbox.c
|
||||
index 3558b8e..6f4b99c 100644
|
||||
--- src/dm_mailbox.c
|
||||
+++ src/dm_mailbox.c
|
||||
@@ -181,7 +181,7 @@ static int _mimeparts_dump(DbmailMailbox *self, GMimeStream *ostream)
|
||||
uint64_t msgid, physid, *id;
|
||||
DbmailMessage *m;
|
||||
GTree *uids;
|
||||
- int count = 0;
|
||||
+ volatile int count = 0;
|
||||
PreparedStatement_T stmt;
|
||||
Connection_T c;
|
||||
ResultSet_T r;
|
||||
@@ -475,7 +475,7 @@ char * dbmail_mailbox_sorted_as_string(DbmailMailbox *self)
|
||||
uint64_t *msn;
|
||||
|
||||
l = g_list_first(self->sorted);
|
||||
- if (! g_list_length(l)>0)
|
||||
+ if (! (g_list_length(l) > 0))
|
||||
return s;
|
||||
|
||||
t = g_string_new("");
|
||||
@@ -1224,7 +1224,7 @@ static GTree * mailbox_search(DbmailMailbox *self, search_key *s)
|
||||
char partial[DEF_FRAGSIZE];
|
||||
Connection_T c; ResultSet_T r; PreparedStatement_T st;
|
||||
GTree *ids;
|
||||
- char *inset = NULL;
|
||||
+ volatile char *inset = NULL;
|
||||
|
||||
GString *t;
|
||||
String_T q;
|
||||
diff --git src/dm_mailboxstate.c src/dm_mailboxstate.c
|
||||
index 2ef3fd3..723689a 100644
|
||||
--- src/dm_mailboxstate.c
|
||||
+++ src/dm_mailboxstate.c
|
||||
@@ -977,7 +977,7 @@ int MailboxState_hasPermission(T M, uint64_t userid, const char *right_flag)
|
||||
if (! owner_id) {
|
||||
result = db_get_mailbox_owner(mboxid, &owner_id);
|
||||
MailboxState_setOwner(M, owner_id);
|
||||
- if (! result > 0)
|
||||
+ if (! (result > 0))
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -1116,7 +1116,7 @@ int MailboxState_build_recent(T M)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static long long int _update_recent(GList *slices, uint64_t seq)
|
||||
+static long long int _update_recent(volatile GList *slices, uint64_t seq)
|
||||
{
|
||||
INIT_QUERY;
|
||||
Connection_T c;
|
||||
diff --git src/dm_message.c src/dm_message.c
|
||||
index 066634a..9d30d52 100644
|
||||
--- src/dm_message.c
|
||||
+++ src/dm_message.c
|
||||
@@ -361,11 +361,11 @@ static DbmailMessage * _mime_retrieve(DbmailMessage *self)
|
||||
ResultSet_T r;
|
||||
char internal_date[SQL_INTERNALDATE_LEN];
|
||||
GMimeContentType *mimetype = NULL;
|
||||
- int prevdepth, depth = 0, row = 0;
|
||||
+ volatile int prevdepth, depth = 0, row = 0;
|
||||
volatile int t = FALSE;
|
||||
- gboolean got_boundary = FALSE, prev_boundary = FALSE, is_header = TRUE, prev_header, finalized=FALSE;
|
||||
- gboolean prev_is_message = FALSE, is_message = FALSE;
|
||||
- String_T m = NULL, n = NULL;
|
||||
+ volatile gboolean got_boundary = FALSE, prev_boundary = FALSE, is_header = TRUE, prev_header, finalized=FALSE;
|
||||
+ volatile gboolean prev_is_message = FALSE, is_message = FALSE;
|
||||
+ volatile String_T m = NULL, n = NULL;
|
||||
const void *blob;
|
||||
Field_T frag;
|
||||
|
||||
@@ -530,7 +530,7 @@ static gboolean store_mime_multipart(GMimeObject *object, DbmailMessage *m, cons
|
||||
{
|
||||
const char *boundary;
|
||||
const char *preface = NULL, *postface = NULL;
|
||||
- int n, i, c;
|
||||
+ int n = 0, i, c;
|
||||
|
||||
g_return_val_if_fail(GMIME_IS_OBJECT(object), TRUE);
|
||||
|
||||
@@ -1977,7 +1977,7 @@ DbmailMessage * dbmail_message_construct(DbmailMessage *self,
|
||||
|
||||
static int get_mailbox_from_filters(DbmailMessage *message, uint64_t useridnr, const char *mailbox, char *into, size_t into_n)
|
||||
{
|
||||
- int t = FALSE;
|
||||
+ volatile int t = FALSE;
|
||||
uint64_t anyone = 0;
|
||||
PreparedStatement_T stmt;
|
||||
Connection_T c;
|
||||
diff --git src/dm_misc.c src/dm_misc.c
|
||||
index e6ca9a0..1294930 100644
|
||||
--- src/dm_misc.c
|
||||
+++ src/dm_misc.c
|
||||
@@ -1029,7 +1029,7 @@ int g_tree_merge(GTree *a, GTree *b, int condition)
|
||||
|
||||
type=g_strdup("AND");
|
||||
|
||||
- if (! g_tree_nnodes(a) > 0)
|
||||
+ if (! (g_tree_nnodes(a) > 0))
|
||||
break;
|
||||
|
||||
/* delete from A all keys not in B */
|
||||
@@ -1053,7 +1053,7 @@ int g_tree_merge(GTree *a, GTree *b, int condition)
|
||||
case IST_SUBSEARCH_OR:
|
||||
type=g_strdup("OR");
|
||||
|
||||
- if (! g_tree_nnodes(b) > 0)
|
||||
+ if (! (g_tree_nnodes(b) > 0))
|
||||
break;
|
||||
|
||||
merger->tree = a;
|
||||
@@ -1081,7 +1081,7 @@ int g_tree_merge(GTree *a, GTree *b, int condition)
|
||||
case IST_SUBSEARCH_NOT:
|
||||
type=g_strdup("NOT");
|
||||
|
||||
- if (! g_tree_nnodes(b) > 0)
|
||||
+ if (! (g_tree_nnodes(b) > 0))
|
||||
break;
|
||||
|
||||
keys = g_tree_keys(b);
|
||||
diff --git src/dm_sievescript.c src/dm_sievescript.c
|
||||
index e163413..80f333d 100644
|
||||
--- src/dm_sievescript.c
|
||||
+++ src/dm_sievescript.c
|
||||
@@ -132,7 +132,7 @@ int dm_sievescript_list(uint64_t user_idnr, GList **scriptlist)
|
||||
|
||||
int dm_sievescript_rename(uint64_t user_idnr, char *scriptname, char *newname)
|
||||
{
|
||||
- int active = 0;
|
||||
+ volatile int active = 0;
|
||||
Connection_T c; ResultSet_T r; PreparedStatement_T s; volatile int t = FALSE;
|
||||
assert(scriptname);
|
||||
|
||||
diff --git src/maintenance.c src/maintenance.c
|
||||
index 2e46453..b4a020b 100644
|
||||
--- src/maintenance.c
|
||||
+++ src/maintenance.c
|
||||
@@ -1012,7 +1012,7 @@ int do_migrate(int migrate_limit)
|
||||
{
|
||||
Connection_T c; ResultSet_T r;
|
||||
int id = 0;
|
||||
- int count = 0;
|
||||
+ volatile int count = 0;
|
||||
DbmailMessage *m;
|
||||
|
||||
qprintf ("Migrate legacy 2.2.x messageblks to mimeparts...\n");
|
||||
diff --git src/modules/authsql.c src/modules/authsql.c
|
||||
index 49e1dc9..8e4829e 100644
|
||||
--- src/modules/authsql.c
|
||||
+++ src/modules/authsql.c
|
||||
@@ -97,7 +97,7 @@ int auth_getclientid(uint64_t user_idnr, uint64_t * client_idnr)
|
||||
{
|
||||
assert(client_idnr != NULL);
|
||||
*client_idnr = 0;
|
||||
- C c; R r; int t = TRUE;
|
||||
+ C c; R r; volatile int t = TRUE;
|
||||
|
||||
c = db_con_get();
|
||||
TRY
|
||||
@@ -118,7 +118,7 @@ int auth_getmaxmailsize(uint64_t user_idnr, uint64_t * maxmail_size)
|
||||
{
|
||||
assert(maxmail_size != NULL);
|
||||
*maxmail_size = 0;
|
||||
- C c; R r; int t = TRUE;
|
||||
+ C c; R r; volatile int t = TRUE;
|
||||
|
||||
c = db_con_get();
|
||||
TRY
|
||||
@@ -361,7 +361,7 @@ uint64_t auth_md5_validate(ClientBase_T *ci UNUSED, char *username,
|
||||
uint64_t user_idnr = 0;
|
||||
const char *dbpass;
|
||||
C c; R r;
|
||||
- int t = FALSE;
|
||||
+ volatile int t = FALSE;
|
||||
|
||||
/* lookup the user_idnr */
|
||||
if (! auth_user_exists(username, &user_idnr))
|
||||
@@ -430,7 +430,7 @@ char *auth_get_userid(uint64_t user_idnr)
|
||||
|
||||
int auth_check_userid(uint64_t user_idnr)
|
||||
{
|
||||
- C c; R r; gboolean t = TRUE;
|
||||
+ C c; R r; volatile gboolean t = TRUE;
|
||||
|
||||
c = db_con_get();
|
||||
TRY
|
||||
@@ -570,7 +570,7 @@ int auth_addalias_ext(const char *alias,
|
||||
|
||||
int auth_removealias(uint64_t user_idnr, const char *alias)
|
||||
{
|
||||
- C c; S s; gboolean t = FALSE;
|
||||
+ C c; S s; volatile gboolean t = FALSE;
|
||||
|
||||
c = db_con_get();
|
||||
TRY
|
||||
@@ -590,7 +590,7 @@ int auth_removealias(uint64_t user_idnr, const char *alias)
|
||||
|
||||
int auth_removealias_ext(const char *alias, const char *deliver_to)
|
||||
{
|
||||
- C c; S s; gboolean t = FALSE;
|
||||
+ C c; S s; volatile gboolean t = FALSE;
|
||||
|
||||
c = db_con_get();
|
||||
TRY
|
||||
diff --git src/pop3.c src/pop3.c
|
||||
index d03f71a..b7106d3 100644
|
||||
--- src/pop3.c
|
||||
+++ src/pop3.c
|
||||
@@ -99,7 +99,7 @@ static int db_createsession(uint64_t user_idnr, ClientSession_T * session)
|
||||
{
|
||||
Connection_T c; ResultSet_T r; volatile int t = DM_SUCCESS;
|
||||
struct message *tmpmessage;
|
||||
- int message_counter = 0;
|
||||
+ volatile int message_counter = 0;
|
||||
const char *query_result;
|
||||
uint64_t mailbox_idnr;
|
||||
INIT_QUERY;
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
81
mail/dbmail/files/patch-0003-Fix-IMAP-mailbox-maintanence
Normal file
81
mail/dbmail/files/patch-0003-Fix-IMAP-mailbox-maintanence
Normal file
@ -0,0 +1,81 @@
|
||||
From f2d27f8727ae4159d356d63c1af6ac1a60b1261a Mon Sep 17 00:00:00 2001
|
||||
From: Pavlo Lavrenenko <Pavlo.Lavrenenko@portaone.com>
|
||||
Date: Thu, 21 May 2015 11:42:56 +0300
|
||||
Subject: [PATCH 03/33] Fix IMAP mailbox maintanence
|
||||
|
||||
Update message's mailbox id in a separate explicit transaction to prevent
|
||||
SQLException: ORA-01453 error on the next db_begin_transaction() call
|
||||
(see db_mailbox_seq_update() next to 'UPDATE dbmail_messages SET mailbox_idnr'
|
||||
query).
|
||||
---
|
||||
src/dm_db.c | 6 ++++++
|
||||
src/dm_db.h | 1 +
|
||||
src/maintenance.c | 8 ++------
|
||||
3 files changed, 9 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git src/dm_db.c src/dm_db.c
|
||||
index feb0b34..313b33f 100644
|
||||
--- src/dm_db.c
|
||||
+++ src/dm_db.c
|
||||
@@ -4290,6 +4290,12 @@ void db_message_set_seq(uint64_t message_id, uint64_t seq)
|
||||
END_TRY;
|
||||
}
|
||||
|
||||
+int db_move_message(uint64_t message_id, uint64_t mailbox_id)
|
||||
+{
|
||||
+ return db_update("UPDATE %smessages SET mailbox_idnr = %" PRIu64 " WHERE message_idnr = %" PRIu64 "",
|
||||
+ DBPFX, mailbox_id, message_id);
|
||||
+}
|
||||
+
|
||||
int db_rehash_store(void)
|
||||
{
|
||||
GList *ids = NULL;
|
||||
diff --git src/dm_db.h src/dm_db.h
|
||||
index 57aa256..84595d2 100644
|
||||
--- src/dm_db.h
|
||||
+++ src/dm_db.h
|
||||
@@ -777,6 +777,7 @@ char * db_returning(const char *s);
|
||||
|
||||
uint64_t db_mailbox_seq_update(uint64_t mailbox_id, uint64_t message_id);
|
||||
void db_message_set_seq(uint64_t message_id, uint64_t seq);
|
||||
+int db_move_message(uint64_t message_id, uint64_t mailbox_id);
|
||||
|
||||
int db_rehash_store(void);
|
||||
|
||||
diff --git src/maintenance.c src/maintenance.c
|
||||
index b4a020b..24b818c 100644
|
||||
--- src/maintenance.c
|
||||
+++ src/maintenance.c
|
||||
@@ -1184,7 +1184,7 @@ int do_erase_old(int days, char * mbtrash_name)
|
||||
/* Move message to Trash if the message is in INBOX mailbox and date less then passed date. */
|
||||
int do_move_old (int days, char * mbinbox_name, char * mbtrash_name)
|
||||
{
|
||||
- Connection_T c; ResultSet_T r; ResultSet_T r1; PreparedStatement_T s; PreparedStatement_T s1; PreparedStatement_T s2;
|
||||
+ Connection_T c; ResultSet_T r; ResultSet_T r1; PreparedStatement_T s; PreparedStatement_T s1;
|
||||
int skip = 1;
|
||||
char expire [DEF_FRAGSIZE];
|
||||
uint64_t mailbox_to;
|
||||
@@ -1200,9 +1200,7 @@ int do_move_old (int days, char * mbinbox_name, char * mbtrash_name)
|
||||
"WHERE mb.name = ? AND msg.status < %d "
|
||||
"AND phys.internal_date < %s",
|
||||
DBPFX, DBPFX, DBPFX, MESSAGE_STATUS_DELETE, expire);
|
||||
-
|
||||
s1 = db_stmt_prepare(c, "SELECT mailbox_idnr FROM %smailboxes WHERE owner_idnr = ? AND name = ?", DBPFX);
|
||||
- s2 = db_stmt_prepare(c, "UPDATE %smessages SET mailbox_idnr = ? WHERE message_idnr = ?", DBPFX);
|
||||
|
||||
db_stmt_set_str(s, 1, mbinbox_name);
|
||||
|
||||
@@ -1225,9 +1223,7 @@ int do_move_old (int days, char * mbinbox_name, char * mbtrash_name)
|
||||
}
|
||||
|
||||
if (!skip) {
|
||||
- db_stmt_set_u64(s2,1,mailbox_to);
|
||||
- db_stmt_set_u64(s2,2,id);
|
||||
- db_stmt_exec(s2);
|
||||
+ db_move_message(id, mailbox_to);
|
||||
db_mailbox_seq_update(mailbox_to, 0);
|
||||
db_mailbox_seq_update(mailbox_from, 0);
|
||||
}
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
@ -0,0 +1,41 @@
|
||||
From b6f28ffa54e6533fd0d8676248d0c9bc6d4bd859 Mon Sep 17 00:00:00 2001
|
||||
From: Paul J Stevens <p.stevens@lukkien.com>
|
||||
Date: Sun, 10 Jan 2016 20:01:31 +0100
|
||||
Subject: [PATCH 04/33] prevent assertion in p_string_erase
|
||||
|
||||
---
|
||||
src/dm_imapsession.c | 9 +++++----
|
||||
1 file changed, 5 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git src/dm_imapsession.c src/dm_imapsession.c
|
||||
index dbf1834..67eae60 100644
|
||||
--- src/dm_imapsession.c
|
||||
+++ src/dm_imapsession.c
|
||||
@@ -870,19 +870,20 @@ static void _imap_send_part(ImapSession *self, GMimeObject *part, body_fetch *bo
|
||||
} else {
|
||||
char *tmp = imap_get_logical_part(part,type);
|
||||
String_T str = p_string_new(self->pool, tmp);
|
||||
+ size_t len = p_string_len(str);
|
||||
g_free(tmp);
|
||||
|
||||
- if (p_string_len(str) < 1) {
|
||||
+ if (len < 1) {
|
||||
dbmail_imap_session_buff_printf(self, "] NIL");
|
||||
} else {
|
||||
uint64_t cnt = 0;
|
||||
if (bodyfetch->octetcnt > 0) {
|
||||
- cnt = get_dumpsize(bodyfetch, p_string_len(str));
|
||||
+ cnt = get_dumpsize(bodyfetch, len);
|
||||
dbmail_imap_session_buff_printf(self, "]<%" PRIu64 "> {%" PRIu64 "}\r\n", bodyfetch->octetstart, cnt);
|
||||
- p_string_erase(str,0,bodyfetch->octetstart);
|
||||
+ p_string_erase(str,0,min(bodyfetch->octetstart,len));
|
||||
p_string_truncate(str,cnt);
|
||||
} else {
|
||||
- dbmail_imap_session_buff_printf(self, "] {%" PRIu64 "}\r\n", p_string_len(str));
|
||||
+ dbmail_imap_session_buff_printf(self, "] {%" PRIu64 "}\r\n", len);
|
||||
}
|
||||
dbmail_imap_session_buff_printf(self,"%s", p_string_str(str));
|
||||
}
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
38
mail/dbmail/files/patch-0005-improve-crypt-authentication
Normal file
38
mail/dbmail/files/patch-0005-improve-crypt-authentication
Normal file
@ -0,0 +1,38 @@
|
||||
From b4b82aca1dd1c8aece722b8370da02b715e4bb53 Mon Sep 17 00:00:00 2001
|
||||
From: Paul J Stevens <p.stevens@lukkien.com>
|
||||
Date: Wed, 10 Feb 2016 09:14:41 +0100
|
||||
Subject: [PATCH 05/33] improve crypt authentication
|
||||
|
||||
also don't segfault when spasswd is empty
|
||||
---
|
||||
src/dm_db.c | 7 ++++++-
|
||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git src/dm_db.c src/dm_db.c
|
||||
index 313b33f..bfe9601 100644
|
||||
--- src/dm_db.c
|
||||
+++ src/dm_db.c
|
||||
@@ -3687,6 +3687,10 @@ int db_user_validate(ClientBase_T *ci, const char *pwfield, uint64_t *user_idnr,
|
||||
return t;
|
||||
|
||||
if (! t) return FALSE;
|
||||
+ if (! strlen(dbpass)) {
|
||||
+ TRACE(TRACE_INFO, "Empty password for [%" PRIu64 "] in [%s]", *user_idnr, pwfield);
|
||||
+ return FALSE;
|
||||
+ }
|
||||
|
||||
if (SMATCH(encode, "")) {
|
||||
TRACE(TRACE_DEBUG, "validating using plaintext passwords");
|
||||
@@ -3699,7 +3703,8 @@ int db_user_validate(ClientBase_T *ci, const char *pwfield, uint64_t *user_idnr,
|
||||
|
||||
if (SMATCH(encode, "crypt")) {
|
||||
TRACE(TRACE_DEBUG, "validating using crypt() encryption");
|
||||
- is_validated = (strcmp((const char *) crypt(password, dbpass), dbpass) == 0) ? 1 : 0;
|
||||
+ strncpy(salt, dbpass, 2);
|
||||
+ is_validated = (strcmp((const char *) crypt(password, salt), dbpass) == 0) ? 1 : 0;
|
||||
} else if (SMATCH(encode, "md5")) {
|
||||
/* get password */
|
||||
if (strncmp(dbpass, "$1$", 3)) { // no match
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
@ -0,0 +1,119 @@
|
||||
From f5b73b342b4a6cae1bb15340e5da7330e29319c1 Mon Sep 17 00:00:00 2001
|
||||
From: Paul J Stevens <p.stevens@lukkien.com>
|
||||
Date: Sat, 5 Mar 2016 18:43:12 +0100
|
||||
Subject: [PATCH 06/33] simplify log_query_time duration logic
|
||||
|
||||
---
|
||||
src/dm_db.c | 16 ++++++++--------
|
||||
src/dm_misc.c | 12 ++++++++++++
|
||||
src/dm_misc.h | 2 ++
|
||||
test/check_dbmail_db.c | 27 +++++++++++++++++++++++++++
|
||||
4 files changed, 49 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git src/dm_db.c src/dm_db.c
|
||||
index bfe9601..429d0ae 100644
|
||||
--- src/dm_db.c
|
||||
+++ src/dm_db.c
|
||||
@@ -354,14 +354,14 @@ void db_con_clear(Connection_T c)
|
||||
|
||||
void log_query_time(char *query, struct timeval before, struct timeval after)
|
||||
{
|
||||
- double elapsed = ((double)after.tv_sec + ((double)after.tv_usec / 1000000)) - ((double)before.tv_sec + ((double)before.tv_usec / 1000000));
|
||||
- TRACE(TRACE_DATABASE, "last query took [%.3f] seconds", elapsed);
|
||||
- if (elapsed > (double)db_params.query_time_warning)
|
||||
- TRACE(TRACE_WARNING, "slow query [%s] took [%.3f] seconds", query, elapsed);
|
||||
- else if (elapsed > (double)db_params.query_time_notice)
|
||||
- TRACE(TRACE_NOTICE, "slow query [%s] took [%.3f] seconds", query, elapsed);
|
||||
- else if (elapsed > (double)db_params.query_time_info)
|
||||
- TRACE(TRACE_INFO, "slow query [%s] took [%.3f] seconds", query, elapsed);
|
||||
+ unsigned int elapsed = (unsigned int)diff_time(before, after);
|
||||
+ TRACE(TRACE_DATABASE, "last query took [%d] seconds", elapsed);
|
||||
+ if (elapsed > db_params.query_time_warning)
|
||||
+ TRACE(TRACE_WARNING, "slow query [%s] took [%d] seconds", query, elapsed);
|
||||
+ else if (elapsed > db_params.query_time_notice)
|
||||
+ TRACE(TRACE_NOTICE, "slow query [%s] took [%d] seconds", query, elapsed);
|
||||
+ else if (elapsed > db_params.query_time_info)
|
||||
+ TRACE(TRACE_INFO, "slow query [%s] took [%d] seconds", query, elapsed);
|
||||
return;
|
||||
}
|
||||
|
||||
diff --git src/dm_misc.c src/dm_misc.c
|
||||
index 1294930..e27ef34 100644
|
||||
--- src/dm_misc.c
|
||||
+++ src/dm_misc.c
|
||||
@@ -2422,4 +2422,16 @@ void uint64_free(void *data)
|
||||
mempool_push(small_pool, data, sizeof(uint64_t));
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * calculate the difference between two timeval values
|
||||
+ * as number of seconds, using default rounding
|
||||
+ */
|
||||
+int diff_time(struct timeval before, struct timeval after)
|
||||
+{
|
||||
+ int tbefore = before.tv_sec * 1000000 + before.tv_usec;
|
||||
+ int tafter = after.tv_sec * 1000000 + after.tv_usec;
|
||||
+ int tdiff = tafter - tbefore;
|
||||
+ return (int)rint((double)tdiff/1000000);
|
||||
+}
|
||||
+
|
||||
|
||||
diff --git src/dm_misc.h src/dm_misc.h
|
||||
index a5dd04f..9660dfa 100644
|
||||
--- src/dm_misc.h
|
||||
+++ src/dm_misc.h
|
||||
@@ -178,4 +178,6 @@ gchar * get_crlf_encoded_opt(const gchar *string, int dots);
|
||||
void strip_crlf(char *buffer);
|
||||
void uint64_free(void *);
|
||||
|
||||
+int diff_time(struct timeval before, struct timeval after);
|
||||
+
|
||||
#endif
|
||||
diff --git test/check_dbmail_db.c test/check_dbmail_db.c
|
||||
index 47c34be..e6cb170 100644
|
||||
--- test/check_dbmail_db.c
|
||||
+++ test/check_dbmail_db.c
|
||||
@@ -414,6 +414,32 @@ START_TEST(test_db_get_sql)
|
||||
}
|
||||
END_TEST
|
||||
|
||||
+START_TEST(test_diff_time)
|
||||
+{
|
||||
+ struct timeval before, after;
|
||||
+ int diff;
|
||||
+
|
||||
+ before.tv_sec = 1; before.tv_usec = 0;
|
||||
+ after.tv_sec = 2; after.tv_usec = 0;
|
||||
+ diff = diff_time(before, after);
|
||||
+ fail_unless(diff == 1);
|
||||
+
|
||||
+ before.tv_sec = 1; before.tv_usec = 1000000 - 1;
|
||||
+ after.tv_sec = 2; after.tv_usec = 0;
|
||||
+ diff = diff_time(before, after);
|
||||
+ fail_unless(diff == 0);
|
||||
+
|
||||
+ before.tv_sec = 1; before.tv_usec = 500001;
|
||||
+ after.tv_sec = 2; after.tv_usec = 0;
|
||||
+ diff = diff_time(before, after);
|
||||
+ fail_unless(diff == 0);
|
||||
+
|
||||
+ before.tv_sec = 1; before.tv_usec = 499999;
|
||||
+ after.tv_sec = 2; after.tv_usec = 0;
|
||||
+ diff = diff_time(before, after);
|
||||
+ fail_unless(diff == 1);
|
||||
+}
|
||||
+END_TEST
|
||||
|
||||
Suite *dbmail_db_suite(void)
|
||||
{
|
||||
@@ -435,6 +461,7 @@ Suite *dbmail_db_suite(void)
|
||||
tcase_add_test(tc_db, test_mailbox_match_new);
|
||||
tcase_add_test(tc_db, test_db_findmailbox_by_regex);
|
||||
tcase_add_test(tc_db, test_db_get_sql);
|
||||
+ tcase_add_test(tc_db, test_diff_time);
|
||||
|
||||
return s;
|
||||
}
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
@ -0,0 +1,148 @@
|
||||
From 6b7eccfec4f76b7d9d1f865caf741ff3214b5964 Mon Sep 17 00:00:00 2001
|
||||
From: Pavlo Lavrenenko <santa.ssh@gmail.com>
|
||||
Date: Thu, 2 Jun 2016 08:18:51 +0300
|
||||
Subject: [PATCH 07/33] Disconnect IMAP clients if only few free FDs left (#37)
|
||||
|
||||
After network connection to DB server goes down the processing of IMAP session
|
||||
stalls: DB connection pool becomes exhausted as active connections do not
|
||||
close till TCP timeout kicks in (true at least for Oracle). While DBMail still
|
||||
accepts incoming connections it quickly reaches the RLIMIT_NOFILE and becomes
|
||||
unresponsive. Send BYE response if the number of opened FDs reaches the
|
||||
RLIMIT_NOFILE value.
|
||||
---
|
||||
src/dbmail.h.in | 5 +++++
|
||||
src/dm_misc.c | 20 ++++++++++++++++++++
|
||||
src/dm_misc.h | 8 ++++++++
|
||||
src/imap4.c | 23 ++++++++++++++++++++++-
|
||||
4 files changed, 55 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git src/dbmail.h.in src/dbmail.h.in
|
||||
index d826dc3..17215ef 100644
|
||||
--- src/dbmail.h.in
|
||||
+++ src/dbmail.h.in
|
||||
@@ -69,12 +69,14 @@
|
||||
#include <string.h>
|
||||
#include <strings.h>
|
||||
#include <sysexits.h>
|
||||
+#include <dirent.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
#include <sys/time.h>
|
||||
+#include <sys/resource.h>
|
||||
#include <sys/wait.h>
|
||||
#include <sys/ipc.h>
|
||||
#include <sys/shm.h>
|
||||
@@ -252,6 +254,9 @@
|
||||
/* input reading linelimit */
|
||||
#define MAX_LINESIZE (64*1024)
|
||||
|
||||
+/* minumun number of free file descriptors required to run the daemon */
|
||||
+#define FREE_DF_THRESHOLD 16
|
||||
+
|
||||
/* string length for query */
|
||||
#define DEF_QUERYSIZE (32*1024)
|
||||
#define DEF_FRAGSIZE 256
|
||||
diff --git src/dm_misc.c src/dm_misc.c
|
||||
index e27ef34..e795de1 100644
|
||||
--- src/dm_misc.c
|
||||
+++ src/dm_misc.c
|
||||
@@ -104,6 +104,26 @@ int drop_privileges(char *newuser, char *newgroup)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+int get_opened_fd_count(void)
|
||||
+{
|
||||
+ DIR* dir = NULL;
|
||||
+ struct dirent* entry = NULL;
|
||||
+ char buf[32];
|
||||
+ int fd_count = 0;
|
||||
+
|
||||
+ snprintf(buf, 32, "/proc/%i/fd/", getpid());
|
||||
+
|
||||
+ dir = opendir(buf);
|
||||
+ if (dir == NULL)
|
||||
+ return -1;
|
||||
+
|
||||
+ while ((entry = readdir(dir)) != NULL)
|
||||
+ fd_count++;
|
||||
+ closedir(dir);
|
||||
+
|
||||
+ return fd_count - 2; /* exclude '.' and '..' entries */
|
||||
+}
|
||||
+
|
||||
void create_unique_id(char *target, uint64_t message_idnr)
|
||||
{
|
||||
char md5_str[FIELDSIZE];
|
||||
diff --git src/dm_misc.h src/dm_misc.h
|
||||
index 9660dfa..b6cf24f 100644
|
||||
--- src/dm_misc.h
|
||||
+++ src/dm_misc.h
|
||||
@@ -45,6 +45,14 @@ void g_string_maybe_shrink(GString *s);
|
||||
int drop_privileges(char *newuser, char *newgroup);
|
||||
|
||||
/**
|
||||
+ \brief get the number of opened files (requires /proc mounted)
|
||||
+ \return
|
||||
+ - -1 on error
|
||||
+ - number of opened files
|
||||
+*/
|
||||
+int get_opened_fd_count(void);
|
||||
+
|
||||
+/**
|
||||
* \brief create a unique id for a message (used for pop, stored per message)
|
||||
* \param target target string. Length should be UID_SIZE
|
||||
* \param message_idnr message_idnr of message
|
||||
diff --git src/imap4.c src/imap4.c
|
||||
index 0532f2e..e523edc 100644
|
||||
--- src/imap4.c
|
||||
+++ src/imap4.c
|
||||
@@ -351,6 +351,12 @@ static void send_greeting(ImapSession *session)
|
||||
dbmail_imap_session_set_state(session, CLIENTSTATE_NON_AUTHENTICATED);
|
||||
}
|
||||
|
||||
+static void disconnect_user(ImapSession *session)
|
||||
+{
|
||||
+ imap_session_printf(session, "* BYE [Service unavailable.]\r\n");
|
||||
+ imap_handle_abort(session);
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* the default timeout callback */
|
||||
|
||||
@@ -601,6 +607,8 @@ int imap_handle_connection(client_sock *c)
|
||||
{
|
||||
ImapSession *session;
|
||||
ClientBase_T *ci;
|
||||
+ struct rlimit fd_limit;
|
||||
+ int fd_count;
|
||||
|
||||
ci = client_init(c);
|
||||
|
||||
@@ -617,7 +625,20 @@ int imap_handle_connection(client_sock *c)
|
||||
Capa_remove(session->capa, "LOGINDISABLED");
|
||||
}
|
||||
|
||||
- send_greeting(session);
|
||||
+ fd_count = get_opened_fd_count();
|
||||
+ if (fd_count < 0 || getrlimit(RLIMIT_NPROC, &fd_limit) < 0) {
|
||||
+ TRACE(TRACE_ERR,
|
||||
+ "[%p] failed to retrieve fd limits, dropping client connection",
|
||||
+ session);
|
||||
+ disconnect_user(session);
|
||||
+ } else if (fd_limit.rlim_cur - fd_count < FREE_DF_THRESHOLD) {
|
||||
+ TRACE(TRACE_WARNING,
|
||||
+ "[%p] fd count [%d], fd limit [%d], fd threshold [%d]: dropping client connection",
|
||||
+ session, fd_count, fd_limit.rlim_cur, FREE_DF_THRESHOLD);
|
||||
+ disconnect_user(session);
|
||||
+ } else {
|
||||
+ send_greeting(session);
|
||||
+ }
|
||||
|
||||
reset_callbacks(session);
|
||||
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
@ -0,0 +1,26 @@
|
||||
From 024ba19d1c83bee22b6b5901d2fff586d9391cf3 Mon Sep 17 00:00:00 2001
|
||||
From: Alan Hicks <ahicks@p-o.co.uk>
|
||||
Date: Tue, 24 Feb 2015 11:27:45 +0000
|
||||
Subject: [PATCH 08/33] Add primary key constraint to dbmail_authlog
|
||||
|
||||
---
|
||||
sql/postgresql/create_tables.pgsql | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git sql/postgresql/create_tables.pgsql sql/postgresql/create_tables.pgsql
|
||||
index da3b694..45740fd 100644
|
||||
--- sql/postgresql/create_tables.pgsql
|
||||
+++ sql/postgresql/create_tables.pgsql
|
||||
@@ -46,7 +46,8 @@ CREATE TABLE dbmail_authlog (
|
||||
dst_port INT8,
|
||||
status VARCHAR(32) DEFAULT 'active',
|
||||
bytes_rx INT8 DEFAULT '0' NOT NULL,
|
||||
- bytes_tx INT8 DEFAULT '0' NOT NULL
|
||||
+ bytes_tx INT8 DEFAULT '0' NOT NULL,
|
||||
+ PRIMARY KEY (id)
|
||||
);
|
||||
|
||||
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
@ -0,0 +1,162 @@
|
||||
From 9d093f76a82c88647df1cd0ef08b3e8f82e26abb Mon Sep 17 00:00:00 2001
|
||||
From: Alan Hicks <ahicks@p-o.co.uk>
|
||||
Date: Fri, 30 Sep 2016 17:17:05 +0100
|
||||
Subject: [PATCH 09/33] Rework temporary connection failures
|
||||
|
||||
---
|
||||
src/modules/authldap.c | 102 ++++++++++++++++++++++++++++++++-----------------
|
||||
1 file changed, 67 insertions(+), 35 deletions(-)
|
||||
|
||||
diff --git src/modules/authldap.c src/modules/authldap.c
|
||||
index 19802c8..2073768 100644
|
||||
--- src/modules/authldap.c
|
||||
+++ src/modules/authldap.c
|
||||
@@ -110,18 +110,48 @@ static gpointer authldap_once(gpointer UNUSED data)
|
||||
return (gpointer)NULL;
|
||||
}
|
||||
|
||||
-/*
|
||||
- lookup thread-local ldap connection
|
||||
-*/
|
||||
+/*
|
||||
+ * ldap_con_get()
|
||||
+ *
|
||||
+ * Lookup thread-local ldap connection and bind using config credentials
|
||||
+ * retrying a few times if the server is temporarily unavailable
|
||||
+ *
|
||||
+ * returns connection on success, NULL on failure
|
||||
+ */
|
||||
static LDAP * ldap_con_get(void)
|
||||
{
|
||||
- LDAP * c = (LDAP *)g_static_private_get(&ldap_conn_key);
|
||||
- if (! c) {
|
||||
- authldap_connect();
|
||||
- c = (LDAP *)g_static_private_get(&ldap_conn_key);
|
||||
+ LDAP * ld = (LDAP *)g_static_private_get(&ldap_conn_key);
|
||||
+ if (ld) {
|
||||
+ TRACE(TRACE_DEBUG, "connection [%p]", ld);
|
||||
+ return ld;
|
||||
}
|
||||
- TRACE(TRACE_DEBUG, "connection [%p]", c);
|
||||
- return c;
|
||||
+ int c = 0;
|
||||
+ int err = -1; // Start wanting success
|
||||
+ while (err != 0 && c++ < 5) {
|
||||
+ // Loop until success or too many retries
|
||||
+ TRACE(TRACE_DEBUG, "No connection trying [%d]", c);
|
||||
+
|
||||
+ err = authldap_connect();
|
||||
+
|
||||
+ switch (err) {
|
||||
+ case LDAP_SUCCESS:
|
||||
+ ld = (LDAP *)g_static_private_get(&ldap_conn_key);
|
||||
+ TRACE(TRACE_DEBUG, "connection [%p]", ld);
|
||||
+ break;
|
||||
+ case LDAP_SERVER_DOWN:
|
||||
+ TRACE(TRACE_WARNING, "LDAP gone away: %s. Trying to reconnect(%d/5).", ldap_err2string(err),c);
|
||||
+ sleep(2); // reconnect failed. wait before trying again
|
||||
+ break;
|
||||
+ default:
|
||||
+ TRACE(TRACE_ERR, "LDAP error(%d): %s", err, ldap_err2string(err));
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ if (! ld) {
|
||||
+ TRACE(TRACE_ERR, "Unable to connect to LDAP giving up");
|
||||
+ }
|
||||
+ TRACE(TRACE_DEBUG, "connection [%p]", ld);
|
||||
+ return ld;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -140,6 +170,13 @@ static void authldap_free(gpointer data)
|
||||
sigaction(SIGPIPE, &oldact, 0);
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * auth_ldap_bind()
|
||||
+ *
|
||||
+ * Bind to server using config credentials
|
||||
+ *
|
||||
+ * returns 0 on success, -1 on failure
|
||||
+ */
|
||||
static int auth_ldap_bind(void)
|
||||
{
|
||||
int err;
|
||||
@@ -153,7 +190,6 @@ static int auth_ldap_bind(void)
|
||||
}
|
||||
|
||||
return 0;
|
||||
-
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -213,44 +249,40 @@ static int authldap_connect(void)
|
||||
return auth_ldap_bind();
|
||||
}
|
||||
|
||||
-static int authldap_reconnect(void)
|
||||
-{
|
||||
- LDAP *c;
|
||||
- if ((c = ldap_con_get())) authldap_free((gpointer)c);
|
||||
- return authldap_connect();
|
||||
-}
|
||||
-
|
||||
+/*
|
||||
+ * authldap_search()
|
||||
+ *
|
||||
+ * Perform an LDAP search
|
||||
+ *
|
||||
+ * returns search results on success, NULL on failure
|
||||
+ */
|
||||
static LDAPMessage * authldap_search(const gchar *query)
|
||||
{
|
||||
LDAPMessage *ldap_res;
|
||||
int _ldap_attrsonly = 0;
|
||||
char **_ldap_attrs = NULL;
|
||||
- int c=0, err;
|
||||
+ int err;
|
||||
LDAP *_ldap_conn;
|
||||
|
||||
g_return_val_if_fail(query!=NULL, NULL);
|
||||
|
||||
_ldap_conn = ldap_con_get();
|
||||
|
||||
- while (c++ < 5) {
|
||||
- TRACE(TRACE_DEBUG, " [%s]", query);
|
||||
- err = ldap_search_s(_ldap_conn, _ldap_cfg.base_dn, _ldap_cfg.scope_int,
|
||||
- query, _ldap_attrs, _ldap_attrsonly, &ldap_res);
|
||||
+ TRACE(TRACE_DEBUG, " [%s]", query);
|
||||
+ err = ldap_search_s(_ldap_conn, _ldap_cfg.base_dn, _ldap_cfg.scope_int,
|
||||
+ query, _ldap_attrs, _ldap_attrsonly, &ldap_res);
|
||||
|
||||
- if (! err)
|
||||
- return ldap_res;
|
||||
+ if (! err)
|
||||
+ return ldap_res;
|
||||
|
||||
- switch (err) {
|
||||
- case LDAP_SERVER_DOWN:
|
||||
- TRACE(TRACE_WARNING, "LDAP gone away: %s. Try to reconnect(%d/5).", ldap_err2string(err),c);
|
||||
- if (authldap_reconnect())
|
||||
- sleep(2); // reconnect failed. wait before trying again
|
||||
- break;
|
||||
- default:
|
||||
- TRACE(TRACE_ERR, "LDAP error(%d): %s", err, ldap_err2string(err));
|
||||
- return NULL;
|
||||
- break;
|
||||
- }
|
||||
+ switch (err) {
|
||||
+ case LDAP_SERVER_DOWN:
|
||||
+ TRACE(TRACE_WARNING, "LDAP gone away: %s).", ldap_err2string(err));
|
||||
+ break;
|
||||
+ default:
|
||||
+ TRACE(TRACE_ERR, "LDAP error(%d): %s", err, ldap_err2string(err));
|
||||
+ return NULL;
|
||||
+ break;
|
||||
}
|
||||
|
||||
TRACE(TRACE_EMERG,"unrecoverable error while talking to ldap server");
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
@ -0,0 +1,36 @@
|
||||
From fd3d09d5bbd3bd03e5eeaaec900f0e45b67ca064 Mon Sep 17 00:00:00 2001
|
||||
From: Alan Hicks <ahicks@p-o.co.uk>
|
||||
Date: Sun, 2 Oct 2016 17:45:42 +0100
|
||||
Subject: [PATCH 10/33] Give sensible default for retry 120s
|
||||
|
||||
---
|
||||
src/modules/authldap.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git src/modules/authldap.c src/modules/authldap.c
|
||||
index 2073768..1b1b1bd 100644
|
||||
--- src/modules/authldap.c
|
||||
+++ src/modules/authldap.c
|
||||
@@ -127,7 +127,7 @@ static LDAP * ldap_con_get(void)
|
||||
}
|
||||
int c = 0;
|
||||
int err = -1; // Start wanting success
|
||||
- while (err != 0 && c++ < 5) {
|
||||
+ while (err != 0 && c++ < 120) {
|
||||
// Loop until success or too many retries
|
||||
TRACE(TRACE_DEBUG, "No connection trying [%d]", c);
|
||||
|
||||
@@ -139,8 +139,8 @@ static LDAP * ldap_con_get(void)
|
||||
TRACE(TRACE_DEBUG, "connection [%p]", ld);
|
||||
break;
|
||||
case LDAP_SERVER_DOWN:
|
||||
- TRACE(TRACE_WARNING, "LDAP gone away: %s. Trying to reconnect(%d/5).", ldap_err2string(err),c);
|
||||
- sleep(2); // reconnect failed. wait before trying again
|
||||
+ TRACE(TRACE_WARNING, "LDAP gone away: %s. Trying to reconnect(%d/120).", ldap_err2string(err),c);
|
||||
+ sleep(1); // reconnect failed. wait before trying again
|
||||
break;
|
||||
default:
|
||||
TRACE(TRACE_ERR, "LDAP error(%d): %s", err, ldap_err2string(err));
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
@ -0,0 +1,95 @@
|
||||
From cca81b0164c83a90eafa8d27d4887638cae080b5 Mon Sep 17 00:00:00 2001
|
||||
From: Alan Hicks <ahicks@p-o.co.uk>
|
||||
Date: Tue, 4 Oct 2016 15:34:04 +0100
|
||||
Subject: [PATCH 11/33] Add retries for binding and searching
|
||||
|
||||
---
|
||||
src/modules/authldap.c | 43 +++++++++++++++++++++++++++----------------
|
||||
1 file changed, 27 insertions(+), 16 deletions(-)
|
||||
|
||||
diff --git src/modules/authldap.c src/modules/authldap.c
|
||||
index 1b1b1bd..475c985 100644
|
||||
--- src/modules/authldap.c
|
||||
+++ src/modules/authldap.c
|
||||
@@ -126,10 +126,11 @@ static LDAP * ldap_con_get(void)
|
||||
return ld;
|
||||
}
|
||||
int c = 0;
|
||||
+ int c_tries = 120;
|
||||
int err = -1; // Start wanting success
|
||||
- while (err != 0 && c++ < 120) {
|
||||
+ while (err != 0 && c++ < c_tries) {
|
||||
// Loop until success or too many retries
|
||||
- TRACE(TRACE_DEBUG, "No connection trying [%d]", c);
|
||||
+ TRACE(TRACE_DEBUG, "No connection trying [%d/%d]", c, c_tries);
|
||||
|
||||
err = authldap_connect();
|
||||
|
||||
@@ -139,11 +140,13 @@ static LDAP * ldap_con_get(void)
|
||||
TRACE(TRACE_DEBUG, "connection [%p]", ld);
|
||||
break;
|
||||
case LDAP_SERVER_DOWN:
|
||||
- TRACE(TRACE_WARNING, "LDAP gone away: %s. Trying to reconnect(%d/120).", ldap_err2string(err),c);
|
||||
+ TRACE(TRACE_WARNING, "LDAP gone away: %s. Trying to reconnect(%d/%d).", ldap_err2string(err), c, c_tries);
|
||||
sleep(1); // reconnect failed. wait before trying again
|
||||
break;
|
||||
default:
|
||||
+ // Includes timeouts etc. Should probably refactor.
|
||||
TRACE(TRACE_ERR, "LDAP error(%d): %s", err, ldap_err2string(err));
|
||||
+ sleep(1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -261,7 +264,9 @@ static LDAPMessage * authldap_search(const gchar *query)
|
||||
LDAPMessage *ldap_res;
|
||||
int _ldap_attrsonly = 0;
|
||||
char **_ldap_attrs = NULL;
|
||||
- int err;
|
||||
+ int err = -1; // Start wanting success
|
||||
+ int c = 0;
|
||||
+ int c_tries = 10;
|
||||
LDAP *_ldap_conn;
|
||||
|
||||
g_return_val_if_fail(query!=NULL, NULL);
|
||||
@@ -269,20 +274,26 @@ static LDAPMessage * authldap_search(const gchar *query)
|
||||
_ldap_conn = ldap_con_get();
|
||||
|
||||
TRACE(TRACE_DEBUG, " [%s]", query);
|
||||
- err = ldap_search_s(_ldap_conn, _ldap_cfg.base_dn, _ldap_cfg.scope_int,
|
||||
- query, _ldap_attrs, _ldap_attrsonly, &ldap_res);
|
||||
|
||||
- if (! err)
|
||||
- return ldap_res;
|
||||
+ while (err != 0 && c++ < c_tries) {
|
||||
+ // Loop until success or too many retries
|
||||
+
|
||||
+ err = ldap_search_s(_ldap_conn, _ldap_cfg.base_dn, _ldap_cfg.scope_int,
|
||||
+ query, _ldap_attrs, _ldap_attrsonly, &ldap_res);
|
||||
|
||||
- switch (err) {
|
||||
- case LDAP_SERVER_DOWN:
|
||||
- TRACE(TRACE_WARNING, "LDAP gone away: %s).", ldap_err2string(err));
|
||||
- break;
|
||||
- default:
|
||||
- TRACE(TRACE_ERR, "LDAP error(%d): %s", err, ldap_err2string(err));
|
||||
- return NULL;
|
||||
- break;
|
||||
+ switch (err) {
|
||||
+ case LDAP_SUCCESS:
|
||||
+ return ldap_res;
|
||||
+ break;
|
||||
+ case LDAP_SERVER_DOWN:
|
||||
+ TRACE(TRACE_WARNING, "LDAP gone away: %s. Trying again(%d/%d).", ldap_err2string(err), c, c_tries);
|
||||
+ break;
|
||||
+ default:
|
||||
+ // Includes timeouts etc. Should probably refactor.
|
||||
+ TRACE(TRACE_ERR, "LDAP error(%d): %s. Trying again (%d/%d).", err, ldap_err2string(err), c, c_tries);
|
||||
+ break;
|
||||
+ }
|
||||
+ sleep(1); // Search failed. Wait before trying again.
|
||||
}
|
||||
|
||||
TRACE(TRACE_EMERG,"unrecoverable error while talking to ldap server");
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
25
mail/dbmail/files/patch-0012-Bump-search-timeout-to-60s
Normal file
25
mail/dbmail/files/patch-0012-Bump-search-timeout-to-60s
Normal file
@ -0,0 +1,25 @@
|
||||
From 5ed508954309e9a5ad6610be47fd02be60f1e726 Mon Sep 17 00:00:00 2001
|
||||
From: Alan Hicks <ahicks@p-o.co.uk>
|
||||
Date: Thu, 6 Oct 2016 15:04:51 +0100
|
||||
Subject: [PATCH 12/33] Bump search timeout to 60s
|
||||
|
||||
---
|
||||
src/modules/authldap.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git src/modules/authldap.c src/modules/authldap.c
|
||||
index 475c985..2a39e0e 100644
|
||||
--- src/modules/authldap.c
|
||||
+++ src/modules/authldap.c
|
||||
@@ -266,7 +266,7 @@ static LDAPMessage * authldap_search(const gchar *query)
|
||||
char **_ldap_attrs = NULL;
|
||||
int err = -1; // Start wanting success
|
||||
int c = 0;
|
||||
- int c_tries = 10;
|
||||
+ int c_tries = 60;
|
||||
LDAP *_ldap_conn;
|
||||
|
||||
g_return_val_if_fail(query!=NULL, NULL);
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
@ -0,0 +1,34 @@
|
||||
From 9a13e4878b94b742e17519c2f4379ee5a3498a73 Mon Sep 17 00:00:00 2001
|
||||
From: Alan Hicks <ahicks@p-o.co.uk>
|
||||
Date: Tue, 11 Oct 2016 14:34:59 +0100
|
||||
Subject: [PATCH 13/33] Increase ldap timeout to 600s (10 mins)
|
||||
|
||||
---
|
||||
src/modules/authldap.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git src/modules/authldap.c src/modules/authldap.c
|
||||
index 2a39e0e..3f43a56 100644
|
||||
--- src/modules/authldap.c
|
||||
+++ src/modules/authldap.c
|
||||
@@ -126,7 +126,7 @@ static LDAP * ldap_con_get(void)
|
||||
return ld;
|
||||
}
|
||||
int c = 0;
|
||||
- int c_tries = 120;
|
||||
+ int c_tries = 600;
|
||||
int err = -1; // Start wanting success
|
||||
while (err != 0 && c++ < c_tries) {
|
||||
// Loop until success or too many retries
|
||||
@@ -266,7 +266,7 @@ static LDAPMessage * authldap_search(const gchar *query)
|
||||
char **_ldap_attrs = NULL;
|
||||
int err = -1; // Start wanting success
|
||||
int c = 0;
|
||||
- int c_tries = 60;
|
||||
+ int c_tries = 600;
|
||||
LDAP *_ldap_conn;
|
||||
|
||||
g_return_val_if_fail(query!=NULL, NULL);
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
123
mail/dbmail/files/patch-0014-Refactor-deprecared-functions
Normal file
123
mail/dbmail/files/patch-0014-Refactor-deprecared-functions
Normal file
@ -0,0 +1,123 @@
|
||||
From 30e4904b6baf5c3f00d4b096f5b51cfbb69958d0 Mon Sep 17 00:00:00 2001
|
||||
From: Alan Hicks <ahicks@p-o.co.uk>
|
||||
Date: Wed, 12 Oct 2016 16:56:22 +0100
|
||||
Subject: [PATCH 14/33] Refactor deprecared functions
|
||||
|
||||
---
|
||||
src/modules/authldap.c | 44 ++++++++++++++++++++------------------------
|
||||
1 file changed, 20 insertions(+), 24 deletions(-)
|
||||
|
||||
diff --git src/modules/authldap.c src/modules/authldap.c
|
||||
index 3f43a56..bbe553b 100644
|
||||
--- src/modules/authldap.c
|
||||
+++ src/modules/authldap.c
|
||||
@@ -28,7 +28,23 @@
|
||||
|
||||
extern char configFile[PATH_MAX];
|
||||
|
||||
-GStaticPrivate ldap_conn_key;
|
||||
+/*
|
||||
+ signal-safe releasing of thread-local ldap connection
|
||||
+*/
|
||||
+static void authldap_free(gpointer data)
|
||||
+{
|
||||
+ LDAP *c = (LDAP *)data;
|
||||
+ struct sigaction act, oldact;
|
||||
+
|
||||
+ memset(&act, 0, sizeof(act));
|
||||
+ memset(&oldact, 0, sizeof(oldact));
|
||||
+ act.sa_handler = SIG_IGN;
|
||||
+ sigaction(SIGPIPE, &act, &oldact);
|
||||
+ ldap_unbind(c);
|
||||
+ sigaction(SIGPIPE, &oldact, 0);
|
||||
+}
|
||||
+
|
||||
+static GPrivate ldap_conn_key = G_PRIVATE_INIT (authldap_free);
|
||||
static GOnce ldap_conn_once = G_ONCE_INIT;
|
||||
static int authldap_connect(void);
|
||||
|
||||
@@ -105,7 +121,6 @@ static void __auth_get_config(void)
|
||||
*/
|
||||
static gpointer authldap_once(gpointer UNUSED data)
|
||||
{
|
||||
- g_static_private_init(&ldap_conn_key);
|
||||
__auth_get_config();
|
||||
return (gpointer)NULL;
|
||||
}
|
||||
@@ -120,7 +135,7 @@ static gpointer authldap_once(gpointer UNUSED data)
|
||||
*/
|
||||
static LDAP * ldap_con_get(void)
|
||||
{
|
||||
- LDAP * ld = (LDAP *)g_static_private_get(&ldap_conn_key);
|
||||
+ LDAP * ld = (LDAP *)g_private_get(&ldap_conn_key);
|
||||
if (ld) {
|
||||
TRACE(TRACE_DEBUG, "connection [%p]", ld);
|
||||
return ld;
|
||||
@@ -136,7 +151,7 @@ static LDAP * ldap_con_get(void)
|
||||
|
||||
switch (err) {
|
||||
case LDAP_SUCCESS:
|
||||
- ld = (LDAP *)g_static_private_get(&ldap_conn_key);
|
||||
+ ld = (LDAP *)g_private_get(&ldap_conn_key);
|
||||
TRACE(TRACE_DEBUG, "connection [%p]", ld);
|
||||
break;
|
||||
case LDAP_SERVER_DOWN:
|
||||
@@ -144,7 +159,6 @@ static LDAP * ldap_con_get(void)
|
||||
sleep(1); // reconnect failed. wait before trying again
|
||||
break;
|
||||
default:
|
||||
- // Includes timeouts etc. Should probably refactor.
|
||||
TRACE(TRACE_ERR, "LDAP error(%d): %s", err, ldap_err2string(err));
|
||||
sleep(1);
|
||||
break;
|
||||
@@ -158,22 +172,6 @@ static LDAP * ldap_con_get(void)
|
||||
}
|
||||
|
||||
/*
|
||||
- signal-safe releasing of thread-local ldap connection
|
||||
-*/
|
||||
-static void authldap_free(gpointer data)
|
||||
-{
|
||||
- LDAP *c = (LDAP *)data;
|
||||
- struct sigaction act, oldact;
|
||||
-
|
||||
- memset(&act, 0, sizeof(act));
|
||||
- memset(&oldact, 0, sizeof(oldact));
|
||||
- act.sa_handler = SIG_IGN;
|
||||
- sigaction(SIGPIPE, &act, &oldact);
|
||||
- ldap_unbind(c);
|
||||
- sigaction(SIGPIPE, &oldact, 0);
|
||||
-}
|
||||
-
|
||||
-/*
|
||||
* auth_ldap_bind()
|
||||
*
|
||||
* Bind to server using config credentials
|
||||
@@ -247,7 +245,7 @@ static int authldap_connect(void)
|
||||
if (strncasecmp(_ldap_cfg.referrals, "no", 2) == 0)
|
||||
ldap_set_option(_ldap_conn, LDAP_OPT_REFERRALS, 0);
|
||||
|
||||
- g_static_private_set(&ldap_conn_key, _ldap_conn, (GDestroyNotify)authldap_free);
|
||||
+ g_private_replace(&ldap_conn_key, _ldap_conn);
|
||||
|
||||
return auth_ldap_bind();
|
||||
}
|
||||
@@ -289,7 +287,6 @@ static LDAPMessage * authldap_search(const gchar *query)
|
||||
TRACE(TRACE_WARNING, "LDAP gone away: %s. Trying again(%d/%d).", ldap_err2string(err), c, c_tries);
|
||||
break;
|
||||
default:
|
||||
- // Includes timeouts etc. Should probably refactor.
|
||||
TRACE(TRACE_ERR, "LDAP error(%d): %s. Trying again (%d/%d).", err, ldap_err2string(err), c, c_tries);
|
||||
break;
|
||||
}
|
||||
@@ -634,7 +631,6 @@ int auth_connect(void)
|
||||
}
|
||||
int auth_disconnect(void)
|
||||
{
|
||||
- g_static_private_free(&ldap_conn_key);
|
||||
return 0;
|
||||
}
|
||||
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
61
mail/dbmail/files/patch-0015-Get-timeout-from-config
Normal file
61
mail/dbmail/files/patch-0015-Get-timeout-from-config
Normal file
@ -0,0 +1,61 @@
|
||||
From af47f87dec649ad495a704926d5e0e004ad17301 Mon Sep 17 00:00:00 2001
|
||||
From: Alan Hicks <ahicks@p-o.co.uk>
|
||||
Date: Wed, 12 Oct 2016 18:23:40 +0100
|
||||
Subject: [PATCH 15/33] Get timeout from config
|
||||
|
||||
---
|
||||
src/modules/authldap.c | 9 +++++++--
|
||||
1 file changed, 7 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git src/modules/authldap.c src/modules/authldap.c
|
||||
index bbe553b..2bf3b95 100644
|
||||
--- src/modules/authldap.c
|
||||
+++ src/modules/authldap.c
|
||||
@@ -59,7 +59,9 @@ typedef struct _ldap_cfg {
|
||||
Field_T field_members;
|
||||
Field_T query_string;
|
||||
Field_T referrals;
|
||||
+ Field_T query_timeout;
|
||||
int scope_int, port_int, version_int;
|
||||
+ int query_timeout_int;
|
||||
} _ldap_cfg_t;
|
||||
|
||||
static _ldap_cfg_t _ldap_cfg;
|
||||
@@ -90,6 +92,7 @@ static void __auth_get_config(void)
|
||||
GETCONFIGVALUE("QUERY_STRING", "LDAP", _ldap_cfg.query_string);
|
||||
GETCONFIGVALUE("SCOPE", "LDAP", _ldap_cfg.scope);
|
||||
GETCONFIGVALUE("REFERRALS", "LDAP", _ldap_cfg.referrals);
|
||||
+ GETCONFIGVALUE("QUERY_TIMEOUT", "LDAP", _ldap_cfg.query_timeout);
|
||||
|
||||
/* Store the port as an integer for later use. */
|
||||
_ldap_cfg.port_int = atoi(_ldap_cfg.port);
|
||||
@@ -113,6 +116,8 @@ static void __auth_get_config(void)
|
||||
else
|
||||
_ldap_cfg.scope_int = LDAP_SCOPE_SUBTREE;
|
||||
}
|
||||
+ /* Store the timeout as an integer. */
|
||||
+ _ldap_cfg.query_timeout_int = atoi(_ldap_cfg.query_timeout);
|
||||
TRACE(TRACE_DEBUG, "integer ldap scope is [%d]", _ldap_cfg.scope_int);
|
||||
}
|
||||
|
||||
@@ -141,7 +146,7 @@ static LDAP * ldap_con_get(void)
|
||||
return ld;
|
||||
}
|
||||
int c = 0;
|
||||
- int c_tries = 600;
|
||||
+ int c_tries = _ldap_cfg.query_timeout_int;
|
||||
int err = -1; // Start wanting success
|
||||
while (err != 0 && c++ < c_tries) {
|
||||
// Loop until success or too many retries
|
||||
@@ -264,7 +269,7 @@ static LDAPMessage * authldap_search(const gchar *query)
|
||||
char **_ldap_attrs = NULL;
|
||||
int err = -1; // Start wanting success
|
||||
int c = 0;
|
||||
- int c_tries = 600;
|
||||
+ int c_tries = _ldap_cfg.query_timeout_int;
|
||||
LDAP *_ldap_conn;
|
||||
|
||||
g_return_val_if_fail(query!=NULL, NULL);
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
30
mail/dbmail/files/patch-0016-Remove-redundant-event_assign
Normal file
30
mail/dbmail/files/patch-0016-Remove-redundant-event_assign
Normal file
@ -0,0 +1,30 @@
|
||||
From 5be7e049c56442111a0a6ffa1d82b66a8547e6a8 Mon Sep 17 00:00:00 2001
|
||||
From: Alan Hicks <ahicks@p-o.co.uk>
|
||||
Date: Thu, 13 Oct 2016 16:09:49 +0100
|
||||
Subject: [PATCH 16/33] Remove redundant event_assign
|
||||
|
||||
---
|
||||
src/server.c | 2 --
|
||||
1 file changed, 2 deletions(-)
|
||||
|
||||
diff --git src/server.c src/server.c
|
||||
index ba8e5c5..a940030 100644
|
||||
--- src/server.c
|
||||
+++ src/server.c
|
||||
@@ -826,13 +826,11 @@ int server_run(ServerConfig_T *conf)
|
||||
for (i = 0; i < conf->socketcount; i++) {
|
||||
TRACE(TRACE_DEBUG, "Adding event for plain socket [%d] [%d/%d]", conf->listenSockets[i], i+1, total);
|
||||
evsock[i] = event_new(evbase, conf->listenSockets[i], EV_READ, server_sock_cb, NULL);
|
||||
- event_assign(evsock[i], evbase, conf->listenSockets[i], EV_READ, server_sock_cb, evsock[i]);
|
||||
event_add(evsock[i], NULL);
|
||||
}
|
||||
for (k = i, i = 0; i < conf->ssl_socketcount; i++, k++) {
|
||||
TRACE(TRACE_DEBUG, "Adding event for ssl socket [%d] [%d/%d]", conf->ssl_listenSockets[i], k+1, total);
|
||||
evsock[k] = event_new(evbase, conf->ssl_listenSockets[i], EV_READ, server_sock_ssl_cb, NULL);
|
||||
- event_assign(evsock[k], evbase, conf->ssl_listenSockets[i], EV_READ, server_sock_ssl_cb, evsock[k]);
|
||||
event_add(evsock[k], NULL);
|
||||
}
|
||||
}
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
@ -0,0 +1,26 @@
|
||||
From 2caa12157f2efc7c4482ab4130f7aaec1f48bef2 Mon Sep 17 00:00:00 2001
|
||||
From: Alan Hicks <ahicks@p-o.co.uk>
|
||||
Date: Thu, 13 Oct 2016 16:10:51 +0100
|
||||
Subject: [PATCH 17/33] Remove deprecated non functioning g_mem_profile
|
||||
|
||||
---
|
||||
src/server.c | 3 ---
|
||||
1 file changed, 3 deletions(-)
|
||||
|
||||
diff --git src/server.c src/server.c
|
||||
index a940030..e013ac0 100644
|
||||
--- src/server.c
|
||||
+++ src/server.c
|
||||
@@ -656,9 +656,6 @@ void server_sig_cb(int UNUSED fd, short UNUSED event, void *arg)
|
||||
mainReload = 1;
|
||||
case SIGPIPE: // ignore
|
||||
break;
|
||||
- case SIGUSR1:
|
||||
- g_mem_profile();
|
||||
- break;
|
||||
default:
|
||||
exit(0);
|
||||
break;
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
@ -0,0 +1,63 @@
|
||||
From cf3b24b2ea79c262c7827a954da9105a21b2c7d7 Mon Sep 17 00:00:00 2001
|
||||
From: Alan Hicks <ahicks@p-o.co.uk>
|
||||
Date: Fri, 14 Oct 2016 13:59:56 +0100
|
||||
Subject: [PATCH 18/33] Add definition for authldap_free
|
||||
|
||||
---
|
||||
src/modules/authldap.c | 33 +++++++++++++++++----------------
|
||||
1 file changed, 17 insertions(+), 16 deletions(-)
|
||||
|
||||
diff --git src/modules/authldap.c src/modules/authldap.c
|
||||
index 2bf3b95..065ee31 100644
|
||||
--- src/modules/authldap.c
|
||||
+++ src/modules/authldap.c
|
||||
@@ -28,22 +28,7 @@
|
||||
|
||||
extern char configFile[PATH_MAX];
|
||||
|
||||
-/*
|
||||
- signal-safe releasing of thread-local ldap connection
|
||||
-*/
|
||||
-static void authldap_free(gpointer data)
|
||||
-{
|
||||
- LDAP *c = (LDAP *)data;
|
||||
- struct sigaction act, oldact;
|
||||
-
|
||||
- memset(&act, 0, sizeof(act));
|
||||
- memset(&oldact, 0, sizeof(oldact));
|
||||
- act.sa_handler = SIG_IGN;
|
||||
- sigaction(SIGPIPE, &act, &oldact);
|
||||
- ldap_unbind(c);
|
||||
- sigaction(SIGPIPE, &oldact, 0);
|
||||
-}
|
||||
-
|
||||
+static void authldap_free(gpointer data);
|
||||
static GPrivate ldap_conn_key = G_PRIVATE_INIT (authldap_free);
|
||||
static GOnce ldap_conn_once = G_ONCE_INIT;
|
||||
static int authldap_connect(void);
|
||||
@@ -177,6 +162,22 @@ static LDAP * ldap_con_get(void)
|
||||
}
|
||||
|
||||
/*
|
||||
+ signal-safe releasing of thread-local ldap connection
|
||||
+*/
|
||||
+static void authldap_free(gpointer data)
|
||||
+{
|
||||
+ LDAP *c = (LDAP *)data;
|
||||
+ struct sigaction act, oldact;
|
||||
+
|
||||
+ memset(&act, 0, sizeof(act));
|
||||
+ memset(&oldact, 0, sizeof(oldact));
|
||||
+ act.sa_handler = SIG_IGN;
|
||||
+ sigaction(SIGPIPE, &act, &oldact);
|
||||
+ ldap_unbind(c);
|
||||
+ sigaction(SIGPIPE, &oldact, 0);
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
* auth_ldap_bind()
|
||||
*
|
||||
* Bind to server using config credentials
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
@ -0,0 +1,30 @@
|
||||
From 91014a1cd01e17215fdc03fb5d922b5b73ac564a Mon Sep 17 00:00:00 2001
|
||||
From: Alan Hicks <ahicks@p-o.co.uk>
|
||||
Date: Fri, 14 Oct 2016 17:54:49 +0100
|
||||
Subject: [PATCH 19/33] Revert inadvertant event_assign removal
|
||||
|
||||
---
|
||||
src/server.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git src/server.c src/server.c
|
||||
index e013ac0..72fab52 100644
|
||||
--- src/server.c
|
||||
+++ src/server.c
|
||||
@@ -823,11 +823,13 @@ int server_run(ServerConfig_T *conf)
|
||||
for (i = 0; i < conf->socketcount; i++) {
|
||||
TRACE(TRACE_DEBUG, "Adding event for plain socket [%d] [%d/%d]", conf->listenSockets[i], i+1, total);
|
||||
evsock[i] = event_new(evbase, conf->listenSockets[i], EV_READ, server_sock_cb, NULL);
|
||||
+ event_assign(evsock[i], evbase, conf->listenSockets[i], EV_READ, server_sock_cb, evsock[i]);
|
||||
event_add(evsock[i], NULL);
|
||||
}
|
||||
for (k = i, i = 0; i < conf->ssl_socketcount; i++, k++) {
|
||||
TRACE(TRACE_DEBUG, "Adding event for ssl socket [%d] [%d/%d]", conf->ssl_listenSockets[i], k+1, total);
|
||||
evsock[k] = event_new(evbase, conf->ssl_listenSockets[i], EV_READ, server_sock_ssl_cb, NULL);
|
||||
+ event_assign(evsock[k], evbase, conf->ssl_listenSockets[i], EV_READ, server_sock_ssl_cb, evsock[k]);
|
||||
event_add(evsock[k], NULL);
|
||||
}
|
||||
}
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
@ -0,0 +1,25 @@
|
||||
From 7daaac91d559f15a476c39f52228cc643f4608ba Mon Sep 17 00:00:00 2001
|
||||
From: Alan Hicks <ahicks@p-o.co.uk>
|
||||
Date: Tue, 18 Oct 2016 13:38:04 +0100
|
||||
Subject: [PATCH 20/33] Reduce failed LDAP connection for search to error
|
||||
|
||||
---
|
||||
src/modules/authldap.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git src/modules/authldap.c src/modules/authldap.c
|
||||
index 065ee31..fc9db8e 100644
|
||||
--- src/modules/authldap.c
|
||||
+++ src/modules/authldap.c
|
||||
@@ -299,7 +299,7 @@ static LDAPMessage * authldap_search(const gchar *query)
|
||||
sleep(1); // Search failed. Wait before trying again.
|
||||
}
|
||||
|
||||
- TRACE(TRACE_EMERG,"unrecoverable error while talking to ldap server");
|
||||
+ TRACE(TRACE_ERR,"unrecoverable error while talking to ldap server");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
@ -0,0 +1,28 @@
|
||||
From 00ff6ae1f64337ca6e723d060ad14873f1661447 Mon Sep 17 00:00:00 2001
|
||||
From: Alan Hicks <ahicks@p-o.co.uk>
|
||||
Date: Wed, 19 Oct 2016 17:52:04 +0100
|
||||
Subject: [PATCH 21/33] Update LDAP to non deprecated search
|
||||
|
||||
---
|
||||
src/modules/authldap.c | 5 +++--
|
||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git src/modules/authldap.c src/modules/authldap.c
|
||||
index fc9db8e..11c1305 100644
|
||||
--- src/modules/authldap.c
|
||||
+++ src/modules/authldap.c
|
||||
@@ -282,8 +282,9 @@ static LDAPMessage * authldap_search(const gchar *query)
|
||||
while (err != 0 && c++ < c_tries) {
|
||||
// Loop until success or too many retries
|
||||
|
||||
- err = ldap_search_s(_ldap_conn, _ldap_cfg.base_dn, _ldap_cfg.scope_int,
|
||||
- query, _ldap_attrs, _ldap_attrsonly, &ldap_res);
|
||||
+ // timeout must be NULL as any value times out!
|
||||
+ err = ldap_search_ext_s(_ldap_conn, _ldap_cfg.base_dn, _ldap_cfg.scope_int,
|
||||
+ query, _ldap_attrs, _ldap_attrsonly, NULL, NULL, NULL, LDAP_NO_LIMIT, &ldap_res);
|
||||
|
||||
switch (err) {
|
||||
case LDAP_SUCCESS:
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
41
mail/dbmail/files/patch-0022-Clear-the-ldap-connection
Normal file
41
mail/dbmail/files/patch-0022-Clear-the-ldap-connection
Normal file
@ -0,0 +1,41 @@
|
||||
From 24869db9c10be2eb90ba2ca9095d92c5645b6320 Mon Sep 17 00:00:00 2001
|
||||
From: Alan Hicks <ahicks@p-o.co.uk>
|
||||
Date: Mon, 24 Oct 2016 15:12:09 +0100
|
||||
Subject: [PATCH 22/33] Clear the ldap connection
|
||||
|
||||
---
|
||||
src/modules/authldap.c | 4 ++++
|
||||
src/server.c | 2 ++
|
||||
2 files changed, 6 insertions(+)
|
||||
|
||||
diff --git src/modules/authldap.c src/modules/authldap.c
|
||||
index 11c1305..7fa3a73 100644
|
||||
--- src/modules/authldap.c
|
||||
+++ src/modules/authldap.c
|
||||
@@ -638,6 +638,10 @@ int auth_connect(void)
|
||||
}
|
||||
int auth_disconnect(void)
|
||||
{
|
||||
+ // Just free the pointer,
|
||||
+ // G_PRIVATE_INIT calls GDestroyNotify
|
||||
+ // which calls authldap_free()
|
||||
+ g_private_replace(&ldap_conn_key, NULL)
|
||||
return 0;
|
||||
}
|
||||
|
||||
diff --git src/server.c src/server.c
|
||||
index 72fab52..ba3ce10 100644
|
||||
--- src/server.c
|
||||
+++ src/server.c
|
||||
@@ -282,6 +282,8 @@ static int server_start_cli(ServerConfig_T *conf)
|
||||
TRACE(TRACE_ERR, "could not connect to authentication");
|
||||
return -1;
|
||||
}
|
||||
+ // Disconnect this connection as threads will create their own
|
||||
+ auth_disconnect();
|
||||
|
||||
srand((int) ((int) time(NULL) + (int) getpid()));
|
||||
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
25
mail/dbmail/files/patch-0023-Update-ldap-deprecated-unbind
Normal file
25
mail/dbmail/files/patch-0023-Update-ldap-deprecated-unbind
Normal file
@ -0,0 +1,25 @@
|
||||
From de4a37ae92bec56314318647a0561c891fee6e33 Mon Sep 17 00:00:00 2001
|
||||
From: Alan Hicks <ahicks@p-o.co.uk>
|
||||
Date: Mon, 24 Oct 2016 15:13:21 +0100
|
||||
Subject: [PATCH 23/33] Update ldap deprecated unbind
|
||||
|
||||
---
|
||||
src/modules/authldap.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git src/modules/authldap.c src/modules/authldap.c
|
||||
index 7fa3a73..9c9d82e 100644
|
||||
--- src/modules/authldap.c
|
||||
+++ src/modules/authldap.c
|
||||
@@ -173,7 +173,7 @@ static void authldap_free(gpointer data)
|
||||
memset(&oldact, 0, sizeof(oldact));
|
||||
act.sa_handler = SIG_IGN;
|
||||
sigaction(SIGPIPE, &act, &oldact);
|
||||
- ldap_unbind(c);
|
||||
+ ldap_unbind_ext(c, NULL, NULL);
|
||||
sigaction(SIGPIPE, &oldact, 0);
|
||||
}
|
||||
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
25
mail/dbmail/files/patch-0024-Fix-typo
Normal file
25
mail/dbmail/files/patch-0024-Fix-typo
Normal file
@ -0,0 +1,25 @@
|
||||
From bd6b9d7d43640abbdd7f0ca410576e0c4d97c3dd Mon Sep 17 00:00:00 2001
|
||||
From: Alan Hicks <ahicks@p-o.co.uk>
|
||||
Date: Mon, 24 Oct 2016 17:02:49 +0100
|
||||
Subject: [PATCH 24/33] Fix typo
|
||||
|
||||
---
|
||||
src/modules/authldap.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git src/modules/authldap.c src/modules/authldap.c
|
||||
index 9c9d82e..2180ed0 100644
|
||||
--- src/modules/authldap.c
|
||||
+++ src/modules/authldap.c
|
||||
@@ -641,7 +641,7 @@ int auth_disconnect(void)
|
||||
// Just free the pointer,
|
||||
// G_PRIVATE_INIT calls GDestroyNotify
|
||||
// which calls authldap_free()
|
||||
- g_private_replace(&ldap_conn_key, NULL)
|
||||
+ g_private_replace(&ldap_conn_key, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
@ -0,0 +1,50 @@
|
||||
From 53ca6f11530a73838d73d3064f4b3d48e477f614 Mon Sep 17 00:00:00 2001
|
||||
From: Alan Hicks <ahicks@p-o.co.uk>
|
||||
Date: Fri, 28 Oct 2016 16:38:20 +0100
|
||||
Subject: [PATCH 25/33] Update to ldap_unbind_ext_s and remove redundant
|
||||
sigaction
|
||||
|
||||
---
|
||||
src/modules/authldap.c | 19 ++++++++++---------
|
||||
1 file changed, 10 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git src/modules/authldap.c src/modules/authldap.c
|
||||
index 2180ed0..05c3331 100644
|
||||
--- src/modules/authldap.c
|
||||
+++ src/modules/authldap.c
|
||||
@@ -167,14 +167,15 @@ static LDAP * ldap_con_get(void)
|
||||
static void authldap_free(gpointer data)
|
||||
{
|
||||
LDAP *c = (LDAP *)data;
|
||||
- struct sigaction act, oldact;
|
||||
-
|
||||
- memset(&act, 0, sizeof(act));
|
||||
- memset(&oldact, 0, sizeof(oldact));
|
||||
- act.sa_handler = SIG_IGN;
|
||||
- sigaction(SIGPIPE, &act, &oldact);
|
||||
- ldap_unbind_ext(c, NULL, NULL);
|
||||
- sigaction(SIGPIPE, &oldact, 0);
|
||||
+
|
||||
+ int err = ldap_set_option(c, LDAP_OPT_SERVER_CONTROLS, NULL );
|
||||
+ if ( err != LDAP_OPT_SUCCESS ) {
|
||||
+ TRACE(TRACE_ERR, "Could not unset controls");
|
||||
+ }
|
||||
+
|
||||
+ if ((err = ldap_unbind_ext_s(c, NULL, NULL))) {
|
||||
+ TRACE(TRACE_ERR, "ldap_unbind_ext_s failed: %s", ldap_err2string(err));
|
||||
+ }
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -639,7 +640,7 @@ int auth_connect(void)
|
||||
int auth_disconnect(void)
|
||||
{
|
||||
// Just free the pointer,
|
||||
- // G_PRIVATE_INIT calls GDestroyNotify
|
||||
+ // G_PRIVATE_INIT calls GDestroyNotify
|
||||
// which calls authldap_free()
|
||||
g_private_replace(&ldap_conn_key, NULL);
|
||||
return 0;
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
71
mail/dbmail/files/patch-0026-Rebalance-commit-rollback
Normal file
71
mail/dbmail/files/patch-0026-Rebalance-commit-rollback
Normal file
@ -0,0 +1,71 @@
|
||||
From 1a09a645c82e07fee8d42642a83652c6c85473ff Mon Sep 17 00:00:00 2001
|
||||
From: Alan Hicks <ahicks@p-o.co.uk>
|
||||
Date: Mon, 31 Oct 2016 18:27:45 +0000
|
||||
Subject: [PATCH 26/33] Rebalance commit/rollback
|
||||
|
||||
---
|
||||
src/dm_mailboxstate.c | 9 ++++++---
|
||||
src/imapcommands.c | 1 +
|
||||
2 files changed, 7 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git src/dm_mailboxstate.c src/dm_mailboxstate.c
|
||||
index 723689a..c04b6d7 100644
|
||||
--- src/dm_mailboxstate.c
|
||||
+++ src/dm_mailboxstate.c
|
||||
@@ -212,11 +212,12 @@ T MailboxState_new(Mempool_T pool, uint64_t id)
|
||||
db_begin_transaction(c); // we need read-committed isolation
|
||||
state_load_metadata(M, c);
|
||||
state_load_messages(M, c);
|
||||
+ db_commit_transaction(c);
|
||||
CATCH(SQLException)
|
||||
LOG_SQLERROR;
|
||||
+ db_rollback_transaction(c);
|
||||
t = DM_EQUERY;
|
||||
FINALLY
|
||||
- db_commit_transaction(c);
|
||||
db_con_close(c);
|
||||
END_TRY;
|
||||
|
||||
@@ -888,11 +889,12 @@ int MailboxState_info(T M)
|
||||
TRY
|
||||
db_begin_transaction(c);
|
||||
db_getmailbox_info(M, c);
|
||||
+ db_commit_transaction(c);
|
||||
CATCH(SQLException)
|
||||
LOG_SQLERROR;
|
||||
+ db_rollback_transaction(c);
|
||||
t = DM_EQUERY;
|
||||
FINALLY
|
||||
- db_commit_transaction(c);
|
||||
db_con_close(c);
|
||||
END_TRY;
|
||||
|
||||
@@ -928,11 +930,12 @@ int MailboxState_count(T M)
|
||||
TRY
|
||||
db_begin_transaction(c);
|
||||
db_getmailbox_count(M, c);
|
||||
+ db_commit_transaction(c);
|
||||
CATCH(SQLException)
|
||||
LOG_SQLERROR;
|
||||
+ db_rollback_transaction(c);
|
||||
t = DM_EQUERY;
|
||||
FINALLY
|
||||
- db_commit_transaction(c);
|
||||
db_con_close(c);
|
||||
END_TRY;
|
||||
|
||||
diff --git src/imapcommands.c src/imapcommands.c
|
||||
index bdedb4a..43760fc 100644
|
||||
--- src/imapcommands.c
|
||||
+++ src/imapcommands.c
|
||||
@@ -946,6 +946,7 @@ void _ic_delete_enter(dm_thread_data *D)
|
||||
db_commit_transaction(c);
|
||||
CATCH(SQLException)
|
||||
LOG_SQLERROR;
|
||||
+ db_rollback_transaction(c);
|
||||
t = DM_EQUERY;
|
||||
FINALLY
|
||||
db_con_close(c);
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
@ -0,0 +1,22 @@
|
||||
From 650dd4bd29c245a290a9e3f2dc4b0f734de22b69 Mon Sep 17 00:00:00 2001
|
||||
From: Chris Mayo <aklhfex@gmail.com>
|
||||
Date: Sat, 23 Jul 2016 17:32:43 +0100
|
||||
Subject: [PATCH 27/33] ensure mailbox2dbmail is using Python 2
|
||||
|
||||
---
|
||||
contrib/mailbox2dbmail/mailbox2dbmail | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git contrib/mailbox2dbmail/mailbox2dbmail contrib/mailbox2dbmail/mailbox2dbmail
|
||||
index 6babffd..fa5c59d 100755
|
||||
--- contrib/mailbox2dbmail/mailbox2dbmail
|
||||
+++ contrib/mailbox2dbmail/mailbox2dbmail
|
||||
@@ -1,4 +1,4 @@
|
||||
-#!/usr/bin/python
|
||||
+#!/usr/bin/python2
|
||||
|
||||
# Copyright (C) 2004 Dan Weber <dan at mirrorlynx dot com>
|
||||
# Copyright (C) 2012 Paul J Stevens <paul@nfg.nl>
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
57
mail/dbmail/files/patch-0028-tidy-mailbox2dbmail-man-page
Normal file
57
mail/dbmail/files/patch-0028-tidy-mailbox2dbmail-man-page
Normal file
@ -0,0 +1,57 @@
|
||||
From 82b4d7ac22cccd411568e7ad471fc3aee93ef7a5 Mon Sep 17 00:00:00 2001
|
||||
From: Chris Mayo <aklhfex@gmail.com>
|
||||
Date: Sat, 23 Jul 2016 17:33:25 +0100
|
||||
Subject: [PATCH 28/33] tidy mailbox2dbmail man page
|
||||
|
||||
---
|
||||
contrib/mailbox2dbmail/mailbox2dbmail.1 | 8 ++++----
|
||||
contrib/mailbox2dbmail/mailbox2dbmail.yo | 8 ++++----
|
||||
2 files changed, 8 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git contrib/mailbox2dbmail/mailbox2dbmail.1 contrib/mailbox2dbmail/mailbox2dbmail.1
|
||||
index 0d35702..402ff34 100644
|
||||
--- contrib/mailbox2dbmail/mailbox2dbmail.1
|
||||
+++ contrib/mailbox2dbmail/mailbox2dbmail.1
|
||||
@@ -9,15 +9,15 @@ Version info
|
||||
.IP "\fB-h,--help\fP"
|
||||
Help Display
|
||||
.IP "\fB-b,--box\fP"
|
||||
-IMAP folder to stick mail in under user (Default: Inbox)
|
||||
+IMAP folder to stick mail in under user (default: Inbox)
|
||||
.IP "\fB-m,--mail\fP"
|
||||
-Location of Mailbox(required)
|
||||
+Location of Mailbox (required)
|
||||
.IP "\fB-u,--user\fP"
|
||||
-Username(required)
|
||||
+Username (required)
|
||||
.IP "\fB-t,--type\fP"
|
||||
Type of Mailbox: mbox, maildir, mhdir (required)
|
||||
.IP "\fB-p,--path\fP"
|
||||
-Path to dbmail-deliver(default: /usr/sbin/dbmail-deliver)
|
||||
+Path to dbmail-deliver (default: /usr/sbin/dbmail-deliver)
|
||||
.PP
|
||||
.SH "SEE ALSO"
|
||||
\fBpython(1)\fP, and \fBpydoc mailbox\fP
|
||||
diff --git contrib/mailbox2dbmail/mailbox2dbmail.yo contrib/mailbox2dbmail/mailbox2dbmail.yo
|
||||
index 46ad068..88c5fb1 100644
|
||||
--- contrib/mailbox2dbmail/mailbox2dbmail.yo
|
||||
+++ contrib/mailbox2dbmail/mailbox2dbmail.yo
|
||||
@@ -6,11 +6,11 @@ manpageoptions()
|
||||
startdit()
|
||||
dit(bf(-v,--version)) Version info
|
||||
dit(bf(-h,--help)) Help Display
|
||||
-dit(bf(-b,--box)) IMAP folder to stick mail in under user (Default: Inbox)
|
||||
-dit(bf(-m,--mail)) Location of Mailbox(required)
|
||||
-dit(bf(-u,--user)) Username(required)
|
||||
+dit(bf(-b,--box)) IMAP folder to stick mail in under user (default: Inbox)
|
||||
+dit(bf(-m,--mail)) Location of Mailbox (required)
|
||||
+dit(bf(-u,--user)) Username (required)
|
||||
dit(bf(-t,--type)) Type of Mailbox: mbox, maildir, mhdir (required)
|
||||
-dit(bf(-p,--path)) Path to dbmail-deliver(default: /usr/sbin/dbmail-deliver)
|
||||
+dit(bf(-p,--path)) Path to dbmail-deliver (default: /usr/sbin/dbmail-deliver)
|
||||
enddit()
|
||||
|
||||
manpageseealso()
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
@ -0,0 +1,34 @@
|
||||
From 17c7e5f34b66cdfc4e9621cb69431ee657cfb346 Mon Sep 17 00:00:00 2001
|
||||
From: Chris Mayo <aklhfex@gmail.com>
|
||||
Date: Fri, 22 Jul 2016 20:38:00 +0100
|
||||
Subject: [PATCH 29/33] update description of pid file location in server man
|
||||
pages
|
||||
|
||||
---
|
||||
man/serveropts.txt | 10 ++++++----
|
||||
1 file changed, 6 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git man/serveropts.txt man/serveropts.txt
|
||||
index b01400d..5e14527 100644
|
||||
--- man/serveropts.txt
|
||||
+++ man/serveropts.txt
|
||||
@@ -3,10 +3,12 @@ OPTIONS
|
||||
-------
|
||||
|
||||
-p pidfile::
|
||||
- Specify an alternate pid file. The daemons are currently hardcoded
|
||||
- to use /var/run/dbmail-<daemon> for their pid files, and will halt
|
||||
- if the pid file cannot be written. Use the -p pidfile option to
|
||||
- place the pid file in your system's preferred location.
|
||||
+ Specify an alternate pid file. By default the daemons use dbmail-<daemon>.pid
|
||||
+ for their pid files, saving them in the directory specified by the
|
||||
+ pid_directory entry in dbmail.conf or if that does not exist the value set by
|
||||
+ the configuration option --localstatedir, and will halt if the pid file
|
||||
+ cannot be written. Use the -p pidfile option to place the pid file in
|
||||
+ your system's preferred location.
|
||||
|
||||
-n::
|
||||
No daemonize: inetd mode. The program remains attached to the console from
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
@ -0,0 +1,180 @@
|
||||
From 3fd6782988f01c2f56af19012e470ea16e800f51 Mon Sep 17 00:00:00 2001
|
||||
From: Michele Comitini <michele.comitini@gmail.com>
|
||||
Date: Tue, 1 Nov 2016 21:20:16 +0100
|
||||
Subject: [PATCH 31/33] boundaries fixups: ordering of parts, do not add
|
||||
newline on boundary if there's no part after previous header (#34)
|
||||
|
||||
* Fix IMAP mailbox maintanence
|
||||
|
||||
Update message's mailbox id in a separate explicit transaction to prevent
|
||||
SQLException: ORA-01453 error on the next db_begin_transaction() call
|
||||
(see db_mailbox_seq_update() next to 'UPDATE dbmail_messages SET mailbox_idnr'
|
||||
query).
|
||||
|
||||
* add newline only if is_message
|
||||
|
||||
* better fix for rfc822 multipart messages with boundary after header
|
||||
|
||||
* fixed some race condition when closing boundaries, since key does not change. Needed ordering parts on depth DESC when key does not vary.
|
||||
|
||||
* fixes ordering in insertion
|
||||
---
|
||||
src/dm_message.c | 12 ++++---
|
||||
test/check_dbmail.h | 78 ++++++++++++++++++++++++++++++++++++++++++++-
|
||||
test/check_dbmail_message.c | 8 +++++
|
||||
3 files changed, 93 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git src/dm_message.c src/dm_message.c
|
||||
index 9d30d52..784c091 100644
|
||||
--- src/dm_message.c
|
||||
+++ src/dm_message.c
|
||||
@@ -387,7 +387,7 @@ static DbmailMessage * _mime_retrieve(DbmailMessage *self)
|
||||
"FROM %smimeparts p "
|
||||
"JOIN %spartlists l ON p.id = l.part_id "
|
||||
"JOIN %sphysmessage ph ON ph.id = l.physmessage_id "
|
||||
- "WHERE l.physmessage_id = ? ORDER BY l.part_key,l.part_order ASC",
|
||||
+ "WHERE l.physmessage_id = ? ORDER BY l.part_key, l.part_order ASC, l.part_depth DESC",
|
||||
frag, p_string_str(n), DBPFX, DBPFX, DBPFX);
|
||||
db_stmt_set_u64(stmt, 1, self->id);
|
||||
r = db_stmt_query(stmt);
|
||||
@@ -454,10 +454,14 @@ static DbmailMessage * _mime_retrieve(DbmailMessage *self)
|
||||
if ((depth > 0) && (blist[depth-1][0]))
|
||||
strncpy(boundary, blist[depth-1], MAX_MIME_BLEN-1);
|
||||
|
||||
- if (is_header && (!prev_header || prev_boundary || (prev_header && depth>0 && !prev_is_message))) {
|
||||
+ if (is_header)
|
||||
+ if (prev_header && depth>0 && !prev_is_message) {
|
||||
+ dprint("--%s\n", boundary);
|
||||
+ p_string_append_printf(m, "--%s\n", boundary);
|
||||
+ } else if (!prev_header || prev_boundary) {
|
||||
dprint("\n--%s\n", boundary);
|
||||
p_string_append_printf(m, "\n--%s\n", boundary);
|
||||
- }
|
||||
+ }
|
||||
|
||||
p_string_append_printf(m, "%s", str);
|
||||
dprint("<part is_header=\"%d\" depth=\"%d\" key=\"%d\" order=\"%d\">\n%s\n</part>\n",
|
||||
@@ -558,7 +562,7 @@ static gboolean store_mime_multipart(GMimeObject *object, DbmailMessage *m, cons
|
||||
if (boundary) {
|
||||
n++;
|
||||
m->part_depth--;
|
||||
- m->part_order=n;
|
||||
+ m->part_order++;
|
||||
}
|
||||
|
||||
if (g_mime_content_type_is_type(GMIME_CONTENT_TYPE(content_type), "multipart", "*") &&
|
||||
diff --git test/check_dbmail.h test/check_dbmail.h
|
||||
index 09c9958..439c8a1 100644
|
||||
--- test/check_dbmail.h
|
||||
+++ test/check_dbmail.h
|
||||
@@ -1561,7 +1561,7 @@ char *multipart_message8 = "From: nobody@example.org\n"
|
||||
"bmdzLnhtbFBLAQItABQABgAIAAAAIQDv0+Pp+gEAAPsDAAAQAAAAAAAAAAAAAAAAALREAABkb2NQ\n"
|
||||
"cm9wcy9hcHAueG1sUEsFBgAAAAAPAA8A3AMAAORHAAAAAA==\n"
|
||||
"\n"
|
||||
- "--_004_AAD42BB12C540843AB5C952ADD4D978901830A1Bswi52mbx1orfloc_--\";\n";
|
||||
+ "--_004_AAD42BB12C540843AB5C952ADD4D978901830A1Bswi52mbx1orfloc_--\n";
|
||||
|
||||
char *multipart_message9 = "From: a\n"
|
||||
"To: b\n"
|
||||
@@ -28440,3 +28440,79 @@ char *multipart_message_big = "From: \"Gennadiy Poryev\" <vecanoi@gmail.com>\n"
|
||||
"/g8HAAAAAwANNP0/pQ4DAA80/T+lDvA8\n"
|
||||
"\n"
|
||||
"------=_NextPart_000_0000_01CDFBC6.932A1F00--\n";
|
||||
+
|
||||
+char *multipart_message_submessage = "Content-Type: multipart/mixed; boundary=\"===============9147350442359610775==\"\n"
|
||||
+"MIME-Version: 1.0\n"
|
||||
+"To: test@test.it\n"
|
||||
+"From: test@test.it\n"
|
||||
+"\n"
|
||||
+"--===============9147350442359610775==\n"
|
||||
+"Content-Type: message/rfc822\n"
|
||||
+"MIME-Version: 1.0\n"
|
||||
+"\n"
|
||||
+"Content-Type: multipart/alternative;\n"
|
||||
+" boundary=\"===============1150329730008994878==\"\n"
|
||||
+"MIME-Version: 1.0\n"
|
||||
+"Subject: Link\n"
|
||||
+"From: my@email.com\n"
|
||||
+"To: your@email.com\n"
|
||||
+"\n"
|
||||
+"--===============1150329730008994878==\n"
|
||||
+"Content-Type: text/plain; charset=\"us-ascii\"\n"
|
||||
+"MIME-Version: 1.0\n"
|
||||
+"Content-Transfer-Encoding: 7bit\n"
|
||||
+"\n"
|
||||
+"Hi!\n"
|
||||
+"How are you?\n"
|
||||
+"Here is the link you wanted:\n"
|
||||
+"https://www.python.org\n"
|
||||
+"--===============1150329730008994878==\n"
|
||||
+"Content-Type: text/html; charset=\"us-ascii\"\n"
|
||||
+"MIME-Version: 1.0\n"
|
||||
+"Content-Transfer-Encoding: 7bit\n"
|
||||
+"\n"
|
||||
+"<html>\n"
|
||||
+" <head></head>\n"
|
||||
+" <body>\n"
|
||||
+" <p>Hi!<br>\n"
|
||||
+" How are you?<br>\n"
|
||||
+" Here is the <a href=\"https://www.python.org\">link</a> you wanted.\n"
|
||||
+" </p>\n"
|
||||
+" </body>\n"
|
||||
+"</html>\n"
|
||||
+"\n"
|
||||
+"--===============1150329730008994878==\n"
|
||||
+"Content-Type: multipart/mixed; boundary=\"===============0782181963306111896==\"\n"
|
||||
+"MIME-Version: 1.0\n"
|
||||
+"\n"
|
||||
+"--===============0782181963306111896==\n"
|
||||
+"Content-Type: text/plain; charset=\"us-ascii\"\n"
|
||||
+"MIME-Version: 1.0\n"
|
||||
+"Content-Transfer-Encoding: 7bit\n"
|
||||
+"\n"
|
||||
+"Text part3_1.\n"
|
||||
+"--===============0782181963306111896==\n"
|
||||
+"Content-Type: text/plain; charset=\"us-ascii\"\n"
|
||||
+"MIME-Version: 1.0\n"
|
||||
+"Content-Transfer-Encoding: 7bit\n"
|
||||
+"\n"
|
||||
+"Text part3_2.\n"
|
||||
+"--===============0782181963306111896==--\n"
|
||||
+"\n"
|
||||
+"\n"
|
||||
+"\n"
|
||||
+"\n"
|
||||
+"--===============1150329730008994878==--\n"
|
||||
+"\n"
|
||||
+"--===============9147350442359610775==\n"
|
||||
+"Content-Type: text/plain; charset=\"us-ascii\"\n"
|
||||
+"MIME-Version: 1.0\n"
|
||||
+"Content-Transfer-Encoding: 7bit\n"
|
||||
+"\n"
|
||||
+"This is a simple text attachment.\n"
|
||||
+"with some newlines at the end.\n"
|
||||
+"\n"
|
||||
+"\n"
|
||||
+"\n"
|
||||
+"--===============9147350442359610775==--\n"
|
||||
+"\n";
|
||||
diff --git test/check_dbmail_message.c test/check_dbmail_message.c
|
||||
index e36a2ea..f070257 100644
|
||||
--- test/check_dbmail_message.c
|
||||
+++ test/check_dbmail_message.c
|
||||
@@ -431,6 +431,14 @@ START_TEST(test_dbmail_message_store)
|
||||
COMPARE(e,t);
|
||||
g_free(e);
|
||||
g_free(t);
|
||||
+ //-----------------------------------------
|
||||
+ m = message_init(multipart_message_submessage);
|
||||
+ e = dbmail_message_to_string(m);
|
||||
+ t = store_and_retrieve(m);
|
||||
+ COMPARE(e,t);
|
||||
+ COMPARE(multipart_message_submessage, t);
|
||||
+ g_free(e);
|
||||
+ g_free(t);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
@ -0,0 +1,25 @@
|
||||
From d213fd84529b3ff3da8b32aa15ef58f2b335383d Mon Sep 17 00:00:00 2001
|
||||
From: Paul J Stevens <p.stevens@labdigital.nl>
|
||||
Date: Sat, 3 Dec 2016 17:33:13 +0100
|
||||
Subject: [PATCH 32/33] [#10083] prepend headers during delivery
|
||||
|
||||
---
|
||||
src/dm_message.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git src/dm_message.c src/dm_message.c
|
||||
index 784c091..82b0656 100644
|
||||
--- src/dm_message.c
|
||||
+++ src/dm_message.c
|
||||
@@ -892,7 +892,7 @@ const char * dbmail_message_get_envelope_recipient(const DbmailMessage *self)
|
||||
|
||||
void dbmail_message_set_header(DbmailMessage *self, const char *header, const char *value)
|
||||
{
|
||||
- g_mime_object_set_header(GMIME_OBJECT(self->content), header, value);
|
||||
+ g_mime_object_prepend_header(GMIME_OBJECT(self->content), header, value);
|
||||
}
|
||||
|
||||
const gchar * dbmail_message_get_header(const DbmailMessage *self, const char *header)
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
@ -0,0 +1,35 @@
|
||||
From 6169c48e7815f7e999e23f65c91ab7299f437b7a Mon Sep 17 00:00:00 2001
|
||||
From: Alan Hicks <ahicks@p-o.co.uk>
|
||||
Date: Sun, 15 Jan 2017 14:29:20 +0000
|
||||
Subject: [PATCH 27/27] Allow for systems that don't use proc
|
||||
|
||||
---
|
||||
src/dm_misc.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git src/dm_misc.c src/dm_misc.c
|
||||
index e795de1..1599c64 100644
|
||||
--- src/dm_misc.c
|
||||
+++ src/dm_misc.c
|
||||
@@ -106,6 +106,10 @@ int drop_privileges(char *newuser, char *newgroup)
|
||||
|
||||
int get_opened_fd_count(void)
|
||||
{
|
||||
+#if defined(__FreeBSD__) || defined(__APPLE__) || defined(__SUNPRO_C)
|
||||
+ // BSD like systems don't use proc
|
||||
+ return 0;
|
||||
+#else
|
||||
DIR* dir = NULL;
|
||||
struct dirent* entry = NULL;
|
||||
char buf[32];
|
||||
@@ -122,6 +126,7 @@ int get_opened_fd_count(void)
|
||||
closedir(dir);
|
||||
|
||||
return fd_count - 2; /* exclude '.' and '..' entries */
|
||||
+#endif
|
||||
}
|
||||
|
||||
void create_unique_id(char *target, uint64_t message_idnr)
|
||||
--
|
||||
2.10.1 (Apple Git-78)
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- acinclude.m4.orig
|
||||
--- acinclude.m4.orig 2015-01-25 10:20:50 UTC
|
||||
+++ acinclude.m4
|
||||
@@ -236,7 +236,7 @@ if ( test [ "x$lookforldap" != "xno" ] || test [ "x$lookforauthldap" != "xno" ]
|
||||
@@ -221,7 +221,7 @@ if ( test [ "x$lookforldap" != "xno" ] |
|
||||
dnl See if we already have the paths we need in the environment.
|
||||
dnl ...but only if --with-ldap was given without a specific path.
|
||||
if ( test [ "x$lookforldap" = "xyes" ] || test [ "x$lookforauthldap" = "xyes" ] ); then
|
||||
@ -9,7 +9,7 @@
|
||||
if test [ "x$LDAPLIB" != "xfailed" ]; then
|
||||
break
|
||||
fi
|
||||
@@ -248,7 +248,7 @@ if ( test [ "x$lookforldap" != "xno" ] || test [ "x$lookforauthldap" != "xno" ]
|
||||
@@ -233,7 +233,7 @@ if ( test [ "x$lookforldap" != "xno" ] |
|
||||
SAVE_CFLAGS=$CFLAGS
|
||||
dnl The headers might be in a funny place, so we need to use -Ipath
|
||||
CFLAGS="$CFLAGS -L$TEST_PATH $LDAPINC"
|
||||
@ -18,7 +18,7 @@
|
||||
CFLAGS=$SAVE_CFLAGS
|
||||
if test [ "x$LDAPLIB" != "xfailed" ]; then
|
||||
break 2
|
||||
@@ -262,7 +262,7 @@ if ( test [ "x$lookforldap" != "xno" ] || test [ "x$lookforauthldap" != "xno" ]
|
||||
@@ -247,7 +247,7 @@ if ( test [ "x$lookforldap" != "xno" ] |
|
||||
AC_MSG_ERROR([Could not find LDAP library.])
|
||||
else
|
||||
AC_DEFINE([AUTHLDAP], 1, [Define if LDAP will be used.])
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- src/clientbase.c.orig 2014-08-23 14:01:38.000000000 +0100
|
||||
+++ src/clientbase.c 2014-08-24 10:12:06.000000000 +0100
|
||||
@@ -151,7 +151,7 @@
|
||||
--- src/clientbase.c.orig 2015-01-25 10:20:50 UTC
|
||||
+++ src/clientbase.c
|
||||
@@ -151,7 +151,7 @@ ClientBase_T * client_init(client_sock *
|
||||
client->tx = STDOUT_FILENO;
|
||||
} else {
|
||||
/* server-side */
|
||||
@ -9,7 +9,7 @@
|
||||
NI_MAXHOST, client->dst_port,
|
||||
NI_MAXSERV, NI_NUMERICHOST | NI_NUMERICSERV))) {
|
||||
TRACE(TRACE_INFO, "getnameinfo::error [%s]", gai_strerror(serr));
|
||||
@@ -159,7 +159,7 @@
|
||||
@@ -159,7 +159,7 @@ ClientBase_T * client_init(client_sock *
|
||||
|
||||
/* client-side */
|
||||
if (server_conf->resolveIP) {
|
||||
@ -18,7 +18,7 @@
|
||||
NI_MAXHOST-1, NULL, 0, NI_NAMEREQD))) {
|
||||
TRACE(TRACE_INFO, "getnameinfo:error [%s]", gai_strerror(serr));
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
@@ -170,7 +170,7 @@ ClientBase_T * client_init(client_sock *
|
||||
client->clientname[0] ? client->clientname : "Lookup failed");
|
||||
} else {
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- src/dbmail.h.in.orig
|
||||
--- src/dbmail.h.in.orig 2015-01-25 10:20:50 UTC
|
||||
+++ src/dbmail.h.in
|
||||
@@ -154,6 +160,11 @@
|
||||
@@ -155,6 +155,11 @@
|
||||
#include <endian.h>
|
||||
#endif
|
||||
|
||||
@ -10,5 +10,5 @@
|
||||
+
|
||||
+
|
||||
#define GETCONFIGVALUE(key, sect, var) \
|
||||
config_get_value(key, sect, var); \
|
||||
if (strlen(var) > 0) \
|
||||
config_get_value(key, sect, var); \
|
||||
if (strlen(var) > 0) \
|
||||
|
Loading…
Reference in New Issue
Block a user