
    sjA                        d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
mZ d dlmZ d dlmZ dZdZdZd	Zd
Z eej,                  j/                  dd            Z ej2                  e      Z G d d      Z G d d      Zy)    N)schedule_coroutine)	UnChunkergenerate_chunks)PublishManager)ServerProtocolii iiiWSLINK_MAX_MSG_SIZE4194304c                       e Zd Zd Zed        Zed        Zed        Zed        Zed        Z	ed        Z
ed        Zej                  d	        Zd
 Zd Zed        Zd Zd Zed        Zd ZddZd Zy)AbstractWebAppc                     d | _         || _        d | _        	 t        j                         }|j                         | _	        d | _
        y # t
        $ r, t        j                         }t        j                  |       Y Qw xY wN)_last_active_client_id_config_shutdown_taskasyncioget_event_loopRuntimeErrornew_event_loopset_event_loopcreate_future_completion_app)selfserver_configloops      </DATA/.local/lib/python3.12/site-packages/wslink/protocol.py__init__zAbstractWebApp.__init__   ss    &*#$"	)))+D  --/		  	)))+D""4(	)s   A 2A=<A=c                     | j                   S r   )r   r   s    r   configzAbstractWebApp.config.   s    ||    c                 L    t        | j                  j                  dd            S )Ntimeout0intr    getr   s    r   r#   zAbstractWebApp.timeout2   s    4;;??9c233r!   c                 :    | j                   j                  dd      S )Nhostz	127.0.0.1r    r'   r   s    r   r)   zAbstractWebApp.host6   s    {{v{33r!   c                 L    t        | j                  j                  dd            S )Nport8080r%   r   s    r   r,   zAbstractWebApp.port:   s    4;;??66233r!   c                 :    | j                   j                  dd      S )Nhandle_signalsTr*   r   s    r   r/   zAbstractWebApp.handle_signals>   s    {{/66r!   c                 :    | j                   j                  dd       S )Nsslr*   r   s    r   ssl_contextzAbstractWebApp.ssl_contextB   s    {{ud++r!   c                     | j                   S r   r   r   s    r   last_active_client_idz$AbstractWebApp.last_active_client_idJ   s    ***r!   c                     || _         y r   r4   )r   values     r   r5   z$AbstractWebApp.last_active_client_idN   s
    &+#r!   c                     || _         y r   r   )r   apps     r   set_appzAbstractWebApp.set_appV   s	    	r!   c                     | j                   S r   r9   r   s    r   get_appzAbstractWebApp.get_appY   s    yyr!   c                     | j                   S r   r9   r   s    r   r:   zAbstractWebApp.app\   s    yyr!   c                 |    | j                   dkD  r&t        | j                   | j                        | _        y d | _        y Nr   )r#   r   stopr   r   s    r   shutdown_schedulez AbstractWebApp.shutdown_scheduled   s3    ;?<<!;Kt||TYY7 	QU 	r!   c                     | j                   7t        j                  d       | j                   j                          d | _         y y )NzCanceling shutdown task)r   loggerinfocancelr   s    r   shutdown_cancelzAbstractWebApp.shutdown_canceli   s:    *KK12&&("&D +r!   c                     | j                   S r   )r   r   s    r   
completionzAbstractWebApp.completions       r!   c                      yr@    r   s    r   get_portzAbstractWebApp.get_portw   s    r!   Nc                    K   y wr   rL   )r   port_callbacks     r   startzAbstractWebApp.start~   	        c                    K   y wr   rL   r   s    r   rA   zAbstractWebApp.stop   rQ   rR   r   )__name__
__module____qualname__r   propertyr    r#   r)   r,   r/   r2   r5   setterr;   r=   r:   rB   rG   rI   rM   rP   rA   rL   r!   r   r   r      s    
    4 4 4 4 4 4 7 7 , , + + !!, ",  

'    r!   r   c                       e Zd ZddefdZd Zd Zed        Zed        Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd ZddZ	 ddZddZddZd Zd Zy)WslinkHandlerNprotocolc                      | _         | _        i  _        i  _        g  _        i  _        t                _        t        j                          _
        t                _        i  _        |j                   _        |j                   _         j!                         r j!                         j#                         }|j%                   j!                                |D ]  }|j'                   j(                   j*                   fd       d }t-        j.                  |j0                  |      D ]C  }|d   }d|j2                  v s|j2                  d   d   }d|v s.|d   }	||f j                  |	<   E   j                  j5                          y y )Nc                  D    t        d j                  j                        S r@   )r   web_apprA   r   s   r   <lambda>z(WslinkHandler.__init__.<locals>.<lambda>   s    .q$,,2C2CDr!   c                 Z    t        j                  |       xs t        j                  |       S r   )inspectismethod
isfunction)xs    r   testz$WslinkHandler.__init__.<locals>.test   s#    "++A.G'2D2DQ2GGr!      _wslinkurisr   uri)serverProtocolr^   functionMapattachmentsReceivedattachmentsRecvQueueconnectionssetauthentified_client_idsr   Lockattachment_atomicr   pub_manager
unchunkersnetwork_monitorlog_emittergetServerProtocolgetLinkProtocolsappendinitpublishaddAttachmentra   
getmembers	__class____dict__registerProtocol)
r   r[   r^   protocolListprotocolObjectre   kprocuri_inforh   s
   `         r   r   zWslinkHandler.__init__   sn   &#% $&!'*u$!()+'77#// !!#113DDFL 6 6 89".##LL&&DH !++N,D,DdKAQ4D$5#'==#?#B H,"*5/C5CT4JD,,S1 L #/" --d3) $r!   c                     || _         y r   ri   )r   r[   s     r   setServerProtocolzWslinkHandler.setServerProtocol   s
    &r!   c                     | j                   S r   r   r   s    r   rv   zWslinkHandler.getServerProtocol   s    """r!   c                     | j                   S r   )rr   r   s    r   publishManagerzWslinkHandler.publishManager   rJ   r!   c                      y)Nreverse_connection_client_idrL   r   s    r   r   z*WslinkHandler.reverse_connection_client_id   s    -r!   c                 4  K   t               | j                  |<   | j                  sy t        | j                  d      r| j                  j	                  ||       | j                  j                         D ]!  }t        |d      s|j	                  ||       # y w)N	onConnect)r   rs   ri   hasattrr   rw   )r   request	client_idlinkProtocols       r   r   zWslinkHandler.onConnect   s|     %.[	"""4&&4))'9= //@@BL|[1&&w	: Cs   B BBc                   K   | j                   |= | j                  sy t        | j                  d      r| j                  j                  |       | j                  j	                         D ]   }t        |d      s|j                  |       " y w)NonClose)rs   ri   r   r   rw   )r   r   r   s      r   r   zWslinkHandler.onClose   st     OOI&""4&&	2''	2 //@@BL|Y/$$Y/ Cs   A5B8Bc                 $  K   |j                  d      }|d   dk(  r|dk(  r|r|d   rt        |d         t        u rd|d   v r| j                  |d   d   |       d {   r`| j                  j                  |       | j                  |   j                  d       | j                  |d| t        d|	       d {    y| j                  |t        d
|	       d {    y| j                  |t        d|	       d {    yy7 7 L7 ,7 w)N:r   systemzwslink.hellosecretl        c)clientID
maxMsgSizer   zAuthentication failedzUnknown system method calledTF)splittypedictvalidateTokenro   addrs   set_max_message_sizesendWrappedMessageMAX_MSG_SIZEsendWrappedErrorAUTHENTICATION_ERRORMETHOD_NOT_FOUND)r   rpcid
methodNameargsr   rpcLists         r   handleSystemMessagez!WslinkHandler.handleSystemMessage   sS    ++c"1:!^+Qd1g$.!T!W,"00a1BINNN0044Y?OOI.CC. 11*+I;*6 #, 2   ,  //,/"+	 0     ++$2'	 ,    = OsI   ADDAD=D
>!DD !DDD
DDDc                 r  K   |sIt         j                  d|j                         | j                  j                  d|j                          y | j                  |   j                  |j                        }|0| j                  5  | j                  ||       d {    d d d        y y 7 # 1 sw Y   y xY ww)Nz*wslink is not expecting text message:
> %sz(wslink is not expecting text message:
> )rD   criticaldataru   rs   process_chunkrt   onCompleteMessage)r   	is_binarymsgr   full_messages        r   	onMessagezWslinkHandler.onMessage   s     OOI388T%%;CHH:F y1??I#%%,,\9EEE &% $E &%s0   BB7B+B)B+
B7)B++B40B7c                   K   d}| j                  |      }t        j                  ||       | j                  j	                  d      r| j                  j                  ||z         d|vry |d   }|d   }g }i }d|v rt        |d   t              r|d   }d|v rt        |d   t              r|d   }| j                  ||||       d {   ry | j                  |      s7| j                  5  | j                  |t        d|       d {    d d d        y || j                  vrV| j                  j                  d	|        | j                  5  | j                  |t        d
||       d {    d d d        y | j                  |   \  }	}
|j!                  d|	       	 || j"                  _         |
|i |}t'        j(                  |      r| j                  5  | d {   }d d d        | j*                  |   j,                  ry | j                  5  | j/                  ||||       d {    d d d        y 7 q7 4# 1 sw Y   y xY w7 # 1 sw Y   y xY w7 y# 1 sw Y   xxY w7 ;# 1 sw Y   y xY w# t0        $ r}t3        j4                         }t        j                  d       t        j                  t7        |             t        j                  |       | j                  j9                  |       | j                  5  | j                  |t:        d|t7        |      |d|       d {  7   d d d        n# 1 sw Y   nxY wY d }~y Y d }~y d }~ww xY ww)Nzwslink incoming msg %sdebugidmethodr   kwargsz%Unauthorized: Skip message processingr   zMethod not found: zUnregistered method calledr   )r   r   zException raised)r   	exceptiontrace)payloadWithSecretStrippedrD   r   ru   has
isinstancelistr   r   isClientAuthenticatedrt   r   r   rj   errorr   insertr^   r5   ra   isawaitablerm   closedr   	Exception	traceback
format_excreprr   EXCEPTION_ERROR)r   rpcr   debug_messagestripped_payloadr   r   r   r   objfuncresultse_instcaptured_traces                 r   r   zWslinkHandler.onCompleteMessage  sA    099#>]$45(""=3C#CDs? D	]
cMz#f+t<v;DOCM4!@]F ))%T9MMM )))4%%++(;'	 ,    &  T---""%7
|#DE%%++$0' ,    & $$Z0	TAs 	1:DLL.D+F+G""7+))$+mG * 	*11%%--7: .    &%S N &  &  , *) &%  	&113NLL+,LLf&LL(&&v.%%++#&",%)&\!/
 ( , 
 
 
 &%%%%	s"  CMH8"M*H>H;H>AMI+I
,I0-M:I4 III#!I4 MI4 I(*I&+I(/I4 7M;H>>IM
IIMII#I4 &I((I1-I4 0M1I4 4	M=BM +L:+L.,L:1	M:M	?M
MMMc                     t        j                  |      }d|v r&|d   D ]  }t        |      t        u sd|v sd|d<     |S )Nr   r   z*****)copydeepcopyr   r   )r   payloadargs      r   r   z'WslinkHandler.payloadWithSecretStripped]  sH    --(Wv9$S$+CM ' r!   c                 v  K   | j                   syd}t        | j                   d      r'd}| j                   j                  ||       d {   sy| j                   j                         D ]-  }t        |d      sd}|j                  ||       d {   r- y |ry|| j                   j                  k(  S 7 k7 &w)NTFr   )ri   r   r   rw   r   )r   tokenr   token_testedr   s        r   r   zWslinkHandler.validateTokene  s     ""4&&8L,,::5)LLL //@@BL|_5#)77yIII 	 C
 ++2222 M
 Js0   AB9	B5
.B99B9B7B9 B97B9c                     || j                   v S r   )ro   )r   r   s     r   r   z#WslinkHandler.isClientAuthenticatedv  s    D8888r!   c                    |rS| j                   j                  }| j                  D cg c]'  }| j                  |      r||k7  r| j                  |   ) c}S |r/| j                  |      r| j                  j	                  |      gS g S | j                  D cg c]"  }| j                  |      r| j                  |   $ c}S c c}w c c}w r   )r^   r5   rm   r   r'   )r   r   skip_last_active_clientlast_cr   s        r   getAuthenticatedWebsocketsz(WslinkHandler.getAuthenticatedWebsocketsy  s    "\\77F )))A--a0Q&[   #)  )))4((,,Y788I %%
%))!, Q%
 	

s   ,B?'Cc           	      v  K   d||d}	 t        j                  |      }| j                  ||      }| j                  5  | j                  4 d {    t        |t              D ]%  }	|D ]  }
|
|
j                  |	       d {      ' d d d       d {    d d d        | j                  j                          y # t        $ rH | j                  5  | j	                  |t
        d||       d {  7   d d d        Y y # 1 sw Y   Y y xY ww xY w7 7 7 # 1 d {  7  sw Y   xY w# 1 sw Y   xY ww)N1.0)wslinkr   resultz"Method result cannot be serializedr   )msgpackpackbr   rt   r   RESULT_SERIALIZE_ERRORr   rq   r   r   
send_bytesnetwork_call_completed)r   r   contentr   r   r   wrapperpacked_wrapper
websocketschunkwss              r   r   z WslinkHandler.sendWrappedMessage  s,     
	$]]73N 44Y@WX

 !!---,^\JE(>"$--"666 ) K .- " 	3355  	 %%++*8' ,    &  & 	& . 7	 .--- "!s   D9B> D9D-DD-D.DDDD-DD-#D9>DD1C42D7D?D9D	D	D9DD9D-DD-D*	D!D*	&D--D62D9c                   K   d|||dd}|r||d   d<   	 t        j                  |      }|r| j                  |   gn&| j                  D cg c]  }| j                  |    c}}	| j                  5  | j
                  4 d {    t        |t              D ]%  }
|	D ]  }||j                  |
       d {      ' d d d       d {    d d d        | j                  j                          y # t        $ r |d   d= t        j                  |      }Y w xY wc c}w 7 7 l7 Z# 1 d {  7  sw Y   jxY w# 1 sw Y   nxY ww)Nr   )codemessage)r   r   r   r   r   )
r   r   r   rm   rt   rq   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   s               r   r   zWslinkHandler.sendWrappedError  sG    "
 '+GGV$	4$]]73N  i()/3/?/?@/?!$""1%/?@ 	 !!---,^\JE(>"$--"666 ) K .- " 	335)  	4 ($]]73N	4 A . 7	 .--- "!s   EC2  ED"E1D<D!D<D'"D'6D#7D'?D<
D%D<#E2$DEDE!D<#D'%D<'D9	-D0.D9	5D<<EEc                     |r|gnt        | j                        }|D ]3  }| j                  |      s| j                  j	                  ||||       5 y )N)r   r   )r   rm   r   rr   rz   )r   topicr   r   r   client_listclients          r   rz   zWslinkHandler.publish  sU    %.ykD9I9I4J!F))&1  (($,C	 )  "r!   c                 8    | j                   j                  |      S r   )rr   r{   )r   r   s     r   r{   zWslinkHandler.addAttachment  s    --g66r!   c                     || _         y r   )r   )r   	newSecrets     r   	setSecretzWslinkHandler.setSecret  s	    r!   r   )NF) NF)NN)rT   rU   rV   r   r   r   rv   rW   r   r   r   r   r   r   r   r   r   r   r   r   r   rz   r{   r   rL   r!   r   rZ   rZ      s    #4 #4J'#     . .	;	0'RFVp3"9
* RW%6N"6H	7 r!   rZ   )r   r   ra   loggingosr   r   r   r   wslink.chunkingr   r   wslink.publishr   wslink.websocketr   r   r   r   r   CLIENT_ERRORr&   environr'   r   	getLoggerrT   rD   r   rZ   rL   r!   r   <module>r     s        	   % 6 ) +     2::>>"7CD			8	$e ePb  b r!   