
    h7                         d dl mZm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mZ 	 d dlZd dlmZmZ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 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* erd	dl+m,Z, ere-Z. ej^                  d      Z0e0jb                  e0jd                  e0jf                  e0jh                  f\  Z1Z2Z3Z4d Z5d Z6g Z7g Z8 G d de      Z9d Z:y#   G d de      ZY xY w#  Y xY w)    )print_functionunicode_literals)SimpleNamespacec                       e Zd Zd Zy)r   c                 :    | j                   j                  |       y N)__dict__update)selfattrs     D/jellyfin/media/venv/lib/python3.12/site-packages/copyparty/tftpd.py__init__zSimpleNamespace.__init__	   s    MM  &    N)__name__
__module____qualname__r    r   r   r   r      s    	'r   r   N)datetime)TftpContextsTftpPacketFactoryTftpPacketTypes
TftpServer
TftpStates)TftpException   )EXEPY2TYPE_CHECKING)VFS)bos)FN_EMBUTCBytesIODaemonODictexclude_dotfilesmin_exrunhook
set_fpermsundotvjoinvsplit)SvcHubtftpc                       y r   r   )akas     r   noopr2   A   s    r   c                     t        d||       t        d   | |||      }t        d   j                  j                  }|r|j                  |      st        d|       |S )Nzconnection from %s:%sr   zclient rejected (--tftp-ipa): )info	_sinitial_hubargstftp_ipa_nmmapyeet)r   pktraddressrportretnms         r   _serverInitialr@   E   sT    	 (E2
A,tS(E
2C	a	!	!B	"&&"8=>Jr   c                   p    e Zd Zd ZddZd Zd Z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y)Tftpdc           
      6   || _         |j                  | _        |j                  | _        |j                  | _        t	        j
                         | _        g t        d d  t        j                  |       t        j                  | j                  j                  rt        j                  nt        j                         dD ]\  }t        j                  |      }|j                  | j                  j                  rt        j                  nt        j                         ^ | j                  j                  s6| j                  j                   st"        t$        t&        t(        t*        g}g }| j                  j,                  st.        st0        s	 t3        j4                  d      }|D ]  }|j                  |j6                         t9        j:                  |      j=                  d      }dj?                  |D 	cg c]  }	|jA                  d|	       c}	      }
|jB                  jD                  }tG        t5        |
|d      |j6                          	 |D ]  }tN        |j                  _(         g tR        d d  tR        j                  t&        jT                  jV                         tX        t&        jT                  _+        | jZ                  t(        _.        | jZ                  t&        _.        t_               }t`        j6                  D ]  }	 tc        ||te        t`        |               | jf                  |_4        | jj                  |_6        | jn                  |_8        d
|_9        |t(        _0        |t*        _0        |t&        _0        t_               }t`        jt                  j6                  D ](  }	 tc        ||te        t`        jt                  |             * | jv                  |_<        | jz                  |_>        | j~                  |_@        | j                  |_B        ||_:        | j                  |       t        | j                  j                        | _F        g | _G        g | _H        g }| j                  j                  rW| j                  j                  j=                  d      D cg c]  }t        |       c}\  }}t        t        ||dz               }| j                  j                  }d|v r|j                  d       |D cg c]  }|j                  d      r| }}| j                  j                  r|D cg c]	  }d|vs| }}|sd}| j                  |d       y t        t        j                  |            }|D ]5  }d|}t        | j                  |||g       t        j                  d       7 y c c}	w # tH        $ rA d}| j                  d|tK               z   d	       tM        |      D ]  \  }}|||   _         Y w xY w#  Y xY w#  Y mxY wc c}w c c}w c c}w )N)partftpyzpartftpy.TftpStateszpartftpy.TftpServerz(^\s*)log\.debug\(.*\)$
z\1passexec)filenamemodezKfailed to optimize tftp code; run with --tftp-no-fast if there are issues:
r.      /-r   ::0.0.0.0)zunix:zfd::z1cannot start tftp-server; no compatible IPs in -itftp_g?)Vhubr7   asrvlog	threadingLockmutexr6   appendlgsetLeveltftpvloggingDEBUGINFO	getLoggertftpvvr   r   r   r   r   tftp_no_fastr   r   recompiler	   inspect	getsourcesplitjoinsub__spec__originrF   	Exceptionr'   	enumerater2   debugr5   TftpServerStateserverInitialr@   _openopenr   ossetattrgetattr_accessaccess_mkdirmkdir_unlinkunlinkseppath
_p_abspathabspath	_p_existsexists_p_isdirisdir_p_normpathnormpath_disarmintr.   portsrvipstftp_prlistrangei
startswithtftp4nlogr%   fromkeysr$   _starttimesleep)r   rP   xlgrCscbakptnCsrc1lnsrc2cfntnzdfoskfopportsp1p2r   ipnames                           r   r   zTftpd.__init__T   s   HH	HH	77^^%
QC
TYY__GMM',,GK 	MA##A&CLL$))//w||L	M yytyy'7'7
  !B D99))#c,**%?@C TAJJ/&00399$?#yy4)PR#'')R*@)PQjj//gdSvF

ST  #"# 	!33AAB3A
""0 !JJ**
 	AQA/	
 \\
KK	\\


!! 	AQ 34	
 oo^^
MM	''S		'	99&*ii&7&7&=&=c&BCc!fCFBr26*+Eiikk3;JJy!DQQ\\2B%CqDD99??!2S\12C2CAIIaO5>>#&' 	B "$D4;;r5k2JJsO	U *Q ! ,fAHHVQ\15!*4 ,2)+1,,, D E 3s]   
A(V/ 2V*
AV/  W< %XX3X
X*	X4X*V/ /AW98W9<XX	c                 *    | j                  d||       y )Nr.   )rR   )r   msgcs      r   r   z
Tftpd.nlog   s    a r   c                    d|v rt         j                  nt         j                  }d}	 t        j                  d| j                        }| j
                  5  | j                  j                  |       | j                  j                  |       d d d        	 |j                  || j                  ||       t)        d|| j                         y # 1 sw Y   AxY w#  | j
                  5  | j                  j                  |       | j                  j                  |       d d d        n# 1 sw Y   nxY w	 |j                  j                          n#  Y nxY w	 t        |j                        }n	#  d}Y nxY w|rd}|r:d}t!        ||| j                  t#                      t%        j&                  d       Y |dk7  sd	| j                  vr"d
}t!        ||| j                  t#                      Y y xY w)NrN   FTrJ   )	af_familyr   z4tftp server [%s]:%d crashed; restarting in 3 sec:
%srI   rM   rL   z'tftp server [%s]:%d failed to start:
%sztftp server [%s]:%d terminated)socketAF_INET6AF_INETr   _lsrU   r   rV   r   listenr   removesockclosebool
listenporterrorr'   r   r   r4   )r   r   r   famhave_been_aliver   boundr   s           r   r   zTftpd._start   s   !$foo''TXX6C $$#$%

2tyyCu
EJ 12tyyAY$ $"ZZ (HHOOC(HHOOB'( ( (HHNN$" 0E"!E&*O"OA!RFH5JJqM ?d$((&:BA!RFH5
 sg   7CC CG+%7D%	G+%D.	*G+2EG+EG+E+*G++E1/AG+45G+c                     | j                   5  | j                  d d  }d d d        D ]  }|j                           y # 1 sw Y   !xY wr   )rU   r   stop)r   srvsr   s      r   r   z
Tftpd.stop   sE    ZZ 	88A;D	  	CHHJ		 	s	   =Ac                 >   |j                  dd      j                  d      }|sddg}t        d||t        |      |        | j                  j
                  j                  |dg| \  }}|d   rd|j                  j                  vrld|j                  vr^t        |      \  }}|j                         t        v r:t        |d|z         } | j                  j
                  j                  |dg| \  }}|j                  st        d	      |||j!                  |      fS )
N\rJ   Tz%s("%s", %s) %s[K[0m*r   wo_up_readme_wo_zunmapped vfs)replacelstriprk   strrQ   vfsgetaxsureadflagsr,   lowerr!   r+   realpathri   	canonical)	r   callervpathpermsr0   r   remzsfns	            r   _v2az
Tftpd._v2a  s     dC(//44LE,feSVUK$499==$$UC8%8S8377==0^3995TE]FBxxzV#b&2+.,499==,,UC@%@S||N++E3==---r   c                 @   |sjt         j                  j                  |j                  dd            \  }}| j                  j
                  }|r|j                  |j                               sy t        j                  }| j                  j                  j                  |ddd      \  }}	|j                  |	d| j                  j                   ddggd      \  }
}}t        |D cg c]*  }t!        j"                  |d   j$                        s&|d   , c}      }|D cg c]&  \  }}||v s|j&                  |j(                  |dz   f( }}}|D cg c]#  \  }}||vs|j&                  |j(                  |f% }}}||z   }|D cg c]   \  }}} |t+        d|      t,              ||f" }}}}|D cg c]P  \  }}}d	|j.                  |j0                  |j2                  |j4                  |j6                  |j8                  fz  ||fR }}}}|j;                         D cg c]
  }d
d|dz   f }}||z   }d|j<                  j>                  vr<t        tA        |D cg c]  }|d   	 c}            }|D cg c]  }|d   |v s| }}	 t+        |D cg c]  }|d   	 c}      }g }d|j<                  jB                  v r|jE                  d       d|j<                  j>                  v r|jE                  d       d|j<                  jF                  v r;d|j<                  jH                  v r|jE                  d       n|jE                  d       d}|jK                  tM        djK                  |                  }ddjO                  |      g}||D cg c]  } |jJ                  |  c}z  }djO                  |      jQ                  dd      } tS        | dz         S c c}w c c}}w c c}}w c c}}}w c c}}}w c c}w c c}w c c}w c c}w #  d}Y pxY wc c}w )Nr   rJ   r   TF)throwr   r   z%04d-%02d-%02d %02d:%02d:%02dz????-??-?? ??:??:??   readhidden	overwritewritez{{}}  {{:{},}}  {{}}z{:,}z# permissions: z, rE   zutf-8r      
)*rp   rz   rd   r   r7   tftp_lsfmatchr   r   fromtimestamprQ   r   r   ls
no_scandirsetstatS_ISDIRst_modest_mtimest_sizemaxr"   yearmonthdayhourminutesecondkeysr   udotr&   r   rV   uwriteudelformatlenre   encoder#   )!r   r   r<   r=   forcer   r   tsdtvnr   fsrootvfs_lsvfs_virtr   dnamesr   vdirs1fils1real1mtszrealtr   realsvirsr   namesbiggestr   fmtretlr>   s!                                    r   r   z	Tftpd._ls  s   emmD#&>?IE2))$$Ccii
3%%))--##E3e<C#%55		$$$E]O $) $
  FIqdll1Q4<<.HadIJ>DTdaV!**aiiS1TT8>R1!6/!**aii+RRCHIIZRR$s1bz3'R0II $
 
 B 0GGHHFFGGIIII 
 
  >F]]_M&1s73MME\bffkk!();1!A$);<=E11Q45=!1B1	,A1Q4,-G "&&,,LL "&&++LL""&&--bffkk![)W%$jjV]]7345'+yy'79:,AQ,,iio$$Wi8sU{##c JTRI
  N *<1 -	G  -sm   #'OOO#+O#O)O)%O/6AO6!O=P8PP	P P!P PP Pc                 n   dx}}|dk(  rd}n|dk(  rd}nt        d|      | j                  d|||g      \  }}}|rd|j                  j                  vrt	        d|       t
        j                  j                  |      r&d|j                  j                  vrt	        d	|       |j                  j                  d
      }	|	rWt        | j                  d | j                  j                  d|	||ddddddt        j                         d      st	        d|       | j                   j"                  s3t
        j                  j%                  |      r| j'                  |ddd      S |s| j                   j(                  f}t+        ||g|i |}
|r$d|j                  v rt-        |
|j                         |
S )NFrbTwbz	bad mode ro   r   z+blocked write; folder not world-writable: /z,blocked write; folder not world-deletable: /xbuz	xbu.tftpd r   8.3.8.7zblocked by xbu server config: fperms)ri   r   r   r   r:   r    rz   r~   r   r   r   r(   r   rP   up2kr   r7   	tftp_nolsr   r   iobufro   r)   )r   r   rH   r0   r1   rdwrr   apr  r>   s              r   rn   zTftpd._openY  sx   R4<BT\BT344652r(;UB#''..(OPxxr"s#'',,'>PQ))--&C7				" 5BCyy""sxx~~b'988E2q$//"A2t&a&2&(cii'sCII&
r   c                 H   | j                  d|ddg      \  }}}d|j                  j                  vrt        d|       t	        j
                  ||j                  d          d|j                  v r2t	        j                  ||j                  d   |j                  d	          y y )
Nrv   FTr   z+blocked mkdir; folder not world-writable: /chmod_dchownuidgid)r   r   r   r:   r    rv   r   r  )r   r   r0   r   _r  s         r   ru   zTftpd._mkdir  s    YYwt}=
Qcggnn$EKL		"cii	*+ciiIIb#))E*CIIe,<=  r   c                 t   | j                  d|g d      \  }}}	 t        j                  |      }t        j                  |j                        r|j
                  rt        d       |j                  dd      j                  d      }| j                  j                  j                  dd|gg dd       y #  Y y xY w)	Ndelete)TFFTz"attempted delete of non-empty filer   rJ   r   r  F)r   r    r   S_ISREGr   r   r:   r   r   rP   r  	handle_rm)r   r   r   r  r  infs         r   rw   zTftpd._unlink  s    YYx0JK
Q	((2,C ||CKK(CKK56dC(//4YUEJ	s   B3 3B7c                      y)NTr   r   r0   s     r   rs   zTftpd._access  s    r   c                     dt        |      z   S )NrJ   )r*   )r   r   s     r   r{   zTftpd._p_abspath  s    U5\!!r   c                      y)Nr  r   r#  s     r   r   zTftpd._p_normpath  s    r   c                 x    	 | j                  d|ddg      d   }t        j                  |       y#  |dk(  cY S xY w)Nzp.existsFr   TrJ   )r   r    r   )r   r   r  s      r   r}   zTftpd._p_exists  sA    	 :uuen=a@BHHRL	 C<s   -0 9c                     	 t        j                  | j                  d|ddg      d         }t        j                  |j                        }|S #  |dk(  cY S xY w)Nzp.isdirFr   rJ   )r    r   r   r   r   )r   r   str>   s       r   r   zTftpd._p_isdir  sS    	 $))IuuenEaHIB,,rzz*CJ	 C<s   AA Ac                     t        j                         j                  j                  j                  }t        d||       t        d      )Nz[31m%s:hook(%s)[0mnope)rb   currentframef_backf_codeco_namer   ri   )r   r0   r1   srcs       r   _hookzTftpd._hook  s:    ""$++22::*C3r   c                    | j                   |_        | j                   |_        | j                   |_        | j                   |_        | j                   |_        | j                   |_        | j                   |_        | j                   |_        | j                   |_	        | j                   |_
        | j                   |_        | j                   |_        | j                   |_        | j                   |_        | j                   |_        | j                   |_        | j                   |_        | j                   |_        | j                   |j&                  _        | j                   |j&                  _        | j                   |j&                  _        | j                   |j&                  _        | j                   |j&                  _        | j                   |j&                  _        | j                   |j&                  _        | j                   |j&                  _        | j                   |j&                  _        | j                   |j&                  _        y r   )r0  chmodr  r   	ftruncatelchownlinklistdirlstatro   r   renamer   scandirr   symlinktruncateutimewalkrz   
expanduser
expandvarsgetatimegetctimegetmtimegetsizeisabsisfileislinkr   )r   r   s     r   r   zTftpd._disarm  se   JJ	JJ	JJ	

ZZ
::jjJJ	::ZZ
ZZ
jjjj::jjzzJJ	::"jj"jj JJ JJ JJ::**** JJr   N)r   )F)r   r   r   r   r   r   r   r   r   rn   ru   rw   rs   r{   r   r}   r   r0  r   r   r   r   rB   rB   S   sY    n`!1f.(B$H/b>K"   
'r   rB   c                 .    t        |        t        |       r   )warningr   )r   s    r   r:   r:     s    CL

r   );
__future__r   r   typesr   objectrZ   rp   r`   r   r   rS   r   r   rb   rD   r   r   r   r   r   partftpy.TftpSharedr   r   r   r   r   authsrvr   r    utilr!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   svchubr-   xranger   r]   rW   rk   r4   rH  r   r2   r@   r6   r5   rB   r:   r   r   r   <module>rQ     s    7'%  	 	     	  . - -      E Wv!xx"**bhhG tWe	 		J'F J'Zu''& ' 	s   C' C9 'C69C=