diff --git a/exec/load/mime.js b/exec/load/mime.js new file mode 100644 index 0000000000000000000000000000000000000000..69bd08f54c84353fb176058c99edaf9e96a03dc6 --- /dev/null +++ b/exec/load/mime.js @@ -0,0 +1,623 @@ +/* + * Takes an RFC822 message and creates a parsed object out of it + * The object looks like this: +{ + header:{ + fields:[{name,value}], + raw, + }, + mime:{ // As with header but MIME headers only + fields:[{name,value}], + raw, + }, + text:"String" +} + */ + +var abnf={}; + +/************************/ +/* Core (from RFC5234) */ +/************************/ +abnf.ALPHA="[\\x41-\\x5a\\x61-\\x7a]"; +abnf.BIT="[01]"; +abnf.CHAR="[\\x01-\\x7f]"; +abnf.CR="\\x0d"; +abnf.CTL="[\\x00-\\x1f\\x7f]"; +abnf.DIGIT="[\\x30-\\x39]"; +abnf.DQUOTE='"'; +abnf.HEXDIG="[\\x30-\\x39A-F]"; +abnf.HTAB="\\x09"; +abnf.LF="\\x0a"; +abnf.CRLF="[\\x0a\\x0d]"; +abnf.LWSP="(?:(?:(?:\\x0d\\x0a)?[\\t ])*)"; +abnf.OCTET="[\\x00-\\xff]"; +abnf.SP="\\x20"; +abnf.VCHAR="[\\x21-\\x7e]"; +abnf.WSP="[\\t ]"; + +/*****************/ +/* From RFC 5322 */ +/*****************/ +var rfc5322abnf={}; + +// 4.1 Miscellaneous Obsolete Tokens +rfc5322abnf.obs_NO_WS_CTL="[\\x01-\\x08\\x0b-\\x0c\\x0e-\\x1f\\x7f]"; +rfc5322abnf.obs_ctext=rfc5322abnf.obs_NO_WS_CTL; +rfc5322abnf.obs_qtext=rfc5322abnf.obs_NO_WS_CTL; +rfc5322abnf.obs_utext="(?:\\x00|"+rfc5322abnf.obs_NO_WS_CTL+"|"+abnf.VCHAR+")"; +rfc5322abnf.obs_qp="(?:\\\\(?:\\x00|"+rfc5322abnf.obs_NO_WS_CTL+"|"+abnf.LF+"|"+abnf.CR+"))"; + +// 3.2.1 Quoted characters +rfc5322abnf.quoted_pair="(?:(?:\\\\(?:"+abnf.VCHAR+"|"+abnf.WSP+"))|"+rfc5322abnf.obs_qp+")"; + +// 4.2 Obsolete Folding White Space +rfc5322abnf.obs_FWS="(?:"+abnf.WSP+"+(?:"+abnf.CRLF+abnf.WSP+"+)*)"; + +// 3.2.2 Folding White Space and Comments +rfc5322abnf.FWS="(?:(?:(?:"+abnf.WSP+"*"+abnf.CRLF+")?"+abnf.WSP+"+)|"+rfc5322abnf.obs_FWS+")"; + +// 4.1 Miscellaneous Obsolete Tokens +rfc5322abnf.obs_unstruct="(?:(?:(?:"+abnf.LF+"*"+abnf.CR+"*"+"(?:"+rfc5322abnf.obs_utext+abnf.LF+"*"+abnf.CR+"*)*)|"+rfc5322abnf.FWS+")*)"; + +// 3.2.2 Folding White Space and Comments +rfc5322abnf.ctext="[\\x21-\\x27\\x2a-\\x5b\\x5d-\\x7e]"; +// RECURSIVE!!! +//rfc5322abnf.comment="(?:\\((?:"+rfc5322abnf.FWS+"?"+rfc5322abnf.ccontent+")*"+rfc5322abnf.FWS+"?\\))"; +//rfc5322abnf.ccontent="(?:"+rfc5322abnf.ctext+"|"+rfc5322abnf.quoted_pair+"|"+rfc5322abnf.comment+")"; +// To fix this, we'll do a magic comment which does not allow comments in it (otherwise a copy/paste from ccontent) +// THIS NEEDS TO BE REMOVED MULTIPLE TIMES UNTIL IT'S GONE! +rfc5322abnf.comment="(?:\\((?:"+rfc5322abnf.FWS+"?"+"(?:"+rfc5322abnf.ctext+"|"+rfc5322abnf.quoted_pair+")"+")*"+rfc5322abnf.FWS+"?\\))"; +rfc5322abnf.CFWS="(?:(?:(?:"+rfc5322abnf.FWS+"?"+rfc5322abnf.comment+")+"+rfc5322abnf.FWS+"?)|"+rfc5322abnf.FWS+")"; + +// 3.2.3 Atom +rfc5322abnf.atext="(?:"+abnf.ALPHA+"|"+abnf.DIGIT+"|[\\!\\#\\$\\%\\&\\+\\-\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~])"; +rfc5322abnf.atom="(?:"+rfc5322abnf.CFWS+"?"+rfc5322abnf.atext+"+"+rfc5322abnf.CFWS+")"; +rfc5322abnf.dot_atom_text="(?:"+rfc5322abnf.atext+"+(?:\\."+rfc5322abnf.atext+"+)*)"; +rfc5322abnf.dot_atom="(?:"+rfc5322abnf.CFWS+"?"+rfc5322abnf.dot_atom_text+rfc5322abnf.CFWS+")"; +rfc5322abnf.specials="(?:[\\(\\)\\<\\>\\[\\]\\:\\;\\@\\\\\\,\\.]|"+abnf.DQUOTE+")"; + +// 3.2.4 Quoted Strings +rfc5322abnf.qtext="[\\x21\\x32-\\x5b\\x5d-\\x7e]"; +rfc5322abnf.qcontent="(?:"+rfc5322abnf.qtext+"|"+rfc5322abnf.quoted_pair+")"; +rfc5322abnf.quoted_string="(?:"+rfc5322abnf.CFWS+"?"+abnf.DQUOTE+"(?:"+rfc5322abnf.FWS+"?"+rfc5322abnf.qcontent+")*"+rfc5322abnf.FWS+"?"+abnf.DQUOTE+rfc5322abnf.CFWS+")"; + +// 3.2.5 Miscellaneous Tokens +rfc5322abnf.word="(?:"+rfc5322abnf.atom+"|"+rfc5322abnf.quoted_string+")"; + +// 4.1 Miscellaneous Obsolete Tokens +rfc5322abnf.obs_phrase="(?:"+rfc5322abnf.word+"(?:"+rfc5322abnf.word+"|\\.|"+rfc5322abnf.CFWS+")*)"; + +// 3.2.5 Miscellaneous Tokens +rfc5322abnf.phrase="(?:"+rfc5322abnf.word+"+|"+rfc5322abnf.obs_phrase+")"; + +// 3.2.5 Miscellaneous Tokens +rfc5322abnf.unstructured="(?:(?:(?:"+rfc5322abnf.FWS+"?"+abnf.VCHAR+")*"+abnf.WSP+"*)|"+rfc5322abnf.obs_unstruct+")"; + +// 3.3 Date and Time Specification +rfc5322abnf.day_name="(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)"; + +// 4.3 Obsolete Date and Time +rfc5322abnf.obs_day_of_week="(?:"+rfc5322abnf.CFWS+"?"+rfc5322abnf.day_name+rfc5322abnf.CFWS+"?)"; + +// 3.3 Date and Time Specification +rfc5322abnf.day_of_week="(?:(?:"+rfc5322abnf.FWS+"?"+rfc5322abnf.day_name+")|"+rfc5322abnf.obs_day_of_week+")"; + +// 4.3 Obsolete Date and Time +rfc5322abnf.obs_day="(?:"+rfc5322abnf.CFWS+"?"+abnf.DIGIT+"{1,2}"+rfc5322abnf.CFWS+"?)"; + +// 3.3 Date and Time Specification +rfc5322abnf.day="(?:(?:"+rfc5322abnf.FWS+"?"+abnf.DIGIT+"{1,2}"+rfc5322abnf.FWS+")|"+rfc5322abnf.obs_day+")"; +rfc5322abnf.month="(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)"; + +// 4.3 Obsolete Date and Time +rfc5322abnf.obs_year="(?:"+rfc5322abnf.CFWS+"?"+abnf.DIGIT+"{2,}"+rfc5322abnf.CFWS+"?)"; + +// 3.3 Date and Time Specification +rfc5322abnf.year="(?:(?:"+rfc5322abnf.FWS+abnf.DIGIT+"{4,}"+rfc5322abnf.FWS+")|"+rfc5322abnf.obs_year+")"; +rfc5322abnf.date="(?:"+rfc5322abnf.day+rfc5322abnf.month+rfc5322abnf.year+")"; + +// 4.3 Obsolete Date and Time +rfc5322abnf.obs_hour="(?:"+rfc5322abnf.CFWS+"?"+abnf.DIGIT+"{2}"+rfc5322abnf.CFWS+"?)"; + +// 3.3 Date and Time Specification +rfc5322abnf.hour="(?:"+abnf.DIGIT+"{2}|"+rfc5322abnf.obs_hour+")"; + +// 4.3 Obsolete Date and Time +rfc5322abnf.obs_minute="(?:"+rfc5322abnf.CFWS+"?"+abnf.DIGIT+"{2}"+rfc5322abnf.CFWS+"?)"; + +// 3.3 Date and Time Specification +rfc5322abnf.minute="(?:"+abnf.DIGIT+"{2}|"+rfc5322abnf.obs_minute+")"; + +// 4.3 Obsolete Date and Time +rfc5322abnf.obs_second="(?:"+rfc5322abnf.CFWS+"?"+abnf.DIGIT+"{2}"+rfc5322abnf.CFWS+"?)"; + +// 3.3 Date and Time Specification +rfc5322abnf.second="(?:"+abnf.DIGIT+"{2}|"+rfc5322abnf.obs_second+")"; + +// 4.3 Obsolete Date and Time +rfc5322abnf.obs_zone="(?:UT|GMT|EST|EDT|CST|CDT|MST|MDT|PST|PDT|[\\x41-\\x49\\x4b-\\x5a\\x61-\\x69\\x6b-\\x7a])"; + +// 3.3 Date and Time Specification +rfc5322abnf.zone="(?:(?:"+rfc5322abnf.FWS+"[\\+\\-]"+abnf.DIGIT+"{4})|"+rfc5322abnf.obs_zone+")"; +rfc5322abnf.time_of_day="(?:"+rfc5322abnf.hour+":"+rfc5322abnf.minute+"(?::"+rfc5322abnf.second+")?)"; +rfc5322abnf.time="(?:"+rfc5322abnf.time_of_day+rfc5322abnf.zone+")"; +rfc5322abnf.date_time="(?:(?:"+rfc5322abnf.day_of_week+",)?"+rfc5322abnf.date+rfc5322abnf.time+rfc5322abnf.CFWS+"?)"; + +// 4.4 Obsolete Addressing +rfc5322abnf.obs_local_part="(?:"+rfc5322abnf.word+"(?:\\."+rfc5322abnf.word+")*)"; + +// 3.4.1 Addr-Spec Specification +rfc5322abnf.local_part="(?:"+rfc5322abnf.dot_atom+"|"+rfc5322abnf.quoted_string+"|"+rfc5322abnf.obs_local_part+")"; + +// 4.4 Obsolete Addressing +rfc5322abnf.obs_dtext="(?:"+rfc5322abnf.obs_NO_WS_CTL+"|"+rfc5322abnf.quoted_pair+")"; + +// 3.4.1 Addr-Spec Specification +rfc5322abnf.dtext="(?:[\\x21-\\x5a\\x5e-\\x7e]|"+rfc5322abnf.obs_dtext+")"; +rfc5322abnf.domain_literal="(?:"+rfc5322abnf.CFWS+"?\\[(?:"+rfc5322abnf.FWS+"?"+rfc5322abnf.dtext+")*"+rfc5322abnf.FWS+"?\\]"+rfc5322abnf.CFWS+"?)"; + +// 4.4 Obsolete Addressing +rfc5322abnf.obs_domain="(?:"+rfc5322abnf.atom+"(?:\\."+rfc5322abnf.atom+")*)"; + +// 3.4.1 Addr-Spec Specification +rfc5322abnf.domain="(?:"+rfc5322abnf.dot_atom+"|"+rfc5322abnf.domain_literal+"|"+rfc5322abnf.obs_domain+")"; +rfc5322abnf.addr_spec="(?:"+rfc5322abnf.local_part+"@"+rfc5322abnf.domain+")"; + +// 4.4 Obsolete Addressing +rfc5322abnf.obs_domain_list="(?:(?:"+rfc5322abnf.CFWS+"|,)*@"+rfc5322abnf.domain+"(?:,"+rfc5322abnf.CFWS+"?(?:@"+rfc5322abnf.domain+")?)*)"; +rfc5322abnf.obs_route="(?:"+rfc5322abnf.obs_domain_list+":)"; +rfc5322abnf.obs_angle_addr="(?:"+rfc5322abnf.CFWS+"?\\<"+rfc5322abnf.obs_route+rfc5322abnf.addr_spec+"\\>"+rfc5322abnf.CFWS+"?)"; + +// 3.4 Address Specification +rfc5322abnf.angle_addr="(?:"+rfc5322abnf.CFWS+"?\\<"+rfc5322abnf.addr_spec+"\\>"+rfc5322abnf.CFWS+"?|"+rfc5322abnf.obs_angle_addr+")"; +rfc5322abnf.display_name=rfc5322abnf.phrase; +rfc5322abnf.name_addr="(?:"+rfc5322abnf.display_name+"|"+rfc5322abnf.angle_addr+")"; +rfc5322abnf.mailbox="(?:"+rfc5322abnf.name_addr+"|"+rfc5322abnf.addr_spec+")"; + +// 4.4 Obsolete Addressing +rfc5322abnf.obs_mbox_list="(?:(?:"+rfc5322abnf.CFWS+",)*"+rfc5322abnf.mailbox+"(?:,(?:"+rfc5322abnf.mailbox+"|"+rfc5322abnf.CFWS+")?)*)"; + +// 3.4 Address Specifications +rfc5322abnf.mailbox_list="(?:(?:"+rfc5322abnf.mailbox+"(?:,"+rfc5322abnf.mailbox+")*)|"+rfc5322abnf.obs_mbox_list+")"; +rfc5322abnf.address="(?:"+rfc5322abnf.mailbox+"|"+rfc5322abnf.group+")"; + +// 4.4 Obsolete Addressing +rfc5322abnf.obs_addr_list="(?:(?:"+rfc5322abnf.CFWS+",)*"+rfc5322abnf.address+"(?:,(?:"+rfc5322abnf.address+"|"+rfc5322abnf.CFWS+")?)*)"; + +// 3.4 Address Specifications +rfc5322abnf.address_list="(?:(?:"+rfc5322abnf.address+"(?:,"+rfc5322abnf.address+")*)|"+rfc5322abnf.obs_addr_list+")"; + +// 4.4 Obsolete Addressing +rfc5322abnf.obs_group_list="(?:(?:"+rfc5322abnf.CFWS+"?,)+"+rfc5322abnf.CFWS+"?)"; + +// 3.4 Address Specifications +rfc5322abnf.group_list="(?:"+rfc5322abnf.mailbox_list+"|"+rfc5322abnf.CFWS+"|"+rfc5322abnf.obs_group_list+")"; +rfc5322abnf.group="(?:"+rfc5322abnf.display_name+":"+rfc5322abnf.group_list+"?;"+rfc5322abnf.CFWS+"?)"; + +// 3.6.1 The Origination Date field +rfc5322abnf.orig_date="(?:Date:"+rfc5322abnf.date_time+abnf.CRLF+")"; + +// 3.6.2 Originator Fields +rfc5322abnf.from="(?:From:"+rfc5322abnf.mailbox_list+abnf.CRLF+")"; +rfc5322abnf.sender="(?:Sender:"+rfc5322abnf.mailbox+abnf.CRLF+")"; +rfc5322abnf.reply_to="(?:Reply-To:"+rfc5322abnf.address_list+abnf.CRLF+")"; + +// 3.6.3 Destination Address Fields +rfc5322abnf.to="(?:To:"+rfc5322abnf.address_list+abnf.CRLF+")"; +rfc5322abnf.cc="(?:Cc:"+rfc5322abnf.address_list+abnf.CRLF+")"; +rfc5322abnf.bcc="(?:Bcc:(?:"+rfc5322abnf.address_list+"|"+rfc5322abnf.CFWS+")?"+abnf.CRLF+")"; + +// 4.5.4 Obsolete Identification Fields +rfc5322abnf.obs_id_left=rfc5322abnf.local_part; +rfc5322abnf.obs_id_right=rfc5322abnf.domain; + +// 3.6.4 Identification Fields +rfc5322abnf.id_left="(?:"+rfc5322abnf.dot_atom_text+"|"+rfc5322abnf.obs_id_left+")"; +rfc5322abnf.no_fold_literal="(?:\\["+rfc5322abnf.dtext+"*\\])"; +rfc5322abnf.id_right="(?:"+rfc5322abnf.dot_atom_text+"|"+rfc5322abnf.no_fold_literal+"|"+rfc5322abnf.obs_id_right+")"; +rfc5322abnf.msg_id="(?:"+rfc5322abnf.CFWS+"?\\<"+rfc5322abnf.id_left+"@"+rfc5322abnf.id_right+"\\>"+rfc5322abnf.CFWS+"?)"; +rfc5322abnf.message_id="(?:Message-ID:"+rfc5322abnf.msg_id+abnf.CRLF+")"; +rfc5322abnf.in_reply_to="(?:In-Reply-To:"+rfc5322abnf.msg_id+"+"+abnf.CRLF+")"; +rfc5322abnf.references="(?:References:"+rfc5322abnf.msg_id+"+"+abnf.CRLF+")"; + +// 3.6.5 Informational Fields +rfc5322abnf.subject="(?:Subject:"+rfc5322abnf.unstructured+abnf.CRLF+")"; +rfc5322abnf.comments="(?:Comments:"+rfc5322abnf.unstructured+abnf.CRLF+")"; +rfc5322abnf.keywords="(?:Keywords:"+rfc5322abnf.phrase+"(?:,"+rfc5322abnf.phrase+")*"+abnf.CRLF+")"; + +// 3.6.6 Resent Fields +rfc5322abnf.resent_date="(?:Resent-Date:"+rfc5322abnf.date_time+abnf.CRLF+")"; +rfc5322abnf.resent_from="(?:Resent-From:"+rfc5322abnf.mailbox_list+abnf.CRLF+")"; +rfc5322abnf.resent_sender="(?:Resent-Sender:"+rfc5322abnf.mailbox+abnf.CRLF+")"; +rfc5322abnf.resent_to="(?:Resent-To:"+rfc5322abnf.address_list+abnf.CRLF+")"; +rfc5322abnf.resent_cc="(?:Resent-Cc:"+rfc5322abnf.address_list+abnf.CRLF+")"; +rfc5322abnf.resent_bcc="(?:Resent-Bcc:(?:"+rfc5322abnf.address_list+"|"+rfc5322abnf.CFWS+")?"+abnf.CRLF+")"; +rfc5322abnf.resent_msg_id="(?:Resent-Message-ID:"+rfc5322abnf.msg_id+abnf.CRLF+")"; + +// 3.6.7 Trace Fields +rfc5322abnf.path="(?:"+rfc5322abnf.angle_addr+"|(?:"+rfc5322abnf.CFWS+"?\\<"+rfc5322abnf.CFWS+"?\\>"+rfc5322abnf.CFWS+"?))"; +rfc5322abnf.received_token="(?:"+rfc5322abnf.word+"|"+rfc5322abnf.angle_addr+"|"+rfc5322abnf.addr_spec+"|"+rfc5322abnf.domain+")"; +rfc5322abnf.received="(?:Received:"+rfc5322abnf.received_token+"*;"+rfc5322abnf.date_time+abnf.CRLF+")"; +rfc5322abnf.return="(?:Return-Path:"+rfc5322abnf.path+abnf.CRLF+")"; +rfc5322abnf.trace="(?:"+rfc5322abnf.return+rfc5322abnf.received+"+)"; + +// 3.6.8 Optional Fields +rfc5322abnf.ftext="[\\x21-\\x39\\x3b-\\x7e]"; +rfc5322abnf.field_name="(?:"+rfc5322abnf.ftext+"+)"; +rfc5322abnf.optional_field="(?:"+rfc5322abnf.field_name+":"+rfc5322abnf.unstructured+abnf.CRLF+")"; + +// 3.6 Field Definitions +rfc5322abnf.fields="(?:(?:"+rfc5322abnf.trace+"|"+rfc5322abnf.optional_field+"*|(?:"+rfc5322abnf.resent_date+"|"+rfc5322abnf.resent_from+"|"+rfc5322abnf.resent_sender+"|"+rfc5322abnf.resent_to+"|"+rfc5322abnf.resent_cc+"|"+rfc5322abnf.resent_bcc+"|"+rfc5322abnf.resent_msg_id+")*)*(?:"+rfc5322abnf.orig_date+"|"+rfc5322abnf.from+"|"+rfc5322abnf.sender+"|"+rfc5322abnf.reply_to+"|"+rfc5322abnf.to+"|"+rfc5322abnf.cc+"|"+rfc5322abnf.bcc+"|"+rfc5322abnf.message_id+"|"+rfc5322abnf.in_reply_to+"|"+rfc5322abnf.references+"|"+rfc5322abnf.subject+"|"+rfc5322abnf.comments+"|"+rfc5322abnf.keywords+"|"+rfc5322abnf.optional_field+")*)"; + +// 3.5 Overall Message Syntax +rfc5322abnf.text="[\\x01-\\x09\\x0b-\\x0c\\x0e-\\x7f]"; + +// 4.1 Miscellaneous Obsolete Tokens +rfc5322abnf.obs_body="(?:(?:(?:"+abnf.LF+"*"+abnf.CR+"*"+"(?:(?:\\x00|"+rfc5322abnf.text+")"+abnf.LF+"*"+abnf.CR+"*)*)|"+abnf.CRLF+")*)"; + +// 4.5.1 Obsolete Origination Date field +rfc5322abnf.obs_orig_date="(?:Date"+abnf.WSP+"*:"+rfc5322abnf.date_time+abnf.CRLF+")"; + +// 4.5.2 Obsolete Originator Fields +rfc5322abnf.obs_from="(?:From"+abnf.WSP+"*:"+rfc5322abnf.mailbox_list+abnf.CRLF+")"; +rfc5322abnf.obs_sender="(?:Sender"+abnf.WSP+"*:"+rfc5322abnf.mailbox+abnf.CRLF+")"; +rfc5322abnf.obs_reply_to="(?:Reply-To"+abnf.WSP+"*:"+rfc5322abnf.address_list+abnf.CRLF+")"; + +// 4.5.3 Obsolete Destination Address Fields +rfc5322abnf.obs_to="(?:To"+abnf.WSP+"*:"+rfc5322abnf.address_list+abnf.CRLF+")"; +rfc5322abnf.obs_cc="(?:Cc"+abnf.WSP+"*:"+rfc5322abnf.address_list+abnf.CRLF+")"; +rfc5322abnf.obs_bcc="(?:Bcc"+abnf.WSP+"*:(?:"+rfc5322abnf.address_list+"|(?:(?:"+rfc5322abnf.CFWS+"?,)*"+rfc5322abnf.CFWS+"?))"+abnf.CRLF+")"; + +// 4.5.4 Obsolete Identification Fields +rfc5322abnf.obs_message_id="(?:Message-ID"+abnf.WSP+"*:"+rfc5322abnf.msg_id+abnf.CRLF+")"; +rfc5322abnf.obs_in_reply_to="(?:In-Reply-To"+abnf.WSP+"*:(?:"+rfc5322abnf.phrase+"|"+rfc5322abnf.msg_id+")*"+abnf.CRLF+")"; +rfc5322abnf.obs_references="(?:References"+abnf.WSP+"*:(?:"+rfc5322abnf.phrase+"|"+rfc5322abnf.msg_id+")*"+abnf.CRLF+")"; + +// 4.1 Miscellaneous Obsolete Tokens +rfc5322abnf.obs_phrase_list="(?:(?:"+rfc5322abnf.phrase+"|"+abnf.CRLF+")?(?:,"+rfc5322abnf.phrase+"|"+rfc5322abnf.CFWS+")*)"; + +// 4.5.5 Obsolete Informational Fields +rfc5322abnf.obs_subject="(?:Subject"+abnf.WSP+"*:"+rfc5322abnf.unstructured+abnf.CRLF+")"; +rfc5322abnf.obs_comments="(?:Comments"+abnf.WSP+"*:"+rfc5322abnf.unstructured+abnf.CRLF+")"; +rfc5322abnf.obs_keywords="(?:Keywords"+abnf.WSP+"*:"+rfc5322abnf.obs_phrase_list+abnf.CRLF+")"; + +// 4.5.6 Resent Fields +rfc5322abnf.obs_resent_date="(?:Resent-Date"+abnf.WSP+"*:"+rfc5322abnf.date_time+abnf.CRLF+")"; +rfc5322abnf.obs_resent_from="(?:Resent-From"+abnf.WSP+"*:"+rfc5322abnf.mailbox_list+abnf.CRLF+")"; +rfc5322abnf.obs_resent_send="(?:Resent-Sender"+abnf.WSP+"*:"+rfc5322abnf.mailbox+abnf.CRLF+")"; +rfc5322abnf.obs_resent_to="(?:Resent-To"+abnf.WSP+"*:"+rfc5322abnf.address_list+abnf.CRLF+")"; +rfc5322abnf.obs_resent_cc="(?:Resent-Cc"+abnf.WSP+"*:"+rfc5322abnf.address_list+abnf.CRLF+")"; +rfc5322abnf.obs_resent_bcc="(?:Resent-Bcc"+abnf.WSP+"*:(?:"+rfc5322abnf.address_list+"|(?:(?:"+rfc5322abnf.CFWS+"?,)*"+rfc5322abnf.CFWS+"?))"+abnf.CRLF+")"; +rfc5322abnf.obs_resent_mid="(?:Resent-Message-ID"+abnf.WSP+"*:"+rfc5322abnf.msg_id+abnf.CRLF+")"; +rfc5322abnf.obs_resent_rply="(?:Resent-Reply-To"+abnf.WSP+"*:"+rfc5322abnf.address_list+abnf.CRLF+")"; + +// 4.5.7 Obsolete Trace Fields +rfc5322abnf.obs_return="(?:Return-Path"+abnf.WSP+"*:"+rfc5322abnf.path+abnf.CRLF+")"; +rfc5322abnf.obs_received="(?:Received"+abnf.WSP+"*:"+rfc5322abnf.received_token+"*;"+rfc5322abnf.date_time+abnf.CRLF+")"; + +// 4.5.8 Optional Fields +rfc5322abnf.obs_optional="(?:"+rfc5322abnf.field_name+abnf.WSP+"*:"+rfc5322abnf.unstructured+abnf.CRLF+")"; + +// 4.5 Obsolete Header Fields +rfc5322abnf.obs_fields="(?:(?:"+rfc5322abnf.obs_return+"|"+rfc5322abnf.obs_received+"|"+rfc5322abnf.obs_orig_date+"|"+rfc5322abnf.obs_from+"|"+rfc5322abnf.obs_sender+"|"+rfc5322abnf.obs_reply_to+"|"+rfc5322abnf.obs_to+"|"+rfc5322abnf.obs_cc+"|"+rfc5322abnf.obs_bcc+"|"+rfc5322abnf.obs_message_id+"|"+rfc5322abnf.obs_in_reply_to+"|"+rfc5322abnf.obs_references+"|"+rfc5322abnf.obs_subject+"|"+rfc5322abnf.obs_comments+"|"+rfc5322abnf.obs_keywords+"|"+rfc5322abnf.obs_resent_date+"|"+rfc5322abnf.obs_resent_from+"|"+rfc5322abnf.obs_resent_send+"|"+rfc5322abnf.obs_resent_rply+"|"+rfc5322abnf.obs_resent_to+"|"+rfc5322abnf.obs_resent_cc+"|"+rfc5322abnf.obs_resent_bcc+"|"+rfc5322abnf.obs_resent_mid+"|"+rfc5322abnf.obs_optional+")*)"; + +// 3.5 Overall Message Syntax +rfc5322abnf.body="(?:(?:(?:"+rfc5322abnf.text+"{0,998}"+abnf.CRLF+")*"+rfc5322abnf.text+"{0,998})|"+rfc5322abnf.obs_body+")" +rfc5322abnf.message="(?:(?:"+rfc5322abnf.fields+"|"+rfc5322abnf.obs_fields+")(?:"+rfc5322abnf.CFLF+rfc5322abnf.body+")?)"; + +/***************************/ +/* Simplified from RFC5322 */ +/***************************/ +// 4.1 Miscellaneous Obsolete Tokens +abnf.obs_NO_WS_CTL="[\\x01-\\x08\\x0b-\\x0c\\x0e-\\x1f\\x7f]"; +abnf.obs_ctext=abnf.obs_NO_WS_CTL; +abnf.obs_qtext=abnf.obs_NO_WS_CTL; +abnf.obs_utext="[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f\\x21-\\x7f]"; +abnf.obs_qp="(?:\\\\[\\x00-\\x08\\x0a-\\x1f\\x7f])"; + +// 3.2.1 Quoted characters +abnf.quoted_pair=abnf.obs_qp; + +// 4.2 Obsolete Folding White Space +abnf.obs_FWS="(?:"+abnf.WSP+"+(?:"+abnf.CRLF+abnf.WSP+"+)*)"; + +// 3.2.2 Folding White Space and Comments +abnf.FWS=abnf.obs_FWS; + +// 4.1 Miscellaneous Obsolete Tokens +abnf.obs_unstruct="(?:(?:(?:"+abnf.LF+"*"+abnf.CR+"*"+"(?:"+abnf.obs_utext+abnf.LF+"*"+abnf.CR+"*)*)|"+abnf.FWS+")*)"; + +// 3.2.2 Folding White Space and Comments +abnf.ctext="[\\x21-\\x27\\x2a-\\x5b\\x5d-\\x7e]"; +// RECURSIVE!!! +//abnf.comment="(?:\\((?:"+abnf.FWS+"?"+abnf.ccontent+")*"+abnf.FWS+"?\\))"; +//abnf.ccontent="(?:"+abnf.ctext+"|"+abnf.quoted_pair+"|"+abnf.comment+")"; +// To fix this, we'll do a magic comment which does not allow comments in it (otherwise a copy/paste from ccontent) +// THIS NEEDS TO BE REMOVED MULTIPLE TIMES UNTIL IT'S GONE! +abnf.comment="(?:\\((?:"+abnf.FWS+"?"+"(?:"+abnf.ctext+"|"+abnf.quoted_pair+")"+")*"+abnf.FWS+"?\\))"; +abnf.CFWS="(?:(?:(?:"+abnf.FWS+"?"+abnf.comment+")+"+abnf.FWS+"?)|"+abnf.FWS+")"; + +// 3.2.3 Atom +abnf.atext="[!#-&+\\-/-9=?A-Z\\^-~]"; +abnf.atom="(?:"+abnf.CFWS+"?"+abnf.atext+"+"+abnf.CFWS+")"; +abnf.dot_atom_text="(?:"+abnf.atext+"+(?:\\."+abnf.atext+"+)*)"; +abnf.dot_atom="(?:"+abnf.CFWS+"?"+abnf.dot_atom_text+abnf.CFWS+")"; +abnf.specials="(?:[\\(\\)\\<\\>\\[\\]\\:\\;\\@\\\\\\,\\.]|"+abnf.DQUOTE+")"; + +// 3.2.4 Quoted Strings +abnf.qtext="[\\x21\\x32-\\x5b\\x5d-\\x7e]"; +abnf.qcontent="(?:"+abnf.qtext+"|"+abnf.quoted_pair+")"; +abnf.quoted_string="(?:"+abnf.CFWS+"?"+abnf.DQUOTE+"(?:"+abnf.FWS+"?"+abnf.qcontent+")*"+abnf.FWS+"?"+abnf.DQUOTE+abnf.CFWS+")"; + +// 3.2.5 Miscellaneous Tokens +abnf.word="(?:"+abnf.atom+"|"+abnf.quoted_string+")"; + +// 4.1 Miscellaneous Obsolete Tokens +abnf.obs_phrase="(?:"+abnf.word+"(?:"+abnf.word+"|\\.|"+abnf.CFWS+")*)"; + +// 3.2.5 Miscellaneous Tokens +abnf.phrase=abnf.obs_phrase; + +// 3.2.5 Miscellaneous Tokens +abnf.unstructured=abnf.obs_unstruct; + +// 3.3 Date and Time Specification +abnf.day_name="(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)"; + +// 4.3 Obsolete Date and Time +abnf.obs_day_of_week="(?:"+abnf.CFWS+"?"+abnf.day_name+abnf.CFWS+"?)"; + +// 3.3 Date and Time Specification +abnf.day_of_week=abnf.obs_day_of_week; + +// 4.3 Obsolete Date and Time +abnf.obs_day="(?:"+abnf.CFWS+"?"+abnf.DIGIT+"{1,2}"+abnf.CFWS+"?)"; + +// 3.3 Date and Time Specification +abnf.day=abnf.obs_day; +abnf.month="(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)"; + +// 4.3 Obsolete Date and Time +abnf.obs_year="(?:"+abnf.CFWS+"?"+abnf.DIGIT+"{2,}"+abnf.CFWS+"?)"; + +// 3.3 Date and Time Specification +abnf.year=abnf.obs_year; +abnf.date="(?:"+abnf.day+abnf.month+abnf.year+")"; + +// 4.3 Obsolete Date and Time +abnf.obs_hour="(?:"+abnf.CFWS+"?"+abnf.DIGIT+"{2}"+abnf.CFWS+"?)"; + +// 3.3 Date and Time Specification +abnf.hour=abnf.obs_hour; + +// 4.3 Obsolete Date and Time +abnf.obs_minute="(?:"+abnf.CFWS+"?"+abnf.DIGIT+"{2}"+abnf.CFWS+"?)"; + +// 3.3 Date and Time Specification +abnf.minute=abnf.obs_minute; + +// 4.3 Obsolete Date and Time +abnf.obs_second="(?:"+abnf.CFWS+"?"+abnf.DIGIT+"{2}"+abnf.CFWS+"?)"; + +// 3.3 Date and Time Specification +abnf.second=abnf.obs_second; + +// 4.3 Obsolete Date and Time +abnf.obs_zone="(?:UT|GMT|EST|EDT|CST|CDT|MST|MDT|PST|PDT|[\\x41-\\x49\\x4b-\\x5a\\x61-\\x69\\x6b-\\x7a])"; + +// 3.3 Date and Time Specification +abnf.zone="(?:(?:"+abnf.FWS+"[\\+\\-]"+abnf.DIGIT+"{4})|"+abnf.obs_zone+")"; +abnf.time_of_day="(?:"+abnf.hour+":"+abnf.minute+"(?::"+abnf.second+")?)"; +abnf.time="(?:"+abnf.time_of_day+abnf.zone+")"; +abnf.date_time="(?:(?:"+abnf.day_of_week+",)?"+abnf.date+abnf.time+abnf.CFWS+"?)"; + +// 4.4 Obsolete Addressing +abnf.obs_local_part="(?:"+abnf.word+"(?:\\."+abnf.word+")*)"; + +// 3.4.1 Addr-Spec Specification +abnf.local_part=abnf.obs_local_part; + +// 4.4 Obsolete Addressing +abnf.obs_dtext="(?:"+abnf.obs_NO_WS_CTL+"|"+abnf.quoted_pair+")"; + +// 3.4.1 Addr-Spec Specification +abnf.dtext=abnf.obs_dtext; +abnf.domain_literal="(?:"+abnf.CFWS+"?\\[(?:"+abnf.FWS+"?"+abnf.dtext+")*"+abnf.FWS+"?\\]"+abnf.CFWS+"?)"; + +// 4.4 Obsolete Addressing +abnf.obs_domain="(?:"+abnf.atom+"(?:\\."+abnf.atom+")*)"; + +// 3.4.1 Addr-Spec Specification +abnf.domain="(?:"+abnf.dot_atom+"|"+abnf.domain_literal+"|"+abnf.obs_domain+")"; +abnf.addr_spec="(?:"+abnf.local_part+"@"+abnf.domain+")"; + +// 4.4 Obsolete Addressing +abnf.obs_domain_list="(?:(?:"+abnf.CFWS+"|,)*@"+abnf.domain+"(?:,"+abnf.CFWS+"?(?:@"+abnf.domain+")?)*)"; +abnf.obs_route="(?:"+abnf.obs_domain_list+":)"; +abnf.obs_angle_addr="(?:"+abnf.CFWS+"?\\<"+abnf.obs_route+abnf.addr_spec+"\\>"+abnf.CFWS+"?)"; + +// 3.4 Address Specification +abnf.angle_addr=abnf.obs_angle_addr; +abnf.display_name=abnf.phrase; +abnf.name_addr="(?:"+abnf.display_name+"|"+abnf.angle_addr+")"; +abnf.mailbox="(?:"+abnf.name_addr+"|"+abnf.addr_spec+")"; + +// 4.4 Obsolete Addressing +abnf.obs_mbox_list="(?:(?:"+abnf.CFWS+",)*"+abnf.mailbox+"(?:,(?:"+abnf.mailbox+"|"+abnf.CFWS+")?)*)"; + +// 3.4 Address Specifications +abnf.mailbox_list=abnf.obs_mbox_list; +abnf.address="(?:"+abnf.mailbox+"|"+abnf.group+")"; + +// 4.4 Obsolete Addressing +abnf.obs_addr_list="(?:(?:"+abnf.CFWS+",)*"+abnf.address+"(?:,(?:"+abnf.address+"|"+abnf.CFWS+")?)*)"; + +// 3.4 Address Specifications +abnf.address_list=abnf.obs_addr_list; + +// 4.4 Obsolete Addressing +abnf.obs_group_list="(?:(?:"+abnf.CFWS+"?,)+"+abnf.CFWS+"?)"; + +// 3.4 Address Specifications +abnf.group_list=abnf.obs_group_list; +abnf.group="(?:"+abnf.display_name+":"+abnf.group_list+"?;"+abnf.CFWS+"?)"; + +// 3.6.1 The Origination Date field +abnf.orig_date="(?:Date:"+abnf.date_time+abnf.CRLF+")"; + +// 3.6.2 Originator Fields +abnf.from="(?:From:"+abnf.mailbox_list+abnf.CRLF+")"; +abnf.sender="(?:Sender:"+abnf.mailbox+abnf.CRLF+")"; +abnf.reply_to="(?:Reply-To:"+abnf.address_list+abnf.CRLF+")"; + +// 3.6.3 Destination Address Fields +abnf.to="(?:To:"+abnf.address_list+abnf.CRLF+")"; +abnf.cc="(?:Cc:"+abnf.address_list+abnf.CRLF+")"; +abnf.bcc="(?:Bcc:(?:"+abnf.address_list+"|"+abnf.CFWS+")?"+abnf.CRLF+")"; + +// 4.5.4 Obsolete Identification Fields +abnf.obs_id_left=abnf.local_part; +abnf.obs_id_right=abnf.domain; + +// 3.6.4 Identification Fields +abnf.id_left=abnf.obs_id_left; +abnf.no_fold_literal="(?:\\["+abnf.dtext+"*\\])"; +abnf.id_right=abnf.obs_id_right; +abnf.msg_id="(?:"+abnf.CFWS+"?\\<"+abnf.id_left+"@"+abnf.id_right+"\\>"+abnf.CFWS+"?)"; +abnf.message_id="(?:Message-ID:"+abnf.msg_id+abnf.CRLF+")"; +abnf.in_reply_to="(?:In-Reply-To:"+abnf.msg_id+"+"+abnf.CRLF+")"; +abnf.references="(?:References:"+abnf.msg_id+"+"+abnf.CRLF+")"; + +// 3.6.5 Informational Fields +abnf.subject="(?:Subject:"+abnf.unstructured+abnf.CRLF+")"; +abnf.comments="(?:Comments:"+abnf.unstructured+abnf.CRLF+")"; +abnf.keywords="(?:Keywords:"+abnf.phrase+"(?:,"+abnf.phrase+")*"+abnf.CRLF+")"; + +// 3.6.6 Resent Fields +abnf.resent_date="(?:Resent-Date:"+abnf.date_time+abnf.CRLF+")"; +abnf.resent_from="(?:Resent-From:"+abnf.mailbox_list+abnf.CRLF+")"; +abnf.resent_sender="(?:Resent-Sender:"+abnf.mailbox+abnf.CRLF+")"; +abnf.resent_to="(?:Resent-To:"+abnf.address_list+abnf.CRLF+")"; +abnf.resent_cc="(?:Resent-Cc:"+abnf.address_list+abnf.CRLF+")"; +abnf.resent_bcc="(?:Resent-Bcc:(?:"+abnf.address_list+"|"+abnf.CFWS+")?"+abnf.CRLF+")"; +abnf.resent_msg_id="(?:Resent-Message-ID:"+abnf.msg_id+abnf.CRLF+")"; + +// 3.6.7 Trace Fields +abnf.path="(?:"+abnf.angle_addr+"|(?:"+abnf.CFWS+"?\\<"+abnf.CFWS+"?\\>"+abnf.CFWS+"?))"; +abnf.received_token="(?:"+abnf.word+"|"+abnf.angle_addr+"|"+abnf.addr_spec+"|"+abnf.domain+")"; +abnf.received="(?:Received:"+abnf.received_token+"*;"+abnf.date_time+abnf.CRLF+")"; +abnf.return="(?:Return-Path:"+abnf.path+abnf.CRLF+")"; +abnf.trace="(?:"+abnf.return+abnf.received+"+)"; + +// 3.6.8 Optional Fields +abnf.ftext="[\\x21-\\x39\\x3b-\\x7e]"; +abnf.field_name="(?:"+abnf.ftext+"+)"; +abnf.optional_field="(?:"+abnf.field_name+":"+abnf.unstructured+abnf.CRLF+")"; + +// 3.6 Field Definitions +abnf.fields="(?:"+abnf.optional_field+"*)"; + +// 3.5 Overall Message Syntax +abnf.text="[\\x01-\\x09\\x0b-\\x0c\\x0e-\\x7f]"; + +// 4.1 Miscellaneous Obsolete Tokens +abnf.obs_body="(?:(?:(?:"+abnf.LF+"*"+abnf.CR+"*"+"(?:(?:\\x00|"+abnf.text+")"+abnf.LF+"*"+abnf.CR+"*)*)|"+abnf.CRLF+")*)"; + +// 4.5.1 Obsolete Origination Date field +abnf.obs_orig_date="(?:Date"+abnf.WSP+"*:"+abnf.date_time+abnf.CRLF+")"; + +// 4.5.2 Obsolete Originator Fields +abnf.obs_from="(?:From"+abnf.WSP+"*:"+abnf.mailbox_list+abnf.CRLF+")"; +abnf.obs_sender="(?:Sender"+abnf.WSP+"*:"+abnf.mailbox+abnf.CRLF+")"; +abnf.obs_reply_to="(?:Reply-To"+abnf.WSP+"*:"+abnf.address_list+abnf.CRLF+")"; + +// 4.5.3 Obsolete Destination Address Fields +abnf.obs_to="(?:To"+abnf.WSP+"*:"+abnf.address_list+abnf.CRLF+")"; +abnf.obs_cc="(?:Cc"+abnf.WSP+"*:"+abnf.address_list+abnf.CRLF+")"; +abnf.obs_bcc="(?:Bcc"+abnf.WSP+"*:(?:"+abnf.address_list+"|(?:(?:"+abnf.CFWS+"?,)*"+abnf.CFWS+"?))"+abnf.CRLF+")"; + +// 4.5.4 Obsolete Identification Fields +abnf.obs_message_id="(?:Message-ID"+abnf.WSP+"*:"+abnf.msg_id+abnf.CRLF+")"; +abnf.obs_in_reply_to="(?:In-Reply-To"+abnf.WSP+"*:(?:"+abnf.phrase+"|"+abnf.msg_id+")*"+abnf.CRLF+")"; +abnf.obs_references="(?:References"+abnf.WSP+"*:(?:"+abnf.phrase+"|"+abnf.msg_id+")*"+abnf.CRLF+")"; + +// 4.1 Miscellaneous Obsolete Tokens +abnf.obs_phrase_list="(?:(?:"+abnf.phrase+"|"+abnf.CRLF+")?(?:,"+abnf.phrase+"|"+abnf.CFWS+")*)"; + +// 4.5.5 Obsolete Informational Fields +abnf.obs_subject="(?:Subject"+abnf.WSP+"*:"+abnf.unstructured+abnf.CRLF+")"; +abnf.obs_comments="(?:Comments"+abnf.WSP+"*:"+abnf.unstructured+abnf.CRLF+")"; +abnf.obs_keywords="(?:Keywords"+abnf.WSP+"*:"+abnf.obs_phrase_list+abnf.CRLF+")"; + +// 4.5.6 Resent Fields +abnf.obs_resent_date="(?:Resent-Date"+abnf.WSP+"*:"+abnf.date_time+abnf.CRLF+")"; +abnf.obs_resent_from="(?:Resent-From"+abnf.WSP+"*:"+abnf.mailbox_list+abnf.CRLF+")"; +abnf.obs_resent_send="(?:Resent-Sender"+abnf.WSP+"*:"+abnf.mailbox+abnf.CRLF+")"; +abnf.obs_resent_to="(?:Resent-To"+abnf.WSP+"*:"+abnf.address_list+abnf.CRLF+")"; +abnf.obs_resent_cc="(?:Resent-Cc"+abnf.WSP+"*:"+abnf.address_list+abnf.CRLF+")"; +abnf.obs_resent_bcc="(?:Resent-Bcc"+abnf.WSP+"*:(?:"+abnf.address_list+"|(?:(?:"+abnf.CFWS+"?,)*"+abnf.CFWS+"?))"+abnf.CRLF+")"; +abnf.obs_resent_mid="(?:Resent-Message-ID"+abnf.WSP+"*:"+abnf.msg_id+abnf.CRLF+")"; +abnf.obs_resent_rply="(?:Resent-Reply-To"+abnf.WSP+"*:"+abnf.address_list+abnf.CRLF+")"; + +// 4.5.7 Obsolete Trace Fields +abnf.obs_return="(?:Return-Path"+abnf.WSP+"*:"+abnf.path+abnf.CRLF+")"; +abnf.obs_received="(?:Received"+abnf.WSP+"*:"+abnf.received_token+"*;"+abnf.date_time+abnf.CRLF+")"; + +// 4.5.8 Optional Fields +abnf.obs_optional="(?:"+abnf.field_name+abnf.WSP+"*:"+abnf.unstructured+abnf.CRLF+")"; + +// 4.5 Obsolete Header Fields +abnf.obs_fields="(?:abnf.obs_optional*)"; + +// 3.5 Overall Message Syntax +abnf.body="(?:(?:(?:"+abnf.text+"{0,998}"+abnf.CRLF+")*"+abnf.text+"{0,998})|"+abnf.obs_body+")" +abnf.message="(?:(?:"+abnf.fields+"|"+abnf.obs_fields+")(?:"+abnf.CFLF+abnf.body+")?)"; + +var field_info={ + "date":{min:1, max:1}, + "from":{min:1, max:1}, + "reply-to":{min:0, max:1}, + "to":{min:0, max:1}, + "cc":{min:0, max:1}, + "bcc":{min:0, max:1}, + "message-id":{min:0, max:1}, + "in-reply-to":{min:0, max:1}, + "references":{min:0, max:1}, + "subject":{min:0, max:1}, +}; + +function parse_header(str) +{ + var hdr={}; + var m; + + hdr.orig=str.replace(/^(.*\r\n)[^\t ].*?$/,"$1"); + hdr.unwrapped=hdr.orig.replace(/\r\n([\t ])/, "$1"); + hdr.orig.replace(/^([\x21-\x39\x41-\x7e]+):.*$/,"$1"); +} + +function parse_mime(str) +{ + var ret={headers:{},body:''}; + var tmp,tmp2; + + tmp=str.split(/\r\n\r\n/, 2); + ret.headers=parse_headers(tmp[0]); + ret.body=tmp[1]; + + // Add default MIME headers + if(ret.headers["CONTENT-TRANSFER-ENCODING"]==undefined) { + } +} + +for(i in abnf) { + writeln(); + writeln(i+" ("+abnf[i].length+")"); + try { + var re=new RegExp(abnf[i]); + } + catch(e) { + writeln(e); + } +}