a
     hi[                     @   s  d 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	m
Z
mZmZmZmZmZ erdddlmZ dd	 ed
D ZG dd dZG dd dZdZdZdZdZdZeZdZdZdZdZdZ dZ!dZ"G dd deZ#G dd deZ$e$j%e$j&e$j'fZ(dZ)dZ*dZ+dZ,d Z-d!Z.d"Z/d"Z0e1d#dZ2G d$d% d%e3Z4G d&d' d'eZ5G d(d) d)eZ6G d*d+ d+eZ7e8e9e8d,d-d.Z:G d/d0 d0Z;G d1d2 d2Z<G d3d4 d4Z=G d5d6 d6Z>dS )7zY
wsproto/frame_protocol
~~~~~~~~~~~~~~~~~~~~~~

WebSocket frame protocol implementation.
    N)getincrementaldecoderIncrementalDecoder)IntEnum)	GeneratorList
NamedTupleOptionalTupleTYPE_CHECKINGUnion   )	Extensionc                    s&   g | ] t  fd dtdD qS )c                 3   s   | ]}| A V  qd S N ).0abr   [/var/www/html/swiplay.fr/scambot/venv/lib/python3.9/site-packages/wsproto/frame_protocol.py	<genexpr>       z<listcomp>.<genexpr>   )bytesrange)r   r   r   r   
<listcomp>   r   r   r   c                   @   s,   e Zd ZeddddZeedddZdS )XorMaskerSimpleN)masking_keyreturnc                 C   s
   || _ d S r   )_masking_key)selfr   r   r   r   __init__   s    zXorMaskerSimple.__init__datar   c                 C   s   |rt |}dd | jD \}}}}|d d d ||d d d< |dd d ||dd d< |dd d ||dd d< |dd d ||dd d< t|d }| j|d  | jd |  | _t|S |S )Nc                 s   s   | ]}t | V  qd S r   )
_XOR_TABLE)r   nr   r   r   r      r   z*XorMaskerSimple.process.<locals>.<genexpr>   r         )	bytearrayr   	translatelenr   )r   r"   Z
data_arrayr   r   cdZkey_rotationr   r   r   process   s    zXorMaskerSimple.process)__name__
__module____qualname__r   r    r-   r   r   r   r   r      s   r   c                   @   s   e Zd ZeedddZdS )XorMaskerNullr!   c                 C   s   |S r   r   r   r"   r   r   r   r-   .   s    zXorMaskerNull.processN)r.   r/   r0   r   r-   r   r   r   r   r1   -   s   r1   ~      }   i  l       @             c                   @   s6   e Zd ZdZdZdZdZdZdZdZ	e
dd	d
ZdS )Opcodez7
    RFC 6455, Section 5.2 - Base Framing Protocol
    r   r   r&      	   
   r   c                 C   s   t | d@ S )Nr<   )boolr   r   r   r   	iscontrol_   s    zOpcode.iscontrolN)r.   r/   r0   __doc__CONTINUATIONTEXTBINARYCLOSEPINGPONGr@   rB   r   r   r   r   r;   H   s   r;   c                   @   sH   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S )CloseReasonz8
    RFC 6455, Section 7.4.1 - Defined Status Codes
      i  i  i  i  i  i  i  i  i  i  i  i  i  N)r.   r/   r0   rC   NORMAL_CLOSUREZ
GOING_AWAYPROTOCOL_ERRORZUNSUPPORTED_DATANO_STATUS_RCVDABNORMAL_CLOSUREINVALID_FRAME_PAYLOAD_DATAZPOLICY_VIOLATIONZMESSAGE_TOO_BIGZMANDATORY_EXTINTERNAL_ERRORZSERVICE_RESTARTZTRY_AGAIN_LATERTLS_HANDSHAKE_FAILEDr   r   r   r   rJ   c   s   		rJ   rK   i  i  i  i  i  z!Ic                       s,   e Zd Zejfeedd fddZ  ZS )ParseFailedN)msgcoder   c                    s   t  | || _d S r   )superr    rU   )r   rT   rU   	__class__r   r   r       s    zParseFailed.__init__)r.   r/   r0   rJ   rM   strr    __classcell__r   r   rW   r   rS      s
   rS   c                   @   s&   e Zd ZU eed< eed< eed< dS )RsvBitsrsv1rsv2rsv3N)r.   r/   r0   r@   __annotations__r   r   r   r   r[      s   
r[   c                   @   s:   e Zd ZU eed< eed< eed< eed< ee	 ed< dS )Headerfinrsvopcodepayload_lenr   N)
r.   r/   r0   r@   r_   r[   r;   intr   r   r   r   r   r   r`      s
   
r`   c                   @   s@   e Zd ZU eed< eeeee	ef f ed< e
ed< e
ed< dS )Framerc   payloadframe_finishedmessage_finishedN)r.   r/   r0   r;   r_   r   r   rY   r	   re   r@   r   r   r   r   rf      s   
rf   )r"   nbytesr   c                 C   s4   t | |kr| S | d | } | jdddd} | S )Nutf-8ignore)errors)r*   decodeencode)r"   rj   r   r   r   _truncate_utf8   s
    rp   c                   @   s   e Zd Zdee ddddZeddddZeedd	d
Zeee dddZ	ddddZ
ddddZedddZdS )BufferN)initial_bytesr   c                 C   s    t  | _d| _|r| | d S Nr   )r(   buffer
bytes_usedfeed)r   rr   r   r   r   r       s    zBuffer.__init__)	new_bytesr   c                 C   s   |  j |7  _ d S r   )rt   )r   rw   r   r   r   rv     s    zBuffer.feed)rj   r   c                 C   s6   |s
t  S | j| j| j|  }|  jt|7  _|S r   )r(   rt   ru   r*   )r   rj   r"   r   r   r   consume_at_most  s
    zBuffer.consume_at_mostc                 C   s"   t | j| j |k rd S | |S r   )r*   rt   ru   rx   )r   rj   r   r   r   consume_exactly  s    zBuffer.consume_exactlyr?   c                 C   s   | j d | j= d| _d S rs   )rt   ru   rA   r   r   r   commit  s    zBuffer.commitc                 C   s
   d| _ d S rs   )ru   rA   r   r   r   rollback  s    zBuffer.rollbackc                 C   s
   t | jS r   )r*   rt   rA   r   r   r   __len__  s    zBuffer.__len__)N)r.   r/   r0   r   r   r    rv   re   rx   ry   rz   r{   r|   r   r   r   r   rq      s   rq   c                   @   s*   e Zd ZddddZeedddZdS )MessageDecoderNr?   c                 C   s   d | _ d | _d S r   )rc   decoderrA   r   r   r   r    "  s    zMessageDecoder.__init__framer   c              
   C   s  |j  rJ | j d u r6|j tju r,td|j | _ n|j tjurPtd|j  |j tju rhtd | _|jor|j	}| jd u r|j
}n^t|j
ttfsJ z| j|j
|}W n4 ty } ztt|tjW Y d }~n
d }~0 0 t| j ||j|}|rd | _ d | _|S )Nzunexpected CONTINUATIONzexpected CONTINUATION, got %rrk   )rc   rB   r;   rD   rS   rE   r   r~   rh   ri   rg   
isinstancer   r(   rn   UnicodeDecodeErrorrY   rJ   rP   rf   )r   r   finishedr"   excr   r   r   process_frame&  s,    


&zMessageDecoder.process_frame)r.   r/   r0   r    rf   r   r   r   r   r   r}   !  s   r}   c                   @   s   e Zd Zdeeed  ddddZeddddZee	 d	d
dZ
ed	ddZeeee dddZeeeddddZdS )FrameDecoderNr   client
extensionsr   c                 C   s:   || _ |pg | _t | _d | _d | _d | _d| _d| _d S rs   )	r   r   rq   rt   headereffective_opcodemaskerpayload_requiredpayload_consumedr   r   r   r   r   r   r    H  s    
zFrameDecoder.__init__r!   c                 C   s   | j | d S r   )rt   rv   r2   r   r   r   receive_bytesV  s    zFrameDecoder.receive_bytesr?   c           	      C   st  | j s|  sd S | j d us J | jd us.J | jd us<J t| j| jk rPd S | j j| j }| j	|}|s~| j jdkr~d S | j
  |  jt|7  _| j| j jk}| j|}| jD ](}|| |}t|trtd||}q|r:t }| jD ]:}|| | j j}t|tr td||d ur||7 }q||7 }t| j||| j j}|rhd | _ d | _d | _ntj| _|S )Nr   error in extension)r   parse_headerr   r   r*   rt   r   rd   r   rx   rz   r-   r   Zframe_inbound_payload_datar   rJ   rS   r(   Zframe_inbound_completera   rf   r;   rD   )	r   Zpayload_remainingrg   r   	extensionZpayload_finalresultr   r   r   r   process_bufferY  sJ    






zFrameDecoder.process_bufferc           	      C   s  | j d}|d u r"| j   dS t|d t@ }tt|d t@ t|d t@ t|d t@ }|d t	@ }zt
|}W n" ty   td|dY n0 | r|stdt|d t@ }|d t@ }| ||}|d u r| j   dS | ||| |r| jrtd|s*| js*td	|r`| j d
}|d u rT| j   dS t|| _nt | _| j   t||||d | _| jj| _| jj r|| _nd| _d| _dS )Nr&   Fr   zInvalid opcode z#xz)Invalid attempt to fragment control framer   z'client received unexpected masked framez)server received unexpected unmasked framer%   T)rt   ry   r{   r@   FIN_MASKr[   	RSV1_MASK	RSV2_MASK	RSV3_MASKOPCODE_MASKr;   
ValueErrorrS   rB   	MASK_MASKPAYLOAD_LEN_MASKparse_extended_payload_lengthextension_processingr   r   r   r1   rz   r`   r   rc   r   r   r   )	r   r"   ra   rb   rc   Zhas_maskZpayload_len_shortrd   r   r   r   r   r     sV    





zFrameDecoder.parse_header)rc   rd   r   c                 C   s   |  r|tkrtd|tkrX| jd}|d u r8d S td|\}|tkrtdnN|tkr| jd}|d u rxd S td|\}|t	krtd|d? rtd	|S )
Nz$Control frame with payload len > 125r&   !Hz6Payload length used 2 bytes when 1 would have sufficedr<   !Qz6Payload length used 8 bytes when 2 would have sufficed?   z'8-byte payload length with non-zero MSB)
rB   MAX_PAYLOAD_NORMALrS   PAYLOAD_LENGTH_TWO_BYTErt   ry   structunpackPAYLOAD_LENGTH_EIGHT_BYTEMAX_PAYLOAD_TWO_BYTE)r   rc   rd   r"   r   r   r   r     s.    z*FrameDecoder.parse_extended_payload_length)rc   rb   rd   r   c                 C   s~   g d}| j D ]F}|| |||}t|tr6td|t|D ]\}}|r>d||< q>qt||D ]\}	}
|
r`|	s`tdq`d S )N)FFFr   TzReserved bit set unexpectedly)r   Zframe_inbound_headerr   rJ   rS   	enumeratezip)r   rc   rb   rd   Zrsv_usedr   r   bitusedexpectedfoundr   r   r   r     s    


z!FrameDecoder.extension_processing)N)r.   r/   r0   r@   r   r   r    r   r   rf   r   r   r;   re   r   r[   r   r   r   r   r   r   G  s    26r   c                   @   s   e Zd Zeed ddddZeedddZee	e ddf d	d
dZ
eddddZeeddf d	ddZd$e	e e	e edddZd%eedddZd&eedddZd'eeeef eedddZeeeeddd Zd(eeeed!d"d#ZdS ))FrameProtocolr   Nr   c                 C   sB   || _ dd |D | _t| j | j| _t | _|  | _d | _d S )Nc                 S   s   g | ]}|  r|qS r   Zenabledr   extr   r   r   r     r   z*FrameProtocol.__init__.<locals>.<listcomp>)	r   r   r   _frame_decoderr}   _message_decoder_parse_more_gen_parse_more_outbound_opcoder   r   r   r   r      s    
zFrameProtocol.__init__r   c              
   C   s$  |j }t|ttfsJ |s(tjdf}nt|dkr>tdnt	d|d d \}|t
k sd|tkrltdzt|}W n ty   Y n0 |tv rtdt|ts|tkrtdz|dd  d	}W n: ty } z td
t| tjW Y d }~n
d }~0 0 ||f}t|j||j|jS )N r   zCLOSE with 1 byte payloadr   r&   zCLOSE with invalid codez#remote CLOSE with local-only reasonz CLOSE with unknown reserved coderk   zError decoding CLOSE reason: )rg   r   r   r(   rJ   rN   r*   rS   r   r   MIN_CLOSE_REASONMAX_CLOSE_REASONr   LOCAL_ONLY_CLOSE_REASONSMAX_PROTOCOL_CLOSE_REASONrn   r   rY   rP   rf   rc   rh   ri   )r   r   r"   rU   reasonr   r   r   r   _process_close  s4    

zFrameProtocol._process_closer?   c                 c   sj   dd | j D | _ d}|sf| j }|d ur^|j sD| j|}n|jtjkr^| 	|}d}|V  qd S )Nc                 S   s   g | ]}|  r|qS r   r   r   r   r   r   r   !  r   z1FrameProtocol._parse_more_gen.<locals>.<listcomp>FT)
r   r   r   rc   rB   r   r   r;   rG   r   )r   closedr   r   r   r   r     s    


zFrameProtocol._parse_more_genr!   c                 C   s   | j | d S r   )r   r   r2   r   r   r   r   0  s    zFrameProtocol.receive_bytesc                 c   s$   | j D ]}|d u r q q|V  qd S r   )r   )r   eventr   r   r   received_frames3  s    
zFrameProtocol.received_frames)rU   r   r   c                 C   s   t  }|tju rd }|d u r(|r(td|tv r6tj}|d urr|t td|7 }|d urr|t|	dt
d 7 }| tj|S )Nz&cannot specify a reason without a coder   rk   r&   )r(   rJ   rN   	TypeErrorr   rL   r   packrp   ro   r   _serialize_framer;   rG   )r   rU   r   rg   r   r   r   close:  s    
zFrameProtocol.closer   )rg   r   c                 C   s   |  tj|S r   )r   r;   rH   r   rg   r   r   r   pingK  s    zFrameProtocol.pingc                 C   s   |  tj|S r   )r   r;   rI   r   r   r   r   pongN  s    zFrameProtocol.pongT)rg   ra   r   c                 C   s   t |tttfrtj}n$t |tr4tj}|d}nt	d| j
d u rN|| _
n| j
|urbtdntj}|rrd | _
| |||S )Nrk   zMust provide bytes or textz!Data type mismatch inside message)r   r   r(   
memoryviewr;   rF   rY   rE   ro   r   r   r   rD   r   )r   rg   ra   rc   r   r   r   	send_dataQ  s    



zFrameProtocol.send_data)ra   rb   rc   r   c                 C   sJ   t |d> }t |jd> t |jd>  t |jd>  }t |}||B |B S )N         r%   )re   r\   r]   r^   )r   ra   rb   rc   Zfin_bitsZrsv_bitsZopcode_bitsr   r   r   _make_fin_rsv_opcodeh  s    *z"FrameProtocol._make_fin_rsv_opcode)rc   rg   ra   r   c                 C   s  t ddd}t| jD ]}|| ||||\}}q| |||}t|}d}|tkr^|}	d }
n|tkrpt}	|}
nt	}	|}
d}| j
r|	dO }	t||	g}|
d ur| rtd|r|ttd|
7 }n|ttd|
7 }| j
rtd}t|}|| || S || S )NFTr6   z"payload too long for control framer   r   r%   )r[   reversedr   Zframe_outboundr   r*   r   r   r   r   r   r(   rB   r   r   r   osurandomr   r-   )r   rc   rg   ra   rb   r   Zfin_rsv_opcodeZpayload_lengthZquad_payloadZfirst_payloadZsecond_payloadr   r   r   r   r   r   r   o  s:    
zFrameProtocol._serialize_frame)NN)r   )r   )r   T)r   T)r.   r/   r0   r@   r   r    rf   r   r   r   r   r   r   r   re   rY   r   r   r   r   r(   r   r[   r;   r   r   r   r   r   r   r     s&   !  r   )?rC   r   r   codecsr   r   enumr   typingr   r   r   r   r	   r
   r   r   r   r   r#   r   r1   r   r   r   r   ZMAX_PAYLOAD_EIGHT_BYTEZMAX_FRAME_PAYLOADr   r   r   r   r   r   r   r;   rJ   rN   rO   rR   r   r   ZMIN_PROTOCOL_CLOSE_REASONr   ZMIN_LIBRARY_CLOSE_REASONZMAX_LIBRARY_CLOSE_REASONZMIN_PRIVATE_CLOSE_REASONZMAX_PRIVATE_CLOSE_REASONr   r   Z	NULL_MASK	ExceptionrS   r[   r`   rf   r   re   rp   rq   r}   r   r   r   r   r   r   <module>   s`   $Y$& (