Ë
    oj¯B  ã                  óÊ  — 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l7Z7 ee*jr                  «       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j6                  «        e4j€                  e<e;e!j2                  «       y# e8$ r dZ7Y Œ¹w xY w) 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y)ÚUnixSSHRealmc                óŽ   — t        |t        «      st        d«      ‚t        |j	                  «       «      }|d   ||j
                  fS )Nz5UNIX SSH realm does not authorize anonymous sessions.r   )Ú
isinstanceÚbytesr   ÚUnixConchUserÚdecodeÚlogout)ÚselfÚusernameÚmindÚ
interfacesÚusers        ú4/usr/lib/python3/dist-packages/twisted/conch/unix.pyÚrequestAvatarzUnixSSHRealm.requestAvatar5   s@   € ô ˜(¤EÔ*ÜÐUÓVÐVÜ˜XŸ_™_Ó.Ó/ˆØ˜!‰}˜d D§K¡KÐ/Ð/ó    N)r(   zbytes | Tuple[()]r)   Úobjectr*   zportal._InterfaceItselfÚreturnzATuple[portal._InterfaceItself, UnixConchUser, Callable[[], None]])Ú__name__Ú
__module__Ú__qualname__r-   © r.   r,   r    r    3   s.   „ ð	0à#ð	0ð ð	0ð -ð		0ð
 
Kô	0r.   r    c                  óF   — e Zd Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	dd„Z
d	„ Zy
)r$   c                óò  — t        j                  | «       || _        t        j                  | j                  «      | _        | j
                  d   g}t        j                  «       D ]  \  }}}}||v sŒ|j                  |«       Œ || _	        i | _
        | j                  j                  t        j                  t        j                   dœ«       | j"                  j                  dt$        j&                  i«       y )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,   r8   zUnixConchUser.__init__B   sÐ   € Ü×Ñ˜4Ô Ø ˆŒÜ—|‘| D§M¡MÓ2ˆŒØ�\‰\˜!‰_ÐˆÜ25·,±,³.ò 	Ñ.ˆI�x  hØ˜8Ò#Ø—‘˜•ð	ð ˆÔð ð 	Œð 	×Ñ×!Ñ!ä#×.Ñ.Ü!+×!GÑ!Gñô	
ð 	×Ñ×#Ñ# W¬l×.MÑ.MÐ$NÕOr.   c                ó    — | j                   dd S )Né   é   ©r;   ©r'   s    r,   ÚgetUserGroupIdzUnixConchUser.getUserGroupIdW   s   € Ø�|‰|˜A˜aÐ Ð r.   c                ó   — | j                   S ©N)r?   rP   s    r,   ÚgetOtherGroupszUnixConchUser.getOtherGroupsZ   s   € Ø×ÑÐr.   c                ó    — | j                   d   S )Né   rO   rP   s    r,   Ú
getHomeDirzUnixConchUser.getHomeDir]   ó   € Ø�|‰|˜A‰Ðr.   c                ó    — | j                   d   S )Né   rO   rP   s    r,   ÚgetShellzUnixConchUser.getShell`   rX   r.   c           	     ó~  — t        j                  |«      \  }}ddlm} 	 | j	                  |j
                  |t        j                  | j                  ||ft         j                  «      |¬«      }|| j                  ||f<   |dk(  r+|j                  «       d   }dt        j                  d|«      fS y# t        $ r Y yw xY w)Nr   ©Úreactor)Ú	interfacerM   é   z>L)r   ÚunpackGlobal_tcpip_forwardÚtwisted.internetr^   Ú
_runAsUserÚ	listenTCPÚSSHListenForwardingFactoryÚconnÚ SSHListenServerForwardingChannelr@   ÚgetHostÚstructÚpackÚBaseException)r'   ÚdataÚ
hostToBindÚ
portToBindr^   Úlisteners         r,   Úglobal_tcpip_forwardz"UnixConchUser.global_tcpip_forwardc   sÆ   € Ü!+×!FÑ!FÀtÓ!LÑˆ
�JÝ,ð	Ø—‘Ø×!Ñ!ØÜ×5Ñ5Ø—I‘IØ Ð,Ü×?Ñ?óð
 %ð 'ó 	ˆHð 8@ˆD�N‰N˜J¨
Ð3Ñ4Ø˜QŠØ%×-Ñ-Ó/°Ñ2�
Øœ&Ÿ+™+ d¨JÓ7Ð7Ð7àøô ò 	Ùð	ús    AB0 Â0	B<Â;B<c                óÊ   — t        j                  |«      \  }}| j                  j                  ||fd «      }|sy| j                  ||f= | j	                  |j
                  «       y)Nr   r`   )r   ra   r@   Úgetrc   ÚstopListening)r'   rl   rm   rn   ro   s        r,   Úglobal_cancel_tcpip_forwardz)UnixConchUser.global_cancel_tcpip_forward|   s^   € Ü!+×!FÑ!FÀtÓ!LÑˆ
�JØ—>‘>×%Ñ% z°:Ð&>ÀÓEˆÙØØ�N‰N˜J¨
Ð3Ð4Ø�‰˜×.Ñ.Ô/Ør.   c                óî   — | j                   j                  «       D ]  }| j                  |j                  «       Œ | j                  j                  d| j                  t        | j                   «      ¬«       y )Nz,avatar {username} logging out ({nlisteners}))r(   Ú
nlisteners)r@   Úvaluesrc   rs   Ú_logÚinfor(   Úlen)r'   ro   s     r,   r&   zUnixConchUser.logout…   s[   € àŸ™×-Ñ-Ó/ò 	4ˆHØ�O‰O˜H×2Ñ2Õ3ð	4à�	‰	�‰Ø:Ø—]‘]Ü˜4Ÿ>™>Ó*ð 	õ 	
r.   c                ó  — t        j                  «       }t        j                  «       }t        j                  «       }| j	                  «       \  }}t        j
                  d«       t        j                  d«       t        j                  | j                  «       «       t        j
                  |«       t        j                  |«       	 t        |«      }	 |D ]A  }	|	d   }
t        |	«      dkD  xr |	d   xs d}t        |	«      dkD  xr |	d   xs i } |
|i |¤Ž}ŒC 	 t        j
                  d«       t        j                  d«       t        j                  |«       t        j
                  |«       t        j                  |«       S # t        $ r	 |||fg}Y ŒÄw xY w# t        j
                  d«       t        j                  d«       t        j                  |«       t        j
                  |«       t        j                  |«       w xY w)Nr   r`   r4   rM   )ÚosÚgeteuidÚgetegidÚ	getgroupsrQ   ÚsetegidÚseteuidÚ	setgroupsrT   ÚiterÚ	TypeErrorrz   )r'   ÚfÚargsÚkwÚeuidÚegidÚgroupsÚuidrJ   ÚiÚfuncÚrs               r,   rc   zUnixConchUser._runAsUser�   s‚  € Ü�z‰z‹|ˆÜ�z‰z‹|ˆÜ—‘“ˆØ×&Ñ&Ó(‰ˆˆSÜ
�
‰
�1ŒÜ
�
‰
�1ŒÜ
�‰�T×(Ñ(Ó*Ô+Ü
�
‰
�3ŒÜ
�
‰
�3Œð	 Ü�Q“ˆAð	Øò &�Ø˜‘t�Ü˜1“v ‘zÒ* a¨¡dÒ0¨b�Ü˜“V˜a‘ZÒ( A a¡DÒ.¨B�Ù˜$Ð% "Ñ%‘ñ	&ô �J‰J�qŒMÜ�J‰J�qŒMÜ�L‰L˜Ô Ü�J‰J�tÔÜ�J‰J�tÔØˆøô ò 	 Ø�T˜2��ŠAð	 ûô �J‰J�qŒMÜ�J‰J�qŒMÜ�L‰L˜Ô Ü�J‰J�tÔÜ�J‰J�tÕús    ÃF ÃAF ÆFÆFÆA+HN)r(   Ústrr0   ÚNone)r0   r�   )r1   r2   r3   r8   rQ   rT   rW   r[   rp   rt   r&   rc   r4   r.   r,   r$   r$   A   s0   „ óPò*!ò òòòò2ó
ór.   r$   c                  ó`   — 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y)ÚSSHSessionForUnixConchUserNc                ó^   — |€ddl m} || _        || _        ddi| _        d| _        d| _        y)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   r]   ÚPATHz/bin:/usr/bin:/usr/local/bin)rb   r^   Ú_reactorÚavatarÚenvironÚptyÚptyTuple)r'   r–   r^   s      r,   r8   z#SSHSessionForUnixConchUser.__init__°   s5   € ð ˆ?Ý0ØˆŒØˆŒØÐ >Ð?ˆŒØˆŒØˆ�r.   c                óò  — t         sy | j                  j                  j                  j                  j	                  «       j
                  }t        j                  dt        j                  |«      «      \  }| j                  d   dd  }t        j                  «       }t        |«      }t        ||z
  dz  «      }t        j                  «       }|xr t         j                  xs t         j                  |_        | j"                  j$                  |_        ||_        |dd  |_        ||f|_        |rC| j                  j.                  |_        t        j2                  |«      d   |_        |dddf|_        t        j8                  t         j:                  «      }	|	j=                  |«       |	j?                  «        t        j8                  t         j@                  «      }
|
j=                  |«       |
j?                  «        y )NÚLrM   rV   g    €„.Aéüÿÿÿr   )!Úutmpr–   rf   Ú	transportÚgetPeerÚhostri   Ú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À   sk  € ÝØØ—K‘K×$Ñ$×.Ñ.×8Ñ8×@Ñ@ÓB×GÑGˆ	Ü—m‘m C¬×)9Ñ)9¸)Ó)DÓE‰ˆØ—-‘- Ñ" 1 2Ð&ˆÜ�I‰I‹KˆÜ�‹VˆÜ�!�b‘&˜C‘Ó ˆÜ—‘Ó ˆØ Ò6¤T×%6Ñ%6ÒK¼$×:KÑ:KˆŒØ—x‘x—|‘|ˆŒØˆŒØ˜b˜c�lˆŒØ˜2�hˆŒÙØ ŸK™K×0Ñ0ˆEŒMÜ"×0Ñ0°Ó;¸AÑ>ˆEŒMØ (¨!¨Q°Ð2ˆEÔÜ�O‰OœDŸN™NÓ+ˆØ	�‰�EÔØ	�
‰
ŒÜ�O‰OœDŸN™NÓ+ˆØ	�‰�EÔØ	�
‰
�r.   c                óÈ   — || j                   d<   || _        || _        t        j                  «       \  }}t        j                  |«      }|| j                   d<   |||f| _        y )NÚTERMÚSSH_TTY)r—   ÚwinSizeÚmodesr˜   Úopenptyr|   Úttynamer™   )r'   ÚtermÚ
windowSizerÇ   ÚmasterÚslaverÉ   s          r,   ÚgetPtyz!SSHSessionForUnixConchUser.getPtyÚ   sW   € Ø#ˆ�‰�VÑØ!ˆŒØˆŒ
ÜŸ™›‰ˆ�Ü—*‘*˜UÓ#ˆØ")ˆ�‰�YÑØ ¨Ð0ˆ�r.   c           
     ó   — | j                   s&| j                  j                  d«       t        d«      ‚| j                  j                  «       \  }}| j                  j                  «       }| j                  j                  «       }| j                  j                  | j                  d<   || j                  d<   || j                  d<   t        j                  j                  |«      }| j                  j                  j                  j                  j                  «       }| j                  j                  j                  j                  j!                  «       }|j"                  › d|j$                  › d|j$                  › �| j                  d<   | j'                  «        | j(                  j+                  ||d|› �g| j                  |||| j                   ¬	«      | _        | j/                  «        t1        j2                  | j,                  j5                  «       t6        j8                  t;        j<                  d
g| j>                  ¢­Ž «       | j@                  r| jC                  «        |j                  jD                  | _#        | jH                  |j                  _"        | j                  j                  j                  j                  jK                  d«       y )Nz'tried to get shell without pty, failingzno ptyÚUSERÚHOMEÚSHELLú Ú
SSH_CLIENTú-©ÚusePTYÚ4Hr`   )&r™   rx   Úerrorr
   r–   rQ   rW   r[   r(   r—   r|   ÚpathÚbasenamerf   rž   rŸ   rh   r    ÚportÚgetPtyOwnershipr•   ÚspawnProcessr˜   rÂ   ÚfcntlÚioctlÚfilenoÚttyÚ
TIOCSWINSZri   rj   rÆ   rÇ   ÚsetModesÚwriteÚoldWriteÚ
_writeHackÚsetTcpNoDelay)	r'   Úprotor‹   rJ   ÚhomeDirÚshellÚ	shellExecÚpeerr    s	            r,   Ú	openShellz$SSHSessionForUnixConchUser.openShellã   sþ  € Ø�}Š}Ø�I‰I�O‰OÐEÔFÜ˜XÓ&Ð&Ø—;‘;×-Ñ-Ó/‰ˆˆSØ—+‘+×(Ñ(Ó*ˆØ—‘×$Ñ$Ó&ˆØ#Ÿ{™{×3Ñ3ˆ�‰�VÑØ&ˆ�‰�VÑØ %ˆ�‰�WÑÜ—G‘G×$Ñ$ UÓ+ˆ	Ø�{‰{×Ñ×)Ñ)×3Ñ3×;Ñ;Ó=ˆØ�{‰{×Ñ×)Ñ)×3Ñ3×;Ñ;Ó=ˆØ(,¯	©	 {°!°D·I±I°;¸aÀÇ	Á	¸{Ð%Kˆ�‰�\Ñ"Ø×ÑÔØ—=‘=×-Ñ-ØØØ��ˆ_ÐØ�L‰LØØØØ—=‘=ð .ó 	
ˆŒð 	×ÑÔÜ�‰�D—H‘H—O‘OÓ%¤s§~¡~´v·{±{À4Ð7WÈ$Ï,É,Ò7WÔXØ�:Š:Ø�M‰MŒOØŸ™×-Ñ-ˆŒØ $§¡ˆ�‰ÔØ�‰×Ñ×"Ñ"×,Ñ,×:Ñ:¸1Õ=r.   c                óº  — | j                   j                  «       \  }}| j                   j                  «       }| j                   j                  «       xs d}|| j                  d<   |d|f}| j                   j
                  j                  j                  j                  «       }| j                   j
                  j                  j                  j                  «       }	|j                  › d|j                  › d|	j                  › �| j                  d<   | j                  r| j                  «        | j                  j                  |||| j                  |||| j                  xs d¬«      | _        | j                  r,| j!                  «        | j"                  r| j%                  «        | j                   j
                  j                  j                  j'                  d«       y )	Nz/bin/shrÑ   z-crÓ   rÔ   r   rÖ   r`   )r–   rQ   rW   r[   r—   rf   rž   rŸ   rh   r    rÜ   r™   rÝ   r•   rÞ   r˜   rÂ   rÇ   rä   rè   )
r'   ré   Úcmdr‹   rJ   rê   rë   Úcommandrí   r    s
             r,   ÚexecCommandz&SSHSessionForUnixConchUser.execCommand  sj  € Ø—;‘;×-Ñ-Ó/‰ˆˆSØ—+‘+×(Ñ(Ó*ˆØ—‘×$Ñ$Ó&Ò3¨)ˆØ&ˆ�‰�VÑØ˜$ Ð$ˆØ�{‰{×Ñ×)Ñ)×3Ñ3×;Ñ;Ó=ˆØ�{‰{×Ñ×)Ñ)×3Ñ3×;Ñ;Ó=ˆØ(,¯	©	 {°!°D·I±I°;¸aÀÇ	Á	¸{Ð%Kˆ�‰�\Ñ"Ø�=Š=Ø× Ñ Ô"Ø—=‘=×-Ñ-ØØØØ�L‰LØØØØ—=‘=Ò% Að .ó 	
ˆŒð �=Š=Ø×ÑÔØ�zŠzØ—‘”Ø�‰×Ñ×"Ñ"×,Ñ,×:Ñ:¸1Õ=r.   c                ó(  — t        j                  | j                  d   «      d   }| j                  j	                  «       \  }}t        j
                  «       t        j                  «       }}t        j                  d«       t        j                  d«       	 t        j                  | j                  d   ||«       t        j                  |«       t        j                  |«       y # t        j                  |«       t        j                  |«       w xY w)NrM   rV   r   )
r|   Ústatr™   r–   rQ   r}   r~   r€   r�   Úchown)r'   ÚttyGidr‹   rJ   rˆ   r‰   s         r,   rÝ   z*SSHSessionForUnixConchUser.getPtyOwnership  s±   € Ü—‘˜Ÿ™ qÑ)Ó*¨1Ñ-ˆØ—;‘;×-Ñ-Ó/‰ˆˆSÜ—Z‘Z“\¤2§:¡:£<ˆdˆÜ
�
‰
�1ŒÜ
�
‰
�1Œð	Ü�H‰H�T—]‘] 1Ñ% s¨FÔ3ä�J‰J�tÔÜ�J‰J�tÕøô �J‰J�tÔÜ�J‰J�tÕús   Â$C% Ã%,Dc                ó  — | j                   }t        j                   |j                  «       «      }| j                  D �]  \  }}|t
        j                  vrŒt
        j                  |   }t        |«      dk(  rA|\  }}t        t        |«      sŒQt        t        |«      }|r||   |z  ||<   Œo||   | 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                     |<   �Œ t        j                   |j                  «       t        j                  |«       y )NrM   ÚOSPEEDÚBÚISPEED)r˜   râ   Ú	tcgetattrrá   rÇ   r   ÚTTYMODESrz   ÚhasattrÚgetattrrø   rú   r#   ÚCCÚ	tcsetattrÚTCSANOW)	r'   r˜   ÚattrÚmodeÚ	modeValueÚttyModeÚflagÚttyAttrÚttyvals	            r,   rä   z#SSHSessionForUnixConchUser.setModes+  sF  € Ø�h‰hˆÜ�}‰}˜Z˜SŸZ™Z›\Ó*ˆØ#Ÿz™zó 	;‰OˆD�)Øœ8×,Ñ,Ñ,ØÜ×'Ñ'¨Ñ-ˆGÜ�7‹|˜qÒ Ø '‘��gÜœs GÔ,ØÜ ¤ gÓ.�ÙØ!% d¡¨fÑ!4�D˜’Jà!% d¡¨v¨gÑ!5�D˜’JØ˜HÒ$Ü#*¬3°!°I°;°Ó#@�”S—Z‘ZÒ Ø˜HÒ$Ü#*¬3°!°I°;°Ó#@�”S—Z‘ZÒ äœs GÔ,ØÜ ¤ gÓ.�Ü',¨i¨\Ó':�”S—V‘V‘˜VÓ$ð+	;ô, 	�‰�j�c—j‘j“l¤C§K¡K°Õ6r.   c                óR   — | j                   r| j                   j                  «        y y rS   )r˜   Ú
closeStdinrP   s    r,   ÚeofReceivedz&SSHSessionForUnixConchUser.eofReceivedF  s   € Ø�8Š8Ø�H‰H×ÑÕ!ð r.   c                ó  — | j                   rut        j                  j                  | j                   d   «      rIt        j                  | j                   d   «      d   }t        j
                  | j                   d   d|«       | j                  rG	 | j                  j                  d«       | j                  j                  «        | j                  d«       | j                  j                  d«       y # t        t        f$ r Y ŒXw xY w)NrM   rV   r   ÚHUPzshell closed)r™   r|   rÚ   Úexistsrô   rõ   r˜   ÚsignalProcessÚOSErrorr   ÚloseConnectionrÂ   rx   ry   )r'   ÚttyGIDs     r,   Úclosedz!SSHSessionForUnixConchUser.closedJ  s¾   € Ø�=Š=œRŸW™WŸ^™^¨D¯M©M¸!Ñ,<Ô=Ü—W‘W˜TŸ]™]¨1Ñ-Ó.¨qÑ1ˆFÜ�H‰H�T—]‘] 1Ñ% q¨&Ô1Ø�8Š8ðØ—‘×&Ñ& uÔ-ð �H‰H×#Ñ#Ô%Ø×Ñ˜aÔ Ø�	‰	�‰�~Õ&øô	 Ô1Ð2ò Ùðús   ÂC1 Ã1DÄDc                óÈ   — || _         t        j                  | j                  j	                  «       t
        j                  t        j                  dg| j                   ¢­Ž «       y )NrØ   )	rÆ   rß   rà   r˜   rá   râ   rã   ri   rj   )r'   rÆ   s     r,   ÚwindowChangedz(SSHSessionForUnixConchUser.windowChangedW  s:   € ØˆŒÜ�‰�D—H‘H—O‘OÓ%¤s§~¡~´v·{±{À4Ð7WÈ$Ï,É,Ò7WÕXr.   c                óf  — | j                   �”t        j                  | j                   j                  «       «      d   }|t        j                  z  sQ|t        j
                  z  r>| j                  j                  j                  j                  ddt        |«      z   z  «       | j                  |«       y)zF
        Hack to send ignore messages when we aren't echoing.
        Nr7   ú é   )r˜   râ   rû   rá   ÚECHOÚICANONr–   rf   rž   Ú
sendIgnorerz   ræ   )r'   rl   r  s      r,   rç   z%SSHSessionForUnixConchUser._writeHack[  sy   € ð �8‰8ÐÜ—=‘= §¡§¡Ó!2Ó3°AÑ6ˆDØœ#Ÿ(™(’? t¬c¯j©jÒ'8Ø—‘× Ñ ×*Ñ*×5Ñ5°fÀÄCÈÃIÁÑ6NÔOØ�‰�dÕr.   rS   )r`   )r1   r2   r3   r   rx   r8   rÂ   rÎ   rî   rò   rÝ   rä   r  r  r  rç   r4   r.   r,   r’   r’   ¬   sB   „ á‹8€Dóó ò41ò>òB>ò6
ò7ò6"ò'òYór.   r’   c                  ór   — 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y)ÚSFTPServerForUnixConchUserc                ó   — || _         y rS   )r–   )r'   r–   s     r,   r8   z#SFTPServerForUnixConchUser.__init__h  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«       yyy)zl
        NOTE: this function assumes it runs as the logged-in user:
        i.e. under _runAsUser()
        r‹   rJ   ÚpermissionsÚatimeÚmtimeN)r|   rõ   ÚchmodÚutime©r'   rÚ   Úattrss      r,   Ú	_setAttrsz$SFTPServerForUnixConchUser._setAttrsk  sv   € ð
 �E‰>˜e u™nÜ�H‰H�T˜5 ™<¨¨u©Ô6Ø˜EÑ!Ü�H‰H�T˜5 Ñ/Ô0Ø�eÑ ¨5Ñ 0Ü�H‰H�T˜E '™N¨E°'©NÐ;Õ<ð !1Ðr.   c                ó°   — |j                   |j                  |j                  |j                  t	        |j
                  «      t	        |j                  «      dœS )N)Úsizer‹   rJ   r   r!  r"  )Úst_sizeÚst_uidÚst_gidÚst_moder¥   Úst_atimeÚst_mtime©r'   Úss     r,   Ú	_getAttrsz$SFTPServerForUnixConchUser._getAttrsw  s>   € à—I‘IØ—8‘8Ø—8‘8ØŸ9™9Ü˜Ÿ™“_Ü˜Ÿ™“_ñ
ð 	
r.   c                ó®   — | j                   j                  «       }t        j                  j	                  t        |j                  «      t        |«      «      S rS   )r–   rW   r|   rÚ   Újoinr   )r'   rÚ   Úhomes      r,   Ú_absPathz#SFTPServerForUnixConchUser._absPath�  s7   € Ø�{‰{×%Ñ%Ó'ˆÜ�w‰w�|‰|œL¨¯©Ó3´\À$Ó5GÓHÐHr.   c                ó   — i S rS   r4   )r'   ÚotherVersionÚextDatas      r,   Ú
gotVersionz%SFTPServerForUnixConchUser.gotVersion…  s   € Øˆ	r.   c                ó<   — t        | | j                  |«      ||«      S rS   )ÚUnixSFTPFiler6  )r'   ÚfilenameÚflagsr&  s       r,   ÚopenFilez#SFTPServerForUnixConchUser.openFileˆ  s   € Ü˜D $§-¡-°Ó"9¸5À%ÓHÐHr.   c                óx   — | j                  |«      }| j                  j                  t        j                  |«      S rS   )r6  r–   rc   r|   Úremove)r'   r=  s     r,   Ú
removeFilez%SFTPServerForUnixConchUser.removeFile‹  s+   € Ø—=‘= Ó*ˆØ�{‰{×%Ñ%¤b§i¡i°Ó:Ð:r.   c                óœ   — | j                  |«      }| j                  |«      }| j                  j                  t        j                  ||«      S rS   )r6  r–   rc   r|   Úrename)r'   ÚoldpathÚnewpaths      r,   Ú
renameFilez%SFTPServerForUnixConchUser.renameFile�  s;   € Ø—-‘- Ó(ˆØ—-‘- Ó(ˆØ�{‰{×%Ñ%¤b§i¡i°¸'ÓBÐBr.   c                óœ   — | j                  |«      }| j                  j                  t        j                  |ff| j
                  ||ffg«      S rS   )r6  r–   rc   r|   Úmkdirr'  r%  s      r,   ÚmakeDirectoryz(SFTPServerForUnixConchUser.makeDirectory”  sG   € Ø�}‰}˜TÓ"ˆØ�{‰{×%Ñ%Ü�h‰h˜˜Ð  4§>¡>°D¸%°=Ð"AÐBó
ð 	
r.   c                óz   — | j                  |«      }| j                  j                  t        j                  |«       y rS   )r6  r–   rc   r|   Úrmdir©r'   rÚ   s     r,   ÚremoveDirectoryz*SFTPServerForUnixConchUser.removeDirectoryš  s(   € Ø�}‰}˜TÓ"ˆØ�‰×ÑœrŸx™x¨Õ.r.   c                ó8   — t        | | j                  |«      «      S rS   )ÚUnixSFTPDirectoryr6  rM  s     r,   ÚopenDirectoryz(SFTPServerForUnixConchUser.openDirectoryž  s   € Ü   t§}¡}°TÓ':Ó;Ð;r.   c                óô   — | j                  |«      }|r+| j                  j                  t        j                  |«      }n*| j                  j                  t        j
                  |«      }| j                  |«      S rS   )r6  r–   rc   r|   rô   Úlstatr2  )r'   rÚ   ÚfollowLinksr1  s       r,   ÚgetAttrsz#SFTPServerForUnixConchUser.getAttrs¡  sV   € Ø�}‰}˜TÓ"ˆÙØ—‘×&Ñ&¤r§w¡w°Ó5‰Aà—‘×&Ñ&¤r§x¡x°Ó6ˆAØ�~‰~˜aÓ Ð r.   c                ót   — | j                  |«      }| j                  j                  | j                  ||«       y rS   )r6  r–   rc   r'  r%  s      r,   ÚsetAttrsz#SFTPServerForUnixConchUser.setAttrs©  s*   € Ø�}‰}˜TÓ"ˆØ�‰×Ñ˜tŸ~™~¨t°UÕ;r.   c                óx   — | j                  |«      }| j                  j                  t        j                  |«      S rS   )r6  r–   rc   r|   ÚreadlinkrM  s     r,   ÚreadLinkz#SFTPServerForUnixConchUser.readLink­  s+   € Ø�}‰}˜TÓ"ˆØ�{‰{×%Ñ%¤b§k¡k°4Ó8Ð8r.   c                óœ   — | j                  |«      }| j                  |«      }| j                  j                  t        j                  ||«      S rS   )r6  r–   rc   r|   Úsymlink)r'   ÚlinkPathÚ
targetPaths      r,   ÚmakeLinkz#SFTPServerForUnixConchUser.makeLink±  s;   € Ø—=‘= Ó*ˆØ—]‘] :Ó.ˆ
Ø�{‰{×%Ñ%¤b§j¡j°*¸hÓGÐGr.   c                ó^   — t         j                  j                  | j                  |«      «      S rS   )r|   rÚ   Úrealpathr6  rM  s     r,   ÚrealPathz#SFTPServerForUnixConchUser.realPath¶  s    € Ü�w‰w×Ñ §¡¨dÓ 3Ó4Ð4r.   c                ó   — t         ‚rS   ©ÚNotImplementedError)r'   ÚextNamer9  s      r,   ÚextendedRequestz*SFTPServerForUnixConchUser.extendedRequest¹  ó   € Ü!Ð!r.   N)r1   r2   r3   r8   r'  r2  r6  r:  r?  rB  rG  rJ  rN  rQ  rU  rW  rZ  r_  rb  rg  r4   r.   r,   r  r  f  s[   „ òò
=ò
òIòòIò;òCò

ò/ò<ò!ò<ò9òHò
5ó"r.   r  c                  ó0   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)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                  j!                  t        j"                  |||«      }|r'|j                  j!                  |j$                  ||«       || _        y )Nr   r   iÿ  )Úserverr   r   r|   ÚO_RDONLYÚO_WRONLYÚO_RDWRr   ÚO_APPENDr   ÚO_CREATr   ÚO_TRUNCr   ÚO_EXCLr–   rc   Úopenr'  Úfd)r'   rk  r=  r>  r&  Ú	openFlagsr  rt  s           r,   r8   zUnixSFTPFile.__init__¿  sC  € ØˆŒØˆ	Ø”8ÑœxÒ'¨E´IÑ,=ÀÒ,BÜŸ™ˆIØ”9Ñ¤	Ò)¨e´hÑ.>À!Ò.CÜŸ™ˆIØ”9Ñ¤	Ò)¨e´hÑ.>Ä(Ò.JÜŸ	™	ˆIØ”:Ñ¤Ò+ØœŸ™Ñ$ˆIØ”9Ñ¤	Ò)ØœŸ™Ñ#ˆIØ”9Ñ¤	Ò)ØœŸ™Ñ#ˆIØ”8ÑœxÒ'ØœŸ™Ñ"ˆIØ˜EÑ!Ø˜Ñ'ˆDØ�mÑ$àˆDØ�]‰]×%Ñ%¤b§g¡g¨x¸ÀDÓIˆÙØ�M‰M×$Ñ$ V×%5Ñ%5°xÀÔGØˆ�r.   c                ó~   — | j                   j                  j                  t        j                  | j
                  «      S rS   )rk  r–   rc   r|   Úclosert  rP   s    r,   rw  zUnixSFTPFile.closeÚ  s'   € Ø�{‰{×!Ñ!×,Ñ,¬R¯X©X°t·w±wÓ?Ð?r.   c                óÂ   — | j                   j                  j                  t        j                  | j
                  |dfft        j                  | j
                  |ffg«      S ©Nr   )rk  r–   rc   r|   Úlseekrt  Úread)r'   ÚoffsetÚlengths      r,   Ú	readChunkzUnixSFTPFile.readChunkÝ  sM   € Ø�{‰{×!Ñ!×,Ñ,Ü�h‰h˜Ÿ™ &¨!Ð,Ð-´·±¸$¿'¹'À6Ð9JÐ/KÐLó
ð 	
r.   c                óÂ   — | j                   j                  j                  t        j                  | j
                  |dfft        j                  | j
                  |ffg«      S ry  )rk  r–   rc   r|   rz  rt  rå   )r'   r|  rl   s      r,   Ú
writeChunkzUnixSFTPFile.writeChunkâ  sL   € Ø�{‰{×!Ñ!×,Ñ,Ü�h‰h˜Ÿ™ &¨!Ð,Ð-´·±¸4¿7¹7ÀD¸/Ð/JÐKó
ð 	
r.   c                ó´   — | j                   j                  j                  t        j                  | j
                  «      }| j                   j                  |«      S rS   )rk  r–   rc   r|   Úfstatrt  r2  r0  s     r,   rU  zUnixSFTPFile.getAttrsç  s;   € Ø�K‰K×Ñ×)Ñ)¬"¯(©(°D·G±GÓ<ˆØ�{‰{×$Ñ$ QÓ'Ð'r.   c                ó   — t         ‚rS   rd  )r'   r&  s     r,   rW  zUnixSFTPFile.setAttrsë  rh  r.   N)	r1   r2   r3   r8   rw  r~  r€  rU  rW  r4   r.   r,   r<  r<  ½  s!   „ òò6@ò
ò

ò
(ó"r.   r<  c                  ó(   — e Zd Zd„ Zd„ Zd„ ZeZd„ Zy)rP  c                ó~   — || _         |j                  j                  t        j                  |«      | _        || _        y rS   )rk  r–   rc   r|   ÚlistdirÚfilesÚdir)r'   rk  Ú	directorys      r,   r8   zUnixSFTPDirectory.__init__ð  s,   € ØˆŒØ—]‘]×-Ñ-¬b¯j©j¸)ÓDˆŒ
Øˆ�r.   c                ó   — | S rS   r4   rP   s    r,   Ú__iter__zUnixSFTPDirectory.__iter__õ  s   € Øˆr.   c                óp  — 	 | j                   j                  d«      }| j                  j                  j	                  t
        j                  t
        j                  j                  | j                  |«      «      }t        ||«      }| j                  j                  |«      }|||fS # t        $ r t        ‚w xY wry  )r‡  Úpoprk  r–   rc   r|   rS  rÚ   r4  rˆ  r   r2  Ú
IndexErrorÚStopIteration)r'   r…   r1  Úlongnamer&  s        r,   Ú__next__zUnixSFTPDirectory.__next__ø  s‘   € ð	(Ø—
‘
—‘˜qÓ!ˆAð —‘×"Ñ"×-Ñ-¬b¯h©h¼¿¹¿¹ÀTÇXÁXÈqÓ8QÓRˆAÜ˜a “|ˆHØ—K‘K×)Ñ)¨!Ó,ˆEØ�x Ð'Ð'øô ò 	 ÜÐð	 ús   ‚B% Â%B5c                ó   — g | _         y rS   )r‡  rP   s    r,   rw  zUnixSFTPDirectory.close  s	   € Øˆ�
r.   N)r1   r2   r3   r8   r‹  r‘  Únextrw  r4   r.   r,   rP  rP  ï  s   „ òò
ò	(ð €Dór.   rP  )AÚ__doc__Ú
__future__r   rß   r<   r|   r˜   r9   r¢   ri   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<  rP  ÚregisterAdapterr4   r.   r,   ú<module>r©     se  ðñõ #ã Û 
Û 	Û 
Û 
Û Û Û Û 
ß (Ñ (å &å "Ý *Ý *ß EÑ EÝ #ß ?Ñ ?÷÷ õ  Ý *Ý 7Ý 6Ý !Ý %Ý .ðÛñ
 ˆV�]‰]Ó÷
0ð 
0ó ð
0ôh�Iô hñV ˆXÓ÷vð vó ðvñr ˆ[Ó÷S"ð S"ó ðS"ñl ˆYÓ÷."ð ."ó ð."÷bñ ð4 €
× Ñ Ø ¨|×/GÑ/Gôð €
× Ñ Ð5°}Àg×FVÑFVÕ Wøð{ ò Ø‚Dðús   Â$E ÅE"Å!E"