
    YfB                       d Z ddlm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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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/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6 	 ddl7Z7n# e8$ r dZ7Y nw xY w ee*j9                   G d d                      Z: G d de          Z; ee           G d d                      Z< ee           G d d                      Z= ee           G d d                      Z> G d d          Z? e4j@        e=e;ej                    e4j@        e<e;e!j                   dS ) z
A UNIX SSH server.
    )annotationsN)CallableDictTuple)implementer)ttymodes)	ConchUser)
ConchError)ISession	ISFTPFileISFTPServer)lsLine)filetransfer
forwardingsession)
FXF_APPEND	FXF_CREATFXF_EXCLFXF_READ	FXF_TRUNC	FXF_WRITE)portal)LoginDenied)ProcessExitedAlready)IListeningPort)Logger)
components)nativeStringc                      e Zd Zdd	Zd
S )UnixSSHRealmusernamebytes | Tuple[()]mindobject
interfacesportal._InterfaceItselfreturnATuple[portal._InterfaceItself, UnixConchUser, Callable[[], None]]c                    t          |t                    st          d          t          |                                          }|d         ||j        fS )Nz5UNIX SSH realm does not authorize anonymous sessions.r   )
isinstancebytesr   UnixConchUserdecodelogout)selfr!   r#   r%   users        D/var/www/html/env/lib/python3.11/site-packages/twisted/conch/unix.pyrequestAvatarzUnixSSHRealm.requestAvatar5   sP     (E** 	WUVVVX__..//!}dDK//    N)r!   r"   r#   r$   r%   r&   r'   r(   )__name__
__module____qualname__r2    r3   r1   r    r    3   s(        	0 	0 	0 	0 	0 	0r3   r    c                  H    e Zd ZddZd Zd Zd Zd	 Zd
 Zd Z	ddZ
d ZdS )r,   r!   strr'   Nonec                   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          r1   r=   zUnixConchUser.__init__B   s    4    |DM22\!_25,.. 	 	.Ixh8##  	 	!!#.!+!G 	
 	
 	
 	##Wl.M$NOOOOOr3   c                     | j         dd         S )N      r@   r/   s    r1   getUserGroupIdzUnixConchUser.getUserGroupIdW   s    |AaC  r3   c                    | j         S N)rD   rU   s    r1   getOtherGroupszUnixConchUser.getOtherGroupsZ   s    r3   c                    | j         d         S )N   rT   rU   s    r1   
getHomeDirzUnixConchUser.getHomeDir]       |Ar3   c                    | j         d         S )N   rT   rU   s    r1   getShellzUnixConchUser.getShell`   r]   r3   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)	interfacerR      z>L)r   unpackGlobal_tcpip_forwardtwisted.internetrc   
_runAsUser	listenTCPSSHListenForwardingFactoryconn SSHListenServerForwardingChannelrE   getHoststructpackBaseException)r/   data
hostToBind
portToBindrc   listeners         r1   global_tcpip_forwardz"UnixConchUser.global_tcpip_forwardc   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   re   )r   rf   rE   getrh   stopListening)r/   rq   rr   rs   rt   s        r1   global_cancel_tcpip_forwardz)UnixConchUser.global_cancel_tcpip_forward|   si    !+!Ft!L!L
J>%%z:&>EE 	1NJ
34.///qr3   c                    | j                                         D ]}|                     |j                   | j                            d| j        t          | j                              d S )Nz,avatar {username} logging out ({nlisteners}))r!   
nlisteners)rE   valuesrh   rx   _loginfor!   len)r/   rt   s     r1   r.   zUnixConchUser.logout   ss    --// 	4 	4HOOH23333	:]4>** 	 	
 	
 	
 	
 	
r3   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   re   r7   rR   )osgeteuidgetegid	getgroupsrV   setegidseteuid	setgroupsrY   iter	TypeErrorr   )r/   fargskweuidegidgroupsuidrO   ifuncrs               r1   rh   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!   r9   r'   r:   )r'   r:   )r4   r5   r6   r=   rV   rY   r\   r`   ru   ry   r.   rh   r7   r3   r1   r,   r,   A   s        P P P P*! ! !           2  
 
 
 
    r3   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   rb   PATHz/bin:/usr/bin:/usr/local/bin)rg   rc   _reactoravatarenvironptyptyTuple)r/   r   rc   s      r1   r=   z#SSHSessionForUnixConchUser.__init__   sH     ?000000 >?r3   re   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LrR   r[   g    .Ar   )!utmpr   rk   	transportgetPeerhostrn   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              r1   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	

r3   c                    || j         d<   || _        || _        t          j                    \  }}t          j        |          }|| j         d<   |||f| _        d S )NTERMSSH_TTY)r   winSizemodesr   openptyr   ttynamer   )r/   term
windowSizer   masterslaver   s          r1   getPtyz!SSHSessionForUnixConchUser.getPty   sX    #V!
*U##")Y0r3   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4Hre   )&r   r}   errorr
   r   rV   r\   r`   r!   r   r   pathbasenamerk   r   r   rm   r   portgetPtyOwnershipr   spawnProcessr   r   fcntlioctlfilenotty
TIOCSWINSZrn   ro   r   r   setModeswriteoldWrite
_writeHacksetTcpNoDelay)	r/   protor   rO   homeDirshell	shellExecpeerr   s	            r1   	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=====r3   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   re   )r   rV   r\   r`   r   rk   r   r   rm   r   r   r   r   r   r   r   r   r   r   r   )
r/   r   cmdr   rO   r   r   commandr   r   s
             r1   execCommandz&SSHSessionForUnixConchUser.execCommand  sq   ;--//S+((**$$&&3)&V$${)3;;=={)3;;==(,	%K%KDI%K%K	%K%K\"= 	#  """=--L=%A . 	
 	
 = 	 z  ",::1=====r3   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)NrR   r[   r   )
r   statr   r   rV   r   r   r   r   chown)r/   ttyGidr   rO   r   r   s         r1   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 )NrR   OSPEEDBISPEED)r   r   	tcgetattrr   r   r   TTYMODESr   hasattrgetattrr   r   r+   CC	tcsetattrTCSANOW)	r/   r   attrmode	modeValuettyModeflagttyAttrttyvals	            r1   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6r3   c                J    | j         r| j                                          d S d S rX   )r   
closeStdinrU   s    r1   eofReceivedz&SSHSessionForUnixConchUser.eofReceivedF  s0    8 	"H!!!!!	" 	"r3   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 )NrR   r[   r   HUPzshell closed)r   r   r   existsr   r   r   signalProcessOSErrorr   loseConnectionr   r}   r~   )r/   ttyGIDs     r1   closedz!SSHSessionForUnixConchUser.closedJ  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   rn   ro   )r/   r   s     r1   windowChangedz(SSHSessionForUnixConchUser.windowChangedW  sE    DHOO%%s~v{47W$,7W7W7WXXXXXr3   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   rk   r   
sendIgnorer   r   )r/   rq   r  s      r1   r   z%SSHSessionForUnixConchUser._writeHack[  s     8=!2!233A6D#(? Ptcj'8 P *55fCII6NOOOdr3   rX   )re   )r4   r5   r6   r   r}   r=   r   r   r   r   r   r   r  r  r  r   r7   r3   r1   r   r      s        688D       41 1 1> > >B> > >6
 
 
7 7 76" " "' ' 'Y Y Y    r3   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 rX   )r   )r/   r   s     r1   r=   z#SFTPServerForUnixConchUser.__init__h  s    r3   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   rO   permissionsatimemtimeN)r   r   chmodutimer/   r   attrss      r1   	_setAttrsz$SFTPServerForUnixConchUser._setAttrsk  s    
 E>>eunnHT5<u666E!!HT5/000e5 0 0HTE'NE'N;<<<<<  0 0r3   c                    |j         |j        |j        |j        t	          |j                  t	          |j                  dS )N)sizer   rO   r#  r$  r%  )st_sizest_uidst_gidst_moder   st_atimest_mtimer/   ss     r1   	_getAttrsz$SFTPServerForUnixConchUser._getAttrsw  s;    I889____
 
 	
r3   c                    | j                                         }t          j                            t          |j                  t          |                    S rX   )r   r\   r   r   joinr   )r/   r   homes      r1   _absPathz#SFTPServerForUnixConchUser._absPath  s=    {%%''w||L33\$5G5GHHHr3   c                    i S rX   r7   )r/   otherVersionextDatas      r1   
gotVersionz%SFTPServerForUnixConchUser.gotVersion  s    	r3   c                L    t          | |                     |          ||          S rX   )UnixSFTPFiler9  )r/   filenameflagsr)  s       r1   openFilez#SFTPServerForUnixConchUser.openFile  s"    D$--"9"95%HHHr3   c                v    |                      |          }| j                            t          j        |          S rX   )r9  r   rh   r   remove)r/   r@  s     r1   
removeFilez%SFTPServerForUnixConchUser.removeFile  s-    ==**{%%bi:::r3   c                    |                      |          }|                      |          }| j                            t          j        ||          S rX   )r9  r   rh   r   rename)r/   oldpathnewpaths      r1   
renameFilez%SFTPServerForUnixConchUser.renameFile  s@    --((--(({%%bi'BBBr3   c                    |                      |          }| j                            t          j        |ff| j        ||ffg          S rX   )r9  r   rh   r   mkdirr*  r(  s      r1   makeDirectoryz(SFTPServerForUnixConchUser.makeDirectory  sI    }}T""{%%h 4>D%="AB
 
 	
r3   c                z    |                      |          }| j                            t          j        |           d S rX   )r9  r   rh   r   rmdirr/   r   s     r1   removeDirectoryz*SFTPServerForUnixConchUser.removeDirectory  s3    }}T""rx.....r3   c                H    t          | |                     |                    S rX   )UnixSFTPDirectoryr9  rP  s     r1   openDirectoryz(SFTPServerForUnixConchUser.openDirectory  s     t}}T':':;;;r3   c                    |                      |          }|r&| j                            t          j        |          }n%| j                            t          j        |          }|                     |          S rX   )r9  r   rh   r   r   lstatr5  )r/   r   followLinksr4  s       r1   getAttrsz#SFTPServerForUnixConchUser.getAttrs  sa    }}T"" 	7&&rw55AA&&rx66A~~a   r3   c                r    |                      |          }| j                            | j        ||           d S rX   )r9  r   rh   r*  r(  s      r1   setAttrsz#SFTPServerForUnixConchUser.setAttrs  s5    }}T""t~tU;;;;;r3   c                v    |                      |          }| j                            t          j        |          S rX   )r9  r   rh   r   readlinkrP  s     r1   readLinkz#SFTPServerForUnixConchUser.readLink  s-    }}T""{%%bk4888r3   c                    |                      |          }|                      |          }| j                            t          j        ||          S rX   )r9  r   rh   r   symlink)r/   linkPath
targetPaths      r1   makeLinkz#SFTPServerForUnixConchUser.makeLink  s@    ==**]]:..
{%%bj*hGGGr3   c                f    t           j                            |                     |                    S rX   )r   r   realpathr9  rP  s     r1   realPathz#SFTPServerForUnixConchUser.realPath  s$    wd 3 3444r3   c                    t           rX   NotImplementedError)r/   extNamer<  s      r1   extendedRequestz*SFTPServerForUnixConchUser.extendedRequest      !!r3   N)r4   r5   r6   r=   r*  r5  r9  r=  rB  rE  rJ  rM  rQ  rT  rX  rZ  r]  rb  re  rj  r7   r3   r1   r   r   f  s         
= 
= 
=
 
 
I I I  I I I; ; ;C C C

 
 
/ / /< < <! ! !< < <9 9 9H H H
5 5 5" " " " "r3   r   c                  2    e Zd Zd Zd Zd Zd Zd Zd ZdS )r?  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   r   O_RDONLYO_WRONLYO_RDWRr   O_APPENDr   O_CREATr   O_TRUNCr   O_EXCLr   rh   openr*  fd)r/   rn  r@  rA  r)  	openFlagsr  rw  s           r1   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r3   c                `    | j         j                            t          j        | j                  S rX   )rn  r   rh   r   closerw  rU   s    r1   rz  zUnixSFTPFile.close  s!    {!,,RXtw???r3   c                    | j         j                            t          j        | j        |dfft          j        | j        |ffg          S Nr   )rn  r   rh   r   lseekrw  read)r/   offsetlengths      r1   	readChunkzUnixSFTPFile.readChunk  sE    {!,,h&!,-$'69J/KL
 
 	
r3   c                    | j         j                            t          j        | j        |dfft          j        | j        |ffg          S r|  )rn  r   rh   r   r}  rw  r   )r/   r  rq   s      r1   
writeChunkzUnixSFTPFile.writeChunk  sD    {!,,h&!,-47D//JK
 
 	
r3   c                    | j         j                            t          j        | j                  }| j                             |          S rX   )rn  r   rh   r   fstatrw  r5  r3  s     r1   rX  zUnixSFTPFile.getAttrs  s6    K))"(DG<<{$$Q'''r3   c                    t           rX   rg  )r/   r)  s     r1   rZ  zUnixSFTPFile.setAttrs  rk  r3   N)	r4   r5   r6   r=   rz  r  r  rX  rZ  r7   r3   r1   r?  r?    sq          6@ @ @
 
 


 
 

( ( (" " " " "r3   r?  c                  *    e Zd Zd Zd Zd ZeZd ZdS )rS  c                v    || _         |j                            t          j        |          | _        || _        d S rX   )rn  r   rh   r   listdirfilesdir)r/   rn  	directorys      r1   r=   zUnixSFTPDirectory.__init__  s/    ]--bj)DD
r3   c                    | S rX   r7   rU   s    r1   __iter__zUnixSFTPDirectory.__iter__  s    r3   c                Z   	 | j                             d          }| j        j                            t
          j        t
          j                            | j	        |                    }t          ||          }| j                            |          }|||fS # t          $ r t          w xY wr|  )r  poprn  r   rh   r   rV  r   r7  r  r   r5  
IndexErrorStopIteration)r/   r   r4  longnamer)  s        r1   __next__zUnixSFTPDirectory.__next__  s    	(
q!!A "--bhTXq8Q8QRRAa||HK))!,,Ex''  	  	  	 	 s   B B*c                    g | _         d S rX   )r  rU   s    r1   rz  zUnixSFTPDirectory.close  s    


r3   N)r4   r5   r6   r=   r  r  nextrz  r7   r3   r1   rS  rS    sW          
  	( 	( 	( D    r3   rS  )A__doc__
__future__r   r   rA   r   r   r>   r   rn   r   r   typingr   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.cred.errorr   twisted.internet.errorr   twisted.internet.interfacesr   twisted.loggerr   twisted.pythonr   twisted.python.compatr   r   ImportErrorIRealmr    r,   r   r   r?  rS  registerAdapterr7   r3   r1   <module>r     s    # " " " " "  



 				 



 



    



 ( ( ( ( ( ( ( ( ( ( & & & & & & " " " " " " * * * * * * * * * * * * E E E E E E E E E E # # # # # # ? ? ? ? ? ? ? ? ? ?                       * * * * * * 7 7 7 7 7 7 6 6 6 6 6 6 ! ! ! ! ! ! % % % % % % . . . . . .KKKK   DDD V]
0 
0 
0 
0 
0 
0 
0 
0h h h h hI h h hV 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) )B32B3