o
    Òó·i¯B  ã                   @  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ÚreturnúATuple[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.   úXC:\Users\psant\Downloads\PAF backend\school\venv\Lib\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ÚgrpZgetgrallÚappendÚotherGroupsÚ	listenersZchannelLookupÚupdater   Z
SSHSessionr   ZopenConnectForwardingClientZsubsystemLookupr   ZFileTransferServer)r,   r   ÚlZ	groupnameÚpasswordÚgidZ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=   rF   r.   r.   r/   ÚgetOtherGroupsZ   s   zUnixConchUser.getOtherGroupsc                 C  ó
   | j d S )Né   rE   rF   r.   r.   r/   Ú
getHomeDir]   ó   
zUnixConchUser.getHomeDirc                 C  rJ   )Né   rE   rF   r.   r.   r/   ÚgetShell`   rM   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)Z	interfacerC   é   z>L)r   ÚunpackGlobal_tcpip_forwardÚtwisted.internetrQ   Ú
_runAsUserZ	listenTCPZSSHListenForwardingFactoryÚconnZ SSHListenServerForwardingChannelÚBaseExceptionr>   ÚgetHostÚstructÚpack)r,   ÚdataÚ
hostToBindÚ
portToBindrQ   Ú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   rR   )r   rS   r>   ÚgetrU   ÚstopListening)r,   r[   r\   r]   r^   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   Z
nlisteners)r>   ÚvaluesrU   ra   Ú_logÚinfor   Úlen)r,   r^   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   rR   r.   rC   )ÚosÚgeteuidÚgetegidZ	getgroupsrG   ÚsetegidÚseteuidÚ	setgroupsrI   ÚiterÚ	TypeErrorrf   )r,   ÚfÚargsÚkwÚeuidÚegidÚgroupsÚuidrB   ÚiÚfuncÚrr.   r.   r/   rU   �   s@   



ÿü





û


zUnixConchUser._runAsUserN)r   r4   r%   r5   )r%   r5   )r1   r2   r3   r7   rG   rI   rL   rO   r_   rb   r+   rU   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   rP   ÚPATHz/bin:/usr/bin:/usr/local/bin)rT   rQ   Ú_reactorÚavatarÚenvironÚptyÚptyTuple)r,   r|   rQ   r.   r.   r/   r7   °   s   

z#SSHSessionForUnixConchUser.__init__rR   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ÚLrC   rK   g    €„.Aéüÿÿÿr   )!Úutmpr|   rV   Ú	transportÚgetPeerÚhostrY   ÚunpackÚsocketÚ	inet_atonr   ÚtimeÚintZ	UtmpEntryZUSER_PROCESSZDEAD_PROCESSZut_typer~   ÚpidZut_pidZut_lineZut_idZut_tvr   Zut_userÚgethostbyaddrZut_hostZ
ut_addr_v6Z
UtmpRecordZ	UTMP_FILEZ	pututlineZendutentZ	WTMP_FILE)r,   ZloggedInZ	ipAddressZpackedIpZ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ÚTERMZSSH_TTY)r}   ÚwinSizeÚmodesr~   Zopenptyrg   Úttynamer   )r,   ZtermZ
windowSizer–   ZmasterZ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ÚHOMEZSHELLú Ú
SSH_CLIENTú-©ZusePTYÚ4HrR   )&r   rd   Úerrorr	   r|   rG   rL   rO   r   r}   rg   ÚpathÚbasenamerV   rƒ   r„   rX   r…   ÚportÚgetPtyOwnershipr{   ÚspawnProcessr~   r“   ÚfcntlÚioctlÚfilenoÚttyÚ
TIOCSWINSZrY   rZ   r•   r–   ÚsetModesÚwriteÚoldWriteÚ
_writeHackÚsetTcpNoDelay)	r,   Úprotoru   rB   ÚhomeDirÚshellZ	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ž   rR   )r|   rG   rL   rO   r}   rV   rƒ   r„   rX   r…   r£   r   r¤   r{   r¥   r~   r“   r–   r«   r¯   )
r,   r°   Úcmdru   rB   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 )NrC   rK   r   )
rg   Ústatr   r|   rG   rh   ri   rj   rk   Úchown)r,   ZttyGidru   rB   rr   rs   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 )NrC   ÚOSPEEDÚBÚISPEED)r~   r©   Ú	tcgetattrr¨   r–   r   ZTTYMODESrf   ÚhasattrÚgetattrrº   r¼   r(   ÚCCÚ	tcsetattrZTCSANOW)	r,   r~   ÚattrÚmodeZ	modeValueZttyModeÚflagZttyAttrZttyvalr.   r.   r/   r«   +  s.   





z#SSHSessionForUnixConchUser.setModesc                 C  s   | j r
| j  ¡  d S d S rH   )r~   Z
closeStdinrF   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 )NrC   rK   r   ZHUPzshell closed)r   rg   r¡   Úexistsr¸   r¹   r~   ZsignalProcessÚOSErrorr   ZloseConnectionr“   rd   re   )r,   Z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ª   rY   rZ   )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¨   ÚECHOZICANONr|   rV   rƒ   Z
sendIgnorerf   r­   )r,   r[   rÂ   r.   r.   r/   r®   [  s
   
z%SSHSessionForUnixConchUser._writeHackrH   )rR   )r1   r2   r3   r   rd   r7   r“   r˜   r´   r·   r¤   r«   rÅ   rÈ   rÉ   r®   r.   r.   r.   r/   ry   ¬   s    

	!ry   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 rH   )r|   )r,   r|   r.   r.   r/   r7   h  rM   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()
        ru   rB   ÚpermissionsÚatimeÚmtimeN)rg   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)Úsizeru   rB   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 rH   )r|   rL   rg   r¡   Újoinr   )r,   r¡   Úhomer.   r.   r/   Ú_absPath�  s   
z#SFTPServerForUnixConchUser._absPathc                 C  s   i S rH   r.   )r,   ZotherVersionÚextDatar.   r.   r/   Ú
gotVersion…  ó   z%SFTPServerForUnixConchUser.gotVersionc                 C  s   t | |  |¡||ƒS rH   )ÚUnixSFTPFilerâ   )r,   ÚfilenameÚflagsrÔ   r.   r.   r/   ÚopenFileˆ  ó   z#SFTPServerForUnixConchUser.openFilec                 C  ó   |   |¡}| j tj|¡S rH   )râ   r|   rU   rg   Úremove)r,   rç   r.   r.   r/   Ú
removeFile‹  ó   
z%SFTPServerForUnixConchUser.removeFilec                 C  s&   |   |¡}|   |¡}| j tj||¡S rH   )râ   r|   rU   rg   Úrename)r,   ZoldpathÚnewpathr.   r.   r/   Ú
renameFile�  ó   

z%SFTPServerForUnixConchUser.renameFilec                 C  s,   |   |¡}| j tj|ff| j||ffg¡S rH   )râ   r|   rU   rg   ÚmkdirrÕ   rÓ   r.   r.   r/   ÚmakeDirectory”  s   
ÿz(SFTPServerForUnixConchUser.makeDirectoryc                 C  s   |   |¡}| j tj|¡ d S rH   )râ   r|   rU   rg   Úrmdir©r,   r¡   r.   r.   r/   ÚremoveDirectoryš  s   
z*SFTPServerForUnixConchUser.removeDirectoryc                 C  s   t | |  |¡ƒS rH   )ÚUnixSFTPDirectoryrâ   rö   r.   r.   r/   ÚopenDirectoryž  s   z(SFTPServerForUnixConchUser.openDirectoryc                 C  s:   |   |¡}|r| j tj|¡}n| j tj|¡}|  |¡S rH   )râ   r|   rU   rg   r¸   Úlstatrß   )r,   r¡   ZfollowLinksrÞ   r.   r.   r/   ÚgetAttrs¡  s
   

z#SFTPServerForUnixConchUser.getAttrsc                 C  s    |   |¡}| j | j||¡ d S rH   )râ   r|   rU   rÕ   rÓ   r.   r.   r/   ÚsetAttrs©  s   
z#SFTPServerForUnixConchUser.setAttrsc                 C  rë   rH   )râ   r|   rU   rg   Úreadlinkrö   r.   r.   r/   ÚreadLink­  rî   z#SFTPServerForUnixConchUser.readLinkc                 C  s&   |   |¡}|   |¡}| j tj||¡S rH   )râ   r|   rU   rg   Úsymlink)r,   ZlinkPathZ
targetPathr.   r.   r/   ÚmakeLink±  rò   z#SFTPServerForUnixConchUser.makeLinkc                 C  s   t j |  |¡¡S rH   )rg   r¡   Úrealpathrâ   rö   r.   r.   r/   ÚrealPath¶  s   z#SFTPServerForUnixConchUser.realPathc                 C  ó   t ‚rH   ©ÚNotImplementedError)r,   ZextNamerã   r.   r.   r/   ÚextendedRequest¹  rå   z*SFTPServerForUnixConchUser.extendedRequestN)r1   r2   r3   r7   rÕ   rß   râ   rä   ré   rí   rñ   rô   r÷   rù   rû   rü   rþ   r   r  r  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   rg   ÚO_RDONLYÚO_WRONLYÚO_RDWRr   ÚO_APPENDr   ÚO_CREATr   ÚO_TRUNCr   ÚO_EXCLr|   rU   ÚopenrÕ   Úfd)r,   r  rç   rè   rÔ   Z	openFlagsrÃ   r  r.   r.   r/   r7   ¿  s0   




zUnixSFTPFile.__init__c                 C  s   | j j tj| j¡S rH   )r  r|   rU   rg   Úcloser  rF   r.   r.   r/   r  Ú  rê   zUnixSFTPFile.closec                 C  ó,   | j j tj| j|dfftj| j|ffg¡S ©Nr   )r  r|   rU   rg   Úlseekr  Úread)r,   ÚoffsetÚlengthr.   r.   r/   Ú	readChunkÝ  ó    ÿzUnixSFTPFile.readChunkc                 C  r  r  )r  r|   rU   rg   r  r  r¬   )r,   r  r[   r.   r.   r/   Ú
writeChunkâ  r  zUnixSFTPFile.writeChunkc                 C  s    | j j tj| j¡}| j  |¡S rH   )r  r|   rU   rg   Úfstatr  rß   rÝ   r.   r.   r/   rû   ç  s   zUnixSFTPFile.getAttrsc                 C  r  rH   r  )r,   rÔ   r.   r.   r/   rü   ë  rå   zUnixSFTPFile.setAttrsN)	r1   r2   r3   r7   r  r  r  rû   rü   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 )
rø   c                 C  s"   || _ |j tj|¡| _|| _d S rH   )r  r|   rU   rg   ÚlistdirÚfilesÚdir)r,   r  Ú	directoryr.   r.   r/   r7   ð  s   
zUnixSFTPDirectory.__init__c                 C  s   | S rH   r.   rF   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 r  )r  ÚpopÚ
IndexErrorÚStopIterationr  r|   rU   rg   rú   r¡   rà   r  r   rß   )r,   ro   rÞ   ÚlongnamerÔ   r.   r.   r/   Ú__next__ø  s   ÿ

zUnixSFTPDirectory.__next__c                 C  s
   g | _ d S rH   )r  rF   r.   r.   r/   r    rM   zUnixSFTPDirectory.closeN)r1   r2   r3   r7   r   r%  Únextr  r.   r.   r.   r/   rø   ï  s    rø   )AÚ__doc__Ú
__future__r   r¦   r;   rg   r~   r8   r‡   rY   r‰   r©   Útypingr   r   r   Zzope.interfacer   Ztwisted.conchr   Ztwisted.conch.avatarr   Ztwisted.conch.errorr	   Ztwisted.conch.interfacesr
   r   r   Ztwisted.conch.lsr   Ztwisted.conch.sshr   r   r   Ztwisted.conch.ssh.filetransferr   r   r   r   r   r   Ztwisted.credr   Ztwisted.cred.errorr   Ztwisted.internet.errorr   Ztwisted.internet.interfacesr   Ztwisted.loggerr   Ztwisted.pythonr   Ztwisted.python.compatr   r‚   ÚImportErrorZIRealmr   r)   ry   rÍ   ræ   rø   ZregisterAdapterr.   r.   r.   r/   Ú<module>   s^    ÿk :V1ÿ