a  ze@sddlZddlmZmZddlZddlmZddlmZddl m Z m Z eGdddeZ eGdd d eZ ed kredS) N) TestEmailBase parameterize)policy) EmailMessage)ContentManagerraw_data_managerc @seZdZejZeZddddZddZddZ d d Z Gd d d e Z ed dZ Gddde Zed dZdefdefddde fde fddde fdddd Zdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)S)*TestContentManager) text/plain)text))Z full_typeZ maintype_onlynull_keycCsNd dd}t}||||}d|d<d|d<||j|ddd dS) NcSs|d}||fSN X-Bar-Header)msgfoobarrrW/opt/bitninja-python-dojo/embedded/lib/python3.9/test/test_email/test_contentmanager.py foo_getterszATestContentManager.get_key_as_get_content_key..foo_getterr Content-Typerrrr)rr)N)radd_get_handler _make_message assertEqual get_content)selforderkeyrcmmrrrget_key_as_get_content_keys  z-TestContentManager.get_key_as_get_content_keycCsdd}dd}t}||||jD]\}}||kr,|||q,|}d|d<d|d<d |d <|||d dS) NcSs|dSrrrrrr bar_getter!szGTestContentManager.get_key_as_get_content_key_order..bar_gettercSs|dSN X-Foo-Headerrr$rrrr#szGTestContentManager.get_key_as_get_content_key_order..foo_getterr rrrrr')rrget_key_paramsvaluesrrr)rrr r%rr! precedencer"rrr get_key_as_get_content_key_order s z3TestContentManager.get_key_as_get_content_key_ordercCsPt}|}d|d<|td||Wdn1sB0YdS)Nr r)rrassertRaisesRegexKeyErrorrrr!r"rrr:test_get_content_raises_if_unknown_mimetype_and_no_default0s zMTestContentManager.test_get_content_raises_if_unknown_mimetype_and_no_defaultc@s eZdZdS)TestContentManager.BaseThingN__name__ __module__ __qualname__rrrr BaseThing7sr5.r0c@s eZdZdS)TestContentManager.ThingNr1rrrrThing:sr8r7rr )r r7)r r8)r0)r5) z builtins.str) str) N) type full_pathqualnamenameZ base_typeZbase_full_pathZ base_qualname base_nameZstr_typeZ str_full_pathZstr_namercCs`ddd}t}||||}|}|j||dd||dd|||dS)NcSs||d<||dSr& set_payload)robjrrrr foo_setterNszATestContentManager.set_key_as_set_content_key..foo_setterrrr')N)radd_set_handlerrr8 set_contentr get_payload)rrr rJr!r"msg_objrrrset_key_as_set_content_keyMs  z-TestContentManager.set_key_as_set_content_keyc Csdd}dd}t}||||jD]\}}||kr,|||q,|}|}|||||dd|||dS)NcSsd|d<||dS)NrX-FooBar-HeaderrGrrIrrrrJZszGTestContentManager.set_key_as_set_content_key_order..foo_settercSs d|d<dS)NrrPrrQrrr bar_setter]szGTestContentManager.set_key_as_set_content_key_order..bar_setterrPr) rrKr(r)rr8rLrrM) rrr rJrRr!r*r"rNrrr set_key_as_set_content_key_orderYs  z3TestContentManager.set_key_as_set_content_key_ordercCsTt}|}|}|t|j|||Wdn1sF0YdSN)rrr8r,r-testobject_full_pathrL)rr!r"rNrrr6test_set_content_raises_if_unknown_type_and_no_defaultjs zITestContentManager.test_set_content_raises_if_unknown_type_and_no_defaultcCsPt}|}d|d<|t||dWdn1sB0YdS)Nz multipart/foortest)rr assertRaises TypeErrorrLr.rrr.test_set_content_raises_if_called_on_multipartqs  zATestContentManager.test_set_content_raises_if_called_on_multipartcCs|}d|d<d|d<d|d<|dt}|tdd |jd |d ||d||d||dd||dS) Nrz Content-Fooz text/htmlrrWToabcc_sdSrTr)argskwrrrzITestContentManager.test_set_content_calls_clear_content..xyz)content_manager) rrHrrKr@rLZ assertIsNonerrM)rr"r!rrr$test_set_content_calls_clear_contentxs z7TestContentManager.test_set_content_calls_clear_contentN)r2r3r4rdefaultrmessager(r#r+r/r@r5Zbaseobject_full_pathr8rUZset_key_paramsrOrSrVrZrcrrrrr s>    rc@seZdZejjdedZeZddZ ddZ ddZ d d Z d d Z d dZddZddZddZddZddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Z d3d4Z!d5d6Z"d7d8Z#d9d:Z$d;d<Z%d=d>Z&d?d@Z'dAdBZ(dCdDZ)dEdFZ*dGdHZ+dIdJZ,dKdLZ-dMdNZ.dOdPZ/dQdRZ0dSdTZ1dUdVZ2dWdXZ3dYdZZ4d[d\Z5d]d^Z6d_d`Z7dadbZ8dcddZ9dedfdgdhedifedjfdkZ:dldmZ;dndoZdtduZ?dvS)wTestRawDataManager<)max_line_lengthrbcCs&|td}|t|ddS)NJ Content-Type: text/plain Basic text. z Basic text. _str_msgtextwrapdedentrrrrr"rrrtest_get_text_plainsz&TestRawDataManager.test_get_text_plaincCs&|td}|t|ddS)NzP Content-Type: text/html

Basic text.

z

Basic text.

rjrnrrrtest_get_text_htmls z%TestRawDataManager.test_get_text_htmlcCs,|tdd}|t|ddS)Nu\ Content-Type: text/plain; charset=latin1 Basìc tëxt. latin1Basìc tëxt. )Z _bytes_msgrlrmencoderrrrnrrrtest_get_text_plain_latin1sz-TestRawDataManager.test_get_text_plain_latin1cCs&|td}|t|ddS)Nz Content-Type: text/plain; charset="latin-1" Content-Transfer-Encoding: quoted-printable Bas=ECc t=EBxt. rrrjrnrrr+test_get_text_plain_latin1_quoted_printablesz>TestRawDataManager.test_get_text_plain_latin1_quoted_printablecCs&|td}|t|ddS)Nz Content-Type: text/plain; charset="utf8" Content-Transfer-Encoding: base64 QmFzw6xjIHTDq3h0Lgo= rrrjrnrrrtest_get_text_plain_utf8_base64sz2TestRawDataManager.test_get_text_plain_utf8_base64cCs&|td}|t|ddS)N Content-Type: text/plain; charset="utf8" Content-Transfer-Encoding: quoted-printable Bas=c3=acc t=c3=abxt=fd. uBasìc tëxt�. rjrnrrr-test_get_text_plain_bad_utf8_quoted_printablesz@TestRawDataManager.test_get_text_plain_bad_utf8_quoted_printablecCs*|td}|tj|ddddS)Nrwignoreerrorsrrrjrnrrr;test_get_text_plain_bad_utf8_quoted_printable_ignore_errorsszNTestRawDataManager.test_get_text_plain_bad_utf8_quoted_printable_ignore_errorscCs*|td}|tj|ddddS)Nu Content-Type: text/plain; charset="utf8" Content-Transfer-Encoding: base64 QmFzw6xjIHTDq3h0Lgoÿ= ryrzrrrjrnrrr8test_get_text_plain_utf8_base64_recoverable_bad_CTE_dataszKTestRawDataManager.test_get_text_plain_utf8_base64_recoverable_bad_CTE_datacCsL|td}|ttj|ddWdn1s>0YdS)NriryrrkrlrmrXrYrrrnrrrtest_get_text_invalid_keywords z0TestRawDataManager.test_get_text_invalid_keywordc Csntd}dD]V}|j|d6|||d}|t|dWdq1s^0YqdS)Nzu Content-Type: {} Content-Transfer-Encoding: base64 Ym9ndXMgZGF0YQ== zaudio image video application)maintypez/foos bogus data) rlrmsplitsubTestrkformatrrr)rtemplaterr"rrrtest_get_non_texts   z$TestRawDataManager.test_get_non_textcCsL|td}|ttj|ddWdn1s>0YdS)Nz| Content-Type: image/jpg Content-Transfer-Encoding: base64 Ym9ndXMgZGF0YQ== ryrzr~rnrrr!test_get_non_text_invalid_keywords z4TestRawDataManager.test_get_non_text_invalid_keywordcCsH|td}|tt|Wdn1s:0YdS)Nzm Content-Type: multipart/mixed; boundary="===" --=== --===-- )rkrlrmrXr-rrrnrrrtest_get_raises_on_multiparts z/TestRawDataManager.test_get_raises_on_multipartc Cstd}dD]}|j|dr|||}t|}|||j | t|d| |dd| |dj dj d Wdq1s0YqdS) Nz Content-Type: message/{} To: foo@example.com From: bar@example.com Subject: example an example message rfc822 external-bodysubtypezan example message tofoo@example.comfromrr) rlrmrrrkrrrassertIsInstancererZ addressesusername)rrrr"Zsub_msgrrr)test_get_message_rfc822_and_external_bodys   zSimple message.

htmlrz Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: 7bit

Simple message.

Trrrrrrrtest_set_text_html?s z%TestRawDataManager.test_set_text_htmlcCs`|}d}tj||dd|t|td||jddd||| |dS)Nrlatin-1charsetz Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Simple message. Trrrrrrrtest_set_text_charset_latin_1Ls z0TestRawDataManager.test_set_text_charset_latin_1cCs\|}d}t|||t|td||jddd||| |dS)NzTSimple but long message that is over 78 characters long to force transfer encoding. z Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Simple but long message that is over 78 characters long to = force transfer encoding. Trrrrrrr(test_set_text_plain_long_line_heuristicsYs  z;TestRawDataManager.test_set_text_plain_long_line_heuristicscCsb|}d}t|||t|tdd||jdd d||| |dS)Nu7et là il est monté sur moi et il commence à m'éto. u Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit et là il est monté sur moi et il commence à m'éto. rTr rrrLrbytesrlrmrsrMrrrrrr5test_set_text_short_line_minimal_non_ascii_heuristicshs zHTestRawDataManager.test_set_text_short_line_minimal_non_ascii_heuristicscCsb|}d}t|||t|tdd||jdd d||| |dS)Nusj'ai un problème de python. il est sorti de son vivarium. et là il est monté sur moi et il commence à m'éto. a* Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable j'ai un probl=C3=A8me de python. il est sorti de son vivari= um. et l=C3=A0 il est mont=C3=A9 sur moi et il commence = =C3=A0 m'=C3=A9to. rTrrrrrr4test_set_text_long_line_minimal_non_ascii_heuristicsus zGTestRawDataManager.test_set_text_long_line_minimal_non_ascii_heuristicscCsb|}d}t|||t|tdd||jdd d||| |dS)Nu} j'ai un problème de python. il est sorti de son vivarium. et là il est monté sur moi et il commence à m'éto. a@ Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable j'ai un probl=C3=A8me de python. il est sorti de son vivari= um. et l=C3=A0 il est mont=C3=A9 sur moi et il commence = =C3=A0 m'=C3=A9to. rTrrrrrr=test_set_text_11_lines_long_line_minimal_non_ascii_heuristicss zPTestRawDataManager.test_set_text_11_lines_long_line_minimal_non_ascii_heuristicscCsb|}d}t|||t|tdd||jdd d||| |dS)Náàäéèęöő. u Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit áàäéèęöő. rTrrrrrr*test_set_text_maximal_non_ascii_heuristicss z=TestRawDataManager.test_set_text_maximal_non_ascii_heuristicscCsb|}d}t|||t|tdd||jdd d||| |dS)Nu áàäéèęöő. u Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit áàäéèęöő. rTrrrrrr3test_set_text_11_lines_maximal_non_ascii_heuristicss zFTestRawDataManager.test_set_text_11_lines_maximal_non_ascii_heuristicscCsb|}d}t|||t|tdd||jdd d||| |dS)Nuáàäéèęöőáàäéèęöőáàäéèęöőáàäéèęöőáàäéèęöőáàäéèęöőáàäéèęöőáàäéèęöőáàäéèęöőáàäéèęöőáàäéèęöőáàäéèęöő. a Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 w6HDoMOkw6nDqMSZw7bFkcOhw6DDpMOpw6jEmcO2xZHDocOgw6TDqcOoxJnD tsWRw6HDoMOkw6nDqMSZw7bFkcOhw6DDpMOpw6jEmcO2xZHDocOgw6TDqcOo xJnDtsWRw6HDoMOkw6nDqMSZw7bFkcOhw6DDpMOpw6jEmcO2xZHDocOgw6TD qcOoxJnDtsWRw6HDoMOkw6nDqMSZw7bFkcOhw6DDpMOpw6jEmcO2xZHDocOg w6TDqcOoxJnDtsWRLgo= rTrrrrrr4test_set_text_long_line_maximal_non_ascii_heuristicss   zGTestRawDataManager.test_set_text_long_line_maximal_non_ascii_heuristicscCsb|}d}t|d|t|tdd||jdd d||| |dS)Nu áàäéèęöőáàäéèęöőáàäéèęöőáàäéèęöőáàäéèęöőáàäéèęöőáàäéèęöőáàäéèęöőáàäéèęöőáàäéèęöőáàäéèęöőáàäéèęöő. ak Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable =C3=A1=C3=A0=C3=A4=C3=A9=C3=A8=C4=99=C3=B6=C5=91=C3=A1=C3= =A0=C3=A4=C3=A9=C3=A8=C4=99=C3=B6=C5=91=C3=A1=C3=A0=C3=A4= =C3=A9=C3=A8=C4=99=C3=B6=C5=91=C3=A1=C3=A0=C3=A4=C3=A9=C3= =A8=C4=99=C3=B6=C5=91=C3=A1=C3=A0=C3=A4=C3=A9=C3=A8=C4=99= =C3=B6=C5=91=C3=A1=C3=A0=C3=A4=C3=A9=C3=A8=C4=99=C3=B6=C5= =91=C3=A1=C3=A0=C3=A4=C3=A9=C3=A8=C4=99=C3=B6=C5=91=C3=A1= =C3=A0=C3=A4=C3=A9=C3=A8=C4=99=C3=B6=C5=91=C3=A1=C3=A0=C3= =A4=C3=A9=C3=A8=C4=99=C3=B6=C5=91=C3=A1=C3=A0=C3=A4=C3=A9= =C3=A8=C4=99=C3=B6=C5=91=C3=A1=C3=A0=C3=A4=C3=A9=C3=A8=C4= =99=C3=B6=C5=91=C3=A1=C3=A0=C3=A4=C3=A9=C3=A8=C4=99=C3=B6= =C5=91. rTrrrrrr=test_set_text_11_lines_long_line_maximal_non_ascii_heuristicss zPTestRawDataManager.test_set_text_11_lines_long_line_maximal_non_ascii_heuristicscCsF|}|t tj|dddWdn1s80YdS)Nr7bitcterrX UnicodeErrorrrLrnrrr,test_set_text_non_ascii_with_cte_7bit_raisess z?TestRawDataManager.test_set_text_non_ascii_with_cte_7bit_raisescCsF|}|t tj|dddWdn1s80YdS)Nrasciirrrnrrr1test_set_text_non_ascii_with_charset_ascii_raisess zDTestRawDataManager.test_set_text_non_ascii_with_charset_ascii_raisescCsH|}|t"tj|ddddWdn1s:0YdS)Nrrr)rrrrnrrr>test_set_text_non_ascii_with_cte_7bit_and_charset_ascii_raisess zQTestRawDataManager.test_set_text_non_ascii_with_cte_7bit_and_charset_ascii_raisescCs|}d|d<|}d|d<d|d<d|d<|dt|||t|td |d }|||j |t|t||| |j |t| t|dS) NzForwarded messageSubjectzpython@vivarium.orgr[police@monty.orgFromzget back in your boxzOr face the comfy chair.a Subject: Forwarded message Content-Type: message/rfc822 Content-Transfer-Encoding: 8bit To: python@vivarium.org From: police@monty.org Subject: get back in your box Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit MIME-Version: 1.0 Or face the comfy chair. r) rrLrrr@rlrmrMrrer)rr"rpayloadrrrtest_set_messages   z#TestRawDataManager.test_set_messagecCs|}d|d<|}d|d<d|d<d|d<|dt|||t|td d ||j|j j d td | | |j |t| t|dS) Nz Escape reportrrr[zvictim@monty.orgrZHelpu:j'ai un problème de python. il est sorti de son vivarium.u Subject: Escape report Content-Type: message/rfc822 Content-Transfer-Encoding: 8bit To: police@monty.org From: victim@monty.org Subject: Help Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit MIME-Version: 1.0 j'ai un problème de python. il est sorti de son vivarium. r)Z maxheaderlena Subject: Escape report Content-Type: message/rfc822 Content-Transfer-Encoding: 8bit To: police@monty.org From: victim@monty.org Subject: Help Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 MIME-Version: 1.0 aidhaSB1biBwcm9ibMOobWUgZGUgcHl0aG9uLiBpbCBlc3Qgc29ydGkgZGUgc29uIHZpdmFyaXVt Lgo= )rrLrrrrlrmrsZ as_stringrrhrrrer@rrrr4test_set_message_with_non_ascii_and_coercion_to_7bits    zGTestRawDataManager.test_set_message_with_non_ascii_and_coercion_to_7bitc CsZ|}|}dD]}dD]}|j||dl|t }|j|||dWdn1sh0Yt|j}||||||Wdq$1s0Yq$qd}dD]}|j||dn|t }|j|||dWdn1s0Yt|j}||||||Wdq1sJ0YqdS)Nzquoted-printable base64r)rrr external-bodyz 8bit binary) rrrrX ValueErrorrLr@ exceptionZassertIn)rr"rrrarexcrrr#test_set_message_invalid_cte_raises@s$   .  .  0  z6TestRawDataManager.test_set_message_invalid_cte_raisesc CsdtdtdfD]}|j|db|}t||dd|t|t d||j dd||| |Wdq1s0YqdS)Ns bogus content)rimagejpegz Content-Type: image/jpeg Content-Transfer-Encoding: base64 Ym9ndXMgY29udGVudA== Tr) bytearray memoryviewrrrrLrr@rlrmrMr)rrr"rrrtest_set_image_jpgTsz%TestRawDataManager.test_set_image_jpgcCsb|}d}|j|dddd|t|tdd||jdd ||||dS) Ntbgus con t ent zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzZaudioZaifzquoted-printablera Content-Type: audio/aif Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 b=FFgus=09con=0At=0Dent=20zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzrTr rrLrrrlrmrsrMrrrrr,test_set_audio_aif_with_quoted_printable_cteds z?TestRawDataManager.test_set_audio_aif_with_quoted_printable_ctecCsj|}d}|j|dddd|t|tdddd ||jd d ||||dS) NrZvideoZmpegbinaryrz~ Content-Type: video/mpeg Content-Transfer-Encoding: binary MIME-Version: 1.0 rs7bgus con t ent zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzs=zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzTrrrrrr#test_set_video_mpeg_with_binary_ctezs  z6TestRawDataManager.test_set_video_mpeg_with_binary_ctecCsj|}d}|j|dddd|t|tdddd ||jd d ||||dS) NsMbgus con t ent zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz application octet-streamZ8bitrz Content-Type: application/octet-stream Content-Transfer-Encoding: 8bit MIME-Version: 1.0 rsbgus con t ent s=zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz Trrrrrr/test_set_application_octet_stream_with_8bit_cteszBTestRawDataManager.test_set_application_octet_stream_with_8bit_ctecCsV|}d}|jj}tj|||dd|dd|ddfd|t|tddS) Nrr[rrrzI'm talking to myself.headersz Content-Type: text/plain; charset="utf-8" To: foo@example.com From: foo@example.com Subject: I'm talking to myself. Content-Transfer-Encoding: 7bit Simple message. ) rrheader_factoryrrLrr@rlrmrr"rrrrr$test_set_headers_from_header_objectssz7TestRawDataManager.test_set_headers_from_header_objectscCs6|}d}tj||dd|t|tddS)Nr)zX-Foo-Header: foozX-Bar-Header: barrz Content-Type: text/plain; charset="utf-8" X-Foo-Header: foo X-Bar-Header: bar Content-Transfer-Encoding: 7bit Simple message. )rrrLrr@rlrmrrrrtest_set_headers_from_stringssz0TestRawDataManager.test_set_headers_from_stringscCsL|}d}|td tj||ddWdn1s>0YdS)Nrr)zContent-Type: foo/barr)rr,rrrLrrrrs   }@