
    \d@                        d 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ZddlZddl	Z	ddl
mZ ddlmZ ddlmZ ddlmZ ddlmZmZmZ ddlmZ dd	lmZmZmZ dd
lmZmZmZm Z m!Z!m"Z" ddl#m$Z$ ddl%m&Z& ddl'm(Z( ddl)m*Z* ddl+m,Z, 	 ddl-Z-n# e.$ r dZ-Y nw xY w ee$j/                   G d d                      Z0 G d de          Z1 ee           G d d                      Z2 ee           G d d                      Z3 ee           G d d                      Z4 G d d          Z5 e*j6        e3e1ej                    e*j6        e2e1ej                   dS )z
A UNIX SSH server.
    N)implementer)ttymodes)	ConchUser)
ConchError)ISession	ISFTPFileISFTPServer)lsLine)filetransfer
forwardingsession)
FXF_APPEND	FXF_CREATFXF_EXCLFXF_READ	FXF_TRUNC	FXF_WRITE)portal)ProcessExitedAlready)Logger)
components)nativeStringc                       e Zd Zd ZdS )UnixSSHRealmc                 @    t          |          }|d         ||j        fS Nr   )UnixConchUserlogout)selfusernamemind
interfacesusers        2lib/python3.11/site-packages/twisted/conch/unix.pyrequestAvatarzUnixSSHRealm.requestAvatar0   s"    X&&!}dDK//    N)__name__
__module____qualname__r%    r&   r$   r   r   .   s#        0 0 0 0 0r&   r   c                   D    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
S )r   c                    t          j        |            || _        t          j        | j                  | _        | j        d         g}t          j                    D ] \  }}}}||v r|                    |           !|| _	        i | _
        | j                            t          j        t          j        d           | j                            dt$          j        i           d S )N   )s   sessions   direct-tcpips   sftp)r   __init__r    pwdgetpwnampwdDatagrpgetgrallappendotherGroups	listenerschannelLookupupdater   
SSHSessionr   openConnectForwardingClientsubsystemLookupr   FileTransferServer)r   r    l	groupnamepasswordgiduserlists          r$   r.   zUnixConchUser.__init__6   s    4    |DM22\!_25,.. 	 	.Ixh8##!!#.!+!G 	
 	
 	
 	##Wl.M$NOOOOOr&   c                      | j         dd         S )N      r1   r   s    r$   getUserGroupIdzUnixConchUser.getUserGroupIdI   s    |AaC  r&   c                     | j         S N)r5   rF   s    r$   getOtherGroupszUnixConchUser.getOtherGroupsL   s    r&   c                     | j         d         S )N   rE   rF   s    r$   
getHomeDirzUnixConchUser.getHomeDirO       |Ar&   c                     | j         d         S )N   rE   rF   s    r$   getShellzUnixConchUser.getShellR   rN   r&   c           	      p   t          j        |          \  }}ddlm} 	 |                     |j        |t          j        | j        ||ft           j                  |          }|| j	        ||f<   |dk    r1|
                                d         }dt          j        d|          fS dS # t          $ r Y dS w xY w)Nr   reactor)	interfacerC      z>L)r   unpackGlobal_tcpip_forwardtwisted.internetrT   
_runAsUser	listenTCPSSHListenForwardingFactoryconn SSHListenServerForwardingChannelr6   getHoststructpackBaseException)r   data
hostToBind
portToBindrT   listeners         r$   global_tcpip_forwardz"UnixConchUser.global_tcpip_forwardU   s    !+!Ft!L!L
J,,,,,,	!5I,? 
 % ' 	 	H 8@DNJ
34Q%--//2
&+dJ7777q  	 	 	11	s   AB' '
B54B5c                     t          j        |          \  }}| j                            ||fd           }|sdS | j        ||f= |                     |j                   dS )Nr   rV   )r   rW   r6   getrY   stopListening)r   rb   rc   rd   re   s        r$   global_cancel_tcpip_forwardz)UnixConchUser.global_cancel_tcpip_forwardn   si    !+!Ft!L!L
J>%%z:&>EE 	1NJ
34.///qr&   c                     | j                                         D ]}|                     |j                   | j                            d| j        t          | j                              d S )Nz,avatar {username} logging out ({nlisteners}))r    
nlisteners)r6   valuesrY   ri   _loginfor    len)r   re   s     r$   r   zUnixConchUser.logoutw   ss    --// 	4 	4HOOH23333	:]4>** 	 	
 	
 	
 	
 	
r&   c                    t          j                    }t          j                    }t          j                    }|                                 \  }}t          j        d           t          j        d           t          j        |                                            t          j        |           t          j        |           	 t          |          }n# t          $ r	 |||fg}Y nw xY w	 |D ]L}	|	d         }
t          |	          dk    r|	d         pd}t          |	          dk    r|	d         pi } |
|i |}M	 t          j        d           t          j        d           t          j        |           t          j        |           t          j        |           ni# t          j        d           t          j        d           t          j        |           t          j        |           t          j        |           w xY w|S )Nr   rV   r*   rC   )osgeteuidgetegid	getgroupsrG   setegidseteuid	setgroupsrJ   iter	TypeErrorrp   )r   fargskweuidegidgroupsuidr@   ifuncrs               r$   rY   zUnixConchUser._runAsUser   s   z||z||&&((S

1

1
T((**+++

3

3	 QAA 	  	  	 T2AAA	 	 & &t1vvz*ad0bVVaZ(AaD.BD$%"%%	& JqMMMJqMMML   JtJt	 JqMMMJqMMML   JtJts    C C+*C+/AF$ $A&H
N)r'   r(   r)   r.   rG   rJ   rM   rQ   rf   rj   r   rY   r*   r&   r$   r   r   5   s        P P P&! ! !           2  
 
 
    r&   r   c                   h    e Zd Z e            ZddZddZd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd ZdS )SSHSessionForUnixConchUserNc                 `    |ddl m} || _        || _        ddi| _        d| _        d| _        dS )a  
        Construct an C{SSHSessionForUnixConchUser}.

        @param avatar: The L{UnixConchUser} for whom this is an SSH session.
        @param reactor: An L{IReactorProcess} used to handle shell and exec
            requests. Uses the default reactor if None.
        Nr   rS   PATHz/bin:/usr/bin:/usr/local/bin)rX   rT   _reactoravatarenvironptyptyTuple)r   r   rT   s      r$   r.   z#SSHSessionForUnixConchUser.__init__   sH     ?000000 >?r&   rV   c                    t           sd S | j        j        j        j                                        j        }t          j        dt          j	        |                    \  }| j
        d         dd          }t          j                    }t          |          }t          ||z
  dz            }t          j                    }|rt           j        pt           j        |_        | j        j        |_        ||_        |dd          |_        ||f|_        |r;| j        j        |_        t          j        |          d         |_        |dddf|_        t          j        t           j                  }	|	                    |           |	                                 t          j        t           j                   }
|
                    |           |
                                 d S )NLrC   rL   g    .Ar   )!utmpr   r\   	transportgetPeerhostr_   unpacksocket	inet_atonr   timeint	UtmpEntryUSER_PROCESSDEAD_PROCESSut_typer   pidut_pidut_lineut_idut_tvr    ut_usergethostbyaddrut_host
ut_addr_v6
UtmpRecord	UTMP_FILE	pututlineendutent	WTMP_FILE)r   loggedIn	ipAddresspackedIpttyNamett1t2entryabs              r$   addUTMPEntryz'SSHSessionForUnixConchUser.addUTMPEntry   s|    	FK$.8@@BBG	mC)9))D)DEE-"122&IKKVV!b&C     6T%6K$:Kx|bccl2h 	3 K0EM"0;;A>EM (!Q2EODN++	E	

ODN++	E	

r&   c                     || j         d<   || _        || _        t          j                    \  }}t          j        |          }|| j         d<   |||f| _        d S )NTERMSSH_TTY)r   winSizemodesr   openptyrr   ttynamer   )r   term
windowSizer   masterslaver   s          r$   getPtyz!SSHSessionForUnixConchUser.getPty   sX    #V!
*U##")Y0r&   c           
         | j         s)| j                            d           t          d          | j                                        \  }}| j                                        }| j                                        }| j        j        | j	        d<   || j	        d<   || j	        d<   t          j                            |          }| j        j        j        j                                        }| j        j        j        j                                        }|j         d|j         d|j         | j	        d<   |                                  | j                            ||d| g| j	        |||| j         	          | _        |                                  t1          j        | j                                        t6          j        t;          j        d
g| j        R             | j         r| !                                 |j        j"        | _#        | j$        |j        _"        | j        j        j        j        %                    d           d S )Nz'tried to get shell without pty, failingzno ptyUSERHOMESHELL 
SSH_CLIENT-usePTY4HrV   )&r   rn   errorr   r   rG   rM   rQ   r    r   rr   pathbasenamer\   r   r   r^   r   portgetPtyOwnershipr   spawnProcessr   r   fcntlioctlfilenotty
TIOCSWINSZr_   r`   r   r   setModeswriteoldWrite
_writeHacksetTcpNoDelay)	r   protor   r@   homeDirshell	shellExecpeerr   s	            r$   	openShellz$SSHSessionForUnixConchUser.openShell   s   } 	'IOOEFFFX&&&;--//S+((**$$&&#{3V&V %WG$$U++	{)3;;=={)3;;==(,	%K%KDI%K%K	%K%K\"=--__L= . 	
 	
 	DHOO%%s~v{47W$,7W7W7WXXX: 	MMOOO- $",::1=====r&   c           
          | j                                         \  }}| j                                         }| j                                         pd}|| j        d<   |d|f}| j         j        j        j                                        }| j         j        j        j                                        }	|j	         d|j
         d|	j
         | j        d<   | j        r|                                  | j                            |||| j        |||| j        pd          | _        | j        r/|                                  | j        r|                                  | j         j        j        j                            d           d S )	Nz/bin/shr   z-cr   r   r   r   rV   )r   rG   rM   rQ   r   r\   r   r   r^   r   r   r   r   r   r   r   r   r   r   r   )
r   r   cmdr   r@   r   r   commandr   r   s
             r$   execCommandz&SSHSessionForUnixConchUser.execCommand   sq   ;--//S+((**$$&&3)&V$${)3;;=={)3;;==(,	%K%KDI%K%K	%K%K\"= 	#  """=--L=%A . 	
 	
 = 	 z  ",::1=====r&   c                    t          j        | j        d                   d         }| j                                        \  }}t          j                    t          j                    }}t          j        d           t          j        d           	 t          j	        | j        d         ||           t          j        |           t          j        |           d S # t          j        |           t          j        |           w xY w)NrC   rL   r   )
rr   statr   r   rG   rs   rt   rv   rw   chown)r   ttyGidr   r@   r~   r   s         r$   r   z*SSHSessionForUnixConchUser.getPtyOwnership  s    q)**1-;--//SZ\\2:<<d

1

1	HT]1%sF333JtJt JtJts   !C *Dc                 $   | j         }t          j         |j                              }| j        D ]1\  }}|t
          j        vrt
          j        |         }t          |          dk    rQ|\  }}t          t          |          sUt          t          |          }|r||         |z  ||<   {||         | z  ||<   |dk    r&t          t          d|           |t          j
        <   |dk    r&t          t          d|           |t          j        <   t          t          |          st          t          |          }t          |f          |t          j                 |<   3t          j         |j                    t          j        |           d S )NrC   OSPEEDBISPEED)r   r   	tcgetattrr   r   r   TTYMODESrp   hasattrgetattrr   r   bytesCC	tcsetattrTCSANOW)	r   r   attrmode	modeValuettyModeflagttyAttrttyvals	            r$   r   z#SSHSessionForUnixConchUser.setModes  s|   h}ZSZ\\**#z 	; 	;OD)8,,,'-G7||q   'gsG,,  g.. 6!%df!4DJJ!%dvg!5DJJH$$#*3I#@#@SZ  H$$#*3I#@#@SZ  sG,,  g..',i\':':SVV$$jcjllCK66666r&   c                 J    | j         r| j                                          d S d S rI   )r   
closeStdinrF   s    r$   eofReceivedz&SSHSessionForUnixConchUser.eofReceived8  s0    8 	"H!!!!!	" 	"r&   c                    | j         rpt          j                            | j         d                   rFt          j        | j         d                   d         }t          j        | j         d         d|           | j        ra	 | j                            d           n# t          t          f$ r Y nw xY w| j        
                                 |                     d           | j                            d           d S )NrC   rL   r   HUPzshell closed)r   rr   r   existsr   r   r   signalProcessOSErrorr   loseConnectionr   rn   ro   )r   ttyGIDs     r$   closedz!SSHSessionForUnixConchUser.closed<  s    = 	2RW^^DM!,<== 	2WT]1-..q1FHT]1%q&1118 	!&&u----12   H##%%%a   	~&&&&&s    B B/.B/c                     || _         t          j        | j                                        t
          j        t          j        dg| j         R             d S )Nr   )	r   r   r   r   r   r   r   r_   r`   )r   r   s     r$   windowChangedz(SSHSessionForUnixConchUser.windowChangedI  sE    DHOO%%s~v{47W$,7W7W7WXXXXXr&   c                 J   | j         t          j        | j                                                   d         }|t          j        z  sF|t          j        z  r7| j        j        j        	                    ddt          |          z   z             |                     |           dS )zF
        Hack to send ignore messages when we aren't echoing.
        Nr-       )r   r   r   r   ECHOICANONr   r\   r   
sendIgnorerp   r   )r   rb   r   s      r$   r   z%SSHSessionForUnixConchUser._writeHackM  s     8=!2!233A6D#(? Ptcj'8 P *55fCII6NOOOdr&   rI   )rV   )r'   r(   r)   r   rn   r.   r   r   r   r   r   r   r   r  r
  r   r*   r&   r$   r   r      s        688D       41 1 1> > >B> > >6
 
 
7 7 76" " "' ' 'Y Y Y    r&   r   c                   t    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 Zd ZdS )SFTPServerForUnixConchUserc                     || _         d S rI   )r   )r   r   s     r$   r.   z#SFTPServerForUnixConchUser.__init__Z  s    r&   c                     d|v r&d|v r"t          j        ||d         |d                    d|v rt          j        ||d                    d|v r)d|v r't          j        ||d         |d         f           dS dS dS )zl
        NOTE: this function assumes it runs as the logged-in user:
        i.e. under _runAsUser()
        r   r@   permissionsatimemtimeN)rr   r   chmodutimer   r   attrss      r$   	_setAttrsz$SFTPServerForUnixConchUser._setAttrs]  s    
 E>>eunnHT5<u666E!!HT5/000e5 0 0HTE'NE'N;<<<<<  0 0r&   c                     |j         |j        |j        |j        t	          |j                  t	          |j                  dS )N)sizer   r@   r  r  r  )st_sizest_uidst_gidst_moder   st_atimest_mtimer   ss     r$   	_getAttrsz$SFTPServerForUnixConchUser._getAttrsi  s;    I889____
 
 	
r&   c                     | j                                         }t          j                            t          |j                  t          |                    S rI   )r   rM   rr   r   joinr   )r   r   homes      r$   _absPathz#SFTPServerForUnixConchUser._absPaths  s=    {%%''w||L33\$5G5GHHHr&   c                     i S rI   r*   )r   otherVersionextDatas      r$   
gotVersionz%SFTPServerForUnixConchUser.gotVersionw  s    	r&   c                 L    t          | |                     |          ||          S rI   )UnixSFTPFiler+  )r   filenameflagsr  s       r$   openFilez#SFTPServerForUnixConchUser.openFilez  s"    D$--"9"95%HHHr&   c                 v    |                      |          }| j                            t          j        |          S rI   )r+  r   rY   rr   remove)r   r2  s     r$   
removeFilez%SFTPServerForUnixConchUser.removeFile}  s-    ==**{%%bi:::r&   c                     |                      |          }|                      |          }| j                            t          j        ||          S rI   )r+  r   rY   rr   rename)r   oldpathnewpaths      r$   
renameFilez%SFTPServerForUnixConchUser.renameFile  s@    --((--(({%%bi'BBBr&   c                     |                      |          }| j                            t          j        |ff| j        ||ffg          S rI   )r+  r   rY   rr   mkdirr  r  s      r$   makeDirectoryz(SFTPServerForUnixConchUser.makeDirectory  sI    }}T""{%%h 4>D%="AB
 
 	
r&   c                 z    |                      |          }| j                            t          j        |           d S rI   )r+  r   rY   rr   rmdirr   r   s     r$   removeDirectoryz*SFTPServerForUnixConchUser.removeDirectory  s3    }}T""rx.....r&   c                 H    t          | |                     |                    S rI   )UnixSFTPDirectoryr+  rB  s     r$   openDirectoryz(SFTPServerForUnixConchUser.openDirectory  s     t}}T':':;;;r&   c                     |                      |          }|r&| j                            t          j        |          }n%| j                            t          j        |          }|                     |          S rI   )r+  r   rY   rr   r   lstatr'  )r   r   followLinksr&  s       r$   getAttrsz#SFTPServerForUnixConchUser.getAttrs  sa    }}T"" 	7&&rw55AA&&rx66A~~a   r&   c                 r    |                      |          }| j                            | j        ||           d S rI   )r+  r   rY   r  r  s      r$   setAttrsz#SFTPServerForUnixConchUser.setAttrs  s5    }}T""t~tU;;;;;r&   c                 v    |                      |          }| j                            t          j        |          S rI   )r+  r   rY   rr   readlinkrB  s     r$   readLinkz#SFTPServerForUnixConchUser.readLink  s-    }}T""{%%bk4888r&   c                     |                      |          }|                      |          }| j                            t          j        ||          S rI   )r+  r   rY   rr   symlink)r   linkPath
targetPaths      r$   makeLinkz#SFTPServerForUnixConchUser.makeLink  s@    ==**]]:..
{%%bj*hGGGr&   c                 f    t           j                            |                     |                    S rI   )rr   r   realpathr+  rB  s     r$   realPathz#SFTPServerForUnixConchUser.realPath  s$    wd 3 3444r&   c                     t           rI   NotImplementedError)r   extNamer.  s      r$   extendedRequestz*SFTPServerForUnixConchUser.extendedRequest      !!r&   N)r'   r(   r)   r.   r  r'  r+  r/  r4  r7  r<  r?  rC  rF  rJ  rL  rO  rT  rW  r\  r*   r&   r$   r  r  X  s         
= 
= 
=
 
 
I I I  I I I; ; ;C C C

 
 
/ / /< < <! ! !< < <9 9 9H H H
5 5 5" " " " "r&   r  c                   2    e Zd Zd Zd Zd Zd Zd Zd ZdS )r1  c                    || _         d}|t          z  t          k    r|t          z  dk    rt          j        }|t          z  t          k    r|t          z  dk    rt          j        }|t          z  t          k    r|t          z  t          k    rt          j        }|t          z  t          k    r|t          j        z  }|t          z  t          k    r|t          j
        z  }|t          z  t          k    r|t          j        z  }|t          z  t          k    r|t          j        z  }d|v r|d         }|d= nd}|j                            t          j        |||          }|r!|j                            |j        ||           || _        d S )Nr   r  i  )serverr   r   rr   O_RDONLYO_WRONLYO_RDWRr   O_APPENDr   O_CREATr   O_TRUNCr   O_EXCLr   rY   openr  fd)r   r`  r2  r3  r  	openFlagsr   ri  s           r$   r.   zUnixSFTPFile.__init__  sc   	8x''EI,=,B,BI9	))eh.>!.C.CI9	))eh.>(.J.J	I:++$I9	))#I9	))#I8x''"IE!!'Dm$$D]%%bgxDII 	HM$$V%5xGGGr&   c                 `    | j         j                            t          j        | j                  S rI   )r`  r   rY   rr   closeri  rF   s    r$   rl  zUnixSFTPFile.close  s!    {!,,RXtw???r&   c                     | j         j                            t          j        | j        |dfft          j        | j        |ffg          S r   )r`  r   rY   rr   lseekri  read)r   offsetlengths      r$   	readChunkzUnixSFTPFile.readChunk  sE    {!,,h&!,-$'69J/KL
 
 	
r&   c                     | j         j                            t          j        | j        |dfft          j        | j        |ffg          S r   )r`  r   rY   rr   rn  ri  r   )r   rp  rb   s      r$   
writeChunkzUnixSFTPFile.writeChunk  sD    {!,,h&!,-47D//JK
 
 	
r&   c                     | j         j                            t          j        | j                  }| j                             |          S rI   )r`  r   rY   rr   fstatri  r'  r%  s     r$   rJ  zUnixSFTPFile.getAttrs  s6    K))"(DG<<{$$Q'''r&   c                     t           rI   rY  )r   r  s     r$   rL  zUnixSFTPFile.setAttrs  r]  r&   N)	r'   r(   r)   r.   rl  rr  rt  rJ  rL  r*   r&   r$   r1  r1    sq          6@ @ @
 
 


 
 

( ( (" " " " "r&   r1  c                   *    e Zd Zd Zd Zd ZeZd ZdS )rE  c                 v    || _         |j                            t          j        |          | _        || _        d S rI   )r`  r   rY   rr   listdirfilesdir)r   r`  	directorys      r$   r.   zUnixSFTPDirectory.__init__  s/    ]--bj)DD
r&   c                     | S rI   r*   rF   s    r$   __iter__zUnixSFTPDirectory.__iter__  s    r&   c                 Z   	 | j                             d          }| j        j                            t
          j        t
          j                            | j	        |                    }t          ||          }| j                            |          }|||fS # t          $ r t          w xY wr   )r{  popr`  r   rY   rr   rH  r   r)  r|  r
   r'  
IndexErrorStopIteration)r   r{   r&  longnamer  s        r$   __next__zUnixSFTPDirectory.__next__  s    	(
q!!A "--bhTXq8Q8QRRAa||HK))!,,Ex''  	  	  	 	 s   B B*c                     g | _         d S rI   )r{  rF   s    r$   rl  zUnixSFTPDirectory.close  s    


r&   N)r'   r(   r)   r.   r  r  nextrl  r*   r&   r$   rE  rE    sW          
  	( 	( 	( D    r&   rE  )7__doc__r   r2   rr   r   r/   r   r_   r   r   zope.interfacer   twisted.conchr   twisted.conch.avatarr   twisted.conch.errorr   twisted.conch.interfacesr   r   r	   twisted.conch.lsr
   twisted.conch.sshr   r   r   twisted.conch.ssh.filetransferr   r   r   r   r   r   twisted.credr   twisted.internet.errorr   twisted.loggerr   twisted.pythonr   twisted.python.compatr   r   ImportErrorIRealmr   r   r   r  r1  rE  registerAdapterr*   r&   r$   <module>r     s     



 				 



 



    



 & & & & & & " " " " " " * * * * * * * * * * * * E E E E E E E E E E # # # # # # ? ? ? ? ? ? ? ? ? ?                       7 7 7 7 7 7 ! ! ! ! ! ! % % % % % % . . . . . .KKKK   DDD V]0 0 0 0 0 0 0 0f f f f fI f f fR Xv v v v v v v vr [S" S" S" S" S" S" S" S"l Y." ." ." ." ." ." ." ."b       4 
 |/G   
 5}gFV W W W W Ws   B BB