U
    •uÄcŠ  ã                   @   sŒ   d dl Z d dlmZ d dlmZ d dlZd dlmZ d dlmZ dZ	de
ee edœdd	„Zejjed
œdd„Zdd„ Ze
edœdd„ZdS )é    N)ÚPopen)ÚOptional)Úsleep)ÚTransportDetails)r   Úpeer2strÚtransport_channel_idÚcreate_transport_details)Ú	is_serverÚchannel_id_typeÚreturnc                 C   sŒ   |dkrdS |dkr"t d |¡ƒ‚|  d¡}|dkr<t dƒ‚t|dƒsNt dƒ‚|jd	d
�}t|ƒtkrjdS t ¡ }| 	|¡ | 
¡ }|S dS )a’  
    Application-layer user authentication protocols are vulnerable to generic
    credential forwarding attacks, where an authentication credential sent by
    a client C to a server M may then be used by M to impersonate C at another
    server S. To prevent such credential forwarding attacks, modern authentication
    protocols rely on channel bindings. For example, WAMP-cryptosign can use
    the tls-unique channel identifier provided by the TLS layer to strongly bind
    authentication credentials to the underlying channel, so that a credential
    received on one TLS channel cannot be forwarded on another.

    :param transport: The asyncio TLS transport to extract the TLS channel ID from.
    :param is_server: Flag indicating the transport is for a server.
    :param channel_id_type: TLS channel ID type, currently only "tls-unique" is supported.
    :returns: The TLS channel id (32 bytes).
    Ns                                    )ú
tls-uniquezinvalid channel ID type {}Ú
ssl_objectzUTLS transport channel_id for tls-unique requested, but ssl_obj not found on transportÚget_channel_bindingz_TLS transport channel_id for tls-unique requested, but get_channel_binding not found on ssl_objr   )Úcb_type)Ú	ExceptionÚformatÚget_extra_infoÚhasattrr   ÚtypeÚbytesÚhashlibZsha256ÚupdateÚdigest)Ú	transportr	   r
   Zssl_objZtls_finished_msgÚmÚ
channel_id© r   úU/var/www/html/SARATH/school/venv/lib/python3.8/site-packages/autobahn/asyncio/util.pyr   +   s     


r   )r   r   c                 C   sÂ   zf|   d¡}t|tƒrBt|ƒdkr&dnd}d |d |d |¡W S t|tƒrXd |¡W S d	 |¡W S W n   Y nX z|   d
¡}d |j¡W S    Y nX z|   d¡}d |¡W S    Y nX dS )NÚpeernameé   é   é   ztcp{2}:{0}:{1}r   é   zunix:{0}z?:{0}Ú
subprocessz
process:{}Úpipezpipe:{}Úunknown)r   Ú
isinstanceÚtupleÚlenr   ÚstrÚpid)r   ÚpeerZip_verÚprocr$   r   r   r   r   V   s*    




r   c                     s<   ddl m‰  ddddg} ttdd„ t‡ fd	d„| ƒƒƒ} | S )
Nr   ©Ú
serializerZCBORSerializerZMsgPackSerializerZUBJSONSerializerZJsonSerializerc                 S   s   | S ©Nr   )Úxr   r   r   Ú<lambda>z   ó    z!get_serializers.<locals>.<lambda>c                    s   t ˆ | ƒrtˆ | ƒS d S r/   )r   Úgetattr)Úsr-   r   r   r1   z   s   )Zautobahn.wampr.   ÚlistÚfilterÚmap)Zserializersr   r-   r   Úget_serializersv   s    ÿr8   )r	   r   c              	   C   sb   t | ƒ}|  dd ¡d k	}|r8dt| |dƒi}tj}d }ni }tj}d }tj}t|||||||d�S )NÚpeercertr   )Úchannel_typeÚchannel_framingr+   r	   Ú	is_securer   Ú	peer_cert)r   r   r   r   ZCHANNEL_TYPE_TLSZCHANNEL_TYPE_TCPZCHANNEL_FRAMING_WEBSOCKET)r   r	   r+   r<   r   r:   r=   r;   r   r   r   r      s&     
ÿ   þr   )N)r   r#   r   Útypingr   Úasyncior   Zautobahn.wamp.typesr   Z__allÚboolr)   r   r   Ú
transportsÚBaseTransportr   r8   r   r   r   r   r   Ú<module>   s   + 	