ó
    oajÝ  ã                  óà   • S r SSKJr  SSKrSSKrSSKJr  SSKrSSK	r	SSK
r
SSKJr  SSKr " S S\
R                  5      r " S S	\
R                  5      r\S
:X  a  \
R&                  " 5         gg)z4Tests for the password-protected face viewer server.é    )ÚannotationsN)ÚPath)Ú	urlencodec                  ó<   • \ rS rSrSS jrSS jrSS jrSS jrSrg)	ÚPasswordHelpersTesté   c                óì   • [         R                  " SSS9n[         R                  R                  U5      nU R	                  UR                  S5      5        U R                  UR                  S5      5        g )Núcorrect horse batteryé † ©Ú
iterationszwrong password)ÚviewerÚmake_password_hashÚPasswordVerifierÚfrom_encodedÚ
assertTrueÚverifyÚassertFalse)ÚselfÚencodedÚverifiers      ÚApackage/face/animasync-face-v3/scripts/test_face_viewer_server.pyÚtest_password_hash_round_tripÚ1PasswordHelpersTest.test_password_hash_round_trip   sZ   € Ü×+Ò+Ð,CÐPWÑXˆÜ×*Ñ*×7Ñ7¸Ó@ˆØ�‰˜Ÿ™Ð(?Ó@ÔAØ×Ñ˜Ÿ™Ð)9Ó:Õ;ó    c                ó    • U R                  [        5         [        R                  R	                  S5        S S S 5        g ! , (       d  f       g = f)Nznot-a-valid-hash)ÚassertRaisesÚ
ValueErrorr   r   r   ©r   s    r   Útest_invalid_hash_is_rejectedÚ1PasswordHelpersTest.test_invalid_hash_is_rejected   s1   € Ø×ÑœzÕ*Ü×#Ñ#×0Ñ0Ð1CÔD÷ +×*Ö*ús	   – ?¿
Ac                ó   • U R                  [        R                  " S5      [        R                  5        U R                  [        R                  " S5      [        R                  5        U R                  [        R                  " S5      S5        g )Nzhttps://evil.example/az//evil.example/az/tools/view.html?q=1)ÚassertEqualr   Ú	safe_nextÚDEFAULT_TARGETr   s    r   Ú)test_safe_next_rejects_external_redirectsÚ=PasswordHelpersTest.test_safe_next_rejects_external_redirects   sc   € Ø×Ñœ×)Ò)Ð*BÓCÄV×EZÑEZÔ[Ø×Ñœ×)Ò)Ð*<Ó=¼v×?TÑ?TÔUØ×Ñœ×)Ò)Ð*@ÓAÐCYÕZr   c                óT  • [         R                  " SSS9nU R                  UR                  S5      5        UR	                  S5        UR	                  S5        U R                  UR                  S5      5        UR                  S5        U R                  UR                  S5      5        g )Né   é<   )Úmax_failuresÚwindow_secondsz203.0.113.10)r   ÚLoginRateLimiterr   Ú
is_limitedÚrecord_failurer   Úclear)r   Úlimiters     r   Ú#test_rate_limiter_limits_and_clearsÚ7PasswordHelpersTest.test_rate_limiter_limits_and_clears!   s…   € Ü×)Ò)°qÈÑLˆØ×Ñ˜×+Ñ+¨NÓ;Ô<Ø×Ñ˜~Ô.Ø×Ñ˜~Ô.Ø�‰˜×*Ñ*¨>Ó:Ô;Ø�‰�nÔ%Ø×Ñ˜×+Ñ+¨NÓ;Õ<r   © N©ÚreturnÚNone)	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   r    r&   r2   Ú__static_attributes__r4   r   r   r   r      s   † ô<ôEô[÷
=r   r   c                  óÈ   • \ rS rSrSr\SS j5       r\SS j5       rSSS.         SS jjr\	R                  S.SS	 jjrSS
 jrSS jrSS jrSS jrSS jrSS jrSrg)ÚServerIntegrationTesté+   r
   c                ój  • [         R                  " 5       U l        [        U R                  R                  5      U l        U R
                  S-  R                  5         U R
                  S-  R                  5         U R
                  S-  S-  R                  SSS9  U R
                  S-  S-  R                  S5        [        R                  " U R                  S	S
9n[        R                  R                  U5      n[        R                  " U R
                  USS9n[        R                   R#                  SU5      U l        SU R                   l        U R                   R&                  S   U l        [*        R,                  " U R                   R.                  SS9U l        U R0                  R3                  5         g )NÚtoolsÚavatarzblendshape-player-natural.htmlz$<!doctype html><title>viewer</title>úutf-8)Úencodingz
sample.bins
   0123456789r   r   F)Útrust_proxy)ú	127.0.0.1r   Té   )ÚtargetÚdaemon)ÚtempfileÚTemporaryDirectoryÚtemp_dirr   ÚnameÚrootÚmkdirÚ
write_textÚwrite_bytesr   r   Úpasswordr   r   Úbuild_handlerÚhttpÚserverÚThreadingHTTPServerÚdaemon_threadsÚserver_addressÚportÚ	threadingÚThreadÚserve_foreverÚthreadÚstart)Úclsr   r   Úhandlers       r   Ú
setUpClassÚ ServerIntegrationTest.setUpClass.   sE  € ä×2Ò2Ó4ˆŒÜ˜Ÿ™×)Ñ)Ó*ˆŒØ	�‰�GÑ	×"Ñ"Ô$Ø	�‰�HÑ	×#Ñ#Ô%Ø	�‰�GÑ	Ð>Ñ	>×JÑJØ2¸Wð 	Kñ 	
ð 
�‰�HÑ	˜|Ñ	+×8Ñ8¸ÔGÜ×+Ò+¨C¯L©LÀWÑMˆÜ×*Ñ*×7Ñ7¸Ó@ˆÜ×&Ò& s§x¡x°ÀuÑMˆÜ—[‘[×4Ñ4Ð5EÀwÓOˆŒ
Ø$(ˆ�
‰
Ô!Ø—:‘:×,Ñ,¨QÑ/ˆŒÜ×%Ò%¨S¯Z©Z×-EÑ-EÈdÑSˆŒ
Ø�
‰
×ÑÕr   c                óÒ   • U R                   R                  5         U R                   R                  5         U R                  R	                  SS9  U R
                  R                  5         g )Nr)   ©Útimeout)rU   ÚshutdownÚserver_closer]   ÚjoinrL   Úcleanup)r_   s    r   ÚtearDownClassÚ#ServerIntegrationTest.tearDownClassA   sD   € à�
‰
×ÑÔØ�
‰
×ÑÔ!Ø�
‰
�‰ ˆÑ"Ø�‰×ÑÕr   N©ÚbodyÚheadersc               ót  • [         R                  R                  SU R                  SS9nUR	                  XX4=(       d    0 S9  UR                  5       nUR                  5       nUR                  5        VV	s0 s H  u  p‰UR                  5       U	_M     n
nn	UR                  5         UR                  X§4$ s  sn	nf )NrF   é   rd   rl   )rT   ÚclientÚHTTPConnectionrY   ÚrequestÚgetresponseÚreadÚ
getheadersÚlowerÚcloseÚstatus)r   ÚmethodÚpathrm   rn   Ú
connectionÚresponseÚresponse_bodyÚkeyÚvalueÚresponse_headerss              r   rs   ÚServerIntegrationTest.requestH   s£   € ô —[‘[×/Ñ/°¸T¿Y¹YÐPQÐ/ÐRˆ
Ø×Ñ˜6¨d¿MÀrÐÑJØ×)Ñ)Ó+ˆØ Ÿ™›ˆØAI×ATÑATÔAVÔWÒAV±:°3˜CŸI™I›K¨Ò.ÑAVÐÑWØ×ÑÔØ�‰Ð 0Ð?Ð?ùó Xs   Á6B4©Únext_urlc               ó(  • [        U R                  US.5      R                  S5      nU R                  SSUS[	        [        U5      5      S.S9u  p4nU R                  US5        US	   nUR                  S
S5      S   R                  SS5      S   nXt4$ )N©rR   ÚnextrC   ÚPOSTú/auth/loginú!application/x-www-form-urlencoded©zContent-TypezContent-Lengthrl   é/  ú
set-cookieÚ;rG   r   Ú=)r   rR   Úencoders   ÚstrÚlenr#   Úsplit)r   r„   rm   ry   rn   Ú_Ú
raw_cookieÚtokens           r   ÚloginÚServerIntegrationTest.loginX   s¡   € Ü d§m¡m¸XÑFÓG×NÑNÈwÓWˆØ!Ÿ\™\ØØØà CÜ"%¤c¨$£i£.ñð	 *ð 
Ñˆ˜ð 	×Ñ˜ Ô%Ø˜\Ñ*ˆ
Ø× Ñ   aÓ(¨Ñ+×1Ñ1°#°qÓ9¸!Ñ<ˆØˆ~Ðr   c                óæ   • U R                  S[        R                  5      u  pnU R                  US5        U R                  US   S5        U R                  US5        U R	                  SUS   5        g )NÚGETrŒ   Úlocationz5/login?next=%2Ftools%2Fblendshape-player-natural.htmlr   zno-storezcache-control)rs   r   r%   r#   ÚassertIn)r   ry   rn   rm   s       r   Ú/test_unauthenticated_request_redirects_to_loginÚEServerIntegrationTest.test_unauthenticated_request_redirects_to_loginh   sk   € Ø $§¡¨U´F×4IÑ4IÓ JÑˆ˜Ø×Ñ˜ Ô%Ø×ÑØ�JÑØCô	
ð 	×Ñ˜˜sÔ#Ø�‰�j '¨/Ñ":Õ;r   c                óÒ  • U R                  SS5      u  pnU R                  US5        U R                  SU5        U R                  SUS   5        [        S[        R
                  S.5      R                  5       nU R                  S	S
US[        [        U5      5      S.S9u  pnU R                  US5        U R                  SU5        U R                  SR                  S5      U5        g )Nrš   z/loginéÈ   s   name="password"zdefault-src 'none'zcontent-security-policyzdefinitely wrongr†   rˆ   r‰   rŠ   r‹   rl   i‘  r�   u   ì˜¬ë°”ë¥´ì§€rC   )
rs   r#   rœ   r   r   r%   r�   r‘   r’   ÚassertNotIn)r   ry   rn   rm   Úforms        r   Ú"test_login_page_and_wrong_passwordÚ8ServerIntegrationTest.test_login_page_and_wrong_passwordr   sÙ   € Ø $§¡¨U°HÓ =Ñˆ˜Ø×Ñ˜ Ô%Ø�‰Ð(¨$Ô/Ø�‰Ð*¨GÐ4MÑ,NÔOäÐ&8Ä&×BWÑBWÑXÓY×`Ñ`ÓbˆØ $§¡ØØØà CÜ"%¤c¨$£i£.ñð	 !-ð !
Ñˆ˜ð 	×Ñ˜ Ô%Ø×Ñ˜ wÔ/Ø�‰�n×+Ñ+¨GÓ4°dÕ;r   c                óÀ  • U R                  5       u  pUS   nU R                  SU5        U R                  SU5        U R                  SU5        S[        R                   SU 30nU R	                  S[        R
                  US9u  pVnU R                  US	5        U R                  S
U5        U R                  SU5        0 UESS0EnU R	                  SSUS9u  pVnU R                  US5        U R                  US   S5        U R                  US5        U R	                  SSUS9u  pVnU R                  US5        U R                  US   S5        U R                  US5        g )Nr�   ÚSecureÚHttpOnlyzSameSite=LaxÚCookier�   rš   ©rn   r    s   <title>viewer</title>zaccess-control-allow-originÚRangez	bytes=2-5ú/avatar/sample.binéÎ   úcontent-rangezbytes 2-5/10s   2345ÚHEADzcontent-lengthÚ4r   )r—   rœ   r   ÚCOOKIE_NAMErs   r%   r#   r¡   )	r   r–   Úlogin_headersÚcookieÚauth_headersry   rn   rm   Úrange_headerss	            r   Ú0test_login_cookie_allows_full_and_range_requestsÚFServerIntegrationTest.test_login_cookie_allows_full_and_range_requests†   sb  € Ø#Ÿz™z›|ÑˆØ˜|Ñ,ˆØ�‰�h Ô'Ø�‰�j &Ô)Ø�‰�n fÔ-à ¤V×%7Ñ%7Ð$8¸¸%¸Ð"AÐBˆØ $§¡¨U´F×4IÑ4IÐS_ Ð `Ñˆ˜Ø×Ñ˜ Ô%Ø�‰Ð.°Ô5Ø×ÑÐ6¸Ô@à>˜<Ð>¨°+Ñ>ˆØ $§¡¨UÐ4HÐR_ Ð `Ñˆ˜Ø×Ñ˜ Ô%Ø×Ñ˜ Ñ1°>ÔBØ×Ñ˜˜wÔ'à $§¡¨VÐ5IÐS` Ð aÑˆ˜Ø×Ñ˜ Ô%Ø×Ñ˜Ð!1Ñ2°CÔ8Ø×Ñ˜˜sÕ#r   c                óÆ  • U R                  S[        R                  S[        R                   S30S9u  n  nU R	                  US5        U R                  5       u  p2S[        R                   SU 30nU R                  SSUS9u  pnU R	                  US5        U R                  S	US
   5        U R                  S[        R                  US9u  n  nU R	                  US5        g )Nrš   r¨   z	=tamperedr©   rŒ   r�   rˆ   z/auth/logoutz	Max-Age=0r�   )rs   r   r%   r°   r#   r—   rœ   )r   ry   r”   r–   r³   rn   s         r   Ú;test_tampered_cookie_is_rejected_and_logout_revokes_sessionÚQServerIntegrationTest.test_tampered_cookie_is_rejected_and_logout_revokes_sessionž   sä   € Ø—|‘|ØÜ×!Ñ!Ø¤&×"4Ñ"4Ð!5°YÐ?Ð@ð $ð 
‰ˆ��1ð
 	×Ñ˜ Ô%à—:‘:“<‰ˆØ ¤V×%7Ñ%7Ð$8¸¸%¸Ð"AÐBˆØ!Ÿ\™\¨&°.È,˜\ÐWÑˆ˜Ø×Ñ˜ Ô%Ø�‰�k 7¨<Ñ#8Ô9Ø—|‘| E¬6×+@Ñ+@È,�|ÐW‰ˆ��1Ø×Ñ˜ Õ%r   c                ól   • U R                  SS9u  pU R                  US   [        R                  5        g )Nzhttps://evil.example/stealrƒ   r›   )r—   r#   r   r%   )r   r”   rn   s      r   Ú*test_external_next_is_not_an_open_redirectÚ@ServerIntegrationTest.test_external_next_is_not_an_open_redirect®   s0   € Ø—Z‘ZÐ)E�ZÐF‰
ˆØ×Ñ˜ Ñ,¬f×.CÑ.CÕDr   c                ó–  • U R                  5       u  p[        R                   SU 3SS.nU R                  SSUS9u  pEnU R	                  US5        U R	                  US   S	5        U R	                  US
5        SUS'   U R                  SSUS9u  pEnU R	                  US5        U R	                  US   S5        U R	                  US5        g )Nr�   zbytes=-3)r¨   rª   rš   r«   r©   r¬   r­   zbytes 7-9/10s   789zbytes=20-30rª   i   z
bytes */10r   )r—   r   r°   rs   r#   )r   r–   r”   r³   ry   rn   rm   s          r   Útest_invalid_and_suffix_rangesÚ4ServerIntegrationTest.test_invalid_and_suffix_ranges²   sÕ   € Ø—:‘:“<‰ˆÜ%+×%7Ñ%7Ð$8¸¸%¸Ð"AÈJÑWˆØ $§¡¨UÐ4HÐR^ Ð _Ñˆ˜Ø×Ñ˜ Ô%Ø×Ñ˜ Ñ1°>ÔBØ×Ñ˜˜vÔ&à -ˆ�WÑØ $§¡¨UÐ4HÐR^ Ð _Ñˆ˜Ø×Ñ˜ Ô%Ø×Ñ˜ Ñ1°<Ô@Ø×Ñ˜˜sÕ#r   r4   r5   )
rz   r‘   r{   r‘   rm   zbytes | Nonern   zdict[str, str] | Noner6   z!tuple[int, dict[str, str], bytes])r„   r‘   r6   ztuple[str, dict[str, str]])r8   r9   r:   r;   rR   Úclassmethodra   rj   rs   r   r%   r—   r�   r£   rµ   r¸   r»   r¾   r<   r4   r   r   r>   r>   +   sŸ   † Ø&€Hàóó ðð$ óó ðð "Ø)-ñ@àð@ð ð@ð
 ð@ð 'ð@ð 
+õ@ð  (.×'<Ñ'<÷ ô <ô<ô($ô0&ô E÷$r   r>   Ú__main__)Ú__doc__Ú
__future__r   Úhttp.clientrT   Úhttp.serverÚpathlibr   rJ   rZ   ÚunittestÚurllib.parser   Úface_viewer_serverr   ÚTestCaser   r>   r8   Úmainr4   r   r   Ú<module>rÌ      sb   ðá :å "ã Û Ý Û Û Û Ý "ã #ô=˜(×+Ñ+ô =ô4S$˜H×-Ñ-ô S$ðl ˆzÓØ‡M‚M…Oð r   