ó
    ¡7�j&  ã                   óÜ   • S SK r S SKrS SKrS SKrSSKJrJrJrJrJ	r	J
r
JrJr  \R                  " \5      r " S S\5      r " S S\5      r " S S	\ R&                  5      r " S
 S\5      rg)é    Né   )Ú	JsonErrorÚ
JsonObjectÚ	JsonValueÚcreate_objectÚget_intÚget_strÚget_str_or_noneÚtypecheckedc            	       ó^   ^ • \ rS rSr% Sr\\S'   SS\SSS\S	S4U 4S
 jjjr	S	\4S jr
SrU =r$ )ÚCockpitProblemé   aÏ  A type of exception that carries a problem code and a message.

Depending on the scope, this is used to handle shutting down:

  - an individual channel (sends problem code in the close message)
  - peer connections (sends problem code in close message for each open channel)
  - the main stdio interaction with the bridge

It is usually thrown in response to some violation of expected protocol
when parsing messages, connecting to a peer, or opening a channel.
ÚattrsNÚproblemÚmsgúJsonObject | NoneÚkwargsÚreturnc                 óv   >• XS'   [        X#5      U l        [        TU ]  [	        U R                  SU5      5        g )Nr   Úmessage)r   r   ÚsuperÚ__init__r	   )Úselfr   r   r   Ú	__class__s       €Ú2/usr/lib/python3/dist-packages/cockpit/protocol.pyr   ÚCockpitProblem.__init__*   s1   ø€ Ø#ˆyÑÜ" 3Ó/ˆŒ
Ü‰Ñœ §¡¨Y¸Ó@ÕAó    c                 ó  • U R                   S   S:X  ai  U R                  b\  [        U R                   [        R                  " U R                  R
                  U R                  U R                  R                  5      S9$ U R                   $ )Nr   zinternal-error)Úcause)r   Ú	__cause__ÚdictÚ	tracebackÚformat_exceptionr   Ú__traceback__©r   s    r   Ú	get_attrsÚCockpitProblem.get_attrs/   sh   € Ø�:‰:�iÑ Ð$4Ó4¸¿¹Ñ9SÜ˜Ÿ
™
¬)×*DÒ*DØ—‘×(Ñ(¨$¯.©.¸$¿.¹.×:VÑ:Vó+ñ ð ð —:‘:Ðr   )r   ©N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   Ú__annotations__Ústrr   r   r&   Ú__static_attributes__Ú__classcell__©r   s   @r   r   r      sP   ø‡ ñ
ð ÓñB ð BÐ*=ð BÐPYð BÐ^b÷ Bð Bð
˜:÷ ò r   r   c                   ó8   ^ • \ rS rSrSS\S\4U 4S jjjrSrU =r$ )ÚCockpitProtocolErroré8   r   r   c                 ó    >• [         TU ]  X!S9  g )N)r   )r   r   )r   r   r   r   s      €r   r   ÚCockpitProtocolError.__init__9   s   ø€ Ü‰Ñ˜ÐÒ2r   © )zprotocol-error)r)   r*   r+   r,   r/   r   r0   r1   r2   s   @r   r4   r4   8   s   ø† ñ3 ð 3¨c÷ 3ö 3r   r4   c                   óf  • \ rS rSr% SrSrS\S'   SrSr\	\S'   Sr
S	\S
'   S%S jrS&S jrS\S\SS4S jrS\S\S\SS4S jrS\S\SS4S jrS\SS4S jrS\SS4S jrS\S\4S jrS\R0                  SS4S jrS&S jrS'S&S jjrS\S\SS4S jrS'SSS \SS4S! jjrS\SS4S" jrS\	4S# jr S$r!g)(ÚCockpitProtocolé=   z“A naive implementation of the Cockpit frame protocol

We need to use this because Python's SelectorEventLoop doesn't supported
buffered protocols.
Nzasyncio.Transport | NoneÚ	transportr   FÚ_closedzasyncio.Future[None] | NoneÚ_communication_doner   c                 ó   • g r(   r8   r%   s    r   Údo_readyÚCockpitProtocol.do_readyH   ó   € Ør   c                 ó   • g r(   r8   ©r   Úexcs     r   Ú	do_closedÚCockpitProtocol.do_closedK   rB   r   Úcommandr   c                 ó   • [         er(   ©ÚNotImplementedError©r   rH   r   s      r   Útransport_control_receivedÚ*CockpitProtocol.transport_control_receivedN   ó   € Ü!Ð!r   Úchannelc                 ó   • [         er(   rJ   )r   rP   rH   r   s       r   Úchannel_control_receivedÚ(CockpitProtocol.channel_control_receivedQ   rO   r   Údatac                 ó   • [         er(   rJ   )r   rP   rT   s      r   Úchannel_data_receivedÚ%CockpitProtocol.channel_data_receivedT   rO   r   Úframec                 óà   • UR                  S5      u  p#nUS:w  aC  UR                  S5      n[        R                  S[	        U5      U5        U R                  XT5        g U R                  U5        g )Nó   
r   Úasciiz.data received: %d bytes of data for channel %s)Ú	partitionÚdecodeÚloggerÚdebugÚlenrV   Úcontrol_received)r   rX   ÚheaderÚ_rT   rP   s         r   Úframe_receivedÚCockpitProtocol.frame_receivedW   s]   € ØŸ/™/¨%Ó0‰ˆ�4à�S‹=Ø—m‘m GÓ,ˆGÜ�L‰LÐIÌ3ÈtË9ÐV]Ô^Ø×&Ñ& wÕ5ð ×!Ñ! $Õ'r   c                 óŠ  •  [        [        R                  " U5      [        5      n[	        US5      n[	        USS 5      nUb)  [
        R                  SU5        U R                  XCU5        g [
        R                  SU5        U R                  X25        g ! [        R                  [        4 a  n[        SU< 35      UeS nAff = f)NrH   rP   zchannel control received %sztransport control received %szcontrol message: )r   ÚjsonÚloadsr!   r	   r^   r_   rR   rM   ÚJSONDecodeErrorr   r4   )r   rT   r   rH   rP   rE   s         r   ra   Ú CockpitProtocol.control_receivedb   s«   € ð	MÜ!¤$§*¢*¨TÓ"2´DÓ9ˆGÜ˜g yÓ1ˆGÜ˜g y°$Ó7ˆGàÑ"Ü—‘Ð:¸GÔDØ×-Ñ-¨gÀÕHä—‘Ð<¸gÔFØ×/Ñ/°ÕAøä×$Ñ$¤iÐ0ó 	MÜ&Ð):¸3¹'Ð'BÓCÈÐLûð	Mús   ‚A(B Á+'B ÂCÂ-B=Â=Cc                 óv  •  UR                  S5      n [	        USU 5      nUS-   nXT-   nU[        U5      :”  a  [        U5      U-
  $ U R                  XU 5        U$ ! [         a3  n[        U5      S:  a  [        U5      S-
  s SnA$ [        S5      UeSnAff = f! [         a  n[        S5      UeSnAff = f)z¨Consumes a single frame from view.

Returns positive if a number of bytes were consumed, or negative if no
work can be done because of a given number of bytes missing.
rZ   é
   Nzsize line is too longzframe size is not an integerr   )ÚindexÚ
ValueErrorr`   r4   Úintrd   )r   rT   ÚnewlinerE   ÚlengthÚstartÚends          r   Úconsume_one_frameÚ!CockpitProtocol.consume_one_framer   sÌ   € ð	IØ—j‘j Ó'ˆGð	PÜ˜˜h˜w˜Ó(ˆFð ˜!‘ˆØ‰nˆà”�T“‹?ä�t“9˜s‘?Ð"ð 	×Ñ˜D s˜OÔ,Øˆ
øô) ó 	IÜ�4‹y˜2‹~ä˜4“y 2‘~Õ%Ü&Ð'>Ó?ÀSÐHûð		Iûô ó 	PÜ&Ð'EÓFÈCÐOûð	Pús:   ‚A ”B Á
BÁ'BÂBÂ	BÂBÂ
B8Â'B3Â3B8c                 ó  • [         R                  SU5        [        U[        R                  5      (       d   eXl        U R                  5         U R                  (       a&  [         R                  S5        UR                  5         g g )Nzconnection_made(%s)z;  but the protocol already was closed, so closing transport)	r^   r_   Ú
isinstanceÚasyncioÚ	Transportr<   r@   r=   Úclose)r   r<   s     r   Úconnection_madeÚCockpitProtocol.connection_made‘   s[   € Ü�‰Ð*¨IÔ6Ü˜)¤W×%6Ñ%6×7Ñ7Ð7Ð7Ø"ŒØ�‰Œà�<�<Ü�L‰LÐVÔWØ�O‰OÕð r   c                 ó|   • [         R                  S5        U R                  c   eS U l        U R                  U5        g )NÚconnection_lost)r^   r_   r<   rz   rD   s     r   r~   ÚCockpitProtocol.connection_lost›   s1   € Ü�‰Ð&Ô'Ø�~‰~Ñ)Ð)Ð)ØˆŒØ�
‰
�3�r   c                 ó®   • U R                   (       a  g SU l         U R                  (       a  U R                  R                  5         U R                  U5        g )NT)r=   r<   rz   rF   rD   s     r   rz   ÚCockpitProtocol.close¡   s6   € Ø�<�<ØØˆŒà�>�>Ø�N‰N× Ñ Ô"à�‰�sÕr   Úpayloadc                 ó&  • [        US-   5      [        U5      -   nU SU S3R                  S5      nU R                  b>  [        R	                  SU R                  5        U R                  R                  XB-   5        g[        R	                  S5        g)z0Send a given payload (bytes) on channel (string)Ú
r[   Nzwriting to transport %sz cannot write to closed transport)r`   Úencoder<   r^   r_   Úwrite)r   rP   r‚   Úframe_lengthrb   s        r   Úwrite_channel_dataÚ"CockpitProtocol.write_channel_data«   sw   € ô ˜7 T™>Ó*¬S°«\Ñ9ˆØ �>  G 9¨BÐ/×6Ñ6°wÓ?ˆØ�>‰>Ñ%Ü�L‰LÐ2°D·N±NÔCØ�N‰N× Ñ  Ñ!1Õ2ä�L‰LÐ;Õ<r   r   r   r   c                 ó²   • [         R                  SX5        [        R                  " [	        X5      SS9S-   nU R                  SUR                  5       5        g)zCWrite a control message.  See jsonutil.create_object() for details.zsending control message %r %ré   )Úindentr„   Ú N)r^   r_   rg   Údumpsr   rˆ   r…   )r   r   r   Úprettys       r   Úwrite_controlÚCockpitProtocol.write_control¶   sA   € ä�‰Ð4°cÔBÜ—’œM¨#Ó6¸qÑAÀDÑHˆØ×Ñ  F§M¡M£OÕ4r   c                 ó6  •  U =R                   U-  sl         U R                   (       aJ  U R                  U R                   5      nUS::  a  g U R                   US  U l         U R                   (       a  MI  g g ! [         a  nU R                  U5         S nAg S nAff = f)Nr   )Úbufferrt   r4   rz   )r   rT   ÚresultrE   s       r   Údata_receivedÚCockpitProtocol.data_received¼   sv   € ð	Ø�KŠK˜4Ñ�KØ—+—+Ø×/Ñ/°·±Ó<�Ø˜Q“;ØØ"Ÿk™k¨&¨'Ð2�”ð	 —+—+“+øô
 $ó 	Ø�J‰J�s�O‰Oûð	ús   ‚AA3 Á
%A3 Á3
BÁ=BÂBc                 ó   • g)NFr8   r%   s    r   Úeof_receivedÚCockpitProtocol.eof_receivedÇ   s   € Ør   )r=   r“   r<   ©r   N)rE   zException | Noner   Nr(   )"r)   r*   r+   r,   r-   r<   r.   r“   r=   Úboolr>   r@   rF   r/   r   rM   rR   ÚbytesrV   rd   ra   ro   rt   rx   ÚBaseTransportr{   r~   rz   rˆ   r   r�   r•   r˜   r0   r8   r   r   r:   r:   =   sC  ‡ ñð
 -1€IÐ)Ó0Ø€FØ€GˆTÓØ9=ÐÐ6Ó=ôôð"°#ð "À
ð "Ètô "ð"°ð "¸cð "ÈJð "Ð[_ô "ð"¨Sð "¸ð "À$ô "ð	( Eð 	(¨dô 	(ðM Uð M¨tô Mð  eð °ô ð>¨×)>Ñ)>ð À4ô ôöð	=¨#ð 	=¸ð 	=À$ô 	=ñ5Ð!4ð 5Àyð 5ÐUYõ 5ð	 %ð 	¨Dô 	ð˜d÷ r   r:   c            	       óÞ   • \ rS rSr% SrS\S'   SrS\S'   SrSS	 jrS
\	SS4S jr
SSSSS
\	SS4S jrS\S
\	SS4S jrSS jr SS\SSS\S\	4S jjr SS\SSS\S\4S jjrS
\	SS4S jrSrg)ÚCockpitProtocolServeréÌ   Nz
str | NoneÚ	init_hostz,dict[str, asyncio.Future[JsonObject]] | NoneÚauthorizationsr   r   c                 ó   • [         er(   rJ   r%   s    r   Údo_send_initÚ"CockpitProtocolServer.do_send_initÑ   rO   r   r   c                 ó   • g r(   r8   )r   r   s     r   Údo_initÚCockpitProtocolServer.do_initÔ   rB   r   ÚhostÚgroupc                 ó   • [         er(   rJ   )r   r©   rª   r   s       r   Údo_killÚCockpitProtocolServer.do_kill×   rO   r   rH   c                 ó8  • US:X  a>  [        US5      S:w  a  [        S5      e[        US5      U l        U R	                  U5        g US:X  a*  U R                  [        USS 5      [        USS 5      U5        g US:X  a  U R                  U5        g [        S	U S
35      e)NÚinitÚversionr   zincorrect version numberr©   Úkillrª   Ú	authorizezunexpected control message z	 received)r   r4   r	   r¡   r§   r¬   r
   Údo_authorizerL   s      r   rM   Ú0CockpitProtocolServer.transport_control_receivedÚ   s˜   € Ø�fÓÜ�w 	Ó*¨aÓ/Ü*Ð+EÓFÐFÜ$ W¨fÓ5ˆDŒNØ�L‰L˜Õ!Ø˜ÓØ�L‰Lœ¨°&¸$Ó?ÄÐQXÐZaÐcgÓAhÐjqÕrØ˜Ó#Ø×Ñ˜gÕ&ä&Ð)DÀWÀIÈYÐ'WÓXÐXr   c                 ó$   • U R                  5         g r(   )r¤   r%   s    r   r@   ÚCockpitProtocolServer.do_readyç   s   € Ø×ÑÕr   Ú	challengeÚtimeoutz
int | Noner   c              ‹   óÊ  #   • U R                   c  0 U l         [        U R                  5      nU =R                  S-  sl        [        R                  " 5       R                  5       n XPR                   U'   U R                  " SSXS.UD6  [        R                  " XR5      I S h  v•N U R                   R                  U5        $  N! U R                   R                  U5        f = f7f)Nr   r²   )rH   r·   Úcookier(   )	r¢   r/   Únext_auth_idrx   Úget_running_loopÚcreate_futurer�   Úwait_forÚpop)r   r·   r¸   r   rº   Úfutures         r   Úrequest_authorization_objectÚ2CockpitProtocolServer.request_authorization_objectë   s¾   é € ð ×ÑÑ&Ø"$ˆDÔÜ�T×&Ñ&Ó'ˆØ×Ò˜QÑÕÜ×)Ò)Ó+×9Ñ9Ó;ˆð	,Ø*0×Ñ Ñ'Ø×ÒÐg¨[ÀIÑgÐ`fÒgÜ ×)Ò)¨&Ó:×:à×Ñ×#Ñ# FÕ+ñ ;øà×Ñ×#Ñ# FÕ+üs0   ‚A"C#Á%<C Â!CÂ"C Â%C#ÃC ÃC Ã C#c              ‹   óX   #   • [        U R                  " X40 UD6I S h  v•N S5      $  N	7f)NÚresponse)r	   rÁ   )r   r·   r¸   r   s       r   Úrequest_authorizationÚ+CockpitProtocolServer.request_authorizationú   s,   é € ô ˜T×>Ò>¸yÑ\ÐU[Ñ\×\Ð^hÓiÐiÑ\ùs   ‚*ž(Ÿ
*c                 ó¼   • [        US5      nU R                  b  X R                  ;  a  [        R                  S5        g U R                  U   R	                  U5        g )Nrº   zno matching authorize request)r	   r¢   r^   ÚwarningÚ
set_result)r   r   rº   s      r   r³   Ú"CockpitProtocolServer.do_authorizeÿ   sN   € Ü˜ (Ó+ˆà×ÑÑ&¨&×8KÑ8KÓ*KÜ�N‰NÐ:Ô;Øà×Ñ˜FÑ#×.Ñ.¨wÕ7r   )r¢   r¡   rš   r(   )r)   r*   r+   r,   r¡   r.   r¢   r»   r¤   r   r§   r¬   r/   rM   r@   r   rÁ   rÅ   r³   r0   r8   r   r   rŸ   rŸ   Ì   så   ‡ Ø"€Iˆ|Ó"ØEI€NÐBÓIØ€Lô"ð˜zð ¨dô ð"˜Lð "°ð "È
ð "ÐW[ô "ðY°#ð YÀ
ð YÈtô Yôð
 7;ñ,Øð,Ø'3ð,ØFOð,à	õ,ð  7;ñjØðjØ'3ðjØFOðjà	õjð
8 Jð 8°4÷ 8r   rŸ   )rx   rg   Úloggingr"   Újsonutilr   r   r   r   r   r	   r
   r   Ú	getLoggerr)   r^   Ú	Exceptionr   r4   ÚProtocolr:   rŸ   r8   r   r   Ú<module>rÐ      se   ðó$ Û Û Û ç u× uÓ uà	×	Ò	˜8Ó	$€ô�Yô ô83˜>ô 3ô
K�g×&Ñ&ô Kô^:8˜Oõ :8r   