
    z%ip                        	 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e      Z G d	 d
e      Z	 G d de      Z
 G d de      Z G d de      ZeeefZdZdZ G d d      Z	 d dlZej(                  Z G d de      Zej/                  d       eeeej0                  fZdad Zdad Zd Zd Zd Z ddZ!d Z"e#dk(  r e"        yy# e$ r dZY 1w xY w)     N)_GLOBAL_DEFAULT_TIMEOUT)FTPerror_reply
error_temp
error_permerror_proto
all_errors          c                       e Zd Zy)ErrorN__name__
__module____qualname__     :/home/uftp/.pyenv/versions/3.12.0/lib/python3.12/ftplib.pyr   r   9       r   r   c                       e Zd Zy)r   Nr   r   r   r   r   r   :   r   r   r   c                       e Zd Zy)r   Nr   r   r   r   r   r   ;   r   r   r   c                       e Zd Zy)r   Nr   r   r   r   r   r   <   r   r   r   c                       e Zd Zy)r   Nr   r   r   r   r   r   =   r   r   r   
s   
c                   V   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Zd	 Zd
 Zd1dZd Zd Z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$d2dZ%d2dZ&d3dZ'd4d Z(d2d!Z)d5d"Z*d2d#Z+d$ Z,d% Z-d& Z.dg fd'Z/d( Z0d) Z1d* Z2d+ Z3d, Z4d- Z5d. Z6d/ Z7d0 Z8y)6r   r    NTFutf-8encodingc                    	 || _         || _        || _        |r(| j                  |       |r| j	                  |||       y y y N)r    source_addresstimeoutconnectlogin)selfhostuserpasswdacctr$   r#   r    s           r   __init__zFTP.__init__m   sK    	
 !,LL

4.  r   c                     | S r"   r   r'   s    r   	__enter__zFTP.__enter__}   s    r   c                     | j                   /	 | j                          | j                   | j	                          y y y # t        t        f$ r Y 0w xY w# | j                   | j	                          w w xY wr"   )sockquitOSErrorEOFErrorclose)r'   argss     r   __exit__zFTP.__exit__   sm    99 !		 99(JJL ) ! X&  99(JJL )s!   = AA AA A1c                 Z   	 |dk7  r|| _         |dkD  r|| _        |dk7  r|| _        | j                  | j                  st        d      ||| _        t        j                  d| | j                   | j                         t        j                  | j                   | j                  f| j                  | j                        | _	        | j                  j                  | _        | j                  j                  d| j                        | _        | j                         | _        | j                   S )	Nr   r   z0Non-blocking socket (timeout=0) is not supportedzftplib.connectr#   rr   )r(   portr$   
ValueErrorr#   sysauditsocketcreate_connectionr1   familyafmakefiler    filegetrespwelcome)r'   r(   r<   r$   r#   s        r   r%   zFTP.connect   s    	 2:DI!8DId?"DL<<#DLLOPP%"0D		"D$))TYY?,,dii-CT\\<@<O<OQ	))""II&&sT]]&C	||~||r   c                 ~    	 | j                   r%t        d| j                  | j                               | j                  S )Nz	*welcome*)	debuggingprintsanitizerG   r.   s    r   
getwelcomezFTP.getwelcome   s/    	;>>+t}}T\\:;||r   c                     	 || _         y r"   )rI   )r'   levels     r   set_debuglevelzFTP.set_debuglevel   s    	H
 r   c                     	 || _         y r"   )passiveserver)r'   vals     r   set_pasvzFTP.set_pasv   s    	7 !r   c                     |d d dv r.t        |j                  d            }|d d d|dz
  z  z   ||d  z   }t        |      S )N   >   pass PASS r   *)lenrstriprepr)r'   sis      r   rK   zFTP.sanitize   sP    Ra5&&AHHV$%A"1QqS	!AabE)AAwr   c                 &   d|v sd|v rt        d      t        j                  d| |       |t        z   }| j                  dkD  rt        d| j                  |             | j                  j                  |j                  | j                               y )N
z4an illegal newline character should not be containedzftplib.sendcmdr
   z*put*)r=   r>   r?   CRLFrI   rJ   rK   r1   sendallencoder    r'   lines     r   putlinezFTP.putline   ss    4<44<STT		"D$/d{>>A'4==./		$++dmm45r   c                 t    | j                   rt        d| j                  |             | j                  |       y )Nz*cmd*)rI   rJ   rK   rf   rd   s     r   putcmdz
FTP.putcmd   s'    >>5$--*=>Tr   c                 `   | j                   j                  | j                  dz         }t        |      | j                  kD  rt	        d| j                  z        | j
                  dkD  rt        d| j                  |             |st        |dd  t        k(  r|d d }|S |dd  t        v r|d d }|S )Nr
   got more than %d bytesz*get*)
rE   readlinemaxlinerY   r   rI   rJ   rK   r4   ra   rd   s     r   getlinezFTP.getline   s    yy!!$,,"23t9t||#04<<?@@>>A'4==./N99D  "#Y$9Dr   c                     | j                         }|dd dk(  r2|d d }	 | j                         }|d|z   z   }|d d |k(  r|dd dk7  r	 |S ,|S )N      -r`   )ro   )r'   re   codenextlines       r   getmultilinezFTP.getmultiline   sr    ||~!98D<<>th/BQ<4' 1,  r   c                     | j                         }| j                  rt        d| j                  |             |d d | _        |d d }|dv r|S |dk(  rt        |      |dk(  rt        |      t        |      )Nz*resp*rq   r
   >   12345)rv   rI   rJ   rK   lastrespr   r   r   )r'   respcs      r   rF   zFTP.getresp   s~      ">>(DMM$/0Ra!HK8T""8T""$r   c                 N    	 | j                         }|d d dk7  rt        |      |S )Nr
   ry   )rF   r   r'   r~   s     r   voidrespzFTP.voidresp  s-    3||~8s?d##r   c                     	 dt         z   }| j                  dkD  rt        d| j                  |             | j                  j                  |t               | j                         }|d d dvrt        |      |S )N   ABORr
   z*put urgent*rq   >   225226426)	B_CRLFrI   rJ   rK   r1   rb   MSG_OOBrv   r   r'   re   r~   s      r   abortz	FTP.abort  st    	D >>A.$--"56		$(  "800d##r   c                 F    	 | j                  |       | j                         S r"   )rh   rF   r'   cmds     r   sendcmdzFTP.sendcmd  s    5C||~r   c                 F    	 | j                  |       | j                         S r"   )rh   r   r   s     r   voidcmdzFTP.voidcmd  s    FC}}r   c                     	 |j                  d      }t        |dz        t        |dz        g}||z   }ddj                  |      z   }| j                  |      S )N.   zPORT ,)splitr[   joinr   )r'   r(   r<   hbytespbytesbytesr   s          r   sendportzFTP.sendport   sZ    	 CtSy/4S>2'||C  r   c                     	 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j                  |      z   }| j                  |      S )Nr   r
      zunsupported address familyr   zEPRT |)rC   r@   AF_INETAF_INET6r   r[   r   r   )r'   r(   r<   rC   fieldsr   s         r   sendeprtzFTP.sendeprt*  s    S77fnn$B77foo%B7:;;d2hd4j"5((||C  r   c                    	 t        j                  d| j                  d      }|j                         d   }| j                  j                         d   }| j                  t         j
                  k(  r| j                  ||      }n| j                  ||      }| j                  t        ur|j                  | j                         |S )N)r   r   r
   )rB   backlogr   )r@   create_serverrC   getsocknamer1   r   r   r   r$   r   
settimeout)r'   r1   r<   r(   r~   s        r   makeportzFTP.makeport7  s    A##GDGGQG!!$yy$$&q)77fnn$==t,D==t,D<<66OODLL)r   c                 R   	 | j                   t        j                  k(  rPt        | j	                  d            \  }}| j
                  r|}||fS | j                  j                         d   }||fS t        | j	                  d      | j                  j                               \  }}||fS )NPASVr   EPSV)	rC   r@   r   parse227r   trust_server_pasv_ipv4_addressr1   getpeernameparse229)r'   untrusted_hostr<   r(   s       r   makepasvzFTP.makepasvD  s    J77fnn$#+DLL,@#A ND22%
 Tz yy,,.q1 Tz "$,,v"6		8M8M8OPJD$Tzr   c                    	 d }| j                   r| j                         \  }}t        j                  ||f| j                  | j
                        }	 || j                  d|z         | j                  |      }|d   dk(  r| j                         }|d   dk7  rt        |      n| j                         5 }|| j                  d|z         | j                  |      }|d   dk(  r| j                         }|d   dk7  rt        |      |j                         \  }}	| j                  t        ur|j                  | j                         d d d        d d dk(  rt        |      }|fS #  |j                           xY w# 1 sw Y   6xY w)Nr:   zREST %sr   ry   rx   rq   150)rQ   r   r@   rA   r$   r#   r   rF   r   r5   r   acceptr   r   parse150)
r'   r   restsizer(   r<   connr~   r1   sockaddrs
             r   ntransfercmdzFTP.ntransfercmdP  s~   	 JD$++T4L$,,;?;N;NPD#LLT!12||C( 7c><<>D7c>%d++ "  2D#LLT!12||C(7c><<>D7c>%d++!%h<<'>>OODLL12 8uD>DTz'

2 2s   AE' 5BE='E:=Fc                 .    	 | j                  ||      d   S )Nr   )r   )r'   r   r   s      r   transfercmdzFTP.transfercmd  s    >  d+A..r   c                     	 |sd}|sd}|sd}|dk(  r	|dv r|dz   }| j                  d|z         }|d   dk(  r| j                  d|z         }|d   dk(  r| j                  d	|z         }|d   d
k7  rt        |      |S )N	anonymousr   >   r   rs   z
anonymous@zUSER r   rz   rW   ACCT ry   r   r   )r'   r)   r*   r+   r~   s        r   r&   z	FTP.login  s    'DFD;6Y#6 l*F||GdN+7c><<& 01D7c><<$/D7c>d##r   c                 \   	 | j                  d       | j                  ||      5 }|j                  |      x}r ||       |j                  |      x}rt         t	        |t              r|j                          d d d        | j                         S # 1 sw Y   | j                         S xY wNzTYPE I)r   r   recv
_SSLSocket
isinstanceunwrapr   )r'   r   callback	blocksizer   r   datas          r   
retrbinaryzFTP.retrbinary  s    	 	Xc4( 	D))I..$. ))I..$. %*T:*F	 }}	 }}s   /B&BB+c                    	 |t         }| j                  d      }| j                  |      5 }|j                  d| j                        5 }	 |j                  | j                  dz         }t        |      | j                  kD  rt        d| j                  z        | j                  dkD  rt        dt        |             |sn(|dd  t        k(  r|d d }n|d	d  d
k(  r|d d	 } ||       t         t        |t              r|j                          d d d        d d d        | j!                         S # 1 sw Y   !xY w# 1 sw Y   | j!                         S xY w)NTYPE Ar;   r   r
   rj   r   z*retr*rk   rl   r`   )
print_liner   r   rD   r    rm   rn   rY   r   rI   rJ   r[   ra   r   r   r   r   )r'   r   r   r~   r   fpre   s          r   	retrlineszFTP.retrlines  sA   
	 !H||H%c" 	dsT]];	?A{{4<<!#34t9t||+ 84<< GHH>>A%(DJ/9$9D"#Y$&9D  %*T:*F#	 	$ }}%	 	 	$ }}s$   D;
CD/D;/D8	4D;;Ec                    	 | j                  d       | j                  ||      5 }|j                  |      x}r/|j                  |       |r ||       |j                  |      x}r/t         t        |t              r|j                          d d d        | j                         S # 1 sw Y   | j                         S xY wr   )r   r   readrb   r   r   r   r   )r'   r   r   r   r   r   r   bufs           r   
storbinaryzFTP.storbinary  s    	 	Xc4( 	D++#+S!SM ++#+
 %*T:*F	 }}	 }}s   AB&(&B&&B>c                 "   	 | j                  d       | j                  |      5 }	 |j                  | j                  dz         }t	        |      | j                  kD  rt        d| j                  z        |snA|dd  t        k7  r|d   t        v r|d d }|t        z   }|j                  |       |r ||       t         t        |t              r|j                          d d d        | j                         S # 1 sw Y   | j                         S xY w)Nr   r
   rj   rk   rl   )r   r   rm   rn   rY   r   r   rb   r   r   r   r   )r'   r   r   r   r   r   s         r   	storlineszFTP.storlines  s    
	 	Xc" 	dkk$,,"23s8dll* 84<< GHHrs8v%2w&(CR#,CS!SM  %*T:*F	  }}!	  }}s   B:C66Dc                 0    	 d|z   }| j                  |      S )Nr   r   )r'   passwordr   s      r   r+   zFTP.acct  s    $ ||C  r   c                 f    	 d}|D ]
  }|d|z   z   } g }| j                  ||j                         |S )NNLST )r   append)r'   r6   r   argfiless        r   nlstzFTP.nlst  sC    P 	$Cs#C	$sELL)r   c                     	 d}d }|dd  rt        |d   t              s
|d d |d   }}|D ]  }|s|d|z   z   } | j                  ||       y )NLISTrl   r   )r   strr   )r'   r6   r   funcr   s        r   dirzFTP.dir&  sm    	G
 9ZR#6crDH$D 	(CS3Y'	( 	sD!r   c              #     K   	 |r&| j                  ddj                  |      z   dz          |rd|z  }nd}g }| j                  ||j                         |D ]s  }|j	                  t
              j                  d      \  }}}i }	|d d j                  d      D ]*  }
|
j                  d      \  }}}||	|j                         <   , ||	f u y w)Nz
OPTS MLST ;zMLSD %sMLSDr   rl   =)	r   r   r   r   rZ   ra   	partitionr   lower)r'   pathfactsr   linesre   facts_found_nameentryfactkeyvalues                r   mlsdzFTP.mlsd5  s     
	 LL7#=>d"CCsELL) 	 D#';;t#4#>#>s#C KDE#CR(..s3 + $s 3Q%*ciik"+ -	 s   CCc                 z    	 | j                  d|z         }|d   dk7  rt        |      | j                  d|z         S )NzRNFR r   rz   zRNTO )r   r   r   )r'   fromnametonamer~   s       r   renamez
FTP.renameQ  sB    ||Gh./7c>d##||Gf,--r   c                 T    	 | j                  d|z         }|d d dv r|S t        |      )NzDELE rq   >   200250r   )r'   filenamer~   s      r   deletez
FTP.deleteX  s6    ||Gh./8~%Kd##r   c                     	 |dk(  r	 | j                  d      S |dk(  rd}d|z   }| j                  |      S # t        $ r }|j                  d   d d dk7  r Y d }~:d }~ww xY w)	Nz..CDUPr   rq   500r   r   zCWD )r   r   r6   )r'   dirnamemsgr   s       r   cwdzFTP.cwd`  sw    $d?||F++ ]Gw||C    88A;r?e+ ,s   6 	AAAc                 z    	 | j                  d|z         }|d d dk(  r|dd  j                         }t        |      S y )NzSIZE rq   213)r   stripint)r'   r   r~   r\   s       r   r   zFTP.sizem  sF    *||Gh./8uQR Aq6M r   c                 f    	 | j                  d|z         }|j                  d      syt        |      S )NzMKD 257r   r   
startswithparse257)r'   r  r~   s      r   mkdzFTP.mkdu  s3    9||FW,- u%~r   c                 ,    	 | j                  d|z         S )NzRMD r   )r'   r  s     r   rmdzFTP.rmd~  s    !||FW,--r   c                 `    	 | j                  d      }|j                  d      syt        |      S )NPWDr
  r   r  r   s     r   pwdzFTP.pwd  s.    /||E" u%~r   c                 J    	 | j                  d      }| j                          |S )NQUIT)r   r5   r   s     r   r2   zFTP.quit  s!    -||F#

r   c                     	 	 | j                   }d | _         ||j                          | j                  }d | _        ||j                          y y # | j                  }d | _        ||j                          w w xY wr"   )rE   r5   r1   )r'   rE   r1   s      r   r5   z	FTP.close  su    F		99DDI

99DDI

   99DDI

  s   %A (A7)r   r   r9   Nr"   )r   r   r   )r   N)r   NN)9r   r   r   rI   r(   FTP_PORTr<   MAXLINErn   r1   rE   rG   rQ   r   r   r,   r/   r7   r%   rL   rO   debugrS   rK   rf   rh   ro   rv   rF   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  r2   r5   r   r   r   r   r   J   s*   . IDDGDDGM%*"R0/!/ !4 E!6$
 

!!
5n/4.!F4>!
" "  8.$!.r   r   c                   d     e Zd Z	 ddeddd fdZd fd	Zd Zd Zd Zd	 Z	d fd
	Z
d Z xZS )FTP_TLSNr   )contextr$   r#   r    c          	      z    |t        j                         }|| _        d| _        t        	|   |||||||       y )NFr   )ssl_create_stdlib_contextr  _prot_psuperr,   )
r'   r(   r)   r*   r+   r  r$   r#   r    	__class__s
            r   r,   zFTP_TLS.__init__  sH     446"DL DLGT4$nx  Ir   c                     |r4t        | j                  t        j                        s| j	                          t
        |   |||      S r"   )r   r1   r  	SSLSocketauthr!  r&   )r'   r)   r*   r+   securer"  s        r   r&   zFTP_TLS.login  s3    jCMMB		7=vt44r   c                    	 t        | j                  t        j                        rt	        d      | j
                  j                  t        j                  k\  r| j                  d      }n| j                  d      }| j
                  j                  | j                  | j                        | _        | j                  j                  d| j                        | _        |S )NzAlready using TLSzAUTH TLSzAUTH SSLserver_hostnamer;   )moder    )r   r1   r  r$  r=   r  protocolPROTOCOL_TLSr   wrap_socketr(   rD   r    rE   r   s     r   r%  zFTP_TLS.auth  s    D$))S]]3 !455||$$(8(88||J/||J/00DII0VDI		**dmm*LDIKr   c                     	 t        | j                  t        j                        st	        d      | j                  d      }| j                  j                         | _        |S )Nznot using TLSCCC)r   r1   r  r$  r=   r   r   r   s     r   ccczFTP_TLS.ccc  sI    Adii7 11<<&D		((*DIKr   c                 Z    	 | j                  d       | j                  d      }d| _        |S )NzPBSZ 0zPROT PTr   r   r   s     r   prot_pzFTP_TLS.prot_p  s-    0 LL"<<)DDLKr   c                 8    	 | j                  d      }d| _        |S )NzPROT CFr2  r   s     r   prot_czFTP_TLS.prot_c  s    4<<)D DLKr   c                     t         |   ||      \  }}| j                  r'| j                  j	                  || j
                        }||fS )Nr(  )r!  r   r   r  r-  r(   )r'   r   r   r   r   r"  s        r   r   zFTP_TLS.ntransfercmd  sL    -c48JD$||||//@D		 0 K:r   c                     dt         z   }| j                  j                  |       | j                         }|d d dvrt	        |      |S )Nr   rq   >   r   r   r   )r   r1   rb   rv   r   r   s      r   r   zFTP_TLS.abort	  sK    V#DIId#$$&DBQx44!$''Kr   )r   r   r   r   )r   r   r   Tr"   )r   r   r   r   r,   r&   r%  r0  r3  r5  r   r   __classcell__)r"  s   @r   r  r    sC    	B	I $.E$(7	I	5

			 			r   r  c                     	 | d d dk7  rt        |       t        -dd l}|j                  d|j                  |j
                  z        at        j                  |       }|sy t        |j                  d            S )Nrq   r   r   z150 .* \((\d+) bytes\)r
   )	r   _150_rerecompile
IGNORECASEASCIImatchr  group)r~   r;  ms      r   r   r     sq     BQx5$**%r}}rxx'?AdAqwwqz?r   c                 J   	 | d d dk7  rt        |       t         dd l}|j                  d|j                        at        j                  |       }|st        |       |j                         }dj                  |d d       }t        |d         dz  t        |d         z   }||fS )	Nrq   227r   z#(\d+),(\d+),(\d+),(\d+),(\d+),(\d+)r   rr      rU   )
r   _227_rer;  r<  r>  searchr   groupsr   r  )r~   r;  rA  numbersr(   r<   s         r   r   r   ,  s    5 BQx5$**CRXXNtA$hhjG88GBQK D
Oq C
O3D:r   c                    	 | d d dk7  rt        |       | j                  d      }|dk  rt        |       | j                  d|dz         }|dk  rt        |       | |dz      | |dz
     k7  rt        |       | |dz   | j                  | |dz            }t	        |      dk7  rt        |       |d   }t        |d         }||fS )Nrq   229(r   )r
   rU   )r   findr   r   rY   r  )r~   peerleftrightpartsr(   r<   s          r   r   r   ?  s    5 BQx5$99S>Dax{4((IIc4!8$Eqy$D1H~eai($% &&tDF|4E
5zQ$7DuQx=D:r   c                     	 | d d dk7  rt        |       | dd dk7  ryd}d}t        |       }||k  r/| |   }|dz   }|dk(  r||k\  s| |   dk7  r	 |S |dz   }||z   }||k  r/|S )Nrq   r
  rU   z "r   r
   ")r   rY   )r~   r  r]   nr   s        r   r  r  T  s    3 BQx5$AayDG	AD	A
a%GaC8AvaC N !AA+ a% Nr   c                     	 t        |        y r"   )rJ   )re   s    r   r   r   j  s    5	$Kr   c                 ~   	 |s|}d|z   }| j                  |       |j                  |       t        | j                  d            \  }}|j                  ||       |j                  d|z         }|d d dvrt        | j                  d|z         }|d d dvrt        | j                          |j                          y )NzTYPE r   zSTOR rq   >   125r   RETR )r   r   r   r   r   r   )	source
sourcenametarget
targetnametype
sourcehost
sourceporttreplysreplys	            r   ftpcprb  o  s    5
T>D
NN4
NN4%fnnV&<=J

OOJ
+ ^^Gj01Fbqz'^^Gj01Fbqz'
OO
OOr   c                     	 t        t        j                        dk  r.t        t        j
                         t        j                  d       dd l} d}d }t        j                  d   dk(  r-|dz   }t        j                  d= t        j                  d   dk(  r-t        j                  d   d d dk(  r't        j                  d   dd  }t        j                  d= t        j                  d   }t        |      }|j                  |       dx}x}}	 | j                  |      }	 |j                  |      \  }}}|j                  |||       t        j                  dd  D ]  }	|	d d d	k(  r|j!                  |	dd          |	d d dk(  r$d
}
|	dd  r|
dz   |	dd  z   }
|j#                  |
      }L|	dk(  r|j%                  |j&                          n|j)                  d|	z   t        j*                  j                  d        |j-                          y # t        $ r" t        j                  j                  d       Y w xY w# t        $ r% |t        j                  j                  d       Y 0w xY w)Nr   r   r
   z-dz-rr   z$No account -- using anonymous login.z5Could not open account file -- using anonymous login.z-lCWDr   z-prX  i   )rY   r>   argvrJ   test__doc__exitnetrcr   rO   authenticatorsKeyErrorstderrwriter3   r&   r   r   rS   rQ   r   stdoutr2   )ri  rI   rcfiler(   ftpuseridr*   r+   netrcobjrE   r   r~   s               r   rf  rf    s/    388}qdllIF
((1+
aK	HHQK ((1+
 xx{2A$!QRHHQK88A;D
d)Cy!FVd<;;v&	<#+#:#:4#@ FD&
 IIffd# 38tGGDH"1XCABxsSy483;;s#DT\LLS.../NN7T>::++T33 HHJ#  	<JJ:<	<  ;JJ : ;;s$   H7 H	 	(H43H47*I%$I%__main__)r   I)$r>   r@   r   __all__r   r  r  	Exceptionr   r   r   r   r   r3   r4   r	   ra   r   r   r  r$  r   r  r   SSLErrorImportErrorr:  r   rE  r   r   r  r   rb  rf  r   r   r   r   <module>ry     s!  L   *  
 I  %      % 
 Wh'
 	R	 R	hu: Jk# kZ NN9(CLL9J $ &*,
,6r zF }  Js   %C	 	CC