
    iK                        d dl mZ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
mZmZ d dlmZmZ d dlmZ d dlmZ d dlmZ dd	lmZmZ dd
lmZ ddlmZ ddlmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z* erddl+m,Z, ere-Z. G d de      Z/ G d de      Z0 G d de      Z1 G d de      Z2	 d dlm3Z3  G d de2e3      Z4 G d de5      Z6d Z7y#  Y xY w)    )print_functionunicode_literalsN)AuthenticationFailedDummyAuthorizer)AbstractedFSFilesystemError)
FTPHandler)IOLoop)	FTPServer   )PY2TYPE_CHECKING)VFS)bos)
VF_CAREFULDaemonODictPebkacexclude_dotfilesfsencipnormpybinrelchkrunhooksanitize_fn
set_fpermsvjoinwunlink)SvcHubc                         e Zd Zd fd	Z xZS )FSEc                 :    t         t        |   |       || _        y N)superr   __init__severity)selfmsgr&   	__class__s      A/home/ubuntu/myenv/lib/python3.12/site-packages/copyparty/ftpd.pyr%   zFSE.__init__.   s    ot-c2     r   )__name__
__module____qualname__r%   __classcell__r)   s   @r*   r!   r!   -   s    ! !r+   r!   c                   J     e Zd Z fdZd Zd Zd Zd	dZd Zd Z	d Z
 xZS )
FtpAuthc                 8    t         t        |           || _        y r#   )r$   r3   r%   hub)r'   r5   r)   s     r*   r%   zFtpAuth.__init__4   s    gt%'r+   c                 
   dj                  ||      |_        d|_        |j                  d   }|j	                  d      r|dd  }t        |      }| j                  j                  }||v rC||   t        j                         z
  }|dk  rt        j                  d       ||= nt        d      | j                  j                  }| j                  j                  }	d}
|dk7  r]d	}
|j                  r	|d
|g}n||g}|D ]=  }|	j                  j!                  |	j"                  j%                  |      d	      }|s;|}
 n |j&                  r-|
dk(  r(|j(                  |j*                  j-                  |         }
|j.                  rD|
|j0                  v r6|j0                  |
   j-                  |      st        j2                  d|
       d}
|
rJ|	j4                  j6                  j!                  |
      s|	j4                  j8                  j!                  |
      s| j                  j:                  }|j<                  r|j?                  ||j                        \  }}|rt        j2                  d       |||<   	 || j                  j@                  jB                  j                  |<   | j                  j@                  jB                  xjD                  dz  c_"        t        d      t        d      |
x|_        |_        y #  Y t        d      xY w)Nz{}:{}*r   ::ffff:   zclient unbannedbanned	anonymous :zusername [%s] rejected by --iprz client banned: invalid passwordsr   zAuthentication failed.)#formatusernameunameaddr
startswithr   r5   banstimelogginginfor   argsasrv	usernamesiacctgetahhashipuipu_iuipu_nmmapipripr_uwarningvfsareadawritegpwdlimbonkbrokerhttpsrvnban)r'   r?   passwordhandleripipnrC   rtrG   rH   r@   altszsgrZ   s                  r*   validate_authenticationzFtpAuth.validate_authentication8   sz    #>>(H=\\!_==#ABBRjxx}}$;cTYY[(BAv./I*844xx}}xx}}{"E~~#+X67 (+ ZZ^^DGGLL$4b9E	 88KK 34E88+::e$((, A5ITXX^^//6$((//:M:Me:TAuu66"g&6&67bOO$FG#DH;?//44R8//4494 ''?@@&'?@@+00(&'?@@s   /A K4 4Lc                      y)N/ r'   r?   s     r*   get_home_dirzFtpAuth.get_home_diru   s    r+   c                 j    | j                   j                  }||j                  v xs ||j                  v S r#   )r5   rH   acctrJ   )r'   r?   rH   s      r*   has_userzFtpAuth.has_userx   s,    xx}}499$>DJJ(>>r+   c                      y)NTri   )r'   r?   permpaths       r*   has_permzFtpAuth.has_perm|   s    r+   c                      y)N
elradfmwMTri   rj   s     r*   	get_permszFtpAuth.get_perms   s    r+   c                 $    dj                  |      S )Nzsup {})r>   rj   s     r*   get_msg_loginzFtpAuth.get_msg_login   s    x((r+   c                      y)Ncyari   rj   s     r*   get_msg_quitzFtpAuth.get_msg_quit   s    r+   r#   )r-   r.   r/   r%   rf   rk   rn   rr   ru   rw   rz   r0   r1   s   @r*   r3   r3   3   s,    ;1z?)r+   r3   c                       e Zd Zd Zdd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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)FtpFsc                     || _         || _        |j                  | _        |j                  | _        |j                  | _        d| _        d| _        | j                  | _        | j                  d       y )Nrh   z/var/lib/empty.)
hcmd_channelr5   rG   r@   cwdrootlistdirlistdirinfochdir)r'   r   r   s      r*   r%   zFtpFs.__init__   s]     &OO$$	 &&
$	<<

3r+   c                 >    | j                   j                  d||       y )Nftpd)r5   log)r'   r(   cs      r*   r   z	FtpFs.log   s    VS!$r+   c           	         	 |j                  dd      j                  d      }t        j                  j	                  |      \  }}t        |      r3t        j                  d|       d}t        |j                  |      d      t        |xs d      }t        ||      }| j                  j                  j                  j                  || j                   ||||      \  }	}
|r|j#                         |	j$                  d   v r| j&                  j                   |	j(                  j*                  vr`d|	j$                  vrRd	|z   }t        ||      }| j                  j                  j                  j                  || j                   ||||      \  }	}
|	j,                  sd
}t        |j                  |            d|	j$                  v sd|	j$                  v r|	j/                  |
      }|	j1                  |      }d}|st        |j                  |      d      |j2                  | j&                  j                      \	  }}}}}}}}}|r|r|r|r|r|r|r|st        |j                  |      d      d|	j$                  v r|	j5                  |
d      st        dd      t        j                  j7                  |	j,                  |
      |	|
fS # t8        $ r}t        t;        |            d }~ww xY w)N\rh   zmalicious vpath: %szUnsupported characters in [{}]r   r<   emb_allwo_up_readme_wo_zNo filesystem mounted at [{}]xdevxvolzPermission denied in [{}]bcasechkTNo such file or directory)replacestriposrq   splitr   rE   rT   r!   r>   r   r   r5   rH   rU   rK   r@   lowerflagsr   axsureadrealpath	canonicalchk_apuaxscasechkjoinr   str)r'   vpathrwmdrdfntrU   remapavfscrcwcmcd_exs                      r*   v2az	FtpFs.v2a   sU   )	MM$,2237EWW]]5)FBbz 5u=4!((5/1--RX2&B"bMExx}}((,,UDJJ1aKHCHHJ#))I"66FFLL5"#))3b[b"88==,,00

Aq!QOS<<3!((5/**"f		&9]]3'zz"~/ahhuoq1104		$&&,,0G-BB1aAR1R1R1Rahhuoq11SYY&s{{3/E5q9977<<c2C<< 	c"g,	s   J?K 	K$KK$c                 T    | j                  t        | j                  |      ||||      S r#   )r   r   r   )r'   r   r   r   r   r   s         r*   rv2az
FtpFs.rv2a   s&     xxTXXu-q!Q::r+   c                     |S r#   ri   )r'   ftppaths     r*   ftp2fszFtpFs.ftp2fs   s    r+   c                     |S r#   ri   )r'   fspaths     r*   fs2ftpzFtpFs.fs2ftp   s    r+   c                 N    d|v r!d|v s|j                  d      rt        dd      y)Nz/.hist/z/up2k.z/dir.txtz Access to this file is forbiddenr   T)endswithr!   r'   rq   s     r*   	validpathzFtpFs.validpath   s.    44==#<<a@@r+   c                 R   d|v }d|v xs
 d|v xs d|v }| j                  |||      \  }}}| j                  |       |r	 t        j                  |      }t	        j                         |j
                  z
  }	d}
|j                  j                  d      }|rt        | j                  d | j                  j                  d	|||d
d
d
dddt	        j                         d       }|j                  d      xs d
}|s|j                  d      dk7  r$|sd|}| j                  |d       t        |      |	dk\  r|	| j                  j                  k  rd}nG| j                  j                  s| j                  j                   rd}n	 | j                  |dddd       d}|st        d      d|vrt#        | j                  |t$               t'        t)        |      || j                  j*                        }|r$d|j                  v rt-        ||j                         |S #  d}
d}	Y xY w#  d}Y xY w)Nr   r   a+TFr   xbuzxbu.ftpr<   z1.3.8.7	rejectmsgrcz%upload blocked by xbu server config:    zFile already existsfperms)r   r   r   statrD   st_mtimer   rK   r   r   r5   up2kr!   rG   ftp_wtno_del	ftp_no_owr   r   openr   iobufr   )r'   filenamemoder   r   r   rU   r   sttdneed_unlinkr   hrr   do_itrets                   r*   r   z
FtpFs.open   s   4K4K53$;5#+YYxA.
CrXXb\YY[2;;."
 ))--&CHHHHMMIIK" FF;'-2t)IQSHHQNa&LRxB$))"2"22!!TYY%8%8"IIhtUDA E /00 D"j159dDIIOO4SYY&sCII&
q#P"!Es   8H ?H  H H&c                    t        | j                  |      }| j                  j                  j                  j                  || j                  dd      \  }}|j                  s|| _        y |j                  |      }	 t        j                  |      }t        j                  |j                        s
t               	 |j                  ||      }|st        dd      || _        y #  t        d      xY w)NFr   zPermission deniedr   )r   r   r5   rH   rU   rK   r@   r   r   r   r   S_ISDIRst_mode	Exceptionr!   r   )r'   rq   nwdrU   r   r   r   r   s           r*   r   zFtpFs.chdir-  s    488T"88==$$((djj%GS||DH]]3	3"B<<

+k! , zz"b!)1--	3122s   <>C# #C0c                 t    | j                  |d      \  }}}t        j                  ||j                         y )NTr   )vf)r   r   makedirsr   )r'   rq   r   rU   r   s        r*   mkdirzFtpFs.mkdirC  s,    YYttY,
CRCII&r+   c                 @   t        | j                  |      }	 | j                  |dd      \  }}}t        j                  j                  |      st        dd      |j                  || j                  | j                  j                   ddgddggd      \  }}}|D 	cg c]  }	|	d   	 }
}	|
j                  |j                                | j                  |j                  j                  vrt        |
      }
|
j!                          |
S c c}	w # t"        $ r}t%        |dd      r |j'                  d      rg cY d }~S g }| j(                  j*                  j,                  j.                  j1                         D ]  }d|j2                  v s|j2                  s	 | j(                  j*                  j,                  j5                  |j2                  | j                  dd       |j7                  |j2                         #  Y xY w |j!                          |cY d }~S d }~ww xY w)	NTFr   r   )throwr   r&   rh   )r   r   r   r   rq   isdirr!   lsr@   rG   
no_scandirextendkeysr   udotr   sortr   getattrr   r5   rH   rU   all_volsvaluesr   rK   append)r'   rq   r   r   rU   r   fsrootvfs_ls1vfs_virtxvfs_lsr   r   vns                 r*   r   zFtpFs.listdirG  s   TXXt$*	88E47LBS88>>"%5q99(+

II(((. )/ )%FGX %,,qad,F,MM(--/*zz-)&1KKMM -  	r:q){{3	 Chhmm''00779 "((?"((HHMM%%))"((DJJeLJJrxx( HHJJ-	sW   BD D	)AD 	D 
H H8H>AHA!G98H9G=;HHHc                     | j                  |d      d   }	 t        j                  |       y # t        $ r(}|j                  t        j
                  k7  r Y d }~y d }~ww xY w)NT)r   r   )r   r   rmdirOSErrorerrnoENOENT)r'   rq   r   es       r*   r   zFtpFs.rmdiru  sQ    YYttY$Q'	IIbM 	ww%,,& '	s   . 	AAAc                 n   | j                   j                  rt        d      t        | j                  |      j                  d      }	 | j                  j                  j                  | j                  | j                  j                  |gg dd       y # t        $ r}t        t        |            d }~ww xY w)Nz/The delete feature is disabled in server configrh   F)rG   r   r!   r   r   lstripr5   r   	handle_rmr@   r   cli_ipr   r   )r'   rq   vpr   s       r*   removezFtpFs.remove}  s    99GHH$((D!((-	HHMM##DJJtRPUV 	c"g,	s   A	B 	B4B//B4c                    | j                   j                  rt        d      t        | j                  |      j                  d      }t        | j                  |      j                  d      }	 | j                  j                  j                  d| j                  | j                  j                  ||       y # t        $ r}t        t        |            d }~ww xY w)Nz4The rename/move feature is disabled in server configrh   r<   )rG   no_mvr!   r   r   r   r5   r   	handle_mvr@   r   r   r   r   )r'   srcdstsvpdvpr   s         r*   renamezFtpFs.rename  s    99??LMM488S!((-488S!((-	HHMM##B

DFFMM3L 	c"g,	s   -AB5 5	C>CCc                      y r#   ri   )r'   rq   r   s      r*   chmodzFtpFs.chmod  s    r+   c                 6   	 | j                  |d      d   }t        j                  |      S # t        $ rb}|j                  r | j                  |      d   }t        j                  |      }t        j
                  |j                        s |cY d }~S d }~ww xY w)NT)r   r   )r   r   r   r!   r&   r   r   )r'   rq   r   r   r   s        r*   r   z
FtpFs.stat  s}    	44(+B88B< 		{{4#B"B<<

+I		s   *- 	BABBBc                     | j                  |d      d   }t        j                  t        j                  |t        |      d       y )NTr   r   F)r   r   utime_crE   rT   int)r'   rq   timevalr   s       r*   utimezFtpFs.utime  s3    YYttY$Q'GOORWu=r+   c                 T    | j                  |      d   }t        j                  |      S Nr   )r   r   r   r'   rq   r   s      r*   lstatzFtpFs.lstat  s"    YYt_Qxx|r+   c                     	 | j                  |      }t        j                  |j                        S # t        $ r}t	        |dd      r Y d }~yd }~ww xY w)Nr&   r   F)r   S_ISREGr   r   r   r'   rq   r   r   s       r*   isfilezFtpFs.isfile  sI    	4B<<

++ 	r:q)		   /2 	AAAc                 h    | j                  |      d   }t        j                  j                  |      S r  )r   r   rq   islinkr  s      r*   r  zFtpFs.islink  s'    YYt_Qxxr""r+   c                     	 | j                  |      }t        j                  |j                        S # t        $ r}t	        |dd      r Y d }~yd }~ww xY w)Nr&   r   T)r   r   r   r   r   r  s       r*   r   zFtpFs.isdir  sI    	4B<<

++ 	r:q)		r  c                 h    | j                  |      d   }t        j                  j                  |      S r  )r   r   rq   getsizer  s      r*   r  zFtpFs.getsize  )    YYt_Qxx##r+   c                 h    | j                  |      d   }t        j                  j                  |      S r  )r   r   rq   getmtimer  s      r*   r"  zFtpFs.getmtime  s)    YYt_Qxx  $$r+   c                     |S r#   ri   r   s     r*   r   zFtpFs.realpath  s    r+   c                 h    | j                  |      d   }t        j                  j                  |      S r  )r   r   rq   lexistsr  s      r*   r%  zFtpFs.lexists  r   r+   c                      yNr   ri   )r'   uids     r*   get_user_by_uidzFtpFs.get_user_by_uid      r+   c                      yr'  ri   )r'   gids     r*   get_group_by_uidzFtpFs.get_group_by_uid  r*  r+   Nr,   )FFFF)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)  r-  ri   r+   r*   r|   r|      s    % 1l ;CJ,',\	>#$%$r+   r|   c                   2     e Zd ZeZd fd	ZddZd Z xZS )
FtpHandlerc                 T   t         j                  | _        t         j                  | _        d| _        t        rt        j                  | |||       nt        t         |   |||       | j                  }|j                  d      r|dd  }| j                  j                  rS| j                  j                  j                  |      s.t        j                  d|       d| _        |j                          y || _        i | _        | j$                  D cg c]	  }|dvs| c}| _        y c c}w )Nr7   r8   r9   zclient rejected (--ftp-ipa): %sF)CWDXCWD)r/  r5   rG   r@   r   r	   r%   r$   	remote_iprB   
ftp_ipa_nmrQ   rE   rT   	connectedcloser   vfs_maplog_cmds_list)r'   connserverioloopcipr   r)   s         r*   r%   zFtpHandler.__init__  s    NN__	
dFF;*d,T66Bnn>>)$ab'C99		(<(<(@(@(EOO=sC"DNJJL  *.););XAq?WaXXs   	D%D%c                 b   t        | j                  j                  |      j                  d      }	 | j                  j	                  |d      \  }}}|| j                  |<   |j                  j                  d      }|rt        d d | j                  j                  d|||d| j                  | j                  j                   j"                  j%                  || j                        dd| j&                  t)        j(                         d       }	|	j                  d	      xs d}
|
s|	j                  d
      dk7  r+|
sd|}
| j                  d|
t        j                         y t+        j,                  | ||      }|S # t
        $ r-}| j                  d|t        j                         Y d }~y d }~ww xY w)Nrh   Tr   z550 r   zxbu.ftpdr<   r   r   r   z%Upload blocked by xbu server config: )r   fsr   r   r   r   respondrE   rF   r7  r   rK   r   r5   r   r@   rH   rU   ru   r   rD   r	   ftp_STOR)r'   filer   r   r   rU   r   r   r   r   r   r   s               r*   r@  zFtpHandler.ftp_STOR  sb   $''++t$++C0	77;;rT;2LBS RiimmE"

!!++B

;		B" {#)rABFF4LA%EGIA_gll; !!$d3
C  	LLR)7<<8	s   !E8 8	F.#F))F.c           
      b   |j                  dd      }| j                  j                  |d       }|rt        j                  j                  |      \  }}	| j                  j                  j                  j                  || j                  dd      \  }
}|
j                  |      \  }
}| j                  j                  j                  |
j                  |
j                  |
j                   ||	| j"                  t%        j$                         | j                         t'        j(                  | ||||||      S )Nzutf-8r   FT)decoder7  popr   rq   r   r5   rH   rU   rK   r@   get_dbvr   	hash_filer   r   r   r   rD   r	   log_transfer)r'   cmdr   receive	completedelapsedbytesr   r   r   rU   r   s               r*   rG  zFtpHandler.log_transfer$  s     __Wi0\\b$'WW]]2&FBxx}}((,,RUDIHC{{3'HCHHMM##						

	 &&#x)We
 	
r+   r#   r   )	r-   r.   r/   r|   abstracted_fsr%   r@  rG  r0   r1   s   @r*   r/  r/    s    M
Y8&P
r+   r/  )TLS_FTPHandlerc                       e Zd Zy)SftpHandlerN)r-   r.   r/   ri   r+   r*   rP  rP  H  s    r+   rP  c                       e Zd Zd Zy)Ftpdc                    || _         |j                  | _        g }| j                  j                  r+|j                  t        | j                  j                  g       | j                  j
                  rW	 t        }| j                  j                  _        d|_        d|_        |j                  || j                  j
                  g       |D ]Z  }|\  }}|xt        _         |_         |j                  xt        _        |_        t!        |      xt        _        |_        | j                  j$                  r| j                  j$                  j'                  d      D cg c]  }t)        |       c}\  }	}
| j                  j                  rN| j                  j
                  r8t)        |
|	z
  dz        }|| j                  j                  k(  r|	|z   }
n|	|dz   z  }	t+        t-        |	|
dz               |_        | j                  j0                  s@| j                  j0                  |_        ] t5        j6                  d      }|j9                  | j                  j:                  rt4        j<                  nt4        j>                         | j                  j@                  }d|v r|j                  d       |D cg c]  }|jC                  d	      r| }}| j                  jD                  r|D cg c]	  }d
|vs| }}|s|jG                  d       y t+        tI        jJ                  |            }tM               }|D ]%  }|D ]  \  }}	 tO        |t)        |      f||         ' tQ        |jR                  d       y #  d}t        |j                  t                     t        j                  d       Y 7xY wc c}w c c}w c c}w #  |dk7  sd|vr Y xY w)NzZ
ftps requires pyopenssl;
please run the following:

  {} -m pip install --user pyopenssl
r   T-   	pyftpdlibz::z0.0.0.0)zunix:zfd:r=   z0cannot start ftp-server; no compatible IPs in -iftp)*r5   rG   rW  r   r/  ftpsrP  printr>   r   sysexitcertcertfiletls_control_requiredtls_data_requiredr3   
authorizerftp_prr   r  listrangepassive_portsftp_natmasquerade_addressrE   	getLoggersetLevelftpvDEBUGINFOftp_irB   ftp4fatalr   fromkeysr
   r   r   loop)r'   r5   hsh1r   h_lph2lpr   p1p2r   lgripsr;  r`   r   s                    r*   r%   zFtpd.__init__P  s   HH	99==IIz499==1299>>  ))..BK&*B##'B IIr499>>*+ 	:DFB&))JNRV(+0JObg4;CL@J!BMyy*.))*:*:*@*@*EFQ#a&FB99==TYY^^R"WM*ATYY]]*!Va!e#'b"q&(9#: yy  (,		(9(9%'	:* ,diinnW]]',,Giioo3;JJy!DQQ\\2B%CqDD99>>!2S\12C2IIHI5>>#&' 	B 2r3r7mQ7	 	v{{E"wuahhuo& G* E 3Y$c/ +:s6   3M6 N32N8	N8)	N=3N=O67N0ON)r-   r.   r/   r%   ri   r+   r*   rR  rR  O  s    E#r+   rR  c                     t         j                  j                  | |j                  dd            }t         j                  j	                  |      j                  dd      S )Nr   rh   )r   rq   r   r   normpath)rv  rw  r   s      r*   r   r     sC    
RD#./A77A&&tS11r+   )8
__future__r   r   argparser   rE   r   r   rZ  rD   pyftpdlib.authorizersr   r   pyftpdlib.filesystemsr   r   pyftpdlib.handlersr	   pyftpdlib.ioloopr
   pyftpdlib.serversr   r%   r   r   authsrvr   r   utilr   r   r   r   r   r   r   r   r   r   r   r   r   r   svchubr   xrangerc  r!   r3   r|   r/  rN  rP  objectrR  r   ri   r+   r*   <module>r     s    7    	  
  G ? ) # ' (     " E!/ !So SlNL Nb
h
 h
V	1j. F#6 F#R2[	s   4C C