const char *rfc2045_boundary(const struct rfc2045 *p) { const char *cb=rfc2045_getattr( p->content_type_attr, "boundary"); if (!cb) cb=""; return (cb); }
static struct rfc2045 *append_part(struct rfc2045 *p, size_t startpos) { struct rfc2045 *newp=append_part_noinherit(p, startpos); /* Substructures inherit content transfer encoding and character set */ set_string(&newp->content_transfer_encoding, p->content_transfer_encoding); rfc2045_setattr(&newp->content_type_attr, "charset", rfc2045_getattr(p->content_type_attr, "charset")); return (newp); }
int libmail_gpgmime_is_decoded(const struct rfc2045 *q, int *retcode) { const char *p; if (!q->content_type || strcasecmp(q->content_type, "multipart/x-mimegpg")) return (0); p=rfc2045_getattr(q->content_type_attr, "xpgpstatus"); if (!p) return (0); *retcode=atoi(p); return (1); }
void rfc2045_mimeinfo(const struct rfc2045 *p, const char **content_type_s, const char **content_transfer_encoding_s, const char **charset_s) { const char *c; *content_type_s=GETINFO(p->content_type, "text/plain"); *content_transfer_encoding_s=GETINFO(p->content_transfer_encoding, "8bit"); c=rfc2045_getattr(p->content_type_attr, "charset"); if (!c) c=rfc2045_getdefaultcharset(); *charset_s=c; }
char *rfc2045_related_start(const struct rfc2045 *p) { const char *cb=rfc2045_getattr( p->content_type_attr, "start"); struct rfc822t *t; struct rfc822a *a; int i; if (!cb || !*cb) return (0); t=rfc822t_alloc_new(cb, 0, NULL); if (!t) { rfc2045_enomem(); return(0); } a=rfc822a_alloc(t); if (!a) { rfc822t_free(t); rfc2045_enomem(); return (0); } for (i=0; i<a->naddrs; i++) if (a->addrs[i].tokens) { char *s=rfc822_getaddr(a, i); rfc822a_free(a); rfc822t_free(t); if (!s) rfc2045_enomem(); return (s); } rfc822a_free(a); rfc822t_free(t); return (0); }
int rfc2045_isflowed(const struct rfc2045 *p) { const char *cb=rfc2045_getattr(p->content_type_attr, "format"); return (cb && strcmp(cb, "flowed") == 0); }
static void dsn(struct rfc2045 *p, int do_orig) { const char *content_type_s; const char *content_transfer_encoding_s; const char *charset_s; off_t start_pos, end_pos, start_body; off_t dummy; const char *q; char buf[BUFSIZ]; unsigned i; int ch; char *recip; char *action; char *orecip; rfc2045_mimeinfo(p, &content_type_s, &content_transfer_encoding_s, &charset_s); if (strcasecmp(content_type_s, "multipart/report") || (q=rfc2045_getattr(p->content_type_attr, "report-type")) == 0 || strcasecmp(q, "delivery-status") || !p->firstpart || !p->firstpart->next || !p->firstpart->next->next) _exit(1); p=p->firstpart->next->next; rfc2045_mimeinfo(p, &content_type_s, &content_transfer_encoding_s, &charset_s); rfc2045_mimepos(p, &start_pos, &end_pos, &start_body, &dummy, &dummy); if (strcasecmp(content_type_s, "message/delivery-status") || fseek(stdin, start_body, SEEK_SET) == -1) _exit(1); i=0; recip=0; orecip=0; action=0; while (start_body < end_pos) { if ((ch=getchar()) == EOF) break; ++start_body; if (i < sizeof(buf)-1) buf[i++]= ch; if (ch != '\n') continue; ch=getchar(); if (ch != EOF) ungetc(ch, stdin); if (ch != '\n' && isspace((int)(unsigned char)ch)) continue; buf[i-1]=0; if (buf[0] == 0) { if (orecip) { if (recip) free(recip); recip=orecip; orecip=0; } print_dsn_recip(recip, action); recip=0; action=0; } if (strncasecmp(buf, "Final-Recipient:", 16) == 0 && recip == 0) { recip=strdup(buf+16); if (!recip) { perror("strdup"); exit(2); } } if (strncasecmp(buf, "Original-Recipient:", 19) == 0 && orecip == 0 && do_orig) { orecip=strdup(buf+19); if (!orecip) { perror("strdup"); exit(2); } } if (strncasecmp(buf, "Action:", 7) == 0 && action == 0) { action=strdup(buf+7); if (!action) { perror("strdup"); exit(2); } } i=0; } if (orecip) { if (recip) free(recip); recip=orecip; orecip=0; } print_dsn_recip(recip, action); }
int rfc2045_ac_check(struct rfc2045 *p, int rwmode) { int flag=0; /* Flag - rewriting suggested */ struct rfc2045 *c; int hasnon7bit=p->has8bitchars; /* hasnon7bit: 8bit chars in this section or subsections */ const char *te; int is8bitte; for (c=p->firstpart; c; c=c->next) if (!c->isdummy) { if (rfc2045_ac_check(c, rwmode)) flag=1; if (strcmp(c->content_transfer_encoding, "7bit") && strcmp(c->content_transfer_encoding, "quoted-printable")) hasnon7bit=1; if (c->has8bitchars) p->has8bitchars=1; } if (RFC2045_ISMIME1DEF(p->mime_version) && !p->content_type) { if ((p->content_type=strdup("text/plain")) == 0) rfc2045_enomem(); if (p->mime_version) { flag=1; } } if (RFC2045_ISMIME1DEF(p->mime_version) && !rfc2045_getattr(p->content_type_attr, "charset") && strncasecmp(p->content_type, "text/", 5) == 0) { rfc2045_setattr(&p->content_type_attr, "charset", rfc2045_getdefaultcharset()); if (p->mime_version && p->firstpart == 0 /* sam - don't trigger rewrites on changes to multipart headers */ ) { flag=1; } } if (RFC2045_ISMIME1DEF(p->mime_version) && !p->content_transfer_encoding) { if ((p->content_transfer_encoding=strdup( hasnon7bit ? "8bit":"7bit")) == 0) rfc2045_enomem(); if (p->mime_version && p->firstpart == 0 /* sam - don't trigger rewrites on changes to multipart headers */ ) { flag=1; } } #if 0 if (RFC2045_ISMIME1DEF(p->mime_version) && strncmp(p->content_type, "text/", 5) == 0 && !hasnon7bit && strcmp(p->content_transfer_encoding, "7bit")) { if (p->mime_version) { flag=1; } } #endif if (RFC2045_ISMIME1DEF(p->mime_version)) { /* Check for conversions */ te=p->content_transfer_encoding; is8bitte=strcasecmp(te, "base64") && strcasecmp(te, "quoted-printable") && strcasecmp(te, "7bit"); /* 8 bit contents */ if (is8bitte && !p->has8bitchars && !p->haslongline) { if (p->rw_transfer_encoding) free(p->rw_transfer_encoding); if ((p->rw_transfer_encoding=strdup("7bit")) == 0) rfc2045_enomem(); flag=1; is8bitte=0; } if (rwmode == RFC2045_RW_7BIT && (is8bitte || p->haslongline)) { if (p->rw_transfer_encoding) free(p->rw_transfer_encoding); if ((p->rw_transfer_encoding=strdup("quoted-printable")) == 0) rfc2045_enomem(); flag=1; } else if (rwmode == RFC2045_RW_8BIT && strcasecmp(te, "quoted-printable") == 0 && !p->haslongline) { if (p->rw_transfer_encoding) free(p->rw_transfer_encoding); if ((p->rw_transfer_encoding=strdup(hasnon7bit ? "8bit":"7bit")) == 0) rfc2045_enomem(); flag=1; } } if (!p->mime_version) { if ((p->mime_version=strdup("1.0")) == 0) rfc2045_enomem(); } return (flag); }