a
    QIh	                  
   @  sj  d dl mZ d dlZd dlmZ d dlmZ d dlmZm	Z	 d dl
Z
d dlZd dlmZ zd dlZd dlmZ W n, ey Z zee W Y dZ[n
dZ[0 0 d dlZd dlZd dlmZmZ d d	lmZmZ d
dlmZmZmZ erd dlmZ e  Z!e!"dZ#e$ej%Z&e#'e& e$ej%Z(e!)e( ej*j+ddej,dedgddgdZ-dddddZ.edddddddddddZ/e-dd d!d"d#Z0ed$d d%d&d'Z1d d(d)d*Z2d d(d+d,Z3d d(d-d.Z4d d(d/d0Z5d d(d1d2Z6d d(d3d4Z7d d(d5d6Z8d7d d%d8d9Z9d7d d%d:d;Z:d7d d%d<d=Z;d7d d%d>d?Z<d7d d%d@dAZ=d d(dBdCZ>ed d(dDdEZ?d7d d%dFdGZ@d d(dHdIZAe-dd7d dJdKdLZBej*CdMd d(dNdOZDej*CdMd d(dPdQZEej*CdMd d(dRdSZFej*CdMd d(dTdUZGd d(dVdWZHd7d d%dXdYZId7d d%dZd[ZJd d(d\d]ZKd d(d^d_ZLdS )`    )annotationsN)asynccontextmanager)count)TYPE_CHECKINGNoReturn)skip_if_optional_else_raise)SSL)DTLSChannelDTLSEndpoint)FakeNet	UDPPacket   )
binds_ipv6gc_collect_harderslow)AsyncGeneratorzexample.comipv6FT)ZmarksZipv4)Zidsz
int | boolr
   )kwargsreturnc                  K  sD   |  dd}|rtjjntjj}tjjtjj|d}t|fi | S )Nr   F)typefamily)poptriosocketAF_INET6AF_INET
SOCK_DGRAMr
   )r   r   r   sock r   O/var/www/html/venv_bot_3.9/lib/python3.9/site-packages/trio/_tests/test_dtls.pyendpoint/   s    r    )
autocancelmtur   boolz
int | Nonez:AsyncGenerator[tuple[DTLSEndpoint, tuple[str, int]], None])r!   r"   r   r   c              
    s   t |d}|rdnd}|j|dfI d H  t 4 I d H ^}ddd fdd	}||jt|I d H  ||j fV  | r|j	
  W d   I d H  q1 I d H s0    Y  W d    n1 s0    Y  d S )
Nr   z::1	127.0.0.1r   r	   None)dtls_channelr   c                   s   t d| jj d| j  d ur0|   z\t d |  I d H  t d | 2 z23 d H W }t d|d| j | |I d H  qT6 W n tj	y   t d Y n0 d S )Nzecho handler started: server z client zserver starting do_handshakezserver finished do_handshakezechoing  -> zecho handler channel broken)
printr    r   getsocknameZpeer_addressset_ciphertext_mtudo_handshakesendr   BrokenResourceError)r'   packetr"   r   r   echo_handlerB   s$    

z&dtls_echo_server.<locals>.echo_handler)r    r   bindr   open_nurserystartserve
server_ctxr*   cancel_scopecancel)r!   r"   r   server	localhostnurseryr1   r   r0   r   dtls_echo_server6   s    r<   r&   )r   r   c              
     s  t | d4 I d H l\}}t| d2}||t}ttj |  W d    n1 s^0    Y  |	 I d H  |
dI d H  | I d H dksJ |
dI d H  | I d H dksJ tjtdd  |
dI d H  W d    n1 s0    Y  |d | }|d | |ks.J |d | |ksJJ W d    n1 s`0    Y  W d   I d H  q1 I d H s0    Y  d S )	Nr$      hellos   goodbyez4^openssl doesn't support sending empty DTLS packets$match    i  i  )r<   r    connect
client_ctxpytestraisesr   ZNeedHandshakeErrorget_cleartext_mtur,   r-   receive
ValueErrorr+   )r   Z_server_endpointaddressclient_endpointZclient_channelZcleartext_mtu_1234r   r   r   
test_smoke^   s*    &.


rJ   ztrio.testing.MockClock)autojump_clockr   c           
        s  d}t dt     d| _t 4 I d H t\}}t 4 I d H .ddd fdddddfd	d
}| _t	|D ]}t
d t
d t
d t }||t}t
d | I d H  t
d t| }td8}	||I d H  | I d H |ksJ W d    n1 s*0    Y  |	jsq@qW d    q1 sV0    Y  qW d   I d H  q1 I d H s0    Y  W d   I d H  q1 I d H s0    Y  d S )Nd   r   gMbP?r   r&   r/   r   c                   s   j g dg ddd }t| j d| j d|  |dkrBd S |dkrV |  q |d	krxt d
 I d H  q |dksJ t| j d| j d| j	    
|  qq d S )N)deliverdropdupedelay)gffffff?皙?rR   rR   )weightsr   r(   z: rO   rP   rQ      rN   z: delivered )choicesr)   sourcedestinationZsend_packetr   sleeprandompayloadhexdeliver_packet)r/   op)fnrr   r   route_packet   s*    
z:test_handshake_over_terrible_network.<locals>.route_packetc                   s(   z  |  W n ty"   Y n0 d S N)
start_soonRuntimeErrorr/   )r;   r`   r   r   route_packet_wrapper   s    zBtest_handshake_over_terrible_network.<locals>.route_packet_wrapperzP################################################################################zclient starting do_handshakezclient finished do_handshake
   )rY   Randomr   enableZautojump_thresholdr<   r   r3   r`   ranger)   r    rA   rB   r,   strencodemove_on_afterr-   rF   cancelled_caught)
rK   Z
HANDSHAKES_rH   re   irI   clientmsgcscoper   )r^   r;   r_   r`   r   $test_handshake_over_terrible_networkz   s2    
-8rs   r   c               	     s   t  4 I d H r\} }t B}||t}|dI d H  | I d H dksNJ W d    n1 sb0    Y  W d   I d H  q1 I d H s0    Y  d S )N   xyz)r<   r    rA   rB   r-   rF   rn   rH   rI   rp   r   r   r   test_implicit_handshake   s
    rw   c                    s<  t  } t  }| jdI d H  t 4 I d H }ddddd}|| jt|I d H  || j	 t
}t 4 I d H 0}||jd ||j W d   I d H  q1 I d H s0    Y  |j  W d   I d H  q1 I d H s0    Y  W d    n1 s0    Y  W d    n1 s.0    Y  d S )Nr%   r   r	   r&   channelr   c              	     sZ   t  4 I d H 0}|| jd || j W d   I d H  qV1 I d H sL0    Y  d S )Ns   from server)r   r3   rb   r-   rF   )rz   r;   r   r   r   handler   s    z!test_full_duplex.<locals>.handlers   from client)r    r   r2   r   r3   r4   r5   r6   rA   r*   rB   rb   r-   rF   r7   r8   )server_endpointrI   Zserver_nurseryr{   rp   r;   r   r   r   test_full_duplex   s    6r}   c               
     s  t  4 I d H \} }t }||t}| I d H  |  ttj	  |
dI d H  W d    n1 sp0    Y  ttj	 | I d H  W d    n1 s0    Y  |  | I d H  W d    n1 s0    Y  W d   I d H  q1 I d H s0    Y  d S )N   abc)r<   r    rA   rB   r,   closerC   rD   r   ClosedResourceErrorr-   rF   acloserv   r   r   r   test_channel_closing   s    .,r   c               	     sV   t dd4 I d H "\} }|   W d   I d H  qJ1 I d H s@0    Y  |   d S )NF)r!   )r<   r   )r|   _addressr   r   r   !test_serve_exits_cleanly_on_close  s    2r   c                    sh  t  4 I d H <\} }t  4 I d H \} }t }||t}||t}|dI d H  |dI d H  | I d H dksJ | I d H dksJ |  tt	j
  |dI d H  W d    n1 s0    Y  tt	j
 | I d H  W d    n1 s0    Y  tt	j
 ||t W d    n1 sJ0    Y  ddddd}t	 4 I d H \}tt	j
& ||jt|I d H  W d    n1 s0    Y  W d   I d H  q1 I d H s0    Y  W d    n1 s0    Y  W d   I d H  q61 I d H s,0    Y  W d   I d H  qd1 I d H sZ0    Y  d S )	Nr~   ru      xxxobjectr&   rn   r   c                   s   d S ra   r   rn   r   r   r   null_handler$  s    z+test_client_multiplex.<locals>.null_handler)r<   r    rA   rB   r-   rF   r   rC   rD   r   r   r3   r4   r5   r6   )rn   Zaddress1Zaddress2rI   client1client2r   r;   r   r   r   test_client_multiplex  s&    ,
..,r   c               	     sd   t j F} tjtdd t|  W d    n1 s80    Y  W d    n1 sV0    Y  d S )Nz#^DTLS requires a SOCK_DGRAM socket$r>   )r   r   rC   rD   rG   r
   )sr   r   r   test_dtls_over_dgram_only,  s    r   c               
     sN  ddddd} t   }|jdI d H  t 4 I d H x}||jt| I d H  t	tj
& ||jt| I d H  W d    n1 s0    Y  |j  W d   I d H  q1 I d H s0    Y  t 4 I d H 8}||jt| I d H  |j  W d   I d H  q*1 I d H s 0    Y  W d    n1 s@0    Y  d S )Nr   r&   r   c                   s   d S ra   r   r   r   r   r   r   3  s    z'test_double_serve.<locals>.null_handlerrx   )r    r   r2   r   r3   r4   r5   r6   rC   rD   ZBusyResourceErrorr7   r8   )r   r|   r;   r   r   r   test_double_serve2  s    
44r   ztrio.abc.Clockc              
     s   t  }|  t }t v}|jdI d H  td0}||j t	}|
 I d H  W d    n1 sp0    Y  |jsJ W d    n1 s0    Y  W d    n1 s0    Y  d S )Nrx   rL   )r   rh   r    r   r2   r   rl   rA   r*   rB   r,   rm   )rK   r^   r   r   rr   rz   r   r   r   test_connect_to_non_serverD  s    ,r   c           	   
     sH  t  }|  dD ].}t 4 I d H \}}t|d}|j|ksHJ ||t}t|d D ],}|t	|
 I d H  tdI d H  q`| }|jdksJ t|D ]"}| I d H t	|
 ksJ q|dI d H  | I d H dksJ W d    n1 s0    Y  W d   I d H  q1 I d H s80    Y  qd S )N)rf      )incoming_packets_buffer      s   buffer clear now)r   rh   r<   r    r   rA   rB   ri   r-   rj   rk   r   rX   
statisticsZ incoming_packets_dropped_in_triorF   )	rK   r^   buffer_sizern   rH   rI   rp   ro   statsr   r   r   test_incoming_buffer_overflowP  s     
 r   c                   s  t  }|  ddlm}m}m}m}m}m}m	} |||j
|jd|||jddddtddd}	|	d }
|	d d }|	d d }t|	}d	|d
< |||j
|jd|||jddddtddd}|||j
|jd|||jddddtddd d}|||j
|jddd}|||j
|jdtdd d}t 4 I d H \}}tjjtjjdR}dd|
|||||||f
D ](}|||I d H  tdI d H  qtW d    n1 s0    Y  W d   I d H  q1 I d H s0    Y  d S )Nr   )ContentTypeHandshakeFragmentHandshakeTypeProtocolVersionRecordencode_handshake_fragmentencode_recordrf   )msg_typeZmsg_lenZmsg_seqZfrag_offsetZfrag_lenfrag)content_typeversionZepoch_seqnorZ                r   r@   #      r   ru   r   )r   rh   
trio._dtlsr   r   r   r   r   r   r   	handshakeZDTLS10client_hellobytes	bytearrayr<   r   r   r   sendtorX   )rK   r^   r   r   r   r   r   r   r   r   Zclient_hello_extendedZclient_hello_shortZclient_hello_really_shortZclient_hello_corrupt_record_lenZclient_hello_fragmentedZ$client_hello_trailing_data_in_recordZhandshake_emptyZ client_hello_truncated_in_cookiern   rH   r   Z
bad_packetr   r   r   *test_server_socket_doesnt_crash_on_garbagec  s    $

	
	r   c              
     s   t    ddlm m t tdddd fdd}|_t	 4 I d H \\}}t
 *}||t}| I d H  W d    qf1 s0    Y  qfW d   I d H  q1 I d H s0    Y  W d    n1 s0    Y  jsJ d S )	Nr   )	BadPacketdecode_client_hello_untrustedr   r   r&   rM   c                   s   z| j \}}}W n  y&   Y n^0 t|dkrt| j }t}|t|krft|d }  ||  dN  < tj| |d} |  d S )Nr   r   )rZ   )rZ   lenr   nextr8   attrsZevolver\   )r/   rn   cookierZ   offsetr   rr   r   r^   Zoffset_to_corruptr   r   r`     s    
z2test_invalid_cookie_rejected.<locals>.route_packet)r   rh   r   r   r   r   CancelScoper   r`   r<   r    rA   rB   r,   rm   )rK   r`   rn   rH   rp   rz   r   r   r   test_invalid_cookie_rejected  s    
vr   c                   s  t  }|  t b}t 8}|jdI d H  t 4 I d H }dddd fdd}||jt	|I d H  t
d t 0 ||j t}| I d H  W d    n1 s0    Y   jsJ t
d	 ||j t}| I d H d
ksJ tdI d H  |j  W d   I d H  qJ1 I d H s@0    Y  W d    n1 s`0    Y  W d    n1 s0    Y  d S )Nrx   Tr	   r&   ry   c                   s   rldt d    tdI d H  t d ttj |  I d H  W d    q1 s`0    Y  nt d | dI d H  d S )NFz'handler: first time, cancelling connectg      ?z"handler: handshake should fail nowz&handler: not first time, sending hellor=   )	r)   r8   r   rX   rC   rD   r.   r,   r-   rz   Zconnect_cscopeZ
first_timer   r   r{     s    .zAtest_client_cancels_handshake_and_starts_new_one.<locals>.handlerzclient: starting first connectzclient: starting second connectr=   rf   )r   rh   r    r   r2   r   r3   r4   r5   r6   r)   r   rA   r*   rB   r,   rm   rF   rX   r7   r8   )rK   r^   r9   rp   r;   r{   rz   r   r   r   0test_client_cancels_handshake_and_starts_new_one  s$    
,
r   c                    s  t  } t  }| jdI d H  |jdI d H  ddddd ddd fdd}t 4 I d H }|| jt|I d H  ||jt I d H  || j	 t
}|d	I d H  | I d H d	ksJ | |j	 t
}| I d H  ttj  |d
I d H  W d    n1 s(0    Y  |dI d H  | I d H dksZJ |j  W d   I d H  q1 I d H s0    Y  W d    n1 s0    Y  W d    n1 s0    Y  d S )Nrx   r	   r&   ry   c                   s(   | 2 z3 d H W }|  |I d H  q6 d S ra   )r-   )rz   r/   r   r   r   r1   1  s    z-test_swap_client_server.<locals>.echo_handlerc                   s>   t tj  | I d H  W d    n1 s00    Y  d S ra   )rC   rD   r   r.   r   r1   r   r   crashing_echo_handler5  s    z6test_swap_client_server.<locals>.crashing_echo_handlers   b as clients   association brokens   a as client)r    r   r2   r   r3   r4   r5   r6   rA   r*   rB   r-   rF   r,   rC   rD   r.   r7   r8   )abr   r;   Zb_to_aZa_to_br   r   r   test_swap_client_server,  s$    0r   c                    s"  t    ddddfdd} | _t 4 I d H \} t t 4 I d H b}dd fdd	}|| td
I d H  d|j	
dj	 I d H  W d   I d H  q1 I d H s0    Y  W d    n1 s0    Y  W d   I d H  q1 I d H s0    Y  d S )NTr   r&   rM   c                   s*    rt d|  d S t d|  |  d S )Nzdropped packetzdelivered packet)r)   r\   rd   
blackholedr^   r   r   r`   U  s
    

z@test_openssl_retransmit_doesnt_break_stuff.<locals>.route_packetrt   c                    sH     t} | jddI d H  | dI d H  |  I d H dksDJ d S )Ng      ?Zinitial_retransmit_timeout   hi)rA   rB   r,   r-   rF   )rp   )rH   rI   r   r   	connecteri  s    z=test_openssl_retransmit_doesnt_break_stuff.<locals>.connecterg?Fr   )r   rh   r`   r<   r    r   r3   rb   rX   r   r   r*   )r`   r|   r;   r   r   )rH   r   rI   r^   r   *test_openssl_retransmit_doesnt_break_stuffK  s     
r   c           	   
     s   t    d ddd fdd}|_t 4 I d H \}}dD ]l}t R}t }d ||t}|j	|dI d H  t }|| |ksJ W d    qF1 s0    Y  qFW d   I d H  q1 I d H s0    Y  d S )	NTr   r&   rM   c                   s    r
d n
 |  d S )NF)r\   rd   r   r   r   r`     s    zCtest_initial_retransmit_timeout_configuration.<locals>.route_packet)r   r      r   )
r   rh   r`   r<   r    r   current_timerA   rB   r,   )	rK   r`   rn   rH   trp   beforerz   afterr   r   r   -test_initial_retransmit_timeout_configuration  s    r   c               	     s   d t    ddd fdd} | _t d4 I d H \}}t Z}||t}|  | I d H  |	dI d H  |
 I d H dksJ W d    n1 s0    Y  W d   I d H  q1 I d H s0    Y  d S )	Ni,  r   r&   rM   c                   sB   t d|   t dt| j  t| j ks4J |  d S )Ndelivering zpayload size: )r)   r   rZ   r\   rd   ZMTUr^   r   r   r`     s    z9test_explicit_tiny_mtu_is_respected.<locals>.route_packetr0   r   )r   rh   r`   r<   r    rA   rB   r+   r,   r-   rF   )r`   _serverrH   rp   rz   r   r   r   #test_explicit_tiny_mtu_is_respected  s    
r   )r   rK   r   c              	     s   t      | rdndddd fdd}| _t| d4 I d H \}}t| d\}||t}|d	 |d
I d H  |	 I d H d
ksJ |
 dksJ W d    n1 s0    Y  W d   I d H  q1 I d H s0    Y  d S )Ni  i$  r   r&   rM   c                   s:   t | jkrtd|   ntd|    |  d S )Nz	dropping r   )r   rZ   r)   r\   rd   r^   r"   r   r   r`     s    z@test_handshake_handles_minimum_network_mtu.<locals>.route_packetr$   i'  ru   i(#  )r   rh   r`   r<   r    rA   rB   r+   r-   rF   rE   )r   rK   r`   rn   rH   rI   rp   r   r   r   *test_handshake_handles_minimum_network_mtu  s    
r   z$always:unclosed DTLS:ResourceWarningc                    s   t j j} dddd}tt2 | I d H }t j I d H  t	  W d    n1 s\0    Y  t j I d H  t j j}| |k sJ | |ksJ d S )Nintrt   c               
     s   t  } tjjtjjd}|dI d H  | | t}t 4 I d H <}|	|j
 tj I d H  |j  W d   I d H  q1 I d H s0    Y  W d    n1 s0    Y  tj j}|S )Nr   rx   )r    r   r   r   r2   rA   r*   rB   r3   rb   r,   testingwait_all_tasks_blockedr7   r8   lowlevelcurrent_statisticstasks_living)er   cr;   during_tasksr   r   r   start_and_forget_endpoint  s    RzDtest_system_task_cleaned_up_on_gc.<locals>.start_and_forget_endpoint)
r   r   r   r   rC   warnsResourceWarningr   r   r   )Zbefore_tasksr   r   Zafter_tasksr   r   r   !test_system_task_cleaned_up_on_gc  s    $r   c                    sL   t  } tt ~ t  W d    n1 s.0    Y  tj I d H  d S ra   )r    rC   r   r   r   r   r   r   r   r   r   r   !test_gc_before_system_task_starts  s
    $r   c                    s   t  } |   t }|jdI d H  |  tj I d H  tjjtjj	d(}|
d|j I d H  W d    n1 s~0    Y  tt ~t  W d    n1 s0    Y  d S )Nrx   r   r   )r   rh   r    r   r2   Z_ensure_receive_loopr   r   r   r   r   r*   rC   r   r   r   )r^   r   r   r   r   r   test_gc_as_packet_received  s    6r   c                  C  sN   dddd} t | }tt ~t  W d    n1 s@0    Y  d S )Nr
   rt   c                    s   t  } |   t S ra   )r   rh   r    )r^   r   r   r   main  s    z&test_gc_after_trio_exits.<locals>.main)r   runrC   r   r   r   )r   r   r   r   r   test_gc_after_trio_exits  s
    	
r   c                    sD   t  *} | j  tj I d H  W d    n1 s60    Y  d S ra   )r    r   r   r   r   r   r   r   r   r   'test_already_closed_socket_doesnt_crash-  s    
r   c              
     s   t      t 4 I d H \}ddd fdd}| _t T}td* ||t}|	 I d H  W d    n1 s0    Y  W d    n1 s0    Y  W d   I d H  q1 I d H s0    Y  d S )Nr   r&   rM   c                   s     |  j  d S ra   )r\   r   r   rd   r^   r9   r   r   r`   @  s    
zEtest_socket_closed_while_processing_clienthello.<locals>.route_packetrf   )
r   rh   r<   r`   r    r   rl   rA   rB   r,   )rK   rH   r`   rI   rp   r   r   r   /test_socket_closed_while_processing_clienthello6  s    r   c                   s  t  }|  ddddd}||_t 4 I d H \}}t }||t t 4 I d H N}dd fdd}|	| t
d	I d H  ||t W d   I d H  q1 I d H s0    Y  W d    n1 s0    Y  W d   I d H  q1 I d H s0    Y  d S )
Nr   r&   rM   c                 S  s   d S ra   r   rd   r   r   r   r`   R  s    zGtest_association_replaced_while_handshake_running.<locals>.route_packetrt   c                     s>   t tj   I d H  W d    n1 s00    Y  d S ra   )rC   rD   r   r.   r,   r   c1r   r   doomed_handshake\  s    zKtest_association_replaced_while_handshake_running.<locals>.doomed_handshakerf   )r   rh   r`   r<   r    rA   rB   r   r3   rb   rX   )rK   r^   r`   rn   rH   rI   r;   r   r   r   r   1test_association_replaced_while_handshake_runningL  s    
r   c               
     s   t  } |   ddddd}|| _t 4 I d H \}}t b}||t}||t tt	j
 | I d H  W d    n1 s0    Y  W d    n1 s0    Y  W d   I d H  q1 I d H s0    Y  d S )Nr   r   rM   c                 S  s
   t  d S ra   )AssertionErrorrd   r   r   r   r`   l  s    zGtest_association_replaced_before_handshake_starts.<locals>.route_packet)r   rh   r`   r<   r    rA   rB   rC   rD   r   r.   r,   )r^   r`   rn   rH   rI   r   r   r   r   1test_association_replaced_before_handshake_startsg  s    r   c                    s  t  4 I d H \} }t }t 4 I d H ~}tddD ] }|d|ft}||j q8||t}|	dI d H  |
 I d H dksJ |j  W d   I d H  q1 I d H s0    Y  W d    n1 s0    Y  W d   I d H  q1 I d H s0    Y  d S )Nr   rf   r%   r   )r<   r    r   r3   ri   rA   rB   rb   r,   r-   rF   r7   r8   )rn   rH   rI   r;   ro   rz   r   r   r   test_send_to_closed_local_porty  s    r   )M
__future__r   rY   
contextlibr   	itertoolsr   typingr   r   r   rC   Ztrio._tests.pytest_pluginr   ZtrustmeZOpenSSLr   ImportErrorerrorr   Ztrio.testingr	   r
   Ztrio.testing._fake_netr   r   Z_core._tests.tutilr   r   r   collections.abcr   CAcaZ
issue_certZserver_certContextZDTLS_METHODr6   Zconfigure_certrB   Zconfigure_trustmarkZparametrizeparamZparametrize_ipv6r    r<   rJ   rs   rw   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   filterwarningsr   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s   


'X
r*-4"
#



	