void sendmsg_done() { if ( *cgi("pos")) http_redirect_argss("&form=readmsg&pos=%s", cgi("pos"), ""); else if (*cgi("sendmsg")) http_redirect_argss("&form=folders&foldermsg=sent", "", ""); else http_redirect_argss("&form=folders", "", ""); }
void sendmsg_done() { /* by lfan, add send OK function */ if (*cgi("savedraft")) { if ( *cgi("pos")) http_redirect_argss("&form=readmsg&pos=%s", cgi("pos"), ""); else http_redirect_argss("&form=folders", "", ""); } else { if ( *cgi("pos") ) http_redirect_argss("&form=sendok&pos=%s", cgi("pos"), ""); else http_redirect_argss("&form=sendok&pos=%s", "-1", ""); } }
void newmsg_do(const char *folder) { const char *draftmessage=cgi("draftmessage"); if (*draftmessage) /* It's ok if it's blank */ { CHECKFILENAME(draftmessage); } if (*cgi("savedraft")) { char *newdraft=newmsg_createdraft(draftmessage); if (!newdraft) enomem(); free(newdraft); sendmsg_done(); return; } if (*cgi("sendmsg") && dosendmsg(draftmessage)) return; if (*cgi("doattachments")) { char *newdraft=newmsg_createdraft(draftmessage); char *base; if (!newdraft) enomem(); if (*cgi("error")) { cgi_put("previewmsg", "1"); output_form("newmsg.html"); return; } base=maildir_basename(newdraft); http_redirect_argss("&form=attachments&pos=%s&draft=%s", cgi("pos"), base); free(base); free(newdraft); return; } #ifdef ISPELL if (*cgi("startspellchk")) { char *newdraft=newmsg_createdraft(draftmessage); char *base; if (!newdraft) enomem(); base=maildir_basename(newdraft); free(newdraft); if (spell_start(base) == 0) { cgi_put("draftmessage", base); output_form("spellchk.html"); } else { http_redirect_argss("&form=newmsg&pos=%s&draft=%s&previewmsg=SPELLCHK", cgi("pos"), base); } free(base); return; } #endif if (*ispreviewmsg()||cgi("return")) { output_form("newmsg.html"); return; } http_redirect_argsss("&form=newmsg&pos=%s&draftmessage=%s&error=%s", cgi("pos"), draftmessage, cgi("error")); }
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); }