We get a lot of our users replying to the quota warning message. The following patch adds a control file to qmail-ldap that allows the local site to specify a From address for the warning message so that replies can go to an address where they've got a better chance of getting help. This should patch cleanly against 20011101a.
john diff -urN qmail-1.03.stock/QLDAPINSTALL qmail-1.03/QLDAPINSTALL --- qmail-1.03.stock/QLDAPINSTALL Sun Nov 11 17:31:48 2001 +++ qmail-1.03/QLDAPINSTALL Mon Nov 19 19:22:01 2001 @@ -339,6 +339,12 @@ Example: You can contact us at (555) 555 5555 Note: Multiline +~control/quotawarningfrom + + Custom From address for quota warning messages. + Default: Qmail-QUOTAGUARD <MAILER-DAEMON@hostname> + Example: Internet Support <[EMAIL PROTECTED]> + ~control/quotawarning Custom text in quota warning message, e.g. for providing contact information diff -urN qmail-1.03.stock/checkpassword.c qmail-1.03/checkpassword.c --- qmail-1.03.stock/checkpassword.c Sun Nov 11 17:31:48 2001 +++ qmail-1.03/checkpassword.c Sun Nov 11 17:26:43 2001 @@ -103,7 +103,7 @@ auth_fail(argc, argv, login.s); } - if ( init_ldap(&locald, &cluster, &rebind, &homemaker, 0, 0, 0) == -1 ) { + if ( init_ldap(&locald, &cluster, &rebind, &homemaker, 0, 0, 0, 0) == -1 ) { log(1, "alert: init_ldap failed.\n"); _exit(1); } diff -urN qmail-1.03.stock/qldap-ldaplib.c qmail-1.03/qldap-ldaplib.c --- qmail-1.03.stock/qldap-ldaplib.c Sun Nov 11 17:31:48 2001 +++ qmail-1.03/qldap-ldaplib.c Sun Nov 11 17:28:54 2001 @@ -68,7 +68,8 @@ } int init_ldap(int *localdelivery, int *cluster, int *bind, stralloc *hm, - stralloc *dotmode, stralloc *quota, stralloc *quotawarning) + stralloc *dotmode, stralloc *quota, stralloc *quotawarning, + stralloc *quotawarningfrom) /* reads all necesary control files and makes everything ready for a ldap lookup * Returns 0 if successful else -1 is returned and errno is set. * Localdelivery is set to 0 or 1 as in ~control/ldaplocaldelivery specified. @@ -202,6 +203,7 @@ t += fmt_strn(cf, "control/ldapdefaultdotmode", 64); *t=0; if (control_rldef(dotmode, ctrl_file, 0, "ldaponly") == -1) return -1; if (!stralloc_0(dotmode)) return -1; + log(64, "init_ldap: control/ldapdefaultdotmode: %s\n", dotmode->s); } if ( quota != 0 ) { @@ -210,6 +212,17 @@ if (control_rldef(quota, ctrl_file, 0, "") == -1) return -1; if (!stralloc_0(quota)) return -1; + log(64, "init_ldap: control/ldapdefaultquota: %s\n", quota->s); + } + + if ( quotawarningfrom != 0 ) { + t = cf; + t += fmt_strn(cf, "control/quotawarningfrom", 64); *t=0; + if (control_rldef(quotawarningfrom, ctrl_file, 0, "") == 1) { + if (!stralloc_0(quotawarningfrom)) return -1; + log(64, "init_ldap: control/quotawarningfrom: %s\n", +quotawarningfrom->s); + } + /* Else, leave it. qmail-quotawarn will fill in a default From addr. */ } if ( quotawarning != 0 ) { @@ -221,6 +234,7 @@ } else { if (!stralloc_copys(quotawarning, "") ) return -1; } + log(64, "init_ldap: control/quotawarning: %s\n", quotawarning->s); } alloc_free(ctrl_file); diff -urN qmail-1.03.stock/qldap-ldaplib.h qmail-1.03/qldap-ldaplib.h --- qmail-1.03.stock/qldap-ldaplib.h Sun Nov 11 17:31:48 2001 +++ qmail-1.03/qldap-ldaplib.h Sun Nov 11 17:26:43 2001 @@ -27,7 +27,8 @@ } searchinfo; int init_ldap(int *localdelivery, int *cluster, int *bind, stralloc *hm, - stralloc *dotmode, stralloc *quota, stralloc *quotawarning); + stralloc *dotmode, stralloc *quota, stralloc *quotawarning, + stralloc *quotawarningfrom); /* reads all necesary control files and makes everything ready for a ldap lookup * Returns 0 if successful else -1 is returned and errno is set. * Localdelivery is set to 0 or 1 as in ~control/ldaplocaldelivery specified. diff -urN qmail-1.03.stock/qmail-ldap.h qmail-1.03/qmail-ldap.h --- qmail-1.03.stock/qmail-ldap.h Sun Nov 11 17:31:48 2001 +++ qmail-1.03/qmail-ldap.h Sun Nov 11 17:26:43 2001 @@ -91,8 +91,9 @@ */ #define ENV_HOMEDIRMAKE "QLDAPAUTOHOMEDIRMAKE" -#define ENV_QUOTA "QMAILQUOTA" -#define ENV_QUOTAWARNING "QMAILQUOTAWARNING" +#define ENV_QUOTA "QMAILQUOTA" +#define ENV_QUOTAWARNINGFROM "QMAILQUOTAWARNINGFROM" +#define ENV_QUOTAWARNING "QMAILQUOTAWARNING" #define ENV_DOTMODE "QMAILDOTMODE" #define ENV_MODE "QMAILMODE" diff -urN qmail-1.03.stock/qmail-ldaplookup.c qmail-1.03/qmail-ldaplookup.c --- qmail-1.03.stock/qmail-ldaplookup.c Sun Nov 11 17:31:48 2001 +++ qmail-1.03/qmail-ldaplookup.c Sun Nov 11 17:27:36 2001 @@ -58,6 +58,7 @@ stralloc homemaker = {0}; stralloc defdot = {0}; stralloc defquota = {0}; +stralloc quotawarningfrom = {0}; stralloc quotawarning = {0}; stralloc filter = {0}; stralloc value = {0}; @@ -140,8 +141,8 @@ log_init(STDERR, -1, 0); - if ( init_ldap( &locald, &cluster, &rebind, &homemaker, &defdot, &defquota, - "awarning) == -1 ) { + if ( init_ldap( &locald, &cluster, &rebind, &homemaker, &defdot, + &defquota, "awarning, "awarningfrom) == -1 ) { strerr_die2x(1, "ERROR: init_ldap failed: ", qldap_err_str(qldap_errno)); } @@ -153,6 +154,7 @@ output(&ssout, "\t\thomedirmaker:\t %s\n", homemaker.len?homemaker.s:"undefined"); output(&ssout, "\t\tdefaultDotMode:\t %s\n", defdot.s); output(&ssout, "\t\tdefaultQuota:\t %s\n", defquota.len?defquota.s:"undedined"); + output(&ssout, "\t\tQuotaWarningFrom:\t %s\n", +quotawarningfrom.len?quotawarningfrom.s:"undefined"); output(&ssout, "\t\tQuotaWarning:\n------\n%s\n------\n", quotawarning.len?quotawarning.s:"undefined"); diff -urN qmail-1.03.stock/qmail-lspawn.c qmail-1.03/qmail-lspawn.c --- qmail-1.03.stock/qmail-lspawn.c Sun Nov 11 17:31:48 2001 +++ qmail-1.03/qmail-lspawn.c Sun Nov 11 17:26:43 2001 @@ -45,6 +45,7 @@ extern stralloc qldap_objectclass; stralloc qldap_defdotmode = {0}; stralloc qldap_defaultquota = {0}; +stralloc qldap_quotawarningfrom = {0}; stralloc qldap_quotawarning = {0}; stralloc qldap_dirmaker = {0}; int qldap_localdelivery; @@ -65,13 +66,20 @@ void get_qldap_controls() { if ( init_ldap( &qldap_localdelivery, &qldap_cluster, 0, &qldap_dirmaker, - &qldap_defdotmode, &qldap_defaultquota, &qldap_quotawarning ) == -1 ) + &qldap_defdotmode, &qldap_defaultquota, &qldap_quotawarning, + &qldap_quotawarningfrom ) == -1 ) _exit(1); if ( qldap_dirmaker.len != 0 ) { if ( !env_put2(ENV_HOMEDIRMAKE, qldap_dirmaker.s )) _exit(QLX_NOMEM); } else { if ( !env_unset(ENV_HOMEDIRMAKE) ) _exit(QLX_NOMEM); + } + + if ( qldap_quotawarningfrom.len != 0 ) { + if ( !env_put2(ENV_QUOTAWARNINGFROM, qldap_quotawarningfrom.s )) +_exit(QLX_NOMEM); + } else { + if ( !env_unset(ENV_QUOTAWARNINGFROM) ) _exit(QLX_NOMEM); } if ( qldap_quotawarning.len != 0 ) { diff -urN qmail-1.03.stock/qmail-quotawarn.c qmail-1.03/qmail-quotawarn.c --- qmail-1.03.stock/qmail-quotawarn.c Sun Nov 11 17:31:48 2001 +++ qmail-1.03/qmail-quotawarn.c Sun Nov 11 17:26:43 2001 @@ -25,6 +25,7 @@ #include "qmail-ldap.h" /* global vars */ +stralloc warningfrom={0}; stralloc warning={0}; stralloc to={0}; stralloc from={0}; @@ -59,15 +60,23 @@ strerr_die3x(111,"Usage: ", argv[0], " mailbox (LDAP-ERR #5.0.1)"); fn = argv[1]; - - if (! (s = env_get(ENV_QUOTAWARNING) ) ) - strerr_die2x(111,ENV_QUOTAWARNING, " not present (LDAP-ERR #5.1.1)"); - if (!stralloc_copys(&warning,s)) temp_nomem(); - + if (! (s = env_get("HOST") ) ) strerr_die1x(111,"ARRG: HOST not present (LDAP-ERR #5.1.3)"); if (!stralloc_copys(&host,s)) temp_nomem(); - + + if ( (s = env_get(ENV_QUOTAWARNINGFROM) ) ) { + if (!stralloc_copys(&warningfrom,s)) temp_nomem(); + } else { + if (!stralloc_copys(&warningfrom, "Qmail-QUOTAGUARD <MAILER-DAEMON@")) +temp_nomem(); + if (!stralloc_cat(&warningfrom, &host)) temp_nomem(); + if (!stralloc_cats(&warningfrom, ">")) temp_nomem(); + } + + if (! (s = env_get(ENV_QUOTAWARNING) ) ) + strerr_die2x(111,ENV_QUOTAWARNING, " not present (LDAP-ERR #5.1.1)"); + if (!stralloc_copys(&warning,s)) temp_nomem(); + if ( fn[str_len(fn)-1] == '/' ) { write_maildir(fn); } else { @@ -148,9 +157,9 @@ if (!stralloc_cats(&to,t)) temp_nomem(); if (!stralloc_cats(&to,"\n")) temp_nomem(); - if (!stralloc_copys(&from,"From: Qmail-QUOTAGUARD <MAILER-DAEMON@")) temp_nomem(); - if (!stralloc_cat(&from,&host)) temp_nomem(); - if (!stralloc_cats(&from,">\n")) temp_nomem(); + if (!stralloc_copys(&from,"From: ")) temp_nomem(); + if (!stralloc_cat(&from,&warningfrom)) temp_nomem(); + if (!stralloc_cats(&from,"\n")) temp_nomem(); if (! (t = env_get("DTLINE") ) ) strerr_die1x(111,"ARRG: DTLINE not present (LDAP-ERR #5.1.4)"); @@ -266,9 +275,9 @@ if (!stralloc_cats(&to,t)) temp_nomem(); if (!stralloc_cats(&to,"\n")) temp_nomem(); - if (!stralloc_copys(&from,"From: Qmail-QUOTAGUARD <MAILER-DAEMON@")) temp_nomem(); - if (!stralloc_cat(&from,&host)) temp_nomem(); - if (!stralloc_cats(&from,">\n")) temp_nomem(); + if (!stralloc_copys(&from,"From: ")) temp_nomem(); + if (!stralloc_cat(&from,&warningfrom)) temp_nomem(); + if (!stralloc_cats(&from,"\n")) temp_nomem(); if (! (t = env_get("DTLINE") ) ) strerr_die1x(111,"ARRG: DTLINE not present (LDAP-ERR #5.1.4)"); -- John Morrissey _o /\ ---- __o [EMAIL PROTECTED] _-< \_ / \ ---- < \, www.horde.net/ __(_)/_(_)________/ \_______(_) /_(_)__