1 message in net.sourceforge.lists.courier-maildrop[maildropl] [PATCH] improved mysql su...
FromSent OnAttachments
Bjoern A. ZeebNov 24, 2001 11:48 am 
Actions with this message:
Paste this link in email or IM:
Paste this link in email or IM:
Atom feed for this thread
Paste this URL into your reader:
Subject:[maildropl] [PATCH] improved mysql support for maildropActions...
From:Bjoern A. Zeeb (bzee@zabbadoz.net)
Date:Nov 24, 2001 11:48:40 am
List:net.sourceforge.lists.courier-maildrop

Hi,

I made a patch to improve mysql support in maildrop:

Changes:

- minor corrections to maildropmysql.config - added MYSQL_DEFAULT_WHERE_CLAUSE (optional) [see maildropmysql.config for explanation] - corrected handling of mysql query to not SIGSEV if no matching user is found - enable one to use an 'int'-type column for quota - quota of 0 (zero) now means no quota (for mysql)

patch can also be found on http://patch.zabbadoz.net/?mail_setup=1

please review

-- Bjoern A. Zeeb bzeeb at Zabbadoz dot NeT 56 69 73 69 74 http://www.zabbadoz.net/

--- maildrop-1.3.5.vanilla/./maildrop/mdmysql.c Mon Jun 25 05:11:40 2001 +++ maildrop-1.3.5/./maildrop/mdmysql.c Sat Nov 24 20:47:56 2001 @@ -19,7 +19,7 @@ MYSQL_ROW row; mdmysqlrec *rec = NULL; static const char query[]= - "SELECT %s, %s, %s, %s, %s, %s, %s FROM %s WHERE %s = \"%s\""; + "SELECT %s, %s, %s, %s, %s, %s, %s FROM %s WHERE %s = \"%s\" %s"; char *querybuf; unsigned int querybuf_len;

@@ -45,7 +45,8 @@ + strlen(cfg->uidnumber_field) + strlen(cfg->gidnumber_field) + strlen(cfg->homedir_field) + strlen(cfg->maildir_field) + strlen(cfg->quota_field) + strlen(cfg->mailstatus_field) - + strlen(cfg->dbtable) + strlen(username); + + strlen(cfg->dbtable) + strlen(username) + + strlen(cfg->where_clause); querybuf = malloc(querybuf_len);

if (!querybuf) @@ -59,7 +60,7 @@ snprintf(querybuf, querybuf_len, query, cfg->uid_field, cfg->uidnumber_field, cfg->gidnumber_field, cfg->homedir_field, cfg->maildir_field, cfg->quota_field, cfg->mailstatus_field, - cfg->dbtable, cfg->uid_field, username); + cfg->dbtable, cfg->uid_field, username, cfg->where_clause);

if (mysql_query (mysql,querybuf)) { @@ -69,33 +70,42 @@ } free(querybuf);

- rec = (mdmysqlrec*)malloc(sizeof(mdmysqlrec)+1);

result = mysql_store_result (mysql); - if (result) + if (! result) { + mysql_close(mysql); + return NULL; + } + + rec = (mdmysqlrec*)malloc(sizeof(mdmysqlrec)+1); + + if (!mysql_num_rows(result)) { - if (mysql_num_rows(result)) - { - row = mysql_fetch_row (result); - rec->uid = strdup(row[0]); - rec->uidnumber=atoi(row[1]); - if (errno == ERANGE) rec->uidnumber = cfg->default_uidnumber; - rec->gidnumber=atoi(row[2]); - if (errno == ERANGE) rec->gidnumber = cfg->default_gidnumber; - rec->homedir=strdup(row[3]); - rec->maildir=strdup(row[4]); - rec->quota=strdup(row[5]); - rec->mailstatus=strdup(row[6]); - - if (!rec->uid || !rec->homedir || !rec->maildir || !rec->mailstatus) - { - mysql_free_result(result); - return NULL; - } - - } - mysql_free_result(result); + mysql_free_result(result); + mysql_close(mysql); + return NULL; } + + row = mysql_fetch_row (result); + rec->uid = strdup(row[0]); + rec->uidnumber=atoi(row[1]); + if (errno == ERANGE) rec->uidnumber = cfg->default_uidnumber; + rec->gidnumber=atoi(row[2]); + if (errno == ERANGE) rec->gidnumber = cfg->default_gidnumber; + rec->homedir=strdup(row[3]); + rec->maildir=strdup(row[4]); + rec->quota=strdup(row[5]); + if (atol(rec->quota) == 0) { + free(rec->quota); + rec->quota = NULL; + } + rec->mailstatus=strdup(row[6]); + + mysql_free_result(result); + mysql_close(mysql); + + if (!rec->uid || !rec->homedir || !rec->maildir || !rec->mailstatus) + return NULL;

return rec;

--- maildrop-1.3.5.vanilla/./maildrop/mdmysqlconfig.h Mon Jun 25 05:11:40 2001 +++ maildrop-1.3.5/./maildrop/mdmysqlconfig.h Sat Nov 24 20:00:04 2001 @@ -15,6 +15,7 @@ #define MYSQL_DEFAULT_HOMEDIRECTORY_FIELD "homedir" #define MYSQL_DEFAULT_QUOTA_FIELD "quota" #define MYSQL_DEFAULT_STATUS_FIELD "vmailstatus" +#define MYSQL_DEFAULT_WHERE_CLAUSE "" #define MYSQL_DEFAULT_TIMEOUT 5

typedef struct { @@ -33,6 +34,7 @@ char *maildir_field; char *quota_field; char *mailstatus_field; + char *where_clause;

int default_uidnumber; int default_gidnumber; --- maildrop-1.3.5.vanilla/./maildrop/mdmysqlconfig.c Mon Jun 25 05:11:40 2001 +++ maildrop-1.3.5/./maildrop/mdmysqlconfig.c Sat Nov 24 19:59:52 2001 @@ -30,6 +30,7 @@ cfg->homedir_field = NULL; cfg->quota_field = NULL; cfg->mailstatus_field = NULL; + cfg->where_clause = NULL;

cfg->port = MYSQL_DEFAULT_PORT; cfg->socket = NULL; @@ -69,6 +70,12 @@ cfg->quota_field = (char*)strdup(val); if ( !strcasecmp(var,"mailstatus_field") ) cfg->mailstatus_field = (char*)strdup(val); + if ( !strcasecmp(var,"where_clause") ) { + if ( !strncasecmp(val,"and", 3) ) { + val = buf+=3; + cfg->where_clause = (char*)strdup(val); + } + }

if ( !strcasecmp(var,"timeout") ) cfg->timeout = atoi(val); @@ -96,6 +103,8 @@ cfg->quota_field = (char*)strdup(MYSQL_DEFAULT_QUOTA_FIELD); if ( !cfg->mailstatus_field ) cfg->mailstatus_field = (char*)strdup(MYSQL_DEFAULT_STATUS_FIELD); + if ( !cfg->where_clause ) + cfg->where_clause = (char*)strdup(MYSQL_DEFAULT_WHERE_CLAUSE); }

free(buf); @@ -125,6 +134,7 @@ free(cfg[0]->homedir_field); free(cfg[0]->quota_field); free(cfg[0]->mailstatus_field); + free(cfg[0]->where_clause);

free(*cfg);

--- maildrop-1.3.5.vanilla/./maildropmysql.config Mon Jun 25 05:11:40 2001 +++ maildrop-1.3.5/./maildropmysql.config Sat Nov 24 20:07:47 2001 @@ -22,9 +22,8 @@ # # quota - *OPTIONAL* The quota for this user. If blank, or # non-existent defaults to no quota. -# mailstatus - account status # -# A sample LDAP entry is given at the end of this file. +# mailstatus - account status # # --- Actual configuration begins here -----------------------------

@@ -78,4 +77,15 @@ # QUOTA_FIELD - MySQL attribute which contains the users quota quota_field quota

-mailstatus_field mailstatus +# MYSQL_DEFAULT_STATUS_FIELD - MySQL attribute which could be created in the +# MySQL entry to set whether or not the user is allowed to receive email on +# this box.. +# -- looks unused for now; but must be valid column ! (2001-11-03) +mailstatus_field vmailstatus + +# MYSQL_DEFAULT_WHERE_CLAUSE - This is optional ! +# It can be set to any fixed string starting with keyword 'AND'. +# It will then be appended to the WHERE clause of our query. +where_clause "" + +