5 messages in net.sourceforge.lists.courier-usersRe: [courier-users] sqwebmail and .ma...
FromSent OnAttachments
Mark ConstableMay 29, 2005 3:23 am 
Sam VarshavchikMay 29, 2005 5:24 am 
Mark ConstableMay 29, 2005 5:59 am 
Sam VarshavchikMay 29, 2005 8:11 am 
Mark ConstableMay 29, 2005 9:58 pm 
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:Re: [courier-users] sqwebmail and .mailfiltersActions...
From:Mark Constable (mar@renta.net)
Date:May 29, 2005 9:58:38 pm
List:net.sourceforge.lists.courier-users

On Monday 30 May 2005 01:11, Sam Varshavchik wrote:

ERROR: Unable to save rule - contact system administrator

when doing a "Save All Changes". These perms look okay to me so is there something else I am (probably) missing ?

I can't find this error message anywhere in my source code.

courier 0.47, which is apparently a bit old now... could anyone suggest the most likely place this is failing? I posted my $HOME perms in a previous message and they look fine to me, everything is daemon:daemon inc mail and apache, and the temp file gets saved okay, just not ../.mailfilter.

-rw------- 1 daemon daemon 326 May 30 14:46 maildirfilter.tmp

I can't imagine the binary having to be SUID ?

-rwxr-xr-x 1 root root 7360 Jan 27 08:31 sqwebmail

webmail/html/en-us/filter.html: [#$INTERNAL=<span style="color: #ee0000">ERROR: Unable to save rule - contact
system administrator</span><br />#]

webmail/mailfilter.c: if (*cgi("do.save")) { if (maildir_filter_exportmaildirfilter(".") || maildir_filter_importmaildirfilter(".")) printf("%s", getarg("INTERNAL")); else printf("%s", getarg("UPDATED")); clrfields(); }

/etc/courier/maildirfilterconfig: MAILDIRFILTER=$HOME/.mailfilter

maildir/maildirfilter2.c:

int maildir_filter_exportmaildirfilter(const char *maildir) { char *maildirfilter=maildir_filter_config_maildirfilter(maildir); char *newname; int rc;

if (!maildirfilter) return (-1);

newname=malloc(strlen(maildir)+sizeof("/maildirfilter.tmp")); if (!newname) { free(maildirfilter); return (-1); }

strcat(strcpy(newname, maildir), "/maildirfilter.tmp"); rc=rename(newname, maildirfilter); free(maildirfilter); free(newname); return (rc); }

int maildir_filter_importmaildirfilter(const char *maildir) { const char *p=maildir_filter_config(maildir, "MAILDIRFILTER"); char *maildirfilter; FILE *i, *o; struct maildir_tmpcreate_info createInfo;

if (!p) return (-1);

if (!*p) { errno=ENOENT; return (-1); }

maildirfilter=maildir_filter_config_maildirfilter(maildir); if (!maildirfilter) return (-1);

maildir_tmpcreate_init(&createInfo);

createInfo.maildir=maildir; createInfo.uniq="maildirfilter-tmp"; createInfo.doordie=1;

if ((o=maildir_tmpcreate_fp(&createInfo)) == NULL) { free(maildirfilter); return (-1); }

strcat(strcpy(createInfo.newname, maildir), "/maildirfilter.tmp"); /* We enough we have enough mem: .uniq */

if ((i=fopen(maildirfilter, "r")) == 0) { struct maildirfilter mf;

if (errno != ENOENT) { fclose(o); unlink(createInfo.tmpname); maildir_tmpcreate_free(&createInfo); free(maildirfilter); return (-1); }

memset(&mf, 0, sizeof(mf)); fclose(o); unlink(createInfo.tmpname); unlink(createInfo.newname); maildir_filter_savemaildirfilter(&mf, maildir, ""); /* write out a blank one */ } else { char buf[BUFSIZ]; int n;

while ((n=fread(buf, 1, sizeof(buf), i)) > 0) if (fwrite(buf, 1, n, o) != n) { fclose(o); fclose(i); unlink(createInfo.tmpname); maildir_tmpcreate_free(&createInfo); free(maildirfilter); return (-1); } if (fflush(o)) { fclose(o); fclose(i); unlink(createInfo.tmpname); maildir_tmpcreate_free(&createInfo); free(maildirfilter); return (-1); } fclose(o); fclose(i); if (chmod(createInfo.tmpname, 0600) || rename(createInfo.tmpname, createInfo.newname)) { unlink(createInfo.tmpname); maildir_tmpcreate_free(&createInfo); free(maildirfilter); return (-1); } }

maildir_tmpcreate_free(&createInfo); free(maildirfilter); return (0); }

--markc