void rfc2045_free(struct rfc2045 *p) { struct rfc2045 *q, *r; for (q=p->firstpart; q; ) { r=q->next; rfc2045_free(q); q=r; } rfc2045_freeattr(p->content_type_attr); rfc2045_freeattr(p->content_disposition_attr); if (p->header) free(p->header); if (p->content_md5) free(p->content_md5); if (p->content_base) free(p->content_base); if (p->content_location) free(p->content_location); if (p->content_language) free(p->content_language); if (p->content_id) free(p->content_id); if (p->content_description) free(p->content_description); if (p->content_transfer_encoding) free(p->content_transfer_encoding); if (p->boundary) free(p->boundary); if (p->content_type) free(p->content_type); if (p->mime_version) free(p->mime_version); if (p->workbuf) free(p->workbuf); if (p->content_disposition) free(p->content_disposition); if (p->rw_transfer_encoding) free(p->rw_transfer_encoding); free(p); }
int main(int argc, char **argv) { FILE *fp; struct rfc2045 *rfc; struct msg2html_info *info; if (argc < 2) return 0; if ((fp=fopen(argv[1], "r")) == NULL) { perror(argv[1]); exit(1); } rfc=rfc2045_fromfp(fp); info=msg2html_alloc("utf-8"); info->showhtml=1; msg2html(fp, rfc, info); fclose(fp); msg2html_free(info); rfc2045_free(rfc); return (0); }
void fetch_free_cached() { if (cached_rfc2045p) { rfc2045_free(cached_rfc2045p); cached_rfc2045p=0; free(cached_filename); cached_filename=0; } }
static void show_preview(const char *filename) { char *header, *value; struct rfc2045 *rfcp; FILE *fp; int fd; fp=0; fd=maildir_safeopen(filename, O_RDONLY, 0); if (fd >= 0) if ((fp=fdopen(fd, "r")) == 0) close(fd); if (!fp) return; while ((header=maildir_readheader(fp, &value, 1)) != 0) { /* Don't show X-, From, and Content- headers in preview */ if (strncmp(header, "x-", 2) == 0) continue; if (strcmp(header, "mime-version") == 0) continue; if (strncmp(header, "content-", 8) == 0) continue; printf("%c", toupper(*header)); output_attrencoded_oknl(header+1); printf(": "); value=rfc2047_decode_enhanced(value, sqwebmail_content_charset); if (value) { output_attrencoded_oknl(value); free(value); } printf("\n"); } printf("\n"); rfcp=rfc2045_fromfp(fp); if (!rfcp) return; filter_start(FILTER_FOR_PREVIEW, &preview_show_func_s); { struct rfc2045 *q= rfc2045_searchcontenttype(rfcp, "text/plain"); if (q) rfc2045_decodemimesection(fileno(fp), q, &filter_stub, NULL); } rfc2045_free(rfcp); filter_end(); }
void newmsg_showfp(FILE *fp, int *attachcnt) { struct rfc2045 *p=rfc2045_fromfp(fp), *q; if (!p) enomem(); /* Here's a nice opportunity to count all attachments */ *attachcnt=0; for (q=p->firstpart; q; q=q->next) if (!q->isdummy) ++*attachcnt; if (*attachcnt) --*attachcnt; /* Not counting the 1st MIME part */ { const char *content_type; const char *content_transfer_encoding; const char *charset; rfc2045_mimeinfo(p, &content_type, &content_transfer_encoding, &charset); if (content_type && strcmp(content_type, "multipart/alternative") == 0) *attachcnt=0; } q=rfc2045_searchcontenttype(p, "text/plain"); if (q) { struct rfc2045src *src=rfc2045src_init_fd(fileno(fp)); if (src) { struct show_textarea_info info; show_textarea_init(&info, 1); rfc2045_decodetextmimesection(src, q, sqwebmail_content_charset, NULL, &show_textarea_trampoline, &info); rfc2045src_deinit(src); show_textarea(&info, "\n", 1); } } rfc2045_free(p); }
struct rfc2045 *rfc2045header_fromfd(int fd) { struct rfc2045 *rfc; char buf[BUFSIZ]; int n; off_t orig_pos; if ((orig_pos=lseek(fd, 0L, SEEK_CUR)) == (off_t)-1) return (NULL); if (lseek(fd, (off_t)0, SEEK_SET) == (off_t)-1) return (NULL); if ((rfc=rfc2045_alloc()) == 0) return (NULL); while (rfc->workinheader && (n=read(fd, buf, sizeof(buf))) > 0) rfc2045_parse(rfc, buf, n); if (lseek(fd, orig_pos, SEEK_SET) == (off_t)-1) { rfc2045_free(rfc); rfc=0; } return (rfc); }
void newmsg_showfp(FILE *fp, int *attachcnt) { struct rfc2045 *p=rfc2045_fromfp(fp), *q; if (!p) enomem(); /* Here's a nice opportunity to count all attachments */ *attachcnt=0; for (q=p->firstpart; q; q=q->next) if (!q->isdummy) ++*attachcnt; if (*attachcnt) --*attachcnt; /* Not counting the 1st MIME part */ q=rfc2045_searchcontenttype(p, "text/plain"); if (q) rfc2045_decodemimesection(fileno(fp), q, &show_textarea, NULL); rfc2045_free(p); }
static int search_spell(const char *filename, unsigned parnum, unsigned pos) { struct rfc2045 *rfcp, *textp; struct buf newtext, current_line; off_t start_pos, end_pos, start_body; int made_replacements, has_misspelling; char *new_line; unsigned paragraph; const char *ignoreword=""; const char *replacefrom=""; const char *replaceto=""; int checked=0; off_t dummy; FILE *fp=0; int x; x=maildir_safeopen(filename, O_RDONLY, 0); if (x >= 0) if ((fp=fdopen(x, "r")) == 0) close(x); if (!fp) return (0); rfcp=rfc2045_fromfp(fp); if (!rfcp) enomem(); textp=findtext(rfcp); if (!textp) { rfc2045_free(rfcp); fclose(fp); return (0); } buf_init(&newtext); buf_init(¤t_line); rfc2045_mimepos(textp, &start_pos, &end_pos, &start_body, &dummy, &dummy); if (fseek(fp, start_body, SEEK_SET) == -1) enomem(); made_replacements=0; has_misspelling=0; paragraph=0; for ( ; start_body < end_pos; start_body++) { int c=getc(fp); if (c < 0) enomem(); if (c != '\n') { buf_append(¤t_line, c); continue; } buf_append(¤t_line, '\0'); if (parnum) { --parnum; buf_cat(&newtext, current_line.ptr); buf_cat(&newtext, "\n"); current_line.cnt=0; ++paragraph; continue; } if (!checked) { int l; checked=1; if ((l=strlen(cgi("word"))) > 0) { /* Ok, what should we do? */ const char *newword=cgi("REPLACE"); if (!*newword || strcmp(newword, "#other") == 0) newword=cgi("OTHER"); /* ** Perhaps they entered the word without ** checking this checkmark. */ else if (*newword == '#') newword=""; if (*newword && pos + l <= strlen(current_line.ptr)) { struct buf tempbuf; buf_init(&tempbuf); buf_cpyn(&tempbuf, current_line.ptr, pos); buf_cat(&tempbuf, newword); buf_cat(&tempbuf, current_line.ptr+pos+l); pos += strlen(newword); if (*cgi("REPLACEALL")) { replacefrom=cgi("word"); replaceto=newword; } buf_append(&tempbuf, '\0'); buf_cpy(¤t_line, tempbuf.ptr); buf_append(¤t_line, '\0'); buf_free(&tempbuf); made_replacements=1; } else { pos += l; if (strcmp(cgi("REPLACE"), "#ignoreall") == 0) ignoreword=cgi("word"); } if (strcmp(cgi("REPLACE"), "#insert") == 0) { spelladd(cgi("word")); } } } if (*current_line.ptr == '>') { buf_cat(&newtext, current_line.ptr); buf_cat(&newtext, "\n"); pos=0; current_line.cnt=0; ++paragraph; continue; } if (!has_misspelling) { new_line=spell_check(current_line.ptr, paragraph, pos, ignoreword, replacefrom, replaceto, &has_misspelling); if (new_line) { buf_cat(&newtext, new_line); free(new_line); made_replacements=1; } else buf_cat(&newtext, current_line.ptr); } else buf_cat(&newtext, current_line.ptr); buf_cat(&newtext, "\n"); pos=0; current_line.cnt=0; ++paragraph; } if (current_line.cnt) buf_cat(&newtext, "\n"); rfc2045_free(rfcp); fclose(fp); if (made_replacements) { char *p=newmsg_createdraft_do(filename, newtext.ptr, NEWMSG_SQISPELL); if (p) free(p); if (*cgi("error")) { has_misspelling=0; /* Abort spell checking */ } } buf_free(&newtext); buf_free(¤t_line); if (*ignoreword) { static char *p=0; if (p) free(p); p=malloc(strlen(cgi("globignore")) + 2 + strlen(ignoreword)); if (!p) enomem(); strcpy(p, cgi("globignore")); if (*p) strcat(p, ":"); strcat(p, ignoreword); cgi_put("globignore", p); } if (*replacefrom) { static char *p=0; if (p) free(p); p=malloc(strlen(cgi("globreplace"))+3 +strlen(replacefrom)+strlen(replaceto)); if (!p) enomem(); strcpy(p, cgi("globreplace")); if (*p) strcat(p, ":"); strcat(strcat(strcat(p, replacefrom), ":"), replaceto); cgi_put("globreplace", p); free(p); } if (has_misspelling) return (1); return (0); }
int main(int argc, char **argv) { int argn; FILE *tmpfp; struct rfc2045 *rfcp; struct mimeautoreply_s replyinfo; const char *subj=0; const char *txtfile=0, *mimefile=0; const char *mimedsn=0; int nosend=0; const char *replymode="reply"; int replytoenvelope=0; int donotquote=0; const char *forwardsep="--- Forwarded message ---"; const char *replysalut="%F writes:"; struct rfc2045src *src; setlocale(LC_ALL, ""); charset=unicode_default_chset(); sender=NULL; for (argn=1; argn < argc; argn++) { char optc; char *optarg; if (argv[argn][0] != '-') break; if (strcmp(argv[argn], "--") == 0) { ++argn; break; } optc=argv[argn][1]; optarg=argv[argn]+2; if (!*optarg) optarg=NULL; switch (optc) { case 'c': if (!optarg && argn+1 < argc) optarg=argv[++argn]; if (optarg && *optarg) { char *p=libmail_u_convert_tobuf("", optarg, libmail_u_ucs4_native, NULL); if (!p) { fprintf(stderr, "Unknown charset: %s\n", charset); exit(1); } free(p); charset=optarg; } continue; case 't': if (!optarg && argn+1 < argc) optarg=argv[++argn]; txtfile=optarg; continue; case 'm': if (!optarg && argn+1 < argc) optarg=argv[++argn]; mimefile=optarg; continue; case 'r': if (!optarg && argn+1 < argc) optarg=argv[++argn]; recips=optarg; continue; case 'M': if (!optarg && argn+1 < argc) optarg=argv[++argn]; mimedsn=optarg; continue; case 'd': if (!optarg && argn+1 < argc) optarg=argv[++argn]; dbfile=optarg; continue; case 'e': replytoenvelope=1; continue; case 'T': if (!optarg && argn+1 < argc) optarg=argv[++argn]; if (optarg && *optarg) replymode=optarg; continue; case 'N': donotquote=1; continue; case 'F': if (!optarg && argn+1 < argc) optarg=argv[++argn]; if (optarg && *optarg) forwardsep=optarg; continue; case 'S': if (!optarg && argn+1 < argc) optarg=argv[++argn]; if (optarg && *optarg) replysalut=optarg; continue; case 'D': if (!optarg && argn+1 < argc) optarg=argv[++argn]; interval=optarg ? atoi(optarg):1; continue; case 'A': if (!optarg && argn+1 < argc) optarg=argv[++argn]; if (optarg) { struct header **h; for (h= &extra_headers; *h; h= &(*h)->next) ; if ((*h=malloc(sizeof(struct header))) == 0 || ((*h)->buf=strdup(optarg)) == 0) { perror("malloc"); exit(EX_TEMPFAIL); } (*h)->next=0; } continue; case 's': if (!optarg && argn+1 < argc) optarg=argv[++argn]; subj=optarg; continue; case 'f': if (optarg && *optarg) { sender=strdup(optarg); } else { sender=getenv("SENDER"); if (!sender) continue; sender=strdup(sender); } if (sender == NULL) { perror("malloc"); exit(1); } continue; case 'n': nosend=1; continue; default: usage(); } } if (!txtfile && !mimefile) usage(); if (txtfile && mimefile) usage(); tmpfp=tmpfile(); if (!tmpfp) { perror("tmpfile"); exit(1); } rfcp=savemessage(tmpfp); if (fseek(tmpfp, 0L, SEEK_SET) < 0) { perror("fseek(tempfile)"); exit(1); } read_headers(tmpfp); if (sender == NULL || *sender == 0) check_sender(); check_dsn(); check_recips(); #ifdef DbObj check_db(); #endif src=rfc2045src_init_fd(fileno(tmpfp)); memset(&replyinfo, 0, sizeof(replyinfo)); replyinfo.info.src=src; replyinfo.info.rfc2045partp=rfcp; replyinfo.info.voidarg=&replyinfo; replyinfo.info.write_func=mimeautoreply_write_func; replyinfo.info.writesig_func=mimeautoreply_writesig_func; replyinfo.info.myaddr_func=mimeautoreply_myaddr_func; replyinfo.info.replymode=replymode; replyinfo.info.replytoenvelope=replytoenvelope; replyinfo.info.donotquote=donotquote; replyinfo.info.replysalut=replysalut; replyinfo.info.forwarddescr="Forwarded message"; replyinfo.info.mailinglists=""; replyinfo.info.charset=charset; replyinfo.info.subject=subj; replyinfo.info.forwardsep=forwardsep; if (mimedsn && *mimedsn) { replyinfo.info.dsnfrom=mimedsn; replyinfo.info.replymode="replydsn"; } if (mimefile) { if ((replyinfo.contentf=fopen(mimefile, "r")) == NULL) { perror(mimefile); exit(1); } { struct rfc2045 *rfcp=rfc2045_alloc(); static const char mv[]="Mime-Version: 1.0\n"; char buf[BUFSIZ]; int l; const char *content_type; const char *content_transfer_encoding; const char *charset; rfc2045_parse(rfcp, mv, sizeof(mv)-1); while ((l=fread(buf, 1, sizeof(buf), replyinfo.contentf) ) > 0) { rfc2045_parse(rfcp, buf, l); } if (l < 0 || fseek(replyinfo.contentf, 0L, SEEK_SET) < 0) { perror(mimefile); exit(1); } rfc2045_mimeinfo(rfcp, &content_type, &content_transfer_encoding, &charset); if (strcasecmp(content_type, "text/plain")) { fprintf(stderr, "%s must specify text/plain MIME type\n", mimefile); exit(1); } { char *p=NULL; if (charset) p=libmail_u_convert_tobuf("", charset, libmail_u_ucs4_native, NULL); if (!p) { fprintf(stderr, "Unknown charset in %s\n", mimefile); exit(1); } free(p); replyinfo.info.charset=strdup(charset); } rfc2045_free(rfcp); } replyinfo.info.content_set_charset=copy_headers; replyinfo.info.content_specify=copy_body; } else if (txtfile) { if ((replyinfo.contentf=fopen(txtfile, "r")) == NULL) { perror(mimefile); exit(1); } replyinfo.info.content_specify=copy_body; } if (replyinfo.contentf) fcntl(fileno(replyinfo.contentf), F_SETFD, FD_CLOEXEC); if (nosend) replyinfo.outf=stdout; else { replyinfo.outf=tmpfile(); if (replyinfo.outf == NULL) { perror("tmpfile"); exit(1); } } { struct header *h; for (h=extra_headers; h; h=h->next) fprintf(replyinfo.outf, "%s\n", h->buf); } fprintf(replyinfo.outf, "Precedence: junk\n" "Auto-Submitted: auto-replied\n"); if (rfc2045_makereply(&replyinfo.info) < 0 || fflush(replyinfo.outf) < 0 || ferror(replyinfo.outf) || (!nosend && ( fseek(replyinfo.outf, 0L, SEEK_SET) < 0 || (close(0), dup(fileno(replyinfo.outf))) < 0) )) { perror("tempfile"); exit(1); } fclose(replyinfo.outf); fcntl(0, F_SETFD, 0); rfc2045_free(rfcp); rfc2045src_deinit(src); if (!nosend) opensendmail(argn, argc, argv); return (0); }
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); }
SubmitFile::~SubmitFile() { interrupt(); current_submit_file=0; if (rwrfcptr) rfc2045_free(rwrfcptr); }
int main(int argc, char **argv) { int argn; char optc; char *optarg; char *mimesection=0; int doinfo=0, dodecode=0, dorewrite=0, dodsn=0, domimedigest=0; struct rfc2045 *p; int rwmode=0; void (*do_extract)(struct rfc2045 *, const char *, int, char **)=0; const char *extract_filename=0; for (argn=1; argn<argc; ) { if (argv[argn][0] != '-') break; optarg=0; optc=argv[argn][1]; if (optc && argv[argn][2]) optarg=argv[argn]+2; ++argn; switch (optc) { case 'c': if (!optarg && argn < argc) optarg=argv[argn++]; if (optarg && *optarg) rfc2045_setdefaultcharset(optarg); break; case 's': if (!optarg && argn < argc) optarg=argv[argn++]; if (optarg && *optarg) mimesection=optarg; break; case 'i': doinfo=1; break; case 'e': dodecode=1; break; case 'r': dorewrite=1; if (optarg && *optarg == '7') rwmode=RFC2045_RW_7BIT; if (optarg && *optarg == '8') rwmode=RFC2045_RW_8BIT; break; case 'm': domimedigest=1; break; case 'd': dodsn=1; break; case 'D': dodsn=2; break; case 'x': do_extract=extract_file; if (optarg) extract_filename=optarg; break; case 'X': do_extract=extract_pipe; break; case 'v': printf("%s\n", rcsid); exit(0); default: usage(); } } if (domimedigest) { mimedigest(argc-argn, argv+argn); return (0); } p=read_message(); if (doinfo) print_info(p, mimesection); else if (dodecode) print_decode(p, mimesection); else if (dorewrite) rewrite(p, rwmode); else if (dodsn) dsn(p, dodsn == 2); else if (do_extract) extract_section(p, mimesection, extract_filename, argc-argn, argv+argn, do_extract); else print_structure(p); rfc2045_free(p); exit(0); return (0); }