o
     JAf                     @   sL  	 d dl Z d dlZd dlmZ g dZdZdZdZG dd deZG d	d
 d
eZ	G dd deZ
G dd deZG dd deZeeefZdZdZG dd dZzd dlZW n eyb   dZY nw ejZG dd deZed eeeejfZdadd Zdadd Zdd Zdd Zdd  Z d(d#d$Z!d%d& Z"e#d'kre"  dS dS ))    N)_GLOBAL_DEFAULT_TIMEOUT)FTPerror_reply
error_temp
error_permerror_proto
all_errors          c                   @      e Zd ZdS )ErrorN__name__
__module____qualname__ r   r   /usr/lib/python3.10/ftplib.pyr   9       r   c                   @   r   )r   Nr   r   r   r   r   r   :   r   r   c                   @   r   )r   Nr   r   r   r   r   r   ;   r   r   c                   @   r   )r   Nr   r   r   r   r   r   <   r   r   c                   @   r   )r   Nr   r   r   r   r   r   =   r   r   
s   
c                   @   s  e Zd Z	 dZdZeZeZdZ	dZ
dZdZdZddddedfdddd	Zd
d Zdd Zd\ddZdd Zdd Ze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/d0 Z#d1d2 Z$d]d3d4Z%d]d5d6Z&d^d7d8Z'd_d:d;Z(d]d<d=Z)d`d>d?Z*d]d@dAZ+dBdC Z,dDdE Z-dFdG Z.dg fdHdIZ/dJdK Z0dLdM Z1dNdO Z2dPdQ Z3dRdS Z4dTdU Z5dVdW Z6dXdY Z7dZd[ Z8dS )ar   r    NTFutf-8encodingc                C   s@   	 || _ || _|| _|r| | |r| ||| d S d S d S N)r   source_addresstimeoutconnectlogin)selfhostuserpasswdacctr   r   r   r   r   r   __init__m   s   
zFTP.__init__c                 C   s   | S r   r   r   r   r   r   	__enter__}   s   zFTP.__enter__c              	   G   sf   | j d ur1z z|   W n ttfy   Y nw W | j d ur$|   d S d S | j d ur0|   w w d S r   )sockquitOSErrorEOFErrorclose)r   argsr   r   r   __exit__   s   


zFTP.__exit__c                 C   s   	 |dkr|| _ |dkr|| _|dkr|| _| jd ur"| js"td|d ur)|| _td| | j | j tj| j | jf| j| jd| _	| j	j
| _| j	jd| jd| _|  | _| jS )	Nr   r   r.   z0Non-blocking socket (timeout=0) is not supportedzftplib.connectr   rr   )r    portr   
ValueErrorr   sysauditsocketcreate_connectionr'   familyafmakefiler   filegetrespwelcome)r   r    r1   r   r   r   r   r   r      s&   

zFTP.connectc                 C   s    	 | j rtd| | j | jS )Nz	*welcome*)	debuggingprintsanitizer<   r%   r   r   r   
getwelcome   s   zFTP.getwelcomec                 C      	 || _ d S r   )r=   )r   levelr   r   r   set_debuglevel   s   
zFTP.set_debuglevelc                 C   rA   r   )passiveserver)r   valr   r   r   set_pasv   s   
zFTP.set_pasvc                 C   sJ   |d d dv r!t |d}|d d d|d   ||d   }t|S )N   >   zpass PASS r   *)lenrstriprepr)r   sir   r   r   r?      s   $zFTP.sanitizec                 C   s`   d|v sd|v rt dtd| | |t }| jdkr$td| | | j|	| j
 d S )N
z4an illegal newline character should not be containedzftplib.sendcmdr	   z*put*)r2   r3   r4   CRLFr=   r>   r?   r'   sendallencoder   r   liner   r   r   putline   s   
zFTP.putlinec                 C   s$   | j rtd| | | | d S )Nz*cmd*)r=   r>   r?   rV   rT   r   r   r   putcmd   s   z
FTP.putcmdc                 C   s   | j | jd }t|| jkrtd| j | jdkr$td| | |s(t|dd  t	kr8|d d }|S |dd  t	v rF|d d }|S )Nr	   got more than %d bytesz*get*)
r:   readlinemaxlinerJ   r   r=   r>   r?   r*   rQ   rT   r   r   r   getline   s   
zFTP.getlinec                 C   sf   |   }|dd dkr1|d d }	 |   }|d|  }|d d |kr0|dd dkr0	 |S q|S )N      -r	   rP   )r]   )r   rU   codeZnextliner   r   r   getmultiline   s   zFTP.getmultilinec                 C   sl   |   }| jrtd| | |d d | _|d d }|dv r"|S |dkr*t||dkr2t|t|)Nz*resp*r^   r	   >   23145)rb   r=   r>   r?   Zlastrespr   r   r   )r   respcr   r   r   r;      s   zFTP.getrespc                 C   s&   	 |   }|d d dkrt||S )Nr	   rc   )r;   r   r   rh   r   r   r   voidresp  s
   zFTP.voidrespc                 C   sV   	 dt  }| jdkrtd| | | j|t |  }|d d dvr)t||S )N   ABORr	   z*put urgent*r^      Z225Z226Z426)	B_CRLFr=   r>   r?   r'   rR   MSG_OOBrb   r   r   rU   rh   r   r   r   abort  s   
z	FTP.abortc                 C      	 |  | |  S r   )rW   r;   r   cmdr   r   r   sendcmd     
zFTP.sendcmdc                 C   rr   r   )rW   rk   rs   r   r   r   voidcmd  rv   zFTP.voidcmdc                 C   sD   	 | d}t|d t|d g}|| }dd| }| |S )N.   zPORT ,)splitrL   joinrw   )r   r    r1   ZhbytesZpbytesbytesrt   r   r   r   sendport   s   

zFTP.sendportc                 C   sd   	 d}| j tjkrd}| j tjkrd}|dkrtddt||t|dg}dd| }| |S )Nr   r	      zunsupported address familyr   zEPRT |)r8   r5   AF_INETAF_INET6r   rL   r|   rw   )r   r    r1   r8   fieldsrt   r   r   r   sendeprt*  s   
zFTP.sendeprtc                 C   sn   	 t jd| jdd}| d }| j d }| jt jkr$| ||}n| ||}| jt	ur5|
| j |S )N)r   r   r	   )r7   backlogr   )r5   create_serverr8   getsocknamer'   r   r~   r   r   r   
settimeout)r   r'   r1   r    rh   r   r   r   makeport7  s   
zFTP.makeportc                 C   sj   	 | j tjkr$t| d\}}| jr|}||fS | j d }||fS t| d| j \}}||fS )NPASVr   ZEPSV)	r8   r5   r   parse227ru   trust_server_pasv_ipv4_addressr'   getpeernameparse229)r   Zuntrusted_hostr1   r    r   r   r   makepasvD  s   zFTP.makepasvc           
      C   s@  	 d }| j rG|  \}}tj||f| j| jd}z&|d ur$| d|  | |}|d dkr3|  }|d dkr=t|W nQ   |	   | 
 =}|d urW| d|  | |}|d dkrf|  }|d dkrpt|| \}}	| jtur|| j W d    n1 sw   Y  |d d dkrt|}||fS )Nr/   zREST %sr   rc   re   r^   150)rD   r   r5   r6   r   r   ru   r;   r   r+   r   acceptr   r   parse150)
r   rt   restsizer    r1   connrh   r'   Zsockaddrr   r   r   ntransfercmdP  sF   



zFTP.ntransfercmdc                 C   s   	 |  ||d S )Nr   )r   )r   rt   r   r   r   r   transfercmd  s   zFTP.transfercmdc                 C   s   	 |sd}|s	d}|sd}|dkr|dv r|d }|  d| }|d dkr-|  d| }|d dkr:|  d	| }|d d
krDt||S )NZ	anonymousr   >   r   r`   z
anonymous@zUSER r   rd   rH   ACCT rc   ru   r   )r   r!   r"   r#   rh   r   r   r   r     s"   z	FTP.loginr   c                 C   s   	 |  d | ||:}	 ||}|sn|| qtd ur2t|tr<|  W d    |  S W d    |  S W d    |  S 1 sIw   Y  |  S NzTYPE I)rw   r   recv
_SSLSocket
isinstanceunwraprk   )r   rt   callback	blocksizer   r   datar   r   r   
retrbinary  s*   



	
	
		zFTP.retrbinaryc              	   C   s>  	 |d u rt }| d}| |}|jd| jd]}	 || jd }t|| jkr2td| j | j	dkr>t
dt| |sAn"|dd  tkrP|d d }n|d	d  d
kr^|d d	 }|| qtd urpt|trp|  W d    n1 szw   Y  W d    |  S W d    |  S 1 sw   Y  |  S )NTYPE Ar0   r   r	   rX   r   z*retr*rY   rZ   rP   )
print_lineru   r   r9   r   r[   r\   rJ   r   r=   r>   rL   rQ   r   r   r   rk   )r   rt   r   rh   r   fprU   r   r   r   	retrlines  s>   

(zFTP.retrlinesc                 C   s   	 |  d | ||A}	 ||}|sn|| |r!|| qtd ur9t|trC|  W d    |  S W d    |  S W d    |  S 1 sPw   Y  |  S r   )rw   r   readrR   r   r   r   rk   )r   rt   r   r   r   r   r   bufr   r   r   
storbinary  s.   






zFTP.storbinaryc                 C   s  	 |  d | |j}	 || jd }t|| jkr#td| j |s&n$|dd  tkr>|d tv r:|d d }|t }|| |rI|| qtd urat	|trk|
  W d    |  S W d    |  S W d    |  S 1 sxw   Y  |  S )Nr   r	   rX   rY   rZ   )rw   r   r[   r\   rJ   r   rn   rR   r   r   r   rk   )r   rt   r   r   r   r   r   r   r   	storlines  s8   





zFTP.storlinesc                 C   s   	 d| }|  |S )Nr   rw   )r   passwordrt   r   r   r   r#     s   
zFTP.acctc                 G   s2   	 d}|D ]}|d|  }qg }|  ||j |S )NZNLST )r   append)r   r,   rt   argfilesr   r   r   nlst#  s   zFTP.nlstc                 G   sj   	 d}d }|dd  r t |d t dkr |d d |d }}|D ]
}|r,|d|  }q"| || d S )NLISTrZ   r   r   )typer   )r   r,   rt   funcr   r   r   r   dir,  s    zFTP.dirc                 c   s    	 |r|  dd| d  |rd| }nd}g }| ||j |D ].}|td\}}}i }	|d d dD ]}
|
d\}}}||	| < q<||	fV  q$d S )Nz
OPTS MLST ;zMLSD %sZMLSDr   rZ   =)	ru   r|   r   r   rK   rQ   	partitionr{   lower)r   pathZfactsrt   linesrU   Zfacts_found_nameentryZfactkeyvaluer   r   r   mlsd;  s"   
zFTP.mlsdc                 C   s2   	 |  d| }|d dkrt|| d| S )NzRNFR r   rd   zRNTO )ru   r   rw   )r   ZfromnameZtonamerh   r   r   r   renameW  s
   z
FTP.renamec                 C   s,   	 |  d| }|d d dv r|S t|)NzDELE r^   >   Z250Z200r   )r   filenamerh   r   r   r   delete^  s
   z
FTP.deletec              
   C   sr   	 |dkr*z|  dW S  ty) } z|jd d d dkr W Y d }~nd }~ww |dkr0d}d| }|  |S )	Nz..ZCDUPr   r^   500r   rx   zCWD )rw   r   r,   )r   dirnamemsgrt   r   r   r   cwdf  s   
zFTP.cwdc                 C   s<   	 |  d| }|d d dkr|dd   }t|S d S )NzSIZE r^   Z213)ru   stripint)r   r   rh   rM   r   r   r   r   s  s   zFTP.sizec                 C   s&   	 |  d| }|dsdS t|S )NzMKD 257r   rw   
startswithparse257)r   r   rh   r   r   r   mkd{  s
   
zFTP.mkdc                 C   s   	 |  d| S )NzRMD r   )r   r   r   r   r   rmd  s   zFTP.rmdc                 C   s"   	 |  d}|dsdS t|S )NZPWDr   r   r   rj   r   r   r   pwd  s
   

zFTP.pwdc                 C   s   	 |  d}|   |S )NZQUIT)rw   r+   rj   r   r   r   r(     s   
zFTP.quitc                 C   sf   	 z!| j }d | _ |d ur|  W | j}d | _|d ur!|  d S d S | j}d | _|d ur2|  w w r   )r:   r+   r'   )r   r:   r'   r   r   r   r+     s"   
z	FTP.close)r   r   r.   Nr   )r   r   r   )r   N)r   NN)9r   r   r   r=   r    FTP_PORTr1   MAXLINEr\   r'   r:   r<   rD   r   r   r$   r&   r-   r   r@   rC   debugrF   r?   rV   rW   r]   rb   r;   rk   rq   ru   rw   r~   r   r   r   r   r   r   r   r   r   r   r#   r   r   r   r   r   r   r   r   r   r   r(   r+   r   r   r   r   r   J   sr    





7



#
			r   c                	       s   e Zd Z	 ejZdddddddedf	dd fddZd fdd		Zd
d Z	dd Z
dd Zdd Zd fdd	Zdd Z  ZS )FTP_TLSr   Nr   r   c
             	      s   |d ur|d urt d|d ur|d urt d|d us |d ur+dd l}|dtd || _|| _|d u r>tj| j||d}|| _	d| _
t j||||||	|
d d S )	Nz4context and keyfile arguments are mutually exclusivez5context and certfile arguments are mutually exclusiver   zAkeyfile and certfile are deprecated, use a custom context insteadr   )certfilekeyfileFr   )r2   warningswarnDeprecationWarningr   r   sslZ_create_stdlib_contextssl_versioncontext_prot_psuperr$   )r   r    r!   r"   r#   r   r   r   r   r   r   r   	__class__r   r   r$     s*   
zFTP_TLS.__init__Tc                    s*   |rt | jtjs|   t |||S r   )r   r'   r   	SSLSocketauthr   r   )r   r!   r"   r#   Zsecurer   r   r   r     s   zFTP_TLS.loginc                 C   sh   	 t | jtjrtd| jtjkr| d}n| d}| jj	| j| j
d| _| jjd| jd| _|S )NzAlready using TLSzAUTH TLSzAUTH SSLZserver_hostnamer0   )moder   )r   r'   r   r   r2   r   ZPROTOCOL_TLSrw   r   wrap_socketr    r9   r   r:   rj   r   r   r   r     s   
zFTP_TLS.authc                 C   s2   	 t | jtjstd| d}| j | _|S )Nznot using TLSZCCC)r   r'   r   r   r2   rw   r   rj   r   r   r   ccc  s   
zFTP_TLS.cccc                 C   s    	 |  d |  d}d| _|S )NzPBSZ 0zPROT PTrw   r   rj   r   r   r   prot_p   s
   


zFTP_TLS.prot_pc                 C   s   	 |  d}d| _|S )NzPROT CFr   rj   r   r   r   prot_c  s   
zFTP_TLS.prot_cc                    s2   t  ||\}}| jr| jj|| jd}||fS )Nr   )r   r   r   r   r   r    )r   rt   r   r   r   r   r   r   r     s   zFTP_TLS.ntransfercmdc                 C   s8   dt  }| j| |  }|d d dvrt||S )Nrl   r^   rm   )rn   r'   rR   rb   r   rp   r   r   r   rq     s   zFTP_TLS.abort)r   r   r   Tr   )r   r   r   r   ZPROTOCOL_TLS_CLIENTr   r   r$   r   r   r   r   r   r   rq   __classcell__r   r   r   r   r     s      r   c                 C   s^   	 | d d dkrt | td u rdd l}|d|j|jB at| }|s(d S t|dS )Nr^   r   r   z150 .* \((\d+) bytes\)r	   )	r   _150_rerecompile
IGNORECASEASCIImatchr   group)rh   r   mr   r   r   r   .  s   
r   c                 C   s   	 | d d dkrt | td u rdd l}|d|jat| }|s't| | }d|d d }t	|d d> t	|d  }||fS )	Nr^   Z227r   z#(\d+),(\d+),(\d+),(\d+),(\d+),(\d+)rx   r_      rG   )
r   _227_rer   r   r   searchr   groupsr|   r   )rh   r   r   Znumbersr    r1   r   r   r   r   B  s   
r   c                 C   s   	 | d d dkrt | | d}|dk rt| | d|d }|dk r*t| | |d  | |d  kr:t| | |d | | |d  }t|dkrSt| |d }t|d }||fS )Nr^   Z229(r   )r	   rG   )r   findr   r{   rJ   r   )rh   Zpeerleftrightpartsr    r1   r   r   r   r   U  s    
r   c                 C   s   	 | d d dkrt | | dd dkrdS d}d}t| }||k rH| | }|d }|dkr@||ks9| | dkr<	 |S |d }|| }||k s#|S )Nr^   r   rG   z "r   r	   ")r   rJ   )rh   r   rN   nri   r   r   r   r   j  s&   r   c                 C   s   	 t |  d S r   )r>   )rU   r   r   r   r     s   r   r   Ic           	      C   s   	 |s|}d| }|  | | | t| d\}}||| |d| }|d d dvr3t| d| }|d d dvrDt|   |  d S )NzTYPE r   zSTOR r^   >   Z125r   RETR )rw   r   ru   r~   r   rk   )	sourceZ
sourcenametargetZ
targetnamer   Z
sourcehostZ
sourceportZtreplyZsreplyr   r   r   ftpcp  s    

r  c                  C   s  	 t tjdk rttj td dd l} d}d }tjd dkr0|d }tjd= tjd dks!tjd d d dkrHtjd dd  }tjd= tjd }t|}|	| d } }}z| |}W n t
yv   |d urttjd Y nw z
||\}}}W n ty   tjd Y nw |||| tjdd  D ]K}	|	d d d	kr||	dd   q|	d d dkrd
}
|	dd  r|
d |	dd   }
||
}q|	dkr||j  q|d|	 tjjd q|  d S )Nr   r   r	   z-dz-rr   z5Could not open account file -- using anonymous login.z$No account -- using anonymous login.z-lZCWDr   z-pr  i   )rJ   r3   argvr>   test__doc__exitnetrcr   rC   r)   stderrwriteZauthenticatorsKeyErrorr   r   ru   rF   rD   r   stdoutr(   )r	  r=   Zrcfiler    ftpZuseridr"   r#   Znetrcobjr:   rt   rh   r   r   r   r    s\   



 
r  __main__)r   r   )$r3   r5   r   __all__ro   r   r   	Exceptionr   r   r   r   r   r)   r*   r   rQ   rn   r   r   ImportErrorr   r   r   r   ZSSLErrorr   r   r   r   r   r   r   r  r  r   r   r   r   r   <module>   sT    &
    ^
}
9
