ó
    Ö›‘hN5  ã                   ó¤  • S r SSKrSSKrSSKrSSKrSSKJr  SSKJrJ	r	J
r
  SSKJrJrJr  SSKJrJr  SSKJr  SSKJr  \" 5       r " S	 S
\R.                  5      r " S S\R2                  5      r " S S5      rS rS r/ SQr\" \R>                  5       " S S\R2                  5      5       r  " S S\RB                  5      r"S r#S r$S r%S r&g)z 
This module contains the implementation of SSHSession, which (by default)
allows access to a shell and a python interpreter over SSH.

Maintainer: Paul Swartz
é    N)Úimplementer)ÚEnvironmentVariableNotPermittedÚISessionÚISessionSetEnv)ÚchannelÚcommonÚ
connection)Ú
interfacesÚprotocol)ÚLogger)ÚnetworkStringc                   ód   • \ rS rSrSrSrS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rSrg)Ú
SSHSessioné!   ay  
A generalized implementation of an SSH session.

See RFC 4254, section 6.

The precise implementation of the various operations that the remote end
can send is left up to the avatar, usually via an adapter to an
interface such as L{ISession}.

@ivar buf: a buffer for data received before making a connection to a
    client.
@type buf: L{bytes}
@ivar client: a protocol for communication with a shell, an application
    program, or a subsystem (see RFC 4254, section 6.5).
@type client: L{SSHSessionProcessProtocol}
@ivar session: an object providing concrete implementations of session
    operations.
@type session: L{ISession}
s   sessionc                 óv   • [         R                  R                  " U /UQ70 UD6  SU l        S U l        S U l        g ©Nó    )r   Ú
SSHChannelÚ__init__ÚbufÚclientÚsession)ÚselfÚargsÚkws      Ú]C:\Users\psant\Downloads\Noiseback\school\venv\Lib\site-packages\twisted/conch/ssh/session.pyr   ÚSSHSession.__init__8   s5   € Ü×Ñ×#Ò# DÐ6¨4Ò6°2Ò6ØˆŒØˆŒØˆ�r   c                 óZ  • [         R                  " U5      u  p#[        R                  SUS9  U R                  R                  X!5      nU(       aH  [        U 5      n[        U5      nUR                  U5        UR                  [        U5      5        XPl
        g[        R                  S5        g)Nz"Asking for subsystem "{subsystem}")Ú	subsystemé   zFailed to get subsystemr   )r   ÚgetNSÚlogÚinfoÚavatarÚlookupSubsystemÚSSHSessionProcessProtocolÚwrapProcessProtocolÚmakeConnectionÚwrapProtocolr   Úerror)r   Údatar   Úignoredr   ÚppÚprotos          r   Úrequest_subsystemÚSSHSession.request_subsystem>   sˆ   € Ü#Ÿ\š\¨$Ó/Ñˆ	Ü�‰Ð5ÀˆÑKØ—‘×,Ñ,¨YÓ=ˆÞÜ*¨4Ó0ˆBÜ'¨Ó+ˆEØ×!Ñ! %Ô(Ø×Ñœl¨6Ó2Ô3ØŒKØä�I‰IÐ/Ô0Ør   c                 ó(  • [         R                  S5        U R                  (       d  [        U R                  5      U l         [        U 5      nU R                  R                  U5        X l        g! [         a    [         R                  S5         gf = f)NzGetting shellr    zError getting shellr   )
r"   r#   r   r   r$   r&   Ú	openShellr   Ú	ExceptionÚfailure)r   r+   r-   s      r   Úrequest_shellÚSSHSession.request_shellM   sq   € Ü�‰�Ô!Ø�|�|Ü# D§K¡KÓ0ˆDŒLð	Ü*¨4Ó0ˆBØ�L‰L×"Ñ" 2Ô&ð
 ŒKØøô ó 	Ü�K‰KÐ-Ô.Ùð	ús   Á&A/ Á/BÂBc                 óT  • U R                   (       d  [        U R                  5      U l         [        R                  " U5      u  p![
        R                  SUS9   [        U 5      nU R                   R                  X25        X0l	        g! [         a    [
        R                  SUS9   gf = f)NzExecuting command "{f}")Úfr    zError executing command "{f}"r   )r   r   r$   r   r!   r"   r#   r&   ÚexecCommandr   r3   r4   )r   r+   r8   r-   s       r   Úrequest_execÚSSHSession.request_exec[   sŠ   € Ø�|�|Ü# D§K¡KÓ0ˆDŒLÜ—,’,˜tÓ$‰ˆÜ�‰Ð*¨aˆÑ0ð	Ü*¨4Ó0ˆBØ�L‰L×$Ñ$ RÔ+ð
 ŒKØøô ó 	Ü�K‰KÐ7¸1ˆKÑ=Ùð	ús   Á&B ÂB'Â&B'c                 ó$  • U R                   (       d  [        U R                  5      U l         [        U5      u  p#n[        R                  SUUS9   U R                   R                  X#U5        g! [         a    [        R                  S5         gf = f)Nz-Handling pty request: {term!r} {windowSize!r})ÚtermÚ
windowSizer    zError handling pty requestr   )	r   r   r$   ÚparseRequest_pty_reqr"   r#   ÚgetPtyr3   r4   )r   r+   r=   r>   Úmodess        r   Úrequest_pty_reqÚSSHSession.request_pty_reqj   s�   € Ø�|�|Ü# D§K¡KÓ0ˆDŒLÜ"6°tÓ"<Ñˆ˜%Ü�‰Ø;ØØ!ð 	ñ 	
ð
	Ø�L‰L×Ñ °%Ô8ð
 øô	 ó 	Ü�K‰KÐ4Ô5Ùð	ús   ÁA- Á-BÂBc                 óp  • U R                   (       d  [        U R                  5      U l         [        R                  " U R                   5      (       d  g[
        R                  " US5      u  p#n U R                   R                  X#5        g! [         a     g[         a    [        R                  SUS9   gf = f)a/  
Process a request to pass an environment variable.

@param data: The environment variable name and value, each encoded
    as an SSH protocol string and concatenated.
@type data: L{bytes}
@return: A true value if the request to pass this environment
    variable was accepted, otherwise a false value.
r   é   r    z)Error setting environment variable {name})Úname)r   r   r$   r   Ú
providedByr   r!   ÚsetEnvr   r3   r"   r4   )r   r+   rF   Úvalues       r   Úrequest_envÚSSHSession.request_env{   s”   € ð �|�|Ü# D§K¡KÓ0ˆDŒLÜ×(Ò(¨¯©×6Ñ6ØÜ"ŸLšL¨¨qÓ1Ñˆ�Tð	Ø�L‰L×Ñ Ô,ð øô /ó 	ÙÜó 	Ü�K‰KÐCÈ$ˆKÑOÙð	ús   Á-B	 Â	
B5ÂB5Â4B5c                 óò   • U R                   (       d  [        U R                  5      U l         [        U5      n U R                   R	                  U5        g! [
         a    [        R                  S5         gf = f)Nr    zError changing window sizer   )r   r   r$   ÚparseRequest_window_changeÚwindowChangedr3   r"   r4   )r   r+   ÚwinSizes      r   Úrequest_window_changeÚ SSHSession.request_window_change”   s`   € Ø�|�|Ü# D§K¡KÓ0ˆDŒLÜ,¨TÓ2ˆð	Ø�L‰L×&Ñ& wÔ/ð
 øô	 ó 	Ü�K‰KÐ4Ô5Ùð	ús   ¸A ÁA6Á5A6c                 óœ   • U R                   (       d  U =R                  U-  sl        g U R                   R                  R                  U5        g ©N)r   r   Ú	transportÚwrite©r   r+   s     r   ÚdataReceivedÚSSHSession.dataReceived    s2   € Ø�{�{à�HŠH˜Ñ�HØØ�‰×Ñ×#Ñ# DÕ)r   c                 ó  • U[         R                  :X  a^  U R                  (       aL  [        U R                  R                  S5      (       a&  U R                  R                  R                  U5        g g g [        R                  SUS9  g )NÚwriteErrzWeird extended data: {dataType})ÚdataType)r	   ÚEXTENDED_DATA_STDERRr   ÚhasattrrT   rZ   r"   Úwarn)r   r[   r+   s      r   ÚextReceivedÚSSHSession.extReceived§   s`   € Ø”z×6Ñ6Ó6Ø�{�{œw t§{¡{×'<Ñ'<¸j×IÑIØ—‘×%Ñ%×.Ñ.¨tÕ4ð  Jˆ{ô �H‰HÐ6ÀˆHÒJr   c                 ó¶   • U R                   (       a  U R                   R                  5         g U R                  (       a  U R                  R	                  U 5        g g rS   )r   ÚeofReceivedr   ÚconnÚ	sendClose©r   s    r   rb   ÚSSHSession.eofReceived®   s9   € ð
 �<�<Ø�L‰L×$Ñ$Õ&Ø�[�[Ø�I‰I×Ñ Õ%ð r   c                 óü   • U R                   (       a?  U R                   R                  (       a$  U R                   R                  R                  5         U R                  (       a  U R                  R	                  5         g g rS   )r   rT   ÚloseConnectionr   Úclosedre   s    r   ri   ÚSSHSession.closed¸   sG   € Ø�;�;˜4Ÿ;™;×0×0Ø�K‰K×!Ñ!×0Ñ0Ô2Ø�<�<Ø�L‰L×ÑÕ!ð r   c                 ó¬   • U R                   (       a$  U R                   R                  R                  5         [        R                  R                  U 5        g rS   )r   rT   rh   r   r   re   s    r   rh   ÚSSHSession.loseConnectionÁ   s3   € Ø�;�;Ø�K‰K×!Ñ!×0Ñ0Ô2Ü×Ñ×)Ñ)¨$Õ/r   )r   r   r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rF   r   r/   r5   r:   rB   rJ   rP   rW   r_   rb   ri   rh   Ú__static_attributes__© r   r   r   r   !   sK   † ñð( €Dòòòòòò"ò2
ò*òKò&ò"õ0r   r   c                   ó0   • \ rS rSrSrS rS rS rS rSr	g)	Ú_ProtocolWrapperéÇ   zK
This class wraps a L{Protocol} instance in a L{ProcessProtocol} instance.
c                 ó   • Xl         g rS   ©r.   ©r   r.   s     r   r   Ú_ProtocolWrapper.__init__Ì   ó   € Ø�
r   c                 ó8   • U R                   R                  5         g rS   )r.   ÚconnectionMadere   s    r   r}   Ú_ProtocolWrapper.connectionMadeÏ   s   € Ø�
‰
×!Ñ!Õ#r   c                 ó:   • U R                   R                  U5        g rS   ©r.   rW   rV   s     r   ÚoutReceivedÚ_ProtocolWrapper.outReceivedÒ   ó   € Ø�
‰
×Ñ Õ%r   c                 ó:   • U R                   R                  U5        g rS   )r.   ÚconnectionLost©r   Úreasons     r   ÚprocessEndedÚ_ProtocolWrapper.processEndedÕ   s   € Ø�
‰
×!Ñ! &Õ)r   rx   N)
rm   rn   ro   rp   rq   r   r}   r�   rˆ   rr   rs   r   r   ru   ru   Ç   s   † ñòò$ò&õ*r   ru   c                   ó2   • \ rS rSrS rS rS rS rS rSr	g)	Ú_DummyTransportéÙ   c                 ó   • Xl         g rS   rx   ry   s     r   r   Ú_DummyTransport.__init__Ú   r{   r   c                 óN   • U R                   R                  R                  U5        g rS   )r.   rT   rU   rV   s     r   rW   Ú_DummyTransport.dataReceivedÝ   s   € Ø�
‰
×Ñ×"Ñ" 4Õ(r   c                 ó:   • U R                   R                  U5        g rS   r€   rV   s     r   rU   Ú_DummyTransport.writeà   rƒ   r   c                 óD   • U R                  SR                  U5      5        g r   )rU   Újoin©r   Úseqs     r   ÚwriteSequenceÚ_DummyTransport.writeSequenceã   s   € Ø�
‰
�3—8‘8˜C“=Õ!r   c                 óV   • U R                   R                  [        R                  5        g rS   )r.   r…   r   ÚconnectionDonere   s    r   rh   Ú_DummyTransport.loseConnectionæ   s   € Ø�
‰
×!Ñ!¤(×"9Ñ"9Õ:r   rx   N)
rm   rn   ro   rp   r   rW   rU   r—   rh   rr   rs   r   r   r‹   r‹   Ù   s   † òò)ò&ò"õ;r   r‹   c                 óZ   • [        U [        R                  5      (       a  [        U 5      $ U $ rS   )Ú
isinstancer   ÚProtocolru   )Úinsts    r   r'   r'   ê   s%   € Ü�$œ×)Ñ)×*Ñ*Ü Ó%Ð%àˆr   c                 ó   • [        U 5      $ rS   )r‹   rx   s    r   r)   r)   ñ   s   € Ü˜5Ó!Ð!r   )ÚABRTÚALRMÚFPEÚHUPÚILLÚINTÚKILLÚPIPEÚQUITÚSEGVÚTERMÚUSR1ÚUSR2c                   óx   • \ rS rSrSrSrS rS rS rS r	S r
S	 rSS
 jrS rSS jrS rS rS rS rS rSrg)r&   i  z�I am both an L{IProcessProtocol} and an L{ITransport}.

I am a transport to the remote endpoint and a process protocol to the
local subsystem.
Nc                 ó   • Xl         SU l        g )NF)r   ÚlostOutOrErrFlag)r   r   s     r   r   Ú"SSHSessionProcessProtocol.__init__  s   € ØŒØ %ˆÕr   c                 ó¼   • U R                   R                  (       aA  U R                  R                  U R                   R                  5        S U R                   l        g g rS   )r   r   rT   rU   re   s    r   r}   Ú(SSHSessionProcessProtocol.connectionMade  s<   € Ø�<‰<××Ø�N‰N× Ñ  §¡×!1Ñ!1Ô2Ø#ˆD�L‰LÕð r   c                 ó:   • U R                   R                  U5        g rS   ©r   rU   rV   s     r   r�   Ú%SSHSessionProcessProtocol.outReceived  ó   € Ø�‰×Ñ˜4Õ r   c                 óX   • U R                   R                  [        R                  U5        g rS   )r   ÚwriteExtendedr	   r\   )r   Úerrs     r   ÚerrReceivedÚ%SSHSessionProcessProtocol.errReceived   s   € Ø�‰×"Ñ"¤:×#BÑ#BÀCÕHr   c                 ó”   • U R                   (       a0  U R                  R                  R                  U R                  5        gSU l         g)zG
EOF should only be sent when both STDOUT and STDERR have been closed.
TN)r°   r   rc   ÚsendEOFre   s    r   ÚoutConnectionLostÚ+SSHSessionProcessProtocol.outConnectionLost#  s1   € ð × × Ø�L‰L×Ñ×%Ñ% d§l¡lÕ3à$(ˆDÕ!r   c                 ó$   • U R                  5         g)z
See outConnectionLost().
N)r¿   re   s    r   ÚerrConnectionLostÚ+SSHSessionProcessProtocol.errConnectionLost,  s   € ð 	×ÑÕ r   c                 ó8   • U R                   R                  5         g rS   ©r   rh   r†   s     r   r…   Ú(SSHSessionProcessProtocol.connectionLost2  ó   € Ø�‰×#Ñ#Õ%r   c                 óÊ  • U R                   cÈ  0 U l         [         H,  nSU-   n[        [        US5      nUc  M  X R                   U'   M.     [        R                  R                  5        Hi  u  pEUR                  S5      (       d  M  UR                  S5      (       a  M5  XPR                   ;  d  MF  US-   [        R                  -   U R                   U'   Mk     U R                   U   $ )z*
Get a signal name given a signal number.
NÚSIGÚSIG_Ú@)	Ú_signalValuesToNamesÚSUPPORTED_SIGNALSÚgetattrÚsignalÚ__dict__ÚitemsÚ
startswithÚsysÚplatform)r   ÚsignumÚsignameÚsigvalueÚkÚvs         r   Ú_getSignalNameÚ(SSHSessionProcessProtocol._getSignalName5  sÃ   € ð ×$Ñ$Ñ,Ø(*ˆDÔ%ç,�Ø '™/�Ü"¤6¨7°DÓ9�ØÓ'Ø:A×-Ñ-¨hÓ7ñ	 -ô
 Ÿ™×-Ñ-Ö/‘�ð —<‘< ×&Ó&¨q¯|©|¸F×/CÓ/CØ× 9Ñ 9Õ9Ø78¸3±wÄÇÁÑ7M˜×1Ñ1°!Ó4ñ 0ð ×(Ñ(¨Ñ0Ð0r   c                 ó€  • UGb   UR                   nUR                  Gb  U R                  UR                  5      n[        [        SS5      b<  [        R
                  " UR                  5      (       a  [        R                  SUS9  SnO[        R                  SUS9  SnU R                  R                  R                  U R                  S[        R                  " [        US	S 5      5      U(       a  S
OS-   [        R                  " S5      -   [        R                  " S5      -   5        O{UR                  bn  [        R                  SUR                  S9  U R                  R                  R                  U R                  S[         R"                  " SUR                  5      5        U R                  R%                  5         g)z¦
When we are told the process ended, try to notify the other side about
how the process ended using the exit-signal or exit-status requests.
Also, close the channel.
NÚ	WCOREDUMPz#exitSignal: {signame} (core dumped))rÖ   TzexitSignal: {}Fs   exit-signalé   ó   ó    r   zexitCode: {exitCode!r})ÚexitCodes   exit-statusú>L)rI   rÏ   rÚ   rÎ   ÚosrÝ   Ústatusr"   r#   r   rc   ÚsendRequestr   ÚNSr   rá   ÚstructÚpackrh   )r   r‡   rº   rÖ   Ú
coreDumpeds        r   rˆ   Ú&SSHSessionProcessProtocol.processEndedI  sS  € ð ÒØ—,‘,ˆCØ�z‰zÒ%Ø×-Ñ-¨c¯j©jÓ9�Üœ2˜{¨DÓ1Ñ=Ä"Ç,Â,Ø—J‘J÷Cñ Cô —H‘HÐBÈG�HÑTØ!%‘Jä—H‘HÐ-°w�HÑ?Ø!&�JØ—‘×!Ñ!×-Ñ-Ø—L‘LØ"Ü—I’Iœm¨G°A°B¨KÓ8Ó9Þ *‘u°ñ7ä—i’i “nñ%ô —i’i “nñ%õð —‘Ñ)Ü—‘Ð1¸C¿L¹L�ÑIØ—‘×!Ñ!×-Ñ-Ø—L‘L .´&·+²+¸dÀCÇLÁLÓ2Qôð 	�‰×#Ñ#Õ%r   c                 ó^   • U R                   R                  R                  R                  5       $ )z.
Return the host from my session's transport.
)r   rc   rT   ÚgetHostre   s    r   rì   Ú!SSHSessionProcessProtocol.getHostj  ó#   € ð �|‰|× Ñ ×*Ñ*×2Ñ2Ó4Ð4r   c                 ó^   • U R                   R                  R                  R                  5       $ )z.
Return the peer from my session's transport.
)r   rc   rT   ÚgetPeerre   s    r   rð   Ú!SSHSessionProcessProtocol.getPeerp  rî   r   c                 ó:   • U R                   R                  U5        g rS   rµ   rV   s     r   rU   ÚSSHSessionProcessProtocol.writev  r·   r   c                 óX   • U R                   R                  SR                  U5      5        g r   )r   rU   r”   r•   s     r   r—   Ú'SSHSessionProcessProtocol.writeSequencey  s   € Ø�‰×Ñ˜3Ÿ8™8 C›=Õ)r   c                 ó8   • U R                   R                  5         g rS   rÅ   re   s    r   rh   Ú(SSHSessionProcessProtocol.loseConnection|  rÇ   r   )rÌ   r°   r   rS   )rm   rn   ro   rp   rq   rÌ   r   r}   r�   r»   r¿   rÂ   r…   rÚ   rˆ   rì   rð   rU   r—   rh   rr   rs   r   r   r&   r&     sW   † ñð  Ðò&ò$ò
!òIò)ò!ô&ò1ô(&òB5ò5ò!ò*õ&r   r&   c                   ó   • \ rS rSrS rSrg)ÚSSHSessionClienti€  c                 ó^   • U R                   (       a  U R                   R                  U5        g g rS   )rT   rU   rV   s     r   rW   ÚSSHSessionClient.dataReceived�  s    € Ø�>�>Ø�N‰N× Ñ  Õ&ð r   rs   N)rm   rn   ro   rp   rW   rr   rs   r   r   rù   rù   €  s   † õ'r   rù   c                 ón  • [         R                  " U 5      u  p[        R                  " SUSS 5      u  p4pV[         R                  " USS 5      u  pxXCXV4n	[	        S[        U5      S-
  S5       V
s/ s H5  n
[        XzU
S-    5      [        R                  " SXzS-   U
S-    5      S   4PM7     nn
XU4$ s  sn
f )zƒParse the data from a pty-req request into usable data.

@returns: a tuple of (terminal type, (rows, cols, xpixel, ypixel), modes)
ú>4LNé   r   r    é   râ   )r   r!   rç   ÚunpackÚrangeÚlenÚord)r+   r=   ÚrestÚcolsÚrowsÚxpixelÚypixelrA   r,   rO   Úis              r   r?   r?   ‡  sÄ   € ô
 —’˜dÓ#�J€DÜ!'§¢¨u°d¸3¸B°iÓ!@Ñ€D�Ü—\’\ $ r s )Ó,�N€EØ˜6Ð*€Gô �qœ#˜e›* q™.¨!Ô,óâ,ˆAô 
ˆU�q˜1‘uÐÓ	¤§¢¨d°E¸a¹%À!ÀaÁ%Ð4HÓ IÈ!Ñ LÓMÙ,ð 
ð ð ˜%ÐÐùò	s   Á0<B2c                 ó¢   • Uu  p4pV[         R                  " U 5      n[        R                  " SXCXV5      n[         R                  " U5      n	Xx-   U	-   $ )zÆ
Pack a pty-req request so that it is suitable for sending.

NOTE: modes must be packed before being sent here.

@type geometry: L{tuple}
@param geometry: A tuple of (rows, columns, xpixel, ypixel)
rý   )r   ræ   rç   rè   )
r=   ÚgeometryrA   r  r  r  r  Ú
termPackedÚwinSizePackedÚmodesPackeds
             r   ÚpackRequest_pty_reqr  —  sI   € ð $,Ñ €T�Ü—’˜4“€JÜ—K’K  t°6ÓB€MÜ—)’)˜EÓ"€KØÑ%¨Ñ3Ð3r   c                 ó>   • [         R                  " SU 5      u  pp4X!X44$ )zrParse the data from a window-change request into usuable data.

@returns: a tuple of (rows, cols, xpixel, ypixel)
rý   )rç   r   )r+   r  r  r  r  s        r   rM   rM   §  s$   € ô
 "(§¢¨u°dÓ!;Ñ€D�Ø�vÐ%Ð%r   c                 ó<   • U u  pp4[         R                  " SX!X45      $ )z˜
Pack a window-change request so that it is suitable for sending.

@type geometry: L{tuple}
@param geometry: A tuple of (rows, columns, xpixel, ypixel)
rý   )rç   rè   )r  r  r  r  r  s        r   ÚpackRequest_window_changer  °  s!   € ð $,Ñ €T�Ü�;Š;�u˜d¨&Ó9Ð9r   )'rq   rã   rÏ   rç   rÓ   Úzope.interfacer   Útwisted.conch.interfacesr   r   r   Útwisted.conch.sshr   r   r	   Útwisted.internetr
   r   Útwisted.loggerr   Útwisted.python.compatr   r"   r   r   ÚProcessProtocolru   r‹   r'   r)   rÍ   Ú
ITransportr&   rž   rù   r?   r  rM   r  rs   r   r   Ú<module>r     sÖ   ðñ
ó 
Û Û Û 
å &÷ñ ÷
 :Ñ 9ß 1Ý !Ý /áƒh€ôc0�×#Ñ#ô c0ôL*�x×/Ñ/ô *÷$;ñ ;ò"ò"òÐ ñ" ˆZ×"Ñ"Ó#ôt& × 8Ñ 8ó t&ó $ðt&ôn'�x×(Ñ(ô 'ò ò 4ò &ó:r   