char *newmsg_newdraft(const char *folder, const char *pos, const char *forwardsep, const char *replysalut) { char *filename=0; char *replymode; size_t pos_n; FILE *fp; const char *mimeidptr; char *draftfilename; struct rfc2045 *rfc2045p, *rfc2045partp; int x; if (*cgi(replymode="reply") || *cgi(replymode="replyall") || *cgi(replymode="replylist") || *cgi(replymode="forward") || *cgi(replymode="forwardatt")) { pos_n=atol(pos); filename=get_msgfilename(folder, &pos_n); } if (!filename) return (0); fp=0; x=maildir_semisafeopen(filename, O_RDONLY, 0); if (x >= 0) if ((fp=fdopen(x, "r")) == 0) close(x); if (fp == 0) { free(filename); return (0); } rfc2045p=rfc2045_fromfp(fp); if (!rfc2045p) { fclose(fp); enomem(); } mimeidptr=cgi("mimeid"); rfc2045partp=0; if (*mimeidptr) { rfc2045partp=rfc2045_find(rfc2045p, mimeidptr); if (rfc2045partp) { const char *content_type, *dummy; rfc2045_mimeinfo(rfc2045partp, &content_type, &dummy, &dummy); if (!content_type || strcmp(content_type, "message/rfc822")) rfc2045partp=0; else rfc2045partp=rfc2045partp->firstpart; } } if (!rfc2045partp) rfc2045partp=rfc2045p; draftfd=maildir_createmsg(DRAFTS, 0, &draftfilename); if (draftfd < 0) { fclose(fp); rfc2045_free(rfc2045p); enomem(); } maildir_writemsgstr(draftfd, "From: "); { const char *f=pref_from; if (!f || !*f) f=login_fromhdr(); if (!f) f=""; maildir_writemsgstr(draftfd, f); maildir_writemsgstr(draftfd, "\n"); } { char *ml=getmailinglists(); struct rfc2045_mkreplyinfo ri; int rc; memset(&ri, 0, sizeof(ri)); ri.fd=fileno(fp); ri.rfc2045partp=rfc2045partp; ri.replymode=replymode; ri.replysalut=replysalut; ri.forwardsep=forwardsep; ri.myaddr_func=ismyaddr; ri.write_func=writefunc; ri.writesig_func=newmsg_writesig; ri.mailinglists=ml; ri.charset=sqwebmail_content_charset; if (strcmp(replymode, "forward") == 0 || strcmp(replymode, "forwardatt") == 0) { #if HAVE_SQWEBMAIL_UNICODE rc=rfc2045_makereply_unicode(&ri); #else rc=rfc2045_makereply(&ri); #endif } else { char *basename=maildir_basename(filename); maildir_writemsgstr(draftfd, "X-Reply-To-Folder: "); maildir_writemsgstr(draftfd, folder); maildir_writemsgstr(draftfd, "\nX-Reply-To-Msg: "); maildir_writemsgstr(draftfd, basename); free(basename); maildir_writemsgstr(draftfd, "\n"); #if HAVE_SQWEBMAIL_UNICODE rc=rfc2045_makereply_unicode(&ri); #else rc=rfc2045_makereply(&ri); #endif } free(ml); if (rc) { fclose(fp); close(draftfd); rfc2045_free(rfc2045p); enomem(); } } fclose(fp); if (maildir_closemsg(draftfd, DRAFTS, draftfilename, 1, 0)) { free(draftfilename); draftfilename=0; cgi_put("error", "quota"); } free(filename); rfc2045_free(rfc2045p); return(draftfilename); }
void newmsg_init(const char *folder, const char *pos) { const char *tolab=getarg("TOLAB"); const char *cclab=getarg("CCLAB"); const char *bcclab=getarg("BCCLAB"); const char *subjectlab=getarg("SUBJECTLAB"); const char *messagelab=getarg("MESSAGELAB"); const char *sendlab=getarg("SENDLAB"); const char *previewlab=getarg("PREVIEWLAB"); const char *forwardsep=getarg("FORWARDLAB"); const char *savedraft=getarg("SAVEDRAFT"); const char *attachmentslab=getarg("ATTACHMENTS"); const char *uploadlab=getarg("UPLOAD"); const char *replysalutation=getarg("SALUTATION"); const char *checkspellingdone=getarg("SPELLCHECKDONE"); const char *checkspelling=getarg("CHECKSPELLING"); const char *quotaerr=getarg("QUOTAERR"); const char *fromlab=getarg("FROMLAB"); const char *replytolab=getarg("REPLYTOLAB"); const char *addressbooklab=getarg("ADDRESSBOOK"); const char *select1=getarg("SELECT1"); const char *select2=getarg("SELECT2"); const char *text1=getarg("TEXT1"); const char *text2=getarg("TEXT2"); char *draftmessage; char *draftmessagefilename; const char *p; FILE *fp; int attachcnt=0; char *cursubj, *curto, *curcc, *curbcc, *curfrom, *curreplyto; int wbnochangingfrom; /* Picking up an existing draft? */ p=cgi("draft"); if (*p) { CHECKFILENAME(p); } if (*p) { draftmessage=strdup(p); if (!draftmessage) enomem(); p=""; } else { draftmessage=newmsg_newdraft(folder, pos, forwardsep, replysalutation); if (!draftmessage) { if (*ispreviewmsg()) { p=cgi("draftmessage"); if (*p) { CHECKFILENAME(p); } draftmessage=newmsg_createdraft(p); } } } draftmessagefilename= draftmessage ? maildir_find(INBOX "." DRAFTS, draftmessage):0; if (*(p=cgi("previewmsg"))) { #ifdef ISPELL if (strcmp(p, "SPELLCHK") == 0) printf("%s<br /><br />\n", checkspellingdone); #endif printf("<table width=\"100%%\" border=\"0\" cellspacing=\"0\" cellpadding=\"1\" class=\"box-small-outer\"><tr><td>\n"); printf("<table width=\"100%%\" border=\"0\" cellspacing=\"0\" cellpadding=\"4\" class=\"preview\"><tr><td>\n"); if (draftmessagefilename) { const char *p=strrchr(draftmessagefilename, '/'); if (p) ++p; else p=draftmessagefilename; newmsg_preview(p); } printf("</td></tr></table>\n"); printf("</td></tr></table>\n"); printf("<table width=\"100%%\" border=\"0\" cellspacing=\"0\" cellpadding=\"6\"><tr><td><hr width=\"80%%\" /></td></tr></table>\n"); } printf("<input type=\"hidden\" name=\"form\" value=\"donewmsg\" />\n"); newmsg_hiddenheader("pos", pos); newmsg_hiddenheader("focusto", *cgi("newmsg") ? "headers":"text"); /* Generate unique message token, to detect duplicate SUBMITs */ tokennew(); /* Display any error message */ if (*cgi("foldermsg")) { printf("<p><span class=\"error\" style=\"color: #ff0000\">"); output_attrencoded_nltobr(cgi("foldermsg")); printf("</span></p>"); } if (strcmp(cgi("error"), "quota") == 0) printf("%s", quotaerr); /* Read message from the draft file */ cursubj=0; curto=0; curfrom=0; curreplyto=0; curcc=0; curbcc=0; fp=0; if (draftmessagefilename) { int x=maildir_safeopen(draftmessagefilename, O_RDONLY, 0); if (x >= 0) if ((fp=fdopen(x, "r")) == 0) close(x); } if (fp != 0) { char *header, *value; while ((header=maildir_readheader(fp, &value, 0)) != 0) { char **rfchp=0; if (strcmp(header, "subject") == 0) { if (!cursubj && !(cursubj=strdup(value))) enomem(); continue; } while (*value && isspace(*value)) ++value; if (strcmp(header, "from") == 0) rfchp= &curfrom; if (strcmp(header, "reply-to") == 0) rfchp= &curreplyto; if (strcmp(header, "to") == 0) rfchp= &curto; if (strcmp(header, "cc") == 0) rfchp= &curcc; if (strcmp(header, "bcc") == 0) rfchp= &curbcc; if (rfchp) { char *newh=malloc ( (*rfchp ? strlen(*rfchp)+2:1) +strlen(value)); if (!newh) enomem(); strcpy(newh, value); if (*rfchp) strcat(strcat(newh, ","), *rfchp); if (*rfchp) free( *rfchp ); *rfchp=newh; } } } printf("<table width=\"100%%\" border=\"0\" cellspacing=\"0\" cellpadding=\"1\" class=\"box-small-outer\"><tr><td>\n"); printf("<table width=\"100%%\" border=\"0\" cellspacing=\"0\" cellpadding=\"4\" class=\"new-message-box\"><tr><td>\n"); printf("<table border=\"0\" width=\"100%%\">\n"); wbnochangingfrom=auth_getoptionenvint("wbnochangingfrom"); if (wbnochangingfrom < 2) newmsg_header_rfc822(fromlab, "headerfrom", curfrom, *cgi("from") ? cgi("from"): pref_from && *pref_from ? pref_from: login_fromhdr(), wbnochangingfrom ? 1:0); printf("<tr valign=\"middle\"><th align=\"right\">" "<p class=\"new-message-header\">" "<span class=\"new-message-header-addressbook\">" "%s</span></p></th><td width=\"6\"> </td>", addressbooklab); printf("<td valign=\"middle\">"); printf("<table border=\"0\" cellpadding=\"0\" cellspacing=\"4\">"); printf("<tr valign=\"middle\"><td>%s\n", select1); ab_listselect(); printf("%s</td><td width=\"100%%\">", select2); printf("<input type=\"submit\" name=\"addressbook_to\" value=\"%s\" />", tolab); printf("<input type=\"submit\" name=\"addressbook_cc\" value=\"%s\" />", cclab); printf("<input type=\"submit\" name=\"addressbook_bcc\" value=\"%s\" />", bcclab); printf("</td></tr></table>"); printf("</td></tr>\n"); #if 0 { FILE *fp; fp=fopen("/tmp/pid", "w"); fprintf(fp, "%d", getpid()); fclose(fp); sleep(10); } #endif newmsg_header_rfc822(tolab, "headerto", curto, cgi("to"), 0); newmsg_header_rfc822(cclab, "headercc", curcc, cgi("cc"), 0); newmsg_header_rfc822(bcclab, "headerbcc", curbcc, cgi("bcc"), 0); newmsg_header_rfc822(replytolab, "headerreply-to", curreplyto, cgi("replyto"), 0); newmsg_header(subjectlab, "headersubject", cursubj, cgi("subject")); if (curto) free(curto); if (curfrom) free(curfrom); if (curreplyto) free(curreplyto); if (curcc) free(curcc); if (curbcc) free(curbcc); if (cursubj) free(cursubj); printf("<tr><td colspan=\"3\"><hr width=\"100%%\" /></td></tr>"); printf("<tr>" "<th valign=\"top\" align=\"right\">" "<p class=\"new-message-header\">" "<span class=\"new-message-header-message\">" "%s</span></p></th><td width=\"6\"> </td>" "<td><select name=\"textformat\">" "<option value=\"plain\" %s>%s</option>" "<option value=\"wiki\" %s>%s</option></select>" "<small>(<a href='%s/wikifmt.html' target='_blank'>%s</a>)</small>" "</td></tr>" "<tr><th valign=\"top\" align=\"right\">" "<p class=\"new-message-header\">" "<span class=\"new-message-header-message\">" "%s</span></p></th><td width=\"6\"> </td>", getarg("FMTNAME"), pref_wikifmt ? "":"selected='selected'", getarg("FMTTEXTPLAIN"), pref_wikifmt ? "selected='selected'":"", getarg("FMTTEXTWIKI"), get_imageurl(), getarg("FMTHELP"), messagelab); printf("<td>%s\n", text1); if (fp) { newmsg_showfp(fp, &attachcnt); } else { printf("%s", cgi("body")); } printf("%s\n", text2); if (draftmessage && *draftmessage) { printf("<input type=\"hidden\" name=\"draftmessage\" value=\""); output_attrencoded(draftmessage); printf("\" />"); } if (draftmessage) free(draftmessage); printf("</td></tr>\n"); printf("<tr><th valign=\"top\" align=\"right\">" "<p class=\"new-message-header\">" "<span class=\"new-message-header-message\">" "%s</span></p></th><td> </td>" "<td>%d <input type=\"submit\" name=\"doattachments\" value=\"%s\" /></td></tr>", attachmentslab, attachcnt, uploadlab); printf("<tr><td colspan=\"2\" align=\"right\"><input type=\"checkbox\" " "name=\"fcc\" id=\"fcc\"%s /></td><td><label for=\"fcc\">%s</label></td></tr>\n", pref_noarchive ? "":" checked=\"checked\"", getarg("PRESERVELAB")); if (auth_getoptionenvint("wbnodsn") == 0) printf("<tr><td colspan=\"2\" align=\"right\"><input type=\"checkbox\" " "name=\"dsn\" id=\"dsn\" /></td><td><label for=\"dsn\">%s</label></td></tr>\n", getarg("DSN")); if (libmail_gpg_has_gpg(GPGDIR) == 0) { char *all_addr; printf("<tr><td colspan=\"2\" align=\"right\"><input type=\"checkbox\" " "name=\"sign\" id=\"sign\" /></td><td><label for=\"sign\">%s</label><select name=\"signkey\">", getarg("SIGNLAB")); gpgselectkey(); printf("</select></td></tr>\n"); all_addr=newmsg_alladdrs(fp); printf("<tr valign=\"middle\"><td colspan=\"2\" align=\"right\">" "<input type=\"checkbox\" name=\"encrypt\" id=\"encrypt\" /></td>" "<td><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr valign=\"middle\"><td><label for=\"encrypt\">%s</label></td><td><select size=\"4\" multiple=\"multiple\" name=\"encryptkey\">", getarg("ENCRYPTLAB")); gpgencryptkeys(all_addr); printf("</select></td></tr>\n"); printf("</table></td></tr>\n"); if (ishttps()) printf("<tr><td colspan=\"2\" align=\"left\"> </td><td>%s<input type=\"password\" name=\"passphrase\" /></td></tr>\n", getarg("PASSPHRASE")); if (all_addr) free(all_addr); } if (fp) fclose(fp); if (draftmessagefilename) free(draftmessagefilename); printf("<tr><td colspan=\"2\"> </td><td>"); printf("<input type=\"submit\" name=\"previewmsg\" value=\"%s\" />", previewlab); printf("<input type=\"submit\" name=\"sendmsg\" value=\"%s\" />", sendlab); printf("<input type=\"submit\" name=\"savedraft\" value=\"%s\" />", savedraft); #ifdef ISPELL printf("<input type=\"submit\" name=\"startspellchk\" value=\"%s\" />", checkspelling); #endif printf("</td></tr>\n"); printf("</table>\n"); printf("</td></tr></table>\n"); printf("</td></tr></table>\n"); }