o
    >hB                     @  s  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 zddl7Z7W n e8y   dZ7Y nw ee*j9G dd dZ:G dd deZ;eeG dd dZ<eeG dd dZ=eeG dd dZ>G dd dZ?e4@e=e;ej e4@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                   @  s   e Zd Zdd	d
ZdS )UnixSSHRealmusernamebytes | Tuple[()]mindobject
interfacesportal._InterfaceItselfreturnATuple[portal._InterfaceItself, UnixConchUser, Callable[[], None]]c                 G  s.   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#   user r.   r/var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/lib/python3.10/site-packages/twisted/conch/unix.pyrequestAvatar5   s   
zUnixSSHRealm.requestAvatarN)r   r    r!   r"   r#   r$   r%   r&   )__name__
__module____qualname__r0   r.   r.   r.   r/   r   3   s    r   c                   @  sX   e Zd ZdddZdd Zd	d
 Zdd Zdd Zdd Zdd Z	dddZ
dd ZdS )r)   r   strr%   Nonec                 C  s   t |  || _t| j| _| jd g}t D ]\}}}}||v r(|| q|| _	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userlistr.   r.   r/   r7   B   s"   

zUnixConchUser.__init__c                 C  s   | j dd S )N      r:   r,   r.   r.   r/   getUserGroupIdW   s   zUnixConchUser.getUserGroupIdc                 C  s   | j S N)r>   rN   r.   r.   r/   getOtherGroupsZ   s   zUnixConchUser.getOtherGroupsc                 C  
   | j d S )N   rM   rN   r.   r.   r/   
getHomeDir]      
zUnixConchUser.getHomeDirc                 C  rR   )N   rM   rN   r.   r.   r/   getShell`   rU   zUnixConchUser.getShellc                 C  s   t |\}}ddlm} z| j|j|t | j||ft j|d}W n
 t	y,   Y dS w || j
||f< |dkrF| d }dtd|fS dS )Nr   reactor)	interfacerK      z>L)r   unpackGlobal_tcpip_forwardtwisted.internetrY   
_runAsUser	listenTCPSSHListenForwardingFactoryconn SSHListenServerForwardingChannelBaseExceptionr?   getHoststructpack)r,   data
hostToBind
portToBindrY   listenerr.   r.   r/   global_tcpip_forwardc   s*   

z"UnixConchUser.global_tcpip_forwardc                 C  sD   t |\}}| j||fd }|sdS | j||f= | |j dS )Nr   r[   )r   r\   r?   getr^   stopListening)r,   rg   rh   ri   rj   r.   r.   r/   global_cancel_tcpip_forward|   s   z)UnixConchUser.global_cancel_tcpip_forwardc                 C  s:   | j  D ]}| |j q| jjd| jt| j d d S )Nz,avatar {username} logging out ({nlisteners}))r   
nlisteners)r?   valuesr^   rm   _loginfor   len)r,   rj   r.   r.   r/   r+      s   
zUnixConchUser.logoutc              	   O  sD  t  }t  }t  }|  \}}t d t d t |   t | t | zt	|}W n t
yB   |||fg}Y nw zD|D ]%}	|	d }
t|	dkrV|	d pWd}t|	dkrb|	d pci }|
|i |}qFW t d t d t | t | t | |S t d t d t | t | t | w )Nr   r[   r.   rK   )osgeteuidgetegid	getgroupsrO   setegidseteuid	setgroupsrQ   iter	TypeErrorrs   )r,   fargskweuidegidgroupsuidrI   ifuncrr.   r.   r/   r^      s@   












zUnixConchUser._runAsUserN)r   r4   r%   r5   )r%   r5   )r1   r2   r3   r7   rO   rQ   rT   rW   rk   rn   r+   r^   r.   r.   r.   r/   r)   A   s    

	
r)   c                   @  sn   e Zd Ze ZdddZdddZdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd ZdS )SSHSessionForUnixConchUserNc                 C  s:   |du r
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   rX   PATHz/bin:/usr/bin:/usr/local/bin)r]   rY   _reactoravatarenvironptyptyTuple)r,   r   rY   r.   r.   r/   r7      s   

z#SSHSessionForUnixConchUser.__init__r[   c                 C  s  t sd S | jjjj j}tdt	|\}| j
d dd  }t }t|}t|| d }t  }|r9t jp;t j|_| jj|_||_|dd  |_||f|_|rg| jj|_t|d |_|dddf|_t t j}	|	| |	  t t j }
|
| |
  d S )NLrK   rS   g    .Ar   )!utmpr   ra   	transportgetPeerhostre   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br.   r.   r/   addUTMPEntry   s0   




z'SSHSessionForUnixConchUser.addUTMPEntryc                 C  sF   || j d< || _|| _t \}}t|}|| j d< |||f| _d S )NTERMSSH_TTY)r   winSizemodesr   openptyrt   ttynamer   )r,   term
windowSizer   masterslaver   r.   r.   r/   getPty   s   


z!SSHSessionForUnixConchUser.getPtyc           	   
   C  sB  | 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j||d| g| j	|||| j d	| _|   t| j t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4Hr[   )&r   rq   errorr	   r   rO   rT   rW   r   r   rt   pathbasenamera   r   r   rd   r   portgetPtyOwnershipr   spawnProcessr   r   fcntlioctlfilenotty
TIOCSWINSZre   rf   r   r   setModeswriteoldWrite
_writeHacksetTcpNoDelay)	r,   protor   rI   homeDirshell	shellExecpeerr   r.   r.   r/   	openShell   s>   



 

&

z$SSHSessionForUnixConchUser.openShellc           
   
   C  s   | 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rD|   | jj|||| j|||| jpSdd| _| jre|   | jre|   | j jjjd d S )	Nz/bin/shr   z-cr   r   r   r   r[   )r   rO   rT   rW   r   ra   r   r   rd   r   r   r   r   r   r   r   r   r   r   r   )
r,   r   cmdr   rI   r   r   commandr   r   r.   r.   r/   execCommand  s2   


 
z&SSHSessionForUnixConchUser.execCommandc              	   C  s   t | jd d }| j \}}t  t  }}t d t d zt 	| jd || W t | t | d S t | t | w )NrK   rS   r   )
rt   statr   r   rO   ru   rv   rx   ry   chown)r,   ttyGidr   rI   r   r   r.   r.   r/   r     s   



z*SSHSessionForUnixConchUser.getPtyOwnershipc           	      C  s  | j }t| }| jD ]n\}}|tjvrqtj| }t|dkrF|\}}tt|s,qt	t|}|r<|| |B ||< q|| | @ ||< q|dkrVt	td| |tj
< q|dkrft	td| |tj< qtt|slqt	t|}t|f|tj |< qt| tj| d S )NrK   OSPEEDBISPEED)r   r   	tcgetattrr   r   r   TTYMODESrs   hasattrgetattrr   r   r(   CC	tcsetattrTCSANOW)	r,   r   attrmode	modeValuettyModeflagttyAttrttyvalr.   r.   r/   r   +  s.   





z#SSHSessionForUnixConchUser.setModesc                 C  s   | j r
| j   d S d S rP   )r   
closeStdinrN   r.   r.   r/   eofReceivedF  s   z&SSHSessionForUnixConchUser.eofReceivedc              	   C  s   | j r tj| j d r t| j d d }t| j d d| | jrAz| jd W n tt	fy6   Y nw | j
  | d | jd d S )NrK   rS   r   HUPzshell closed)r   rt   r   existsr   r   r   signalProcessOSErrorr   loseConnectionr   rq   rr   )r,   ttyGIDr.   r.   r/   closedJ  s   

z!SSHSessionForUnixConchUser.closedc                 C  s0   || _ t| j tjtjdg| j R   d S )Nr   )	r   r   r   r   r   r   r   re   rf   )r,   r   r.   r.   r/   windowChangedW  s   *z(SSHSessionForUnixConchUser.windowChangedc                 C  s\   | j dur't| j  d }|tj@ s'|tj@ r'| jjj	ddt
|   | | dS )zF
        Hack to send ignore messages when we aren't echoing.
        Nr6       )r   r   r   r   ECHOICANONr   ra   r   
sendIgnorers   r   )r,   rg   r   r.   r.   r/   r   [  s
   
z%SSHSessionForUnixConchUser._writeHackrP   )r[   )r1   r2   r3   r   rq   r7   r   r   r   r   r   r   r   r   r   r   r.   r.   r.   r/   r      s    

	!r   c                   @  s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#S )$SFTPServerForUnixConchUserc                 C  s
   || _ d S rP   )r   )r,   r   r.   r.   r/   r7   h  rU   z#SFTPServerForUnixConchUser.__init__c                 C  sr   d|v rd|v rt ||d |d  d|v rt ||d  d|v r5d|v r7t ||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   rI   permissionsatimemtimeN)rt   r   chmodutimer,   r   attrsr.   r.   r/   	_setAttrsk  s   z$SFTPServerForUnixConchUser._setAttrsc                 C  s&   |j |j|j|jt|jt|jdS )N)sizer   rI   r  r  r	  )st_sizest_uidst_gidst_moder   st_atimest_mtimer,   sr.   r.   r/   	_getAttrsw  s   z$SFTPServerForUnixConchUser._getAttrsc                 C  s"   | j  }tjt|jt|S rP   )r   rT   rt   r   joinr   )r,   r   homer.   r.   r/   _absPath  s   
z#SFTPServerForUnixConchUser._absPathc                 C  s   i S rP   r.   )r,   otherVersionextDatar.   r.   r/   
gotVersion     z%SFTPServerForUnixConchUser.gotVersionc                 C  s   t | | |||S rP   )UnixSFTPFiler  )r,   filenameflagsr  r.   r.   r/   openFile     z#SFTPServerForUnixConchUser.openFilec                 C     |  |}| jtj|S rP   )r  r   r^   rt   remove)r,   r!  r.   r.   r/   
removeFile     
z%SFTPServerForUnixConchUser.removeFilec                 C  s&   |  |}|  |}| jtj||S rP   )r  r   r^   rt   rename)r,   oldpathnewpathr.   r.   r/   
renameFile     

z%SFTPServerForUnixConchUser.renameFilec                 C  s,   |  |}| jtj|ff| j||ffgS rP   )r  r   r^   rt   mkdirr  r  r.   r.   r/   makeDirectory  s   
z(SFTPServerForUnixConchUser.makeDirectoryc                 C  s   |  |}| jtj| d S rP   )r  r   r^   rt   rmdirr,   r   r.   r.   r/   removeDirectory  s   
z*SFTPServerForUnixConchUser.removeDirectoryc                 C  s   t | | |S rP   )UnixSFTPDirectoryr  r1  r.   r.   r/   openDirectory  s   z(SFTPServerForUnixConchUser.openDirectoryc                 C  s:   |  |}|r| jtj|}n| jtj|}| |S rP   )r  r   r^   rt   r   lstatr  )r,   r   followLinksr  r.   r.   r/   getAttrs  s
   

z#SFTPServerForUnixConchUser.getAttrsc                 C  s    |  |}| j| j|| d S rP   )r  r   r^   r  r  r.   r.   r/   setAttrs  s   
z#SFTPServerForUnixConchUser.setAttrsc                 C  r%  rP   )r  r   r^   rt   readlinkr1  r.   r.   r/   readLink  r(  z#SFTPServerForUnixConchUser.readLinkc                 C  s&   |  |}|  |}| jtj||S rP   )r  r   r^   rt   symlink)r,   linkPath
targetPathr.   r.   r/   makeLink  r-  z#SFTPServerForUnixConchUser.makeLinkc                 C  s   t j| |S rP   )rt   r   realpathr  r1  r.   r.   r/   realPath  s   z#SFTPServerForUnixConchUser.realPathc                 C     t rP   NotImplementedError)r,   extNamer  r.   r.   r/   extendedRequest  r  z*SFTPServerForUnixConchUser.extendedRequestN)r1   r2   r3   r7   r  r  r  r  r#  r'  r,  r/  r2  r4  r7  r8  r:  r>  r@  rE  r.   r.   r.   r/   r  f  s$    
r  c                   @  s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )r   c                 C  s  || _ d}|t@ tkr|t@ dkrtj}|t@ tkr#|t@ dkr#tj}|t@ tkr2|t@ tkr2tj}|t@ tkr=|tjO }|t	@ t	krH|tj
O }|t@ tkrS|tjO }|t@ tkr^|tjO }d|v rj|d }|d= nd}|jtj|||}|r|j|j|| || _d S )Nr   r  i  )serverr   r   rt   O_RDONLYO_WRONLYO_RDWRr   O_APPENDr   O_CREATr   O_TRUNCr   O_EXCLr   r^   openr  fd)r,   rF  r!  r"  r  	openFlagsr   rO  r.   r.   r/   r7     s0   




zUnixSFTPFile.__init__c                 C  s   | j jtj| jS rP   )rF  r   r^   rt   closerO  rN   r.   r.   r/   rQ    r$  zUnixSFTPFile.closec                 C  ,   | j jtj| j|dfftj| j|ffgS Nr   )rF  r   r^   rt   lseekrO  read)r,   offsetlengthr.   r.   r/   	readChunk      zUnixSFTPFile.readChunkc                 C  rR  rS  )rF  r   r^   rt   rT  rO  r   )r,   rV  rg   r.   r.   r/   
writeChunk  rY  zUnixSFTPFile.writeChunkc                 C  s    | j jtj| j}| j |S rP   )rF  r   r^   rt   fstatrO  r  r  r.   r.   r/   r7    s   zUnixSFTPFile.getAttrsc                 C  rA  rP   rB  )r,   r  r.   r.   r/   r8    r  zUnixSFTPFile.setAttrsN)	r1   r2   r3   r7   rQ  rX  rZ  r7  r8  r.   r.   r.   r/   r     s    r   c                   @  s0   e Zd Zdd Zdd Zdd ZeZdd Zd	S )
r3  c                 C  s"   || _ |jtj|| _|| _d S rP   )rF  r   r^   rt   listdirfilesdir)r,   rF  	directoryr.   r.   r/   r7     s   
zUnixSFTPDirectory.__init__c                 C  s   | S rP   r.   rN   r.   r.   r/   __iter__  r  zUnixSFTPDirectory.__iter__c                 C  sb   z| j d}W n	 ty   tw | jjtjtj	
| j|}t||}| j|}|||fS rS  )r]  pop
IndexErrorStopIterationrF  r   r^   rt   r5  r   r  r^  r   r  )r,   r}   r  longnamer  r.   r.   r/   __next__  s   

zUnixSFTPDirectory.__next__c                 C  s
   g | _ d S rP   )r]  rN   r.   r.   r/   rQ    rU   zUnixSFTPDirectory.closeN)r1   r2   r3   r7   r`  re  nextrQ  r.   r.   r.   r/   r3    s    r3  )A__doc__
__future__r   r   r;   rt   r   r8   r   re   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   r3  registerAdapterr.   r.   r.   r/   <module>   s^    k :V1