o
    ;'h�3  ã                   @  sP  d dl mZ d dlZd dlZd dlZd dlZd dlmZmZ d dl	m
Z
 d dlmZ d dl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mZmZmZ ejdkrbd dlmZm Z  nd dl!mZm Z  edƒZ"edƒZ#e$e$e%e%f df Z&e$e&df Z'G dd„ deƒZ(e
dd�G dd„ deƒƒZ)e
dd�G dd„ dee) ƒƒZ*dS )é    )ÚannotationsN)ÚCallableÚMapping)Ú	dataclass)Úwraps)ÚAnyÚTypeVaré   )ÚBrokenResourceErrorÚEndOfStreamÚaclose_forcefullyÚget_cancelled_exc_classÚ	to_thread)ÚTypedAttributeSetÚtyped_attribute)ÚAnyByteStreamÚ
ByteStreamÚListenerÚ	TaskGroup)é   é   )ÚTypeVarTupleÚUnpackÚT_RetvalÚPosArgsT.c                   @  sž   e Zd ZU dZeƒ Zded< eƒ Zded< eƒ Zded< eƒ Z	ded	< eƒ Z
d
ed< eƒ Zded< eƒ Zded< eƒ Zded< eƒ Zded< eƒ Zded< dS )ÚTLSAttributez5Contains Transport Layer Security related attributes.ú
str | NoneÚalpn_protocolÚbytesÚchannel_binding_tls_uniqueztuple[str, str, int]Úcipherz*None | dict[str, str | _PCTRTTT | _PCTRTT]Úpeer_certificatezbytes | NoneÚpeer_certificate_binaryÚboolÚserver_sidez!list[tuple[str, str, int]] | NoneÚshared_ciphersússl.SSLObjectÚ
ssl_objectÚstandard_compatibleÚstrÚtls_versionN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Ú__annotations__r   r    r!   r"   r$   r%   r'   r(   r*   © r0   r0   úGC:\Users\shubh\Videos\agent\nova\Lib\site-packages\anyio/streams/tls.pyr   !   s   
 r   F)Úeqc                   @  s    e Zd ZU dZded< ded< ded< ded	< ded
< edddddœd2dd„ƒZd3dd„Zd4dd „Zd5d"d#„Z	d6d7d(d)„Z
d8d+d,„Zd5d-d.„Zed9d0d1„ƒZdS ):Ú	TLSStreama  
    A stream wrapper that encrypts all sent data and decrypts received data.

    This class has no public initializer; use :meth:`wrap` instead.
    All extra attributes from :class:`~TLSAttribute` are supported.

    :var AnyByteStream transport_stream: the wrapped stream

    r   Útransport_streamr#   r(   r&   Ú_ssl_objectzssl.MemoryBIOÚ	_read_bioÚ
_write_bioNT)r$   ÚhostnameÚssl_contextr(   r$   úbool | Noner8   r   r9   ússl.SSLContext | NoneÚreturnc                Ã  sÄ   �|du r| }|s'|rt jjnt jj}t  |¡}tt dƒr'| jt j M  _t  ¡ }t  ¡ }t	|ƒt j
u r@|j||||d�}	nt |j||||d¡I dH }	| |||	||d�}
|
 |	j¡I dH  |
S )aÔ  
        Wrap an existing stream with Transport Layer Security.

        This performs a TLS handshake with the peer.

        :param transport_stream: a bytes-transporting stream to wrap
        :param server_side: ``True`` if this is the server side of the connection,
            ``False`` if this is the client side (if omitted, will be set to ``False``
            if ``hostname`` has been provided, ``False`` otherwise). Used only to create
            a default context when an explicit context has not been provided.
        :param hostname: host name of the peer (if host name checking is desired)
        :param ssl_context: the SSLContext object to use (if not provided, a secure
            default will be created)
        :param standard_compatible: if ``False``, skip the closing handshake when
            closing the connection, and don't raise an exception if the peer does the
            same
        :raises ~ssl.SSLError: if the TLS handshake fails

        NÚOP_IGNORE_UNEXPECTED_EOF)r$   Úserver_hostname)r4   r(   r5   r6   r7   )ÚsslÚPurposeÚCLIENT_AUTHÚSERVER_AUTHÚcreate_default_contextÚhasattrÚoptionsr=   Ú	MemoryBIOÚtypeÚ
SSLContextÚwrap_bior   Zrun_syncÚ_call_sslobject_methodÚdo_handshake)Úclsr4   r$   r8   r9   r(   ÚpurposeZbio_inZbio_outr'   Úwrapperr0   r0   r1   ÚwrapO   s@   €ÿ

ÿ
ú	ûzTLSStream.wrapÚfuncú&Callable[[Unpack[PosArgsT]], T_Retval]ÚargsúUnpack[PosArgsT]r   c                 Ç  s’  �	 z||Ž }W n­ t jyY   z| jjr!| j | j ¡ ¡I d H  | j ¡ I d H }W n& ty8   | j	 
¡  Y n tyP } z| j	 
¡  | j 
¡  t|‚d }~ww | j	 |¡ Y no t jyn   | j | j ¡ ¡I d H  Y nZ t jy‡ } z| j	 
¡  | j 
¡  t|‚d }~w t jyµ } z"| j	 
¡  | j 
¡  t|t jƒs§|jr°d|jv r°| jr­t|‚td ‚‚ d }~ww | jjrÆ| j | j ¡ ¡I d H  |S q)NTZUNEXPECTED_EOF_WHILE_READING)r?   ÚSSLWantReadErrorr7   Úpendingr4   ÚsendÚreadÚreceiver   r6   Ú	write_eofÚOSErrorr
   ÚwriteÚSSLWantWriteErrorÚSSLSyscallErrorÚSSLErrorÚ
isinstanceÚSSLEOFErrorÚstrerrorr(   )ÚselfrP   rR   ÚresultÚdataÚexcr0   r0   r1   rJ   –   sV   €

€ý€

€

ÿ
€õ×z TLSStream._call_sslobject_methodútuple[AnyByteStream, bytes]c                 Ã  s:   �|   | jj¡I dH  | j ¡  | j ¡  | j| j ¡ fS )z„
        Does the TLS closing handshake.

        :return: a tuple of (wrapped byte stream, bytes left in the read buffer)

        N)rJ   r5   Úunwrapr6   rY   r7   r4   rW   ©rb   r0   r0   r1   rg   Ä   s
   €

zTLSStream.unwrapÚNonec                 Ã  sP   �| j rz	|  ¡ I d H  W n ty   t| jƒI d H  ‚ w | j ¡ I d H  d S ©N)r(   rg   ÚBaseExceptionr   r4   Úacloserh   r0   r0   r1   rl   Ð   s   €þzTLSStream.acloseé   Ú	max_bytesÚintr   c                 Ã  s$   �|   | jj|¡I d H }|st‚|S rj   )rJ   r5   rW   r   )rb   rn   rd   r0   r0   r1   rX   Ú   s
   €zTLSStream.receiveÚitemc                 Ã  s   �|   | jj|¡I d H  d S rj   )rJ   r5   r[   )rb   rp   r0   r0   r1   rV   á   s   €zTLSStream.sendc                 Ã  sb   �|   tj¡}t d|¡}|r-t| d¡ƒt| d¡pdƒ}}||fdk r-td|› �ƒ‚tdƒ‚)NzTLSv(\d+)(?:\.(\d+))?é   r	   r   )rq   r   z;send_eof() requires at least TLSv1.3; current session uses z7send_eof() has not yet been implemented for TLS streams)Úextrar   r*   ÚreÚmatchro   ÚgroupÚNotImplementedError)rb   r*   rt   ÚmajorÚminorr0   r0   r1   Úsend_eofä   s   €"ÿÿÿzTLSStream.send_eofúMapping[Any, Callable[[], Any]]c                   sŒ   i ˆ j j¥tjˆ jjtjˆ jjtjˆ jjtj	‡ fdd„tj
‡ fdd„tj‡ fdd„tj‡ fdd„tj‡ fdd„tj‡ fdd„tjˆ jji
¥S )Nc                     ó   ˆ j  d¡S )NF©r5   Úgetpeercertr0   rh   r0   r1   Ú<lambda>ü   s    z,TLSStream.extra_attributes.<locals>.<lambda>c                     r{   )NTr|   r0   rh   r0   r1   r~   ý   s    ÿc                     s   ˆ j jS rj   )r5   r$   r0   rh   r0   r1   r~      s    c                     s   ˆ j jr	ˆ j  ¡ S d S rj   )r5   r$   r%   r0   rh   r0   r1   r~     s   ÿc                     ó   ˆ j S rj   ©r(   r0   rh   r0   r1   r~     ó    c                     r   rj   )r5   r0   rh   r0   r1   r~     r�   )r4   Úextra_attributesr   r   r5   Úselected_alpn_protocolr   Úget_channel_bindingr    r!   r"   r$   r%   r(   r'   r*   Úversionrh   r0   rh   r1   r‚   ó   s   ÿ


ïzTLSStream.extra_attributes)r4   r   r$   r:   r8   r   r9   r;   r(   r#   r<   r3   )rP   rQ   rR   rS   r<   r   )r<   rf   ©r<   ri   )rm   )rn   ro   r<   r   )rp   r   r<   ri   ©r<   rz   )r+   r,   r-   r.   r/   ÚclassmethodrO   rJ   rg   rl   rX   rV   ry   Úpropertyr‚   r0   r0   r0   r1   r3   =   s*   
 
ù
F
.



r3   c                   @  sn   e Zd ZU dZded< ded< dZded< d	Zd
ed< ed dd„ƒZ	d!d"dd„Z	d#dd„Z
ed$dd„ƒZdS )%ÚTLSListeneraš  
    A convenience listener that wraps another listener and auto-negotiates a TLS session
    on every accepted connection.

    If the TLS handshake times out or raises an exception,
    :meth:`handle_handshake_error` is called to do whatever post-mortem processing is
    deemed necessary.

    Supports only the :attr:`~TLSAttribute.standard_compatible` extra attribute.

    :param Listener listener: the listener to wrap
    :param ssl_context: the SSL context object
    :param standard_compatible: a flag passed through to :meth:`TLSStream.wrap`
    :param handshake_timeout: time limit for the TLS handshake
        (passed to :func:`~anyio.fail_after`)
    zListener[Any]Úlistenerzssl.SSLContextr9   Tr#   r(   é   ÚfloatÚhandshake_timeoutre   rk   Ústreamr   r<   ri   c                 Ã  sL   �t |ƒI dH  t| tƒ ƒst t¡jd| d� t| tƒr#t| tƒ ƒr$‚ dS )a½  
        Handle an exception raised during the TLS handshake.

        This method does 3 things:

        #. Forcefully closes the original stream
        #. Logs the exception (unless it was a cancellation exception) using the
           ``anyio.streams.tls`` logger
        #. Reraises the exception if it was a base exception or a cancellation exception

        :param exc: the exception
        :param stream: the original stream

        NzError during TLS handshake)Úexc_info)r   r_   r   ÚloggingÚ	getLoggerr+   Ú	exceptionÚ	Exception)re   r�   r0   r0   r1   Úhandle_handshake_error"  s   €
ÿÿz"TLSListener.handle_handshake_errorNÚhandlerúCallable[[TLSStream], Any]Ú
task_groupúTaskGroup | Nonec                 ƒ  s2   �t ˆ ƒd‡ ‡fdd„ƒ}ˆj ||¡I d H  d S )Nr�   r   r<   ri   c              
   “  s¢   �ddl m} z$|ˆjƒ� tj| ˆjˆjd�I d H }W d   ƒ n1 s%w   Y  W n tyG } zˆ || ¡I d H  W Y d }~d S d }~ww ˆ |ƒI d H  d S )Nr	   )Ú
fail_after)r9   r(   )	Ú rš   rŽ   r3   rO   r9   r(   rk   r•   )r�   rš   Zwrapped_streamre   ©r–   rb   r0   r1   Úhandler_wrapperG  s    €ýÿ€ €ÿz*TLSListener.serve.<locals>.handler_wrapper)r�   r   r<   ri   )r   r‹   Úserve)rb   r–   r˜   r�   r0   rœ   r1   rž   B  s   €zTLSListener.servec                 Ã  s   �| j  ¡ I d H  d S rj   )r‹   rl   rh   r0   r0   r1   rl   Y  s   €zTLSListener.acloserz   c                   s   t j‡ fdd„iS )Nc                     r   rj   r€   r0   rh   r0   r1   r~   _  r�   z.TLSListener.extra_attributes.<locals>.<lambda>)r   r(   rh   r0   rh   r1   r‚   \  s   ÿzTLSListener.extra_attributes)re   rk   r�   r   r<   ri   rj   )r–   r—   r˜   r™   r<   ri   r†   r‡   )r+   r,   r-   r.   r/   r(   rŽ   Ústaticmethodr•   rž   rl   r‰   r‚   r0   r0   r0   r1   rŠ   
  s   
 "ý
rŠ   )+Ú
__future__r   r‘   rs   r?   ÚsysÚcollections.abcr   r   Údataclassesr   Ú	functoolsr   Útypingr   r   r›   r
   r   r   r   r   Z_core._typedattrr   r   Úabcr   r   r   r   Úversion_infor   r   Ztyping_extensionsr   r   Útupler)   Z_PCTRTTZ_PCTRTTTr   r3   rŠ   r0   r0   r0   r1   Ú<module>   s2    
 M