
    <fhda                         d dl Z d dlZd dlZd dlmZmZmZ d dlmZm	Z	m
Z
mZmZ d dlmZmZ d dlmZ d dlmZmZ 	  G d de j*                        Zed	k(  r e j0                          yy)
    N)Mockpatch	MagicMock)SSLErrorSSLEOFErrorSSLWantReadErrorSSLWantWriteErrorHAVE_SSL)_ssl_socket_wrap_sni_socket)WebSocketException)recvsendc                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)SSLEdgeCasesTestc                 4    t         s| j                  d       y y )NzSSL not available)r
   skipTest)selfs    V/var/www/zara/venv/lib/python3.12/site-packages/websocket/tests/test_ssl_edge_cases.pysetUpzSSLEdgeCasesTest.setUp'   s    MM-.     c                 h   t               }t        d      5 }t               }||_        t        j                  d      |j
                  _        dt        j                  i}| j                  t        j                        5  t        ||d       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)z$Test SSL handshake failure scenariosssl.SSLContextzSSL handshake timeout	cert_reqsexample.comN)r   r   return_valuesockettimeoutwrap_socketside_effectsslCERT_REQUIREDassertRaisesr   r   	mock_sockmock_ssl_contextmock_contextsslopts        r   test_ssl_handshake_failurez+SSLEdgeCasesTest.test_ssl_handshake_failure+   s    F	 #$ 
	>(86L,8)39>>'4L$$0 "3#4#45F""6>>2 >Iv}=>
	> 
	>> >
	> 
	>$   A'B(=BB(B%	!B((B1c                 j   t               }t        d      5 }t               }||_        t        j                  d      |j
                  _        t        j                  dd}| j                  t        j                        5  t        ||d       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)z;Test various SSL certificate verification failure scenariosr   zCertificate verification failedTr   check_hostnamezbadssl.exampleN
r   r   r   r!   SSLCertVerificationErrorr   r    r"   r#   r   r$   s        r   *test_ssl_certificate_verification_failuresz;SSLEdgeCasesTest.test_ssl_certificate_verification_failures<   s    F	 #$ 
	A(86L,8)363O3O14L$$0 $'#4#4MF""3#?#?@ AIv/?@A
	A 
	AA A
	A 
	A$   A(B)>BB)B&	"B))B2c                    t               }t        d      5 }t               }t               |j                  _        ||_        d|i}t	        ||d       |j                  j                          ddd       y# 1 sw Y   yxY w)z6Test SSL context configuration with various edge casesr   contextr   N)r   r   r   r   r   assert_called_once)r   r%   r&   existing_contextr(   s        r   )test_ssl_context_configuration_edge_casesz:SSLEdgeCasesTest.test_ssl_context_configuration_edge_casesM   s{    F	 #$ 	>(8#v8<((5,<)!12F 	6=9 ((;;=	> 	> 	>s   AA55A>c           	         t               }t        j                  dddi      5  t        dd      5  t        dd      5  t        d      5 }t               }||_        t               |j                  _        i }t        ||d	       |j                  j                          d
d
d
       d
d
d
       d
d
d
       d
d
d
       t        j                  dddi      5  t        dd      5  t        dd      5  t        d      5 }t               }||_        t               |j                  _        i }t        ||d	       |j                  j                  d
d       d
d
d
       d
d
d
       d
d
d
       d
d
d
       y
# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   RxY w# 1 sw Y   VxY w# 1 sw Y   ZxY w# 1 sw Y   y
xY w)z.Test CA bundle environment variable edge cases
os.environWEBSOCKET_CLIENT_CA_BUNDLEz/nonexistent/ca-bundle.crtzos.path.isfileF)r   zos.path.isdirr   r   Nz/etc/ssl/certsT)cafilecapath)	r   r   dictr   r   r   load_verify_locationsassert_not_calledassert_called_withr$   s        r   )test_ssl_ca_bundle_environment_edge_casesz:SSLEdgeCasesTest.test_ssl_ca_bundle_environment_edge_cases_   s   F	 ZZ79UV
 	O 'e< O?? 
O/0 	O4D'+v8D(5@D00=!##Iv}E %::LLN	O
OO	O" ZZ'CEU&VW 	'e< ?> /0 4D'+v8D(5@D00=!##Iv}E %::MM#'0@ N 	 		O 	O
O 
OO O	O 	O(   	 	s   FFFAE7	F'F/FG%F?3F3?AF'	F3F?&G7F <FFFF	FF$'F0,F33F<8F??G	GGc                 j   t               }t        d      5 }t               }||_        t        j                  d      |j
                  _        t               |j                  _        ddi}| j                  t              5  t        ||d       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)z(Test SSL cipher configuration edge casesr   zNo cipher can be selectedciphersINVALID_CIPHERr   N)r   r   r   r!   r   set_ciphersr    r   r#   r   r   r$   s        r   (test_ssl_cipher_configuration_edge_casesz9SSLEdgeCasesTest.test_ssl_cipher_configuration_edge_cases   s    F	 #$ 	>(86L,8)36<<+4L$$0 59FL$$1!12F""#56 >Iv}=>	> 	>> >	> 	>r1   c                 V   t               }t        d      5 }t               }||_        t        d      |j                  _        t               |j                  _        ddi}| j                  t              5  t        ||d       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)z(Test ECDH curve configuration edge casesr   zunknown curve name
ecdh_curveinvalid_curver   N)
r   r   r   
ValueErrorset_ecdh_curver    r   r#   r   r   r$   s        r   test_ssl_ecdh_curve_edge_casesz/SSLEdgeCasesTest.test_ssl_ecdh_curve_edge_cases   s    F	 #$ 		>(86L,8)6@AU6VL''348FL$$1"O4F""#56 >Iv}=>		> 		>> >		> 		>$   AB4BBB	BB(c                 V   t               }t        d      5 }t               }||_        t        d      |j                  _        t               |j                  _        ddi}| j                  t              5  t        ||d       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)z0Test client certificate configuration edge casesr   zNo such filecertfilez/nonexistent/client.crtr   N)
r   r   r   FileNotFoundErrorload_cert_chainr    r   r#   r   r   r$   s        r   &test_ssl_client_certificate_edge_casesz7SSLEdgeCasesTest.test_ssl_client_certificate_edge_cases   s    F	 #$ 		>(86L,8)7H7XL((448FL$$1 ";<F""#56 >Iv}=>		> 		>> >		> 		>rL   c                    t               }dgfd}||j                  _        d|j                  _        t        d      5 }t               }||_        dg|j                  _        t        |d      }| j                  |d       | j                  d   d       |j                  j                          |j                  j                          d	d	d	       y	# 1 sw Y   y	xY w)
z)Test SSL want read/write retry edge casesr   c                 X    dxx   dz  cc<   d   dk(  rt        d      d   dk(  ryy)Nr      The operation did not complete      data after retriesr   r   )bufsizeread_attemptss    r   	mock_recvzMSSLEdgeCasesTest.test_ssl_want_read_write_retry_edge_cases.<locals>.mock_recv   s?    !!Q1$&'GHHq!Q&,r         >@selectors.DefaultSelectorTd   rW   rV   N)
r   r   r    
gettimeoutr   r   selectassertEqualregisterassert_called)r   r%   r[   mock_selector_classmock_selectorresultrZ   s         @r   )test_ssl_want_read_write_retry_edge_casesz:SSLEdgeCasesTest.test_ssl_want_read_write_retry_edge_cases   s    F	 	 &/	",0	)./ 	13F FM/<,15M  -)S)FV%:;]1-q1""002  ..0	1 	1 	1s   BCCc                 Z   t               }dgfd}||j                  _        d|j                  _        t        d      5 }t               }||_        dg|j                  _        t        |d      }| j                  |d       | j                  d   d       d	d	d	       y	# 1 sw Y   y	xY w)
z$Test SSL want write retry edge casesr   c                 l    dxx   dz  cc<   d   dk(  rt        d      d   dk(  rt        |       S y)Nr   rT   rU   rV   )r	   len)datawrite_attemptss    r   	mock_sendzHSSLEdgeCasesTest.test_ssl_want_write_retry_edge_cases.<locals>.mock_send   sF    1"a A%'(HII"a'4y r   r\   r]   T	   test data	   rV   N)r   r   r    r_   r   r   r`   ra   )r   r%   rm   rd   re   rf   rl   s         @r   $test_ssl_want_write_retry_edge_casesz5SSLEdgeCasesTest.test_ssl_want_write_retry_edge_cases   s    F	 	 &/	",0	)./ 	33F FM/<,15M  -)\2FVQ'^A.2	3 	3 	3s   AB!!B*c                     t               }t        d      |j                  _        d|j                  _        ddlm} | j                  |      5  t        |d       ddd       y# 1 sw Y   yxY w)zTest SSL EOF error edge caseszSSL connection has been closedr\   r   "WebSocketConnectionClosedExceptionrn   N)	r   r   r   r    r_   r   websocket._exceptionsrs   r#   r   r%   rs   s      r   test_ssl_eof_error_edge_casesz.SSLEdgeCasesTest.test_ssl_eof_error_edge_cases   s\    F	 &11Q%R	",0	)LAB 	*L)	* 	* 	*s   A##A,c                 J   ddl m} ddlm} t	               }d|j
                  _        t	        |      }t	               |_        ||j                  _         ||d      }|j                  |t	                     }| j                  ||g       |j
                  j                          y)zTest SSL pending data scenariosr   )SSLDispatcher)WebSocketApp   )specg      @N)websocket._dispatcherrx   websocket._appry   r   pendingr   sockr`   ra   r4   )r   rx   ry   mock_ssl_sockmock_app
dispatcherrf   s          r    test_ssl_pending_data_edge_casesz1SSLEdgeCasesTest.test_ssl_pending_data_edge_cases  s    7/ -1* \**"8S1
 ""=$&9 	-1002r   c                 R   t               }dfd}||j                  _        d|j                  _        t        d      5 }t               }||_        dg|j                  _        t        |d      }| j                  |d       | j                  d       d	d	d	       y	# 1 sw Y   y	xY w)
z Test SSL renegotiation scenariosr   c                 0    dz  dk(  rt        d      y)NrT   zSSL renegotiation required   data after renegotiationrX   )rY   
call_counts    r   r[   zESSLEdgeCasesTest.test_ssl_renegotiation_edge_cases.<locals>.mock_recv  s"    !OJQ&'CDD.r   r\   r]   Tr^   r   rV   N)r   r   r    r_   r   r   r`   ra   )r   r%   r[   rd   re   rf   r   s         @r   !test_ssl_renegotiation_edge_casesz2SSLEdgeCasesTest.test_ssl_renegotiation_edge_cases  s    F	 
	/ &/	",0	)./ 	,3F FM/<,15M  -)S)FV%@AZ+	, 	, 	,s    ABB&c                    t               }t        d      5 }t               }||_        t               |j                  _        ddi}t	        ||d       |j                  j                  |ddd       ddd       y# 1 sw Y   yxY w)z+Test SSL server hostname override scenariosr   server_hostnamezoverride.example.comzoriginal.example.comTdo_handshake_on_connectsuppress_ragged_eofsr   Nr   r   r   r   r   r?   r$   s        r   !test_ssl_server_hostname_overridez2SSLEdgeCasesTest.test_ssl_server_hostname_override3  s    F	#$ 	(86L,8)48FL$$1 ()?@F	6+AB $$77(,%) 6	 8 	 	 	s   AA::Bc                 H   t               }t        d      5 }t               }||_        t               |j                  _        t	        t
        d      r>dt
        j                  i}t        ||d       |j                  t
        j                         ddd       y# 1 sw Y   yxY w)z$Test SSL protocol version edge casesr   PROTOCOL_TLSssl_versionr   N)	r   r   r   r   hasattrr!   r   r   r?   r$   s        r   $test_ssl_protocol_version_edge_casesz5SSLEdgeCasesTest.test_ssl_protocol_version_edge_casesH  s    F	 #$ 
	F(86L,8)48FL$$1 sN+')9)9:Iv}= 33C4D4DE
	F 
	F 
	Fs   A9BB!c                 \   t               }t        j                  dddi      5  t        d      5 }t               }||_        t               |j                  _        i }t        ||d       | j                  |j                  d       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)z-Test SSL keylog file configuration edge casesr8   SSLKEYLOGFILEz/tmp/ssl_keys.logr   r   N)r   r   r<   r   r   r   ra   keylog_filenamer$   s        r   test_ssl_keylog_file_edge_casesz0SSLEdgeCasesTest.test_ssl_keylog_file_edge_casesY  s    F	 ZZ8K&LM 
	T'( 	T,<#v0< -8<((5Iv}=   !=!=?RS	T
	T 
	T	T 	T
	T 
	Ts#   B"ABB"B	B""B+c                 r   t               }t        j                  dt        j                  dft        j                  dt        j                  dft        j                  dt        j                  dfg}|D ]  \  }}}}| j	                  ||      5  t        d      5 }t               }||_        t               |j                  _        ||d}	t        ||	d       | j                  |j                  |       | j                  |j                  |       ddd       ddd        y# 1 sw Y   xY w# 1 sw Y   xY w)z1Test different SSL verification mode combinationsFTr,   r   r   N)r   r!   	CERT_NONEr"   subTestr   r   r   r   ra   verify_moder-   )
r   r%   
test_casesr   r-   expected_verifyexpected_checkr&   r'   r(   s
             r   #test_ssl_context_verification_modesz4SSLEdgeCasesTest.test_ssl_context_verification_modesj  s*   F	 ]]E3==%8s'8'8%@c&7&7>	

 KU 	RFI~	.Q 
R+, 	R0@#'6L4@$1<@FL,,9+4WF	6=A$$\%=%=O$$\%@%@.Q	R
R 
R	R	R 	R
R 
Rs%   D-A5D!D-!D*&D--D6	c                     ddl m} t               }t        d      |j                  _         |       }||_        d|_        	 |j                          y# t        $ r | j                  d       Y yw xY w)z#Test SSL socket shutdown edge casesr   )	WebSocketzSSL shutdown failedTz/SSL shutdown error should be handled gracefullyN)
websocket._corer   r   r   shutdownr    r   	connectedclosefail)r   r   r   wss       r   #test_ssl_socket_shutdown_edge_casesz4SSLEdgeCasesTest.test_ssl_socket_shutdown_edge_cases  sb    --56K-L*[	IHHJ 	IIIGH	Is   A A/.A/c                     t               }t        d      |j                  _        d|j                  _        ddlm} | j                  t        |f      5  t        |d       ddd       y# 1 sw Y   yxY w)z6Test SSL socket being closed during ongoing operationsz+SSL connection has been closed unexpectedlyr\   r   rr   r^   N)	r   r   r   r    r_   r   rt   rs   r#   ru   s      r   &test_ssl_socket_close_during_operationz7SSLEdgeCasesTest.test_ssl_socket_close_during_operation  sg    F	 &.9&
	" -1	)L *LMN 	!C 	! 	! 	!s   A))A2c                     t               }t        d      5 }t               }||_        t               |j                  _        ddi}	 t	        ||d       ddd       y# t
        $ r Y w xY w# 1 sw Y   yxY w)z-Test SSL compression configuration edge casesr   compressionFr   N)r   r   r   r   r   AttributeErrorr$   s        r   test_ssl_compression_edge_casesz0SSLEdgeCasesTest.test_ssl_compression_edge_cases  s    F	#$ 	(86L,8)48FL$$1 $U+FIv}=	 	 " 	 	s)   /A+A	A(%A+'A((A++A4c                    t               }t        d      5 }t               }||_        t               }||j                  _        d|_        d|_        t        |i d      }| j                  |       ddd       y# 1 sw Y   yxY w)z Test SSL session reuse scenariosr   mock_sessionTr   N)r   r   r   r   sessionsession_reusedr   assertIsNotNone)r   r%   r&   r'   r   rf   s         r   !test_ssl_session_reuse_edge_casesz2SSLEdgeCasesTest.test_ssl_session_reuse_edge_cases  s    F	#$ 	)(86L,8) FM4AL$$1 %3M!+/M( B>F   (	) 	) 	)   AA88Bc                     t               }t        d      5 }t               }||_        t               |j                  _        dddgi}t	        ||d      }| j                  |       ddd       y# 1 sw Y   yxY w)zATest SSL ALPN (Application Layer Protocol Negotiation) edge casesr   alpn_protocolszhttp/1.1h2r   N)r   r   r   r   r   r   )r   r%   r&   r'   r(   rf   s         r   !test_ssl_alpn_protocol_edge_casesz2SSLEdgeCasesTest.test_ssl_alpn_protocol_edge_cases  sy    F	#$ 	)(86L,8)48FL$$1 'T(:;F !FMBF  (	) 	) 	)s   AA..A7c                    t               }t        d      5 }t               }||_        t               |j                  _        d}t	        |i |       |j                  j                  |dd|       ddd       y# 1 sw Y   yxY w)z0Test SSL SNI (Server Name Indication) edge casesr   z2001:db8::1Tr   Nr   )r   r%   r&   r'   ipv6_hostnames        r   test_ssl_sni_edge_casesz(SSLEdgeCasesTest.test_ssl_sni_edge_cases  s    F	 #$ 	(86L,8)48FL$$1 *M	2}5 $$77(,%) -	 8 	 	 	r   c                     t               d }|j                  _        dj                  _        ddlm}  |fdd      }|j                  d      }| j                  t        |      d       y	)
z'Test SSL buffer size related edge casesc                 @    | dkD  rt        d      dt        | d      z  S )N @  z"[SSL: BAD_LENGTH] buffer too large   Arz   )r   min)rY   s    r   r[   zCSSLEdgeCasesTest.test_ssl_buffer_size_edge_cases.<locals>.mock_recv  s'    CDD#gt,,,r   r\   r   )frame_bufferc                     t        |       S )N)r   )sizer%   s    r   <lambda>zBSSLEdgeCasesTest.test_ssl_buffer_size_edge_cases.<locals>.<lambda>  s    tIt'< r   T)skip_utf8_validationr   N)
r   r   r    r_   r   websocket._abnfr   recv_strictassertGreaterrj   )r   r[   r   fbrf   r%   s        @r   test_ssl_buffer_size_edge_casesz0SSLEdgeCasesTest.test_ssl_buffer_size_edge_cases  sb    F		- &/	",0	)0 <SWX &3v;*r   c                 h   t               }t        d      5 }t               }||_        t        j                  d      |j
                  _        dt        j                  i}| j                  t        j                        5  t        ||d       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)z&Test SSL protocol downgrade protectionr   SSLV3_ALERT_HANDSHAKE_FAILUREr   r   N)
r   r   r   r!   r   r   r    PROTOCOL_TLS_CLIENTr#   r   r$   s        r   &test_ssl_protocol_downgrade_protectionz7SSLEdgeCasesTest.test_ssl_protocol_downgrade_protection  s    F	#$ 	>(86L,8)36<</4L$$0 $S%<%<=F ""3<<0 >Iv}=>	> 	>> >	> 	>r*   c                 j   t               }t        d      5 }t               }||_        t        j                  d      |j
                  _        t        j                  dd}| j                  t        j                        5  t        ||d       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)z0Test SSL certificate chain validation edge casesr   z2certificate verify failed: certificate has expiredTr,   zexpired.badssl.comNr.   r$   s        r   %test_ssl_certificate_chain_validationz6SSLEdgeCasesTest.test_ssl_certificate_chain_validation  s    F	#$ 	E(86L,8) 473O3OD4L$$0 $'#4#4MF""3#?#?@ EIv/CDE	E 	EE E	E 	Er1   c                 L   t               }t        d      5 }t               }||_        t        j                  d      |j
                  _        ddi}| j                  t        j                        5  t        ||d       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)z(Test SSL weak cipher rejection scenariosr   zno shared cipherrB   zRC4-MD5r   N)	r   r   r   r!   r   r   r    r#   r   r$   s        r   test_ssl_weak_cipher_rejectionz/SSLEdgeCasesTest.test_ssl_weak_cipher_rejection+  s    F	#$ 		>(86L,8)36<<@R3SL$$0+F ""3<<0 >Iv}=>		> 		>> >		> 		>s$   AB/B=BB	BB#c           
         t               }g d}|D ]  \  }}| j                  ||      5  t        d      5 }t               }||_        ||k7  rxd|v rtt	        j
                  d| d| d      |j                  _        t        j                  dd	}| j                  t        j
                        5  t        |||       d
d
d
       nJt               |j                  _        t        j                  dd	}t        |||      }| j                  |       d
d
d
       d
d
d
        y
# 1 sw Y   xY w# 1 sw Y   !xY w# 1 sw Y   5xY w)z)Test SSL hostname verification edge cases))*.example.comzsubdomain.example.com)r   zsub.subdomain.example.com)r   zwww.example.com)certhostnamer   zsub.subdomainz
hostname 'z' doesn't match ''Tr,   N)r   r   r   r   r!   r/   r   r    r"   r#   r   r   )	r   r%   r   cert_hostnameconnect_hostnamer&   r'   r(   rf   s	            r   )test_ssl_hostname_verification_edge_casesz:SSLEdgeCasesTest.test_ssl_hostname_verification_edge_cases:  sh   F	

 0: 	5+M+=;KL 5+, 50@#'6L4@$1 &)99+/?? @C?[?[()9(::KM?Z[\@00<
 *-):):.2"
 "..s/K/KL M'	6;KLM M AE00=),):):.2" "-Y@P!Q,,V4;55 5	5(M M%5 55 5s<   D<A8D0/D$	=AD0D<$D-)D00D95D<<E	c                 j   t               }	 ddl}t        |d      rft        d      5 }t               }||_        t               |j
                  _        t        |i d       |j
                  j                          ddd       yy# 1 sw Y   yxY w# t        t        f$ r | j                  d       Y yw xY w)zTest SSL memory BIO edge casesr   N	MemoryBIOr   r   zSSL MemoryBIO not available)r   r!   r   r   r   r   r   r4   ImportErrorr   r   )r   r%   r!   r&   r'   s        r   test_ssl_memory_bio_edge_casesz/SSLEdgeCasesTest.test_ssl_memory_bio_edge_casesf  s    F		9sK(+, 	B0@#'6L4@$1<@FL,,9  	2}= !,,??A	B 	B )	B 	B ^, 	9MM78	9s/   B AB9B BB B  B21B2N) __name__
__module____qualname__r   r)   r0   r6   r@   rE   rK   rQ   rg   rp   rv   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r   r   r   r   %   s    />"A">$$L>$> > 1@3:*3.,6*F"T"R0I"! &)&)$,+.>"E$>*5X9r   r   __main__)unittestr   r!   unittest.mockr   r   r   websocket._ssl_compatr   r   r   r	   r
   websocket._httpr   r   rt   r   websocket._socketr   r   TestCaser   r   mainr   r   r   <module>r      s]      
 0 0  : 4 (&U	9x(( U	9p zHMMO r   