void pref_setfrom(const char *p) { if (pref_from) free(pref_from); // by lfan // pref_from=strdup(p); pref_from = malloc(256); if (!pref_from) enomem(); sprintf(pref_from, "\"%s\" <%s>", p, login_returnaddr()); pref_update(); }
const char *login_fromhdr() { const char *address=login_returnaddr(); const char *fullname=getenv("AUTHFULLNAME"); int l; const char *p; char *q; static char *hdrbuf=0; if (!fullname || !*fullname) return (address); /* That was easy */ l=sizeof("\"\" <>")+strlen(address)+strlen(fullname); for (p=fullname; *p; p++) if (*p == '"' || *p == '\\' || *p == '(' || *p == ')' || *p == '<' || *p == '>') ++l; for (p=address; *p; p++) if (*p == '"' || *p == '\\' || *p == '(' || *p == ')' || *p == '<' || *p == '>') ++l; if (hdrbuf) free(hdrbuf); hdrbuf=malloc(l); if (!hdrbuf) enomem(); q=hdrbuf; *q++='"'; for (p=fullname; *p; p++) { if (*p == '"' || *p == '\\' || *p == '(' || *p == ')' || *p == '<' || *p == '>') *q++ = '\\'; *q++= *p; } *q++='"'; *q++=' '; *q++='<'; for (p=address; *p; p++) { if (*p == '"' || *p == '\\' || *p == '(' || *p == ')' || *p == '<' || *p == '>') *q++ = '\\'; *q++= *p; } *q++='>'; *q=0; return (hdrbuf); }
int acl_read(maildir_aclt_list *l, const char *folder, char **owner) { struct maildir_info minfo; int rc; if (maildir_info_imap_find(&minfo, folder, login_returnaddr())<0) { return -1; } rc=acl_read2(l, &minfo, owner); maildir_info_destroy(&minfo); return rc; }
// by lfan void get_dotqmail_file( char* fpath ) { struct vqpasswd *mypw; char *user, *domain, *p, *p2; p=login_returnaddr(); p2=strdup(p); user=strtok(p2, "@"); domain=strtok(0, "@"); if ( (mypw = vauth_getpw( user, domain )) != NULL ) { sprintf( fpath, "%s/.qmail", mypw->pw_dir ); free(mypw); } if( p2 ) free(p2); }
int maildir_filter_savemaildirfilter(struct maildirfilter *mf, const char *maildir, const char *from) { // by lfan, to support .qmail-user forward file char *p, *p2, *user; char *maildirpath; //const char *maildirpath=maildir_filter_config(maildir, "MAILDIR"); struct maildir_tmpcreate_info createInfo; int fd, rc; p=login_returnaddr(); p2=strdup(p); user=strtok(p2, "@"); p = malloc(strlen(user) + 12); sprintf( p, "./%s/Maildir", user ); free(p2); maildirpath=p; if (!maildirpath || !*maildirpath) { errno=EINVAL; return (-1); } maildir_tmpcreate_init(&createInfo); createInfo.maildir=maildir; createInfo.uniq="maildirfilter-tmp"; createInfo.doordie=1; if ((fd=maildir_tmpcreate_fd(&createInfo)) < 0) return -1; close(fd); unlink(createInfo.tmpname); strcat(strcpy(createInfo.newname, maildir), "/maildirfilter.tmp"); rc=maildir_filter_saverules(mf, createInfo.tmpname, maildir, maildirpath, from); if (rc == 0 && rename(createInfo.tmpname, createInfo.newname)) rc= -1; maildir_tmpcreate_free(&createInfo); free(p); return (rc); }
void acl_computeRights(maildir_aclt_list *l, char *rights, const char *owner) { char *p, *q; maildir_aclt a; if (maildir_acl_computerights(&a, l, login_returnaddr(), owner) < 0) { *rights=0; return; } for (p=q=rights; *p; p++) { if (strchr(maildir_aclt_ascstr(&a), *p)) *q++ = *p; } *q=0; maildir_aclt_destroy(&a); }
static int dosendmsg(const char *origdraft) { pid_t pid; const char *returnaddr; int pipefd1[2]; char *filename; const char *line; char *draftmessage; int isgpgerr; unsigned long filesize; struct stat stat_buf; int dsn; if (tokencheck()) /* Duplicate submission - message was already sent */ { sendmsg_done(); return (1); } if (strcmp(cgi("form"), "doattach") == 0) { /* When called from the attachment window, we do NOT create ** a new draft message */ draftmessage=strdup(origdraft); } else draftmessage=newmsg_createdraft(origdraft); if (!draftmessage) enomem(); filename=newmsg_createsentmsg(draftmessage, &isgpgerr, 1); if (!filename) { char *draftbase=maildir_basename(draftmessage); if (isgpgerr) { cgi_put("draftmessage", draftbase); output_form("gpgerr.html"); } else { http_redirect_argss("&form=newmsg&pos=%s" "&draft=%s&error=quota", cgi("pos"), draftbase); } free(draftmessage); free(draftbase); return (1); } if (pipe(pipefd1) != 0) { cgi_put("foldermsg", "ERROR: pipe() failed."); maildir_msgpurgefile(SENT, filename); free(filename); free(draftmessage); return (0); } returnaddr=login_returnaddr(); dsn= *cgi("dsn") != 0; pid=fork(); if (pid < 0) { cgi_put("foldermsg", "ERROR: fork() failed."); close(pipefd1[0]); close(pipefd1[1]); maildir_msgpurgefile(SENT, filename); free(filename); free(draftmessage); return (0); } if (pid == 0) { static const char noexec[]="ERROR: Unable to execute sendit.sh.\n"; static const char nofile[]="ERROR: Temp file not available - probably exceeded quota.\n"; char *tmpfile=maildir_find(SENT, filename); int fd; if (!tmpfile) { fwrite((char*)nofile, 1, sizeof(nofile)-1, stderr); _exit(1); } close(0); fd=maildir_safeopen(tmpfile, O_RDONLY, 0); close(1); close(2); dup(pipefd1[1]); dup(pipefd1[1]); close(pipefd1[0]); close(pipefd1[1]); if (dsn) putenv("DSN=-Nsuccess,delay,fail"); else putenv("DSN="); if (fd == 0) execl(SENDITSH, "sendit.sh", returnaddr, sqwebmail_mailboxid, NULL); fwrite(noexec, 1, sizeof(noexec)-1, stderr); _exit(1); } close(pipefd1[1]); line=geterrbuf(pipefd1[0]); close(pipefd1[0]); if (waitfor(pid)) { if (!*line) line="Unable to send message.\n"; } else line=""; if (*line == 0) /* Succesfully sent message */ { if (*draftmessage) { char *base=maildir_basename(draftmessage); char *draftfile=maildir_find(DRAFTS, base); free(base); /* Remove draft file */ if (draftfile) { char *replytofolder=0, *replytomsg=0; char *header, *value; FILE *fp; int x; fp=0; x=maildir_safeopen(draftfile, O_RDONLY, 0); if ( maildir_parsequota(draftfile, &filesize)) { if (x < 0 || fstat(x, &stat_buf)) stat_buf.st_size=0; filesize=stat_buf.st_size; } if (x >= 0) if ((fp=fdopen(x, "r")) == 0) close(x); /* First, look for a message that we should ** mark as replied */ while (fp && (header=maildir_readheader(fp, &value, 0)) != 0) { if (strcmp(header,"x-reply-to-folder") == 0 && !replytofolder) { replytofolder=strdup(value); if (!replytofolder) enomem(); } if (strcmp(header,"x-reply-to-msg") == 0 && !replytomsg) { replytomsg=strdup(value); if (!replytomsg) enomem(); } if (replytofolder && replytomsg) break; } if (fp) fclose(fp); if (replytofolder && replytomsg) maildir_markreplied(replytofolder, replytomsg); if (replytofolder) free(replytofolder); if (replytomsg) free(replytomsg); maildir_quota_deleted(".", -(long)filesize, -1); unlink(draftfile); free(draftfile); } } tokensave(); if (*cgi("fcc") == 0) { unsigned long filesize=0; char *tmpfile=maildir_find(SENT, filename); if (tmpfile) { maildir_parsequota(tmpfile, &filesize); unlink(tmpfile); maildir_quota_deleted(".", -(long)filesize,-1); free(tmpfile); } } free(filename); free(draftmessage); sendmsg_done(); return (1); } if (stat(filename, &stat_buf) == 0) maildir_quota_deleted(".", -(long)stat_buf.st_size, -1); maildir_msgpurgefile(SENT, filename); free(filename); { char *draftbase=maildir_basename(draftmessage); http_redirect_argsss("&form=newmsg&pos=%s&draft=%s&foldermsg=%s", cgi("pos"), draftbase, line); free(draftmessage); free(draftbase); } return (1); }
const char *login_fromhdr() { const char *address=login_returnaddr(); const char *fullname=getenv("AUTHFULLNAME"); int l; const char *p; char *q; static char *hdrbuf=0; FILE *fp; char authcharset[128]; char *ufullname=0; static char *uhdrbuf=0; if (!fullname || !*fullname) return (address); /* That was easy */ authcharset[0] = 0; if ((fp=fopen(AUTHCHARSET, "r"))) { char *p; if (fgets(authcharset, sizeof(authcharset), fp) == NULL) authcharset[0]=0; fclose(fp); if ((p=strchr(authcharset, '\n'))) *p = '\0'; } if (authcharset[0] == 0 && sqwebmail_system_charset && *sqwebmail_system_charset && strcasecmp(sqwebmail_system_charset, "ASCII")) strncat(authcharset, sqwebmail_system_charset, sizeof(authcharset)-1); if (authcharset[0] && sqwebmail_content_charset && *sqwebmail_content_charset && (ufullname=libmail_u_convert_toutf8(fullname, authcharset,NULL))) fullname = ufullname; l=sizeof("\"\" <>")+strlen(address)+strlen(fullname); for (p=fullname; *p; p++) if (*p == '"' || *p == '\\' || *p == '(' || *p == ')' || *p == '<' || *p == '>') ++l; for (p=address; *p; p++) if (*p == '"' || *p == '\\' || *p == '(' || *p == ')' || *p == '<' || *p == '>') ++l; if (hdrbuf) free(hdrbuf); hdrbuf=malloc(l); if (!hdrbuf) enomem(); q=hdrbuf; *q++='"'; for (p=fullname; *p; p++) { if (*p == '"' || *p == '\\' || *p == '(' || *p == ')' || *p == '<' || *p == '>') *q++ = '\\'; *q++= *p; } *q++='"'; *q++=' '; *q++='<'; for (p=address; *p; p++) { if (*p == '"' || *p == '\\' || *p == '(' || *p == ')' || *p == '<' || *p == '>') *q++ = '\\'; *q++= *p; } *q++='>'; *q=0; if (ufullname) free(ufullname); if (uhdrbuf) free(uhdrbuf); if ((uhdrbuf=libmail_u_convert_fromutf8(hdrbuf, sqwebmail_content_charset, NULL)) != NULL) return (uhdrbuf); return (hdrbuf); }
static int ismyaddr(const char *p, void *dummy) { return (strcmp(p, login_returnaddr()) == 0); }
static void doupdate() { maildir_aclt_list l; char *owner; char buf[2]; char *p; struct maildir_info minfo; if (maildir_info_imap_find(&minfo, sqwebmail_folder, login_returnaddr()) < 0) return; if (acl_read2(&l, &minfo, &owner) < 0) { maildir_info_destroy(&minfo); return; } strcpy(buf, ACL_ADMINISTER); acl_computeRights(&l, buf, owner); if (!*buf) { if (owner) free(owner); maildir_aclt_list_destroy(&l); maildir_info_destroy(&minfo); return; } if (*cgi("delentity")) { if (maildir_aclt_list_del(&l, cgi("delentity"))) printf("%s", getarg("ACL_failed")); } if (*cgi("do.update")) { char *entity=NULL; const char *p; char new_acl[40]; p=cgi("entitytype"); if (strcmp(p, "anonymous") == 0 || strcmp(p, "owner") == 0) entity=strdup(p); else if (strcmp(p, "user") == 0) { p=cgi("entity"); if (*p) { entity=malloc(sizeof("user="******"user="******"group") == 0) { p=cgi("entity"); if (*p) { entity=malloc(sizeof("group=")+strlen(p)); if (entity) strcat(strcpy(entity, "group="), p); } } else { entity=strdup(cgi("entity")); } if (*cgi("negate") == '-' && entity) { char *p=malloc(strlen(entity)+2); if (p) strcat(strcpy(p, "-"), entity); free(entity); entity=p; } if (entity) { char *val= unicode_convert_toutf8(entity, sqwebmail_content_charset, NULL); if (val) { free(entity); entity=val; } } p=getarg("ACL_all"); new_acl[0]=0; while (*p && strlen(new_acl) < sizeof(new_acl)-2) { char b[40]; sprintf(b, "acl_%c", *p); if (*cgi(b)) { b[0]=*p; b[1]=0; strcat(new_acl, b); } ++p; } if (!entity || !*entity || maildir_aclt_list_add(&l, entity, new_acl, NULL) < 0) printf("%s", getarg("ACL_failed")); if (entity) free(entity); } p=maildir_name2dir(".", minfo.maildir); if (p) { const char *err_ident; if (maildir_acl_write(&l, minfo.homedir, strncmp(p, "./", 2) == 0 ? p+2:p, owner, &err_ident)) printf("%s", getarg("ACL_failed")); free(p); } if (owner) free(owner); maildir_aclt_list_destroy(&l); maildir_info_destroy(&minfo); }
void listrights() { maildir_aclt_list l; char buf[40]; char *owner; if (*cgi("do.update") || *cgi("delentity")) { struct maildir_info minfo; if (maildir_info_imap_find(&minfo, sqwebmail_folder, login_returnaddr()) == 0) { if (minfo.homedir) { struct maildirwatch *w; char *lock; int tryanyway; w=maildirwatch_alloc(minfo.homedir); if (!w) { maildir_info_destroy(&minfo); enomem(); return; } lock=maildir_lock(minfo.homedir, w, &tryanyway); maildir_info_destroy(&minfo); if (lock == NULL) { if (!tryanyway) { printf("%s", getarg("ACL_noaccess")); return; } } doupdate(); if (lock) { unlink(lock); free(lock); } maildirwatch_free(w); } } } if (acl_read(&l, sqwebmail_folder, &owner) < 0) { printf("%s", getarg("ACL_cantread")); return; } buf[0]=0; strncat(buf, getarg("ACL_all"), sizeof(buf)-2); acl_computeRights(&l, buf, owner); maildir_aclt_list_destroy(&l); if (owner) free(owner); if (!maildir_acl_canlistrights(buf)) { printf("%s", getarg("ACL_cantread")); return; } showrights(buf); }