
    h;9                     N   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	m
Z
mZmZ ddlmZmZ ddlmZ ddlmZmZmZmZmZmZ erddlmZ  ej4                  d	      Zej8                  ej:                  ej<                  ej>                  f\  ZZZZ G d
 de       Z!d Z"y)    N)SimpleNamespace   )ANYWINEXETYPE_CHECKING)LEELOO_DALLASVFS)bos)Daemonabsrealmin_expybinrunhookvjoin)SvcHubsmbc                       e Zd Zd ZddZd Zd Zd Zdddd	Zd
 Z	d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y)SMBc           	      &   || _         |j                  | _        |j                  | _        |j                  | _        i | _        | j                  j
                  | _        | j                  j
                   | _        t        j                  | j                  j                  rt        j                  nt        j                         dD ]\  }t        j                  |      }|j                  | j                  j                  rt        j                  nt        j                         ^ 	 ddlm} ddlm}m} t;               }t<        j>                  D ]  }		 tA        ||	tC        t<        |	               | jD                  |_#        | jH                  |_%        | jL                  |_'        | jP                  |_)        | jT                  |_+        | jX                  |_-        | j\                  |_/        | jT                  |_0        | jb                  |_2        |_        t;               }
t<        jf                  j>                  D ](  }		 tA        |
|	tC        t<        jf                  |	             * | jh                  |
_5        | jl                  |
_7        | jp                  |
_9        |
|j<                  _3        | j                  jt                  s| jv                  |
_<        | jz                  |_>        | j                          t        d | j                  j                  D        d       }|s| j                  d	d
d       d}t        | j                  j                        }|j                  ||      }	 | j                  r|j                  | j                         | j                  j                  rdnd}|j                  dd|       |j                  | j                  j                          | j                  j                  j                         D ]9  \  }}||f|dffD ])  \  }} |      } |      }|j                  |d||       + ; t        d      D cg c]  }t        j                  dd       }}djy                  |D cg c]  }dj5                  |       c}      }|j                  |       || _R        |j                  | _S        | j                  d	dj5                  ||             y # t*        $ rh t,        r t/        d       t1        j2                  d       d}t/        |j5                  t7               t8                     t1        j2                  d       Y w xY w#  Y xY w#  Y *xY w#  d| _        d| _        d}| j                  d	|d       Y xY wc c}w c c}w )N)impacketzimpacket.smbserverr   	smbserver)compute_lmhashcompute_nthashzcopyparty.exe cannot do SMBr   zl[36m
{}[31m

ERROR: need 'impacket'; please run this command:[33m
 {} -m pip install --user impacket
[0mc              3   *   K   | ]  }d |vs|  yw):N ).0xs     C/jellyfin/media/venv/lib/python3.12/site-packages/copyparty/smbd.py	<genexpr>zSMB.__init__.<locals>.<genexpr>Y   s     :S\1:s   	r   z0IPv6 not supported for SMB; listening on 0.0.0.0   z0.0.0.0)listenAddress
listenPortFTzKimpacket too old; access permissions will not work! all accounts are admin!noyesA/)readOnlyk       z{:02x}zlistening @ {}:{})ThubargsasrvlogfilessmbanoaccaccslgsetLevelsmbvvvloggingDEBUGINFO	getLoggersmbvvr   r   impacket.ntlmr   r   ImportErrorr   printsysexitformatr   r   r   os__dict__setattrgetattr_closeclose_listdirlistdir_mkdirmkdir_openopen_unlinkremove_renamerename_statstatunlink_utimeutimepath	_p_existsexists
_p_getsizegetsize_p_isdirisdir	smb_nwa_2_p_joinjoin_is_in_file_jailisInFileJail_disarmnextiintsmb_portSimpleSMBServersetAuthCallback_auth_cbsmbwaddSharesetSMB2Supportsmb1acctitemsaddCredentialrangerandomrandintsetSMBChallengesrvstop)selfr.   r   lgrr   r   r   mfosr*   fopipportrx   tronamepwduplmhashnthashchichas                           r    __init__zSMB.__init__   s9   HH	HH	77
YY^^
		&	
TYY%5%5GMM7<<H3 	MA##A&CLL$))//w||L	M
	*D  	AQA/	
 KK	mmKK	::\\
\\
::\\
KK		 !! 	AQ 34	
 ^^
ooMM		yy""||CH "&!6!6	:diikk:DAHHUNPQRB499%%&''bT'J	"yy##DMM2 YY^^TS#+tyy~~-.--/ 	8ID#sCj1 81'*'*!!!Q78	8 05Qx8!v~~a%88gg37axq)78C HH	+222t<=]  	34 PA!((68U+,HHQK	".	"DIDJ]AHHUAq! 97sC   $S U5%U'U V	/VA-U
UUU%Vc                 *    | j                  d||       y )Nr   )r1   )rz   msgcs      r    nlogzSMB.nlog{   s    Q    c                 D    t        | j                  j                  d       y )Nsmbd)r   rx   start)rz   s    r    r   z	SMB.start~   s    txx~~v&r   c                 l   t        d||       |d   }|d   }|r|d   nd}| j                  j                  j                  ||      xs d}|j                  dd      xs d}|d   }|d   }|dk7  r||d<   t	        d	|||       y |dk7  rt	        d
|||       y |rt	        d||       y t	        d||       y )Nzauth-result: %s %sconnDataAuthenticated	user_name*	partygoerClientIP	host_namezclient %s [%s] authed as %sz%client %s [%s] keeping old auth as %sz#client %s [%s] authed as [*] (anon)zclient %s [%s] rejected)debugr0   iacctgetinfo)	rz   akaconndataauth_okunameoldnamecli_ipcli_hns	            r    rl   zSMB._auth_cb   s    "Ar*j>?+#*;		##E518S,,{C07C*%KC<$)H[!.F^8&&'R6G*FF;r   c                    | j                   rt        S | j                  j                  sy	 t	        j
                         j                  j                  }|j                  }t        d      D ](  }|j                  }d|v r
|d   d   c S |j                  }* t               #  t        dj                  j                  |j                  j                  j                  |j                  j                  j                  j                  |j                  j                  j                  j                  j                         Y yxY w)Nr   r"   r   r   z$nyoron... %s <<-- %s <<-- %s <<-- %s)r4   r   r0   rq   inspectcurrentframef_backrt   f_locals	Exceptionwarningf_codeco_name)rz   cf0cfncls        r    _unamez
SMB._uname   s    ::  yy~~	 &&(//66CB1X [[#j>+66YY	
 +	6

""

!!))

!!((00

!!((//77 s   AB B BD>r-   Nr   permsc                Z   |j                  dd      j                  d      }|s| j                         }|sddg}t        d||t	        |      ||        | j
                  j                  j                  ||g| \  }}|j                  st        d      |t        |j                  |      fS )N\r(   Tz%s("%s", %s) %s @%s[K[0munmapped vfs)replacelstripr   r   strr0   vfsr   realpathr   r   )rz   callervpathr   r   r   r   rems           r    _v2azSMB._v2a   s     dC(//4 KKME4LE0&%QPUV$499==$$UE:E:S||N++E#,,,,,r   c                 \   |j                  dd      j                  d      }| j                         }| j                  j                  j                  ||dd      \  }}|j                  st        d      |j                  ||| j                  j                   ddgg      \  }}}	|D 
cg c]*  }
t        j                  |
d   j                        s&|
d   , }}
|D 
cg c]  }
|
d   |vs|
d    }}
t        |	j                               |z   |z   }| j                  j                   r|S g }d}t#        |      D ]f  \  }}|dk\  rd	}t%        ||t'        |      ||        |S t'        |j)                  d
d            }|dz   dz  dz  }|d|z   z  }|j+                  |       h |S c c}
w c c}
w )Nr   r(   Fr   r   r      i   zMlisting only %d of %d files (%d byte) in /%s for performance; see --smb-nwa-1zutf-16r      r+   h   )r   r   r   r0   r   r   r   r   lsr/   
no_scandirrU   S_ISDIRst_modelistkeys	smb_nwa_1	enumerater   lenencodeappend)rz   r   r   r   r   r   r   _vfs_lsvfs_virtr   dirsfilsr   retszr   fnr   nszs                       r    rJ   zSMB._listdir   s   dC(//499==$$UE5%@S||N++!ffDII000E5>2B
68 %CQqT\\(B!CC$9!D(8!99(--/"T)D099I r] 		EArU{c1c"gr51 
 bii)45C!G>Q&C#)OBJJrN		 
) D9s   ('F$F$F)*F)i  )chmodc                   t         j                  }t        r|t         j                  z  }||k7  }|r$| j                  j
                  st        d|z          | j                         } | j                  d|g||d|gd\  }	}
|r|	j                  j                  s'd}t        ||	j                  j                  ||fz         t        |
      }
|	j                  j                  d      }|rWt        | j                  d | j                   j"                  d||
|dddd	d	d
t%        j$                         d      st        d|       t'        j(                  |
|g|d|i|}|rt%        j$                         }t+        | j,                        }|dkD  rt/        | j,                  j1                         D cg c]  }|d	   	 c}      }|||z
  dz  z   }| j,                  j3                         D ci c]  \  }}|d	   |kD  s|| c}}| _        t5        d|t+        | j,                               |j7                  dd      j9                  d      }||f| j,                  |<   |S c c}w c c}}w )Nzblocked write (no --smbw): rO   Tr   (blocked write (no-write-acc %s): /%s @%sxbuzxbu.smbr-   r   1.7.6.2zblocked by xbu server config: modei(#     zwas tracking %d files, now %dr   r(   )rD   O_RDONLYr   O_BINARYr/   rm   yeetr   r   axsuwriter   flagsr   r   r   r.   up2ktimer
   rO   r   r2   minvaluesrr   r   r   r   )rz   r   r   r   r   r   f_rowrr   r   apr   r   r   nownfr   oldestcutoffr*   vs                        r    rN   z	SMB._open   s    {{BKKDd]diinn.67$))FEMAMU4*MR77>>>Q#''..%778B))--&C7				" 5BChhr571757B7))+CTZZBDyDJJ,=,=,?@qad@A3<1"44/3zz/?/?/AStq!QqTF]adS
4b#djj/JMM$,33C8E"ElDJJsO
 ASs   -I(I 9I c           
      2   t        j                  |       || j                  vry | j                  j                  |      \  }}t         j                  j                  |      \  }}| j                  j                  j                  j                  || j                         dd      \  }}|j                  |      \  }}| j                  j                  j                  |j                  |j                  |j                   ||dt#        j"                         d       y )NFTr   r-   )rD   rI   r2   poprY   splitr.   r0   r   r   r   get_dbvr   	hash_filer   r   r   r   )rz   fdr   vpr   r   r   s          r    rH   z
SMB._close  s    
TZZ

r"2r"B88==$$((T[[]E4HS;;s#SLLIIIIIIK		
r   c                    | j                   j                  st        d|z          |j                  d      }|j                  d      }| j	                         }| j                  d|||      \  }}|j                  j                  s'd}t        ||j                  j                  ||fz         | j                  j                  j                  ||ddd      \  }}|j                  j                  s'd}t        ||j                  j                  ||fz         | j                  j                  j                  |d||       	 t        j                   ||j"                  	       y #  Y y xY w)
Nzblocked rename (no --smbw): r(   rS   r   r   Tz(blocked rename (no-move-acc %s): /%s @%sr   )vf)r/   rm   r   r   r   r   r   r   r0   r   r   umover.   r   	handle_mvr
   makedirsr   )	rz   vp1vp2r   vfs2ap2r   vfs1r   s	            r    rR   zSMB._rename,  s   yy~~/#56jjojjoIIhSI>	cxx:AdhhoosE223))--##CdDAaxx~~:Adhhnnc5112y#s;	LL,	s   >!E   E$c                 X   | j                   j                  st        d|z          | j                         }| j	                  d||      \  }}|j
                  j                  s'd}t        ||j
                  j                  ||fz         t        j                  ||j                  d         S )Nzblocked mkdir (no --smbw): rM   r   z(blocked mkdir (no-write-acc %s): /%s @%schmod_d)
r/   rm   r   r   r   r   r   r
   rM   r   )rz   r   r   r   r   r   s         r    rL   z
SMB._mkdirD  s    yy~~.67))GU%)8Rww~~:AcggnneU334yySYYy122r   c                     	  | j                   d|g|dddgid   }t        j                  |g|i |}|S #  t        t	        j                               }t        j                  ddddddd	|||f
      cY S xY w)
NrU   r   TFr   iA  i  r+   )r   r
   rU   rh   r   rD   stat_result)rz   r   r   r   r   r   tss          r    rT   z	SMB._statP  s    		Q65B1BT5MB1EB((2((R(CJ	Q TYY[!B>>5"b!T4BB"OPPs	   69 >A9c                    | j                   j                  st        d|z          | j                         }| j	                  d||g d      \  }}|j
                  j                  st        d|z          |j                  dd      j                  d      }| j                  j                  j                  |d|gg d	d	       y )
Nzblocked delete (no --smbw): delete)TFFTr   zblocked delete (no-del-acc): r   r(   r   F)r/   rm   r   r   r   r   udelr   r   r.   r   	handle_rm)rz   r   r   r   r   s        r    rP   zSMB._unlink\  s    yy~~/%78 ))e50J  
R ww||0589dC(//4y5'2ueLr   c                 >   | j                   j                  st        d|z          | j                         }| j	                  d||      \  }}|j
                  j                  s'd}t        ||j
                  j                  ||fz         t        j                  ||      S )Nzblocked utime (no --smbw): rX   r   z(blocked utime (no-write-acc %s): /%s @%s)	r/   rm   r   r   r   r   r   r
   rX   )rz   r   timesr   r   r   r   s          r    rW   z
SMB._utimek  s{    yy~~.67))GU%)8Rww~~:AcggnneU334yyU##r   c                 p    	 | j                  d|ddg      d   }t        j                  |       y#  Y yxY w)Nzp.existsTFr   r   )r   r
   rU   )rz   r   r   s      r    rZ   zSMB._p_existsw  s<    	:uT5MB1EBHHRL	s   .1 5c                 r    t        j                  | j                  d|ddg      d         }|j                  S )Nz	p.getsizeTFr  r   )r
   rU   r   st_size)rz   r   sts      r    r\   zSMB._p_getsize  s2    XXdiiU4-iHKLzzr   c                     	 t        j                  | j                  d|ddg      d         }t        j                  |j                        }|S #  Y yxY w)Nzp.isdirTFr  r   )r
   rU   r   r   r   )rz   r   r  r   s       r    r^   zSMB._p_isdir  sN    	$))IuT5M)J1MNB,,rzz*CJ	s   AA Ac                 ^    t        j                  j                  | }|j                  dd      S )N".)rD   rY   rb   r   )rz   r   r   s      r    ra   zSMB._p_join  s'     ggllA{{3$$r   c                     t        j                         j                  j                  j                  }t        d||       t        d      )Nz[31m%s:hook(%s)[0mnope)r   r   r   r   r   errorr   )rz   r   r   srcs       r    _hookz	SMB._hook  s:    ""$++22::*C3r   c                 F   ddl m} | 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                  |j                  j                  _        | j                  |j                  j                  _        | j                  |j                  j                  _        | j                  |j                  j                  _        | j                  |j                  j                  _        y )Nr   r   )r   r   r   rD   r   chown	ftruncatelchownlinklstatr   scandirsymlinktruncatewalkrY   abspath
expanduser
expandvarsgetatimegetctimegetmtimeisabsisfileislinkr   )rz   r   s     r    re   zSMB._disarm  s   &!ZZ	!ZZ	!%	"jj	 JJ	!ZZ	#zz	#zz	#zz	 $

	 JJ	$(JJ	!'+zz	$'+zz	$%)ZZ	"%)ZZ	"%)ZZ	""&**	#'::	 #'::	 %)ZZ	"r   c                      y)NTr   )rz   r   s     r    rc   zSMB._is_in_file_jail  s    r   )r   )__name__
__module____qualname__r   r   r   rl   r   r   rJ   rN   rH   rR   rL   rT   rP   rW   rZ   r\   r^   ra   r   re   rc   r   r   r    r   r      s}    _>B '<&8 +-D-$D -24l
(0
3
QM
$	% 
04r   r   c                 .    t        |        t        |       )N)r   r   )r   s    r    r   r     s    I
C.r   )#r   r9   rD   ru   rU   rA   r   typesr   r   r   r   r   authsrvr   r	   r
   utilr   r   r   r   r   r   svchubr   r<   r6   r   r   r   r  objectr   r   r   r   r    <module>r>     s      	   
  ! 0 0 '  @ @ Wu!xx"**bhhG tWe]& ]@r   