
    h                       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
Z
d dlZd dlZd dlm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mZ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+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 e!rd dl9Z9erdd
l:m;Z; ddl<m=Z= ddl>m?Z? ere@ZAdZBdZCdZDdj                  eC      ZFdj                  eC      ZGdj                  eG      ZH ej                  d      ZJ ej                  d      ZK ej                  d      ZL G d deM      ZN G d deO      ZP G d deO      ZQ G d deO      ZRer ej                  d      ZSn ej                  d      ZS G d d eO      ZTd! ZUd" ZVd# ZWy)$    )print_functionunicode_literalsN)datetime   )ANYWINPY2TYPE_CHECKINGWINDOWSE)bos)	flagdescs	permdescsvf_bmapvf_cmapvf_vmap)PWHash)DEF_MTEDEF_MTHEXTSHAVE_SQLITE3IMPLICATIONSMIMES
SQLITE_VERUNPLICATIONSUTCODictPebkacabsrealafsencget_df	humansize	json_hescmin_exodfusion	read_utf8relchkstatdirub64encuncygundot
unhumanizevjoinvsplit)BrokerMp)	BrokerThr)	BrokerClileeloo_dallaszsee log for detailsz (see serverlog for details)z ({})zinvalid config; {}z\$\{u(%[+-][^}]+)\}z\$\{g(%[+-][^}]+)\}z(\${[ug][}%])c                       e Zd Zy)CfgExN)__name__
__module____qualname__     F/jellyfin/media/venv/lib/python3.12/site-packages/copyparty/authsrv.pyr3   r3   b   s    r8   r3   c                   ,    e Zd Z	 	 	 	 	 	 	 	 	 ddZd Zy)AXSNc
                 l   t        |xs g       | _        t        |xs g       | _        t        |xs g       | _        t        |xs g       | _        t        |xs g       | _        t        |xs g       | _        t        |xs g       | _        t        |xs g       | _        t        |	xs g       | _	        y N)
setureaduwriteumoveudelugetupgetuhtmluadminudot)
selfr?   r@   rA   rB   rC   rD   rE   rF   rG   s
             r9   __init__zAXS.__init__g   s     %+2&
6<R(%+2&
_	_	%+2&
%+2&
6<R(_	r8   c                 `     dj                         }ddj                   fd|D              dS )Nz4uread uwrite umove udel uget upget uhtml uadmin udotzAXS(, c              3   F   K   | ]  }|d j                   |     yw=N__dict__.0krH   s     r9   	<genexpr>zAXS.__repr__.<locals>.<genexpr>   s     %R!DMM!4D&E%R   !))splitjoin)rH   kss   ` r9   __repr__zAXS.__repr__}   s)    CIIK II%Rr%RRTTr8   )	NNNNNNNNN)r4   r5   r6   rI   rZ   r7   r8   r9   r;   r;   f   s*     %,Ur8   r;   c                   p    e Zd Zd ZddZd Z	 	 	 ddZd Z	 ddZddZ	d	 Z
d
 Zd Zd Zd Zd Zd Zy)Limc                    || _         d | _        d| _        dx| _        | _        d| _        i | _        i | _        i | _        d| _	        d| _
        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        t1        j2                  d      | _        y )N  Fr    )log_funcregchmod_duidgidchownnupsbupsbupcnosubdfldftdfvvbmaxvnmaxsminsmaxbwinbmaxnwinnmaxrotnrotlrotfrecompilerot_re)rH   ra   s     r9   rI   zLim.__init__   s       48
			


									jjnr8   c                 D    | j                   r| j                  d||       y y )Nzup-limra   rH   msgcs      r9   logzLim.log   s    ==MM(C+ r8   c                     || _         t        j                  |      j                  dd      j                  dd      }t        j                  dd|      }t        j
                  d|z   dz         | _        y )	Nz%Yz[0-9]{4}z%jz[0-9]{3}z
%[mdHMSWU]z[0-9]{2}z(^|/)$)rx   ry   escapereplacesubrz   r{   )rH   fmtrs      r9   set_rotfzLim.set_rotf   s[    	IIcN""44<<T:NFF<Q/jj1s!23r8   Nc	                    || j                   || _         d| _        | j                  |       | j                  |       | j	                  |       |dk7  r| j                  |       nd}| j                  ||||       | j                  ||       | j                  |      \  }	}
||	k(  r|	|fS |	|rdj                  ||
      fS |
fS )Nr   r_   {}/{})
rb   rl   chk_nupchk_bupchk_remchk_szchk_vszchk_dfrotformat)rH   ipremszptopabspathbrokerrb   	volgetterap2vp2s              r9   allzLim.all   s     ?txx/DHDHRRS8KKOBVT2y1GR 88G$Sc>8OW^^C->>#>>r8   c                     || j                   k  rt        dd      | j                  r|| j                  kD  rt        dd      y y )N  zfile too smallzfile too big)rp   r   rq   )rH   r   s     r9   r   z
Lim.chk_sz   s@    		>.//99diin-- (9r8   c                 0   |r| j                   | j                  z   sy |j                  ||      }|j                         \  }}| j                   r| j                   ||z   k  rt	        dd      | j                  r| j                  |dz   k  rt	        dd      y y )Nr   zvolume has exceeded max sizer   z!volume has exceeded max num.files)rn   ro   askgetr   )rH   r   r   r   r   xnbytesnfiless           r9   r   zLim.chk_vsz   s     TZZ$**4JJy$'::$**v{2<==::$**vz1ABB 2:r8   c           
         | j                   sy | j                  t        j                         k  rt        t        j                               dz   | _        t	        |d      \  }}}|r!d}| j                  |||fz  d       d| _        n|xs d| _        | j                  r#t        | j                  j                               ng D ]E  }| xj                  t        |d   t        |d         xs d	z  t        |d
         z        z  c_        G |rd}| j                  |z
  | j                   k  rt        | j                  t        t        j                               dz         | _        d}t        d|j                  t        | j                  | j                   z
        t        |                  | xj                  t        |      z  c_        y )Ni,  Tz*failed to read disk space usage for %r: %s   l   *UU* r   sizehash  need
   z$server HDD is full; {} free, need {}  )rk   rl   timeintr    r   rm   rb   listvalueslenminr   r   r!   )	rH   r   r   already_writtendfduerrtjs	            r9   r   z
Lim.chk_df   s]   xx88diik!499;'#-DH $/KBC@gs^+Q/&704T$((//+,b VC&	S6^-Bs Cc!F)n TUUV 88b=488#488S%5%:;DH6AahhyDHH1D'EyQS}UVVCGr8   c                 :    | j                   r|rt        dd      y y )Nr   zno subdirectories allowed)rj   r   )rH   r   s     r9   r   zLim.chk_rem  s     ::#9:: :r8   c                    | j                   s| j                  s|dfS | j                   r|j                  d      }| j                  j	                  |j                  dd            r|dfS t        j                  t              j                  | j                         }|r|dz  }||z   |fS | j                  || j                        }|st        dd      |t        |      d  j                  d      j                  dd      }||fS )Nr`   z/\\/r   zno available slots in volume)rx   rv   rstripr{   searchr   r   nowr   strftimediverw   r   r   strip)rH   pathsufretds        r9   r   zLim.rot	  s    yy8O99;;u%D{{!!$,,tS"9:Rx,,s#,,TYY7C#:s?"iidii(<==D	""5)11$<Avr8   c                 l   t        j                  |      }|st        |      | j                  k\  rd S dS |D cg c]#  }|st	        d |D              st        |      % }}|j                          |sxt        j                  j                  |d      }t        j                  || j                         | j                  rXt        j                  || j                  | j                         n,t        j                  j                  |t        |d               }| j!                  ||dz
        }| t        j                  j                  ||      S t        |      | j                  k\  ry t        j                  j                  |t        |d   dz               }t        j                  || j                         | j                  r+t        j                  || j                  | j                         | j!                  ||dz
        }|t#        dd      t        j                  j                  ||      S c c}w )Nr`   c              3   $   K   | ]  }|d v  
 yw)
1234567890Nr7   )rR   ys     r9   rT   zLim.dive.<locals>.<genexpr>&  s     2P13D2Ps   0r_   r   r   zrotation bug)r   listdirr   rv   r   r   sortosr   rX   mkdirrc   rf   rd   re   strr   r   )rH   r   lvsitemsr   dirsr   r   s           r9   r   zLim.dive  s   D!u:24:: %Q1s2Pa2P/PAQQ		'',,tS)CIIc4<<(zzdhh1 '',,tSb]3CiiS1W%?77<<S))t9		! ggll4T"X\!23		#t||$::HHS$((DHH-iiS1W%;n--ww||C%%= Rs   H1 H1H1c                     	 | j                   |   j                  t        j                                y #  t        j                         g| j                   |<   Y y xY wr=   )rg   appendr   )rH   r   s     r9   nupzLim.nupF  s?    	*IIbM  -	*!YY[MDIIbMs	   03 $Ac                     t        j                          |f}	 | j                  |   j                  |       | j                  |xx   |z  cc<   y #  |g| j                  |<   || j                  |<   Y y xY wr=   )r   rh   r   ri   )rH   r   r   vs       r9   bupzLim.bupL  sb    YY[&!	#IIbM  #IIbMV#M	#CDIIbM"DIIbMs   5A !A1c                 .   | j                   r|| j                  vry | j                  |   }t        j                         | j                  z
  }|r$|d   |k  r|j	                  d       |r	|d   |k  rt        |      | j                   k\  rt        dd      y )Nr     ztoo many uploads)ru   rg   r   rt   popr   r   )rH   r   rg   cutoffs       r9   r   zLim.chk_nupU  s    yyBdii/yy}tyy(tAw'HHQK tAw' t9		!011 "r8   c                 p   | j                   r|| j                  vry | j                  |   }t        j                         | j                  z
  }| j                  |   }|r0|d   d   |k  r%||j                  d      d   z  }|r|d   d   |k  r%|| j                  |<   || j                   k\  rt        dd      y )Nr   r   r   zupload size limit exceeded)rs   rh   r   rr   ri   r   r   )rH   r   rh   r   marks        r9   r   zLim.chk_bupa  s    yyBdii/yy}tyy(yy}tAwqzF*DHHQKN"D tAwqzF* 		"499:;; r8   r   )NNup2k.get_volsize)r   F)r4   r5   r6   rI   r   r   r   r   r   r   r   r   r   r   r   r   r   r7   r8   r9   r\   r\      s\     %D,4 '?@. (C&8;,%&N*#
2<r8   r\   c                       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dZd Zd ZddZd Zd Z	 	 ddZ	 	 ddZ	 ddZ	 ddZddZd Zy)VFSzsingle level in the virtual fsc                    || _         || _        || _        || _        || _        || _        | | _        d| _        i | _        i | _	        i | _
        d | _        d | _        d | _        t               | _        d| _        g | _        i | _        i | _        i | _        i | _        i | _        i | _        i | _        i | _        i | _        i | _        d| _        i | _        i | _        |r||j?                  t@        jB                        rdnt@        jB                  z   }||rdndz   }t@        jD                  jG                  |d      | _$        | jH                  | _%        | | j:                  |<   | | j<                  |<   || gfg| _&        || fg| _'        ndx| _$        | _%        g | _&        g | _'        | jP                  | _)        | jT                  | _+        y )Nr   r`   r   .hist),r   realpathvpathvpath0axsflagsrootdevnodeshisttabdbpathsdbvlimshr_srcr>   	shr_files	shr_ownershr_all_apsareadawriteamoveadelagetapgetahtmlaadminadotjs_lsjs_htmall_vols	all_nodesendswithr   sepr   rX   histpathdbpathall_apsall_vps_get_dbvget_dbv_lsls)	rH   r   r   r   r   r   r   rpvps	            r9   rI   zVFS.__init__s  s     

	
%

		

	
8#4#4RVV#<R"&&IB#B/BGGLL7;DM--DK#'DMM% $(DNN5!$L>DLJ<DL*,,DMDKDLDL}}((r8   c                 Z     ddj                   fddj                         D              z  S )NzVFS(%s)rK   c              3   F   K   | ]  }|d j                   |     ywrM   rO   rQ   s     r9   rT   zVFS.__repr__.<locals>.<genexpr>  s'       dmmA./rU   zrealpath vpath axs flags)rX   rW   rH   s   `r9   rZ   zVFS.__repr__  s2    II 399; 
 	
r8   c                    | || j                   <   | j                  r| || j                   <   | j                  j                  t        j                        rdnt        j                  z  | j                   | j                   rdndz   }t        fd|D        d       }|r|j                  |        n|j                  | gf       |j                  || f       | j                  j                         D ]  }|j                  ||||        y )Nr`   r   c              3   :   K   | ]  }|d    k(  s|d     yw)r   r   Nr7   )rR   r   r  s     r9   rT   z#VFS.get_all_vols.<locals>.<genexpr>  s     8QqTRZ!8s   
)
r   r   r  r   r  nextr   r   r   get_all_vols)	rH   volsr   apsvpsr  hitr   r  s	           @r9   r  zVFS.get_all_vols  s     !djj==#DBBFF+"7Bdjjsb9B8c8$?C

4 

B<(JJDz"""$ 	2ANN4S1	2r8   c           
      l   |dk(  s|j                  d      rJ |j                  d      rJ d|v rJ|j                  dd      \  }}|j                  dd      \  }}|| j                  v r | j                  |   j                  |||      S t	        | j
                  | j                  r*t        j                  j                  | j                  |      nddj                  | j                  |      j                  d      dj                  | j                  |      j                  d      | j                  | j                  |            }| j                   xs | |_        || j                  |<   |j                  |||      S || j                  v r| j                  |   S dj                  | j                  |      j                  d      }dj                  | j                  |      j                  d      }t	        | j
                  |||t#               i       }| j                   xs | |_        || j                  |<   |S )z(get existing, or add new path to the vfsr   r   r`   r   )r  rW   r   addr   r   r   r   r   rX   r   r   lstripr   r   _copy_flagsr   r;   )	rH   srcdstdst0namename0vnr  vp0s	            r9   r  zVFS.add  s   czc!222<<$$$#:		#q)ID#**S!,KE4tzz!zz$'++Cd;;59]]T]]D1tzz4077<t{{E299#>  &B XX%BF!DJJt66#sD))$**::c?" ^^DJJ,33C8nnT[[$/66s;3C3!T

3	r8   c                 L   | j                   j                         D ci c]  \  }}||
 }}}|j                  d      }|re|dk7  r`dj                  |j	                  d      |      }t
        j                  j                  t
        j                  j                  |            |d<   |j                  d      }|re|dk7  r`dj                  |j	                  d      |      }t
        j                  j                  t
        j                  j                  |            |d<   |S c c}}w )Nhist-r   r   r  )	r   r   r   r   r   r   r   
expandvars
expanduser)rH   r#  rS   r   r   r(  zsdbps           r9   r  zVFS._copy_flags  s    "&**"2"2"45$!QA55yy DCKC 0$7BGG..rww/A/A"/EFE&Mii!3#:

36B gg001C1CB1GHE(O 6s   D c                     | j                   r@| j                   j                  j                         D ]  \  }}|dvs|| j                  |<    | j                  j	                         D ]  }|j                           y )N)r(  r  )r   r   r   r   r   bubble_flags)rH   rS   r   ns       r9   r/  zVFS.bubble_flags  sk    88,,. &1..$%DJJqM& ""$ 	ANN	r8   c                     |s| dfS d|v r|j                  dd      \  }}n|}d}|| j                  v r| j                  |   j                  |      S | |fS )zreturn [vfs,remainder]r`   r   r   )rW   r   _find)rH   r   r#  r   s       r9   r2  z	VFS._find  sc    8O%<C+ID#DC4::::d#))#..U{r8   c           	      2   |r| j                  t        |            \  }}n| }|j                  }||j                  v ||j                  v ||j
                  v ||j                  v ||j                  v ||j                  v ||j                  v ||j                  v fS )z.can Read,Write,Move,Delete,Get,Upget,Admin,Dot)r2  r*   r   r?   r@   rA   rB   rC   rD   rF   rG   )rH   r   unamer%  _r   s         r9   
can_accesszVFS.can_access  s     JJuU|,EBBFFQWWQXXQWWQVVOQVVOQWWQXXQVVO	
 		
r8   c                     | j                  ||      }dj                  d t        d|      D              }d|v r	d|v r|dz  }|S )Nr`   c              3   ,   K   | ]  \  }}|s	|  y wr=   r7   )rR   choks      r9   rT   z VFS.get_perms.<locals>.<genexpr>0  s     BVRrbBs   
zrwmdgGa.rwmdza.A)r6  rX   zip)rH   r   r4  zblr   s        r9   	get_permszVFS.get_perms.  sH    ooeU+ggBs:s';BBS=TS[3JC
r8   c	           
      h   t        |      r/| j                  r| j                  dd|d|       t        d      t        |      }	| j	                  |	      \  }
}|
j
                  }||j                  df||j                  df||j                  df||j                  df||j                  d	ffD ]  \  }}}|s
||vs|t        k7  s||	k7  r?|d
k7  r:| j                  r.|
j                  |      }d}| j                  d|||||	|fz  d       d}t        |||d|	z   d|
j                  z   fz         |
|fS )zDreturns [vfsnode,fs_remainder] if user has the requested permissionsvfszinvalid relpath z @i  readwritemovedeleter   .z%s has no %s in %r => %r => %r   z*you don't have %s-access in %r or below %rr   )r&   r   r   r*   r2  r   r?   r@   rA   rB   rC   LEELOO_DALLAS	canonicalr   )rH   r   r4  	will_read
will_write	will_movewill_delwill_getr   cvpathr%  r   r   reqr   r   apr   s                     r9   r   zVFS.get5  sA    %=xxE5 IJ+u**V$CVV (7+(qvvx(qvvu%
 	KKCC uA~%=*@F?u|c*B8AHHUAUFB(G$GK@S!sC&L#.&I"IJJ	K  3wr8   c                     | j                   }|s| j                  |      S |\  }}|j                  t        ||            S r=   )r   r  r,   )rH   vremr   shvsrems        r9   _get_share_srczVFS._get_share_src\  s<    ll==&&	T||E$-..r8   c                     | j                   }|s| |fS t        | j                  t        |j                        d  j	                  d      |      }||fS Nr   )r   r,   r   r   r  )rH   rS  r   s      r9   r  zVFS._get_dbvd  sM    hh:TZZCII 0188=tDDyr8   c                 L    | j                   }|r|d|z   z  }|rt        |      S |S )z<returns the canonical path (fully-resolved absolute fs path)r   )r   r   )rH   r   resolverQ  s       r9   rI  zVFS.canonicall  s,    ]]#)OB%wr{-2-r8   c                     | j                   }|r|d|z   z  }t        j                  j                  |      \  }}t        j                  j	                  t        |      |      S )z-resolves until the final component (filename)r   )r   r   r   rW   rX   r   )rH   r   rQ  adfns        r9   
dcanonicalzVFS.dcanonicalt  sJ    ]]#)OBr"Bww||GBK,,r8   c                     t        dd      )Nr   znope.avi)r   )rH   akas      r9   _ls_nopezVFS._ls_nope}  s     S*%%r8   c                     | j                   \  }}|j                  |d||||      \  }}	}
|	D cg c]3  }t        j                  j	                  |d         | j
                  v s2|5 }	}||	i fS c c}w )z@replaces _ls for certain shares (single-file, or file selection)
r   )r   r  r   r   basenamer   )rH   r   r4  scandirpermsetslstatthrowr%  r   realr5  r   s               r9   _ls_shrzVFS._ls_shr  st     ,,C55dGXueLqLa277#3#3AaD#9T^^#KLLb   Ms   3A-"A-c           	         i }| j                  |      }t        t        | j                  ||||            }	|	j	                          |s|	D 
cg c]  }
|
d   | j
                  vs|
 }	}
| j                  xs | }t        | j
                  j                               D ]  \  }}|j                  |k(  r!| j                  j                  d      r|||<   6d}|j                  }|j                  |j                  |j                  |j                  |j                   g}|D ]&  }d}t#        ||      D ]  \  }}|s	||vsd} |s& n |s|||<    d|v rxt$        r|j'                  dd      n|}|j)                  d      r%|	D 
cg c]  }
|
d   j+                  d	      r|
 }	}
n(d
|v r$|	D 
cg c]  }
|
d   j)                  d      r|
 }	}
||	|fS c c}
w c c}
w c c}
w )z5return user-readable [fsdir,real,virt] items at vpathr   dkFTr   r   r   z/.histzup2k.z
/.hist/th/zdir.txt)rI  r   r'   r   r   r   r   sortedr   r   r   r   r?   r@   rA   rB   rC   r=  r
   r   r  
startswith)rH   r   r4  rf  rg  rh  ri  virt_visr   rj  r   r   r#  vn2r:  zxr   psetrP  lstps                        r9   r  zVFS._ls  s    ..%GDHHguguEF		#>!qt4::'=A>D>(("dC#DJJ$4$4$67 )	c77c>djjnnT&:%(HTNWWxxBHHbggrwwG$ DB$'cN 'S5#3!&B'  %(HTN#)& g.5c*7Azz(##'Haqtw/GHH"#'Haqt}}Y/GHHh&&; ?2 IHs$   G$GGG+GGc
              #     K   | j                  |||||      \  }
}}| j                  |      \  }}|rV|
j                  |d         r|
|d   k(  r:|
|v r6| j                  r)d}| j                  d||d   |
| j                  |fz  d       yd| j
                  v sd| j
                  v rg }|D ]g  }t        t        j                  j                  |
|d	               }| j                  |      }|r|j                  d
|dd      rW|j                  |       i |D cg c]  }|j                  |       }}|xr |dk(  xs ||j                  j                  v }|s|D cg c]  }dd|d	   z   vs| }}|dd |
gz   }|D cg c]'  }t!        j"                  |d   j$                        r&|) }}|D cg c]'  }t!        j"                  |d   j$                        s&|) }}|j'                          |j'                          ||||
|||f |D ]i  \  }}|s|j                  d      r|dz   |z   j)                  d      }|dz   |z   j)                  d      }| j+                  |||||||||		      D ]  }|  k |	syt-        |j/                               D ]Q  \  }}|s|j                  d      r|dz   |z   j)                  d      }|j+                  |d
||||||      D ]  }|  S yc c}w c c}w c c}w c c}w w)aC  
        recursively yields from ./rem;
        rel is a unix-style user-defined vpath (not vfs-related)

        NOTE: don't invoke this function from a dbv; subvols are only
          descended into if rem is blank due to the _ls `if not rem:`
          which intention is to prevent unintended access to subvols
        )rh  r_   z@bailing from symlink loop,
  prev: %r
  curr: %r
  from: %r / %rzvfs.walkr   Nxdevxvolr   r`   TF   z/.r   r   rF  )r  r  ro  r   r   r   r   r   r   rX   chk_apr   r   remover   rG   statS_ISDIRst_moder   r  walkrn  r   )rH   relr   seenr4  rg  wantdotsrf  rh  subvolsfsrootvfs_lsvfs_virtr   rS  r   rm1lerQ  rq  r   r5  dots_okrfilesrdirsrdirwrelwremr0  rA  s                                 r9   r  zVFS.walk  s    B $(773wPU7#V LL%	T &&tBx0Fd2h4F$xxYQ$r(FDJJ)L%LaPTZZ6TZZ#7C #RWW\\&"Q%89kk"o#''"eT5"AJJrN	#
 ,//aq!/A/GA F#'',,1F!'BA4sQqTz+AaBFBAw&!#F4<<!+E!FF"Aqdll1Q4<<&@AA 	

4ffeX== 		GD!ts3#I$,,S1D#I$,,S1DYYdD%8WeW  		 X^^-. 	FAsq||C0#IM))#.DXXb$x7E  	? 0 C GAsO   C=K; K;K'/+K;K,*K,.K;='K1%K1)K;/'K6K6D K;c              #     K   |s|sdn&|j                  d      d   j                  d      xs d}| j                  ||g |ddggd|d      }	|	D ]N  \  }
}
}}}}}|r|D cg c]  }|d	   |v s| }}|D cg c]  }|d	   |vs| }}|D cg c]  }|j                  |       }
}|j	                         D cg c]	  }||vs| }}|D cg c]  }|j                  |       }
}t               }|D cg c]  }|d	   	 }}|r|D cg c]
  }|dz   |z    c}n|}|D cg c]"  }t        j                  j                  ||      $ }}t        t        |||            }|D cg c]  \  }}}|||d   d
 c}}}D ]  }|  |s?t        t        j                               }t        j                  ddddddd|||f
      }|D cg c]  }|d	   	 }}|D cg c]  }|d   	 }}|t        |j	                               z  }||gt        |      z  z  }|r|D cg c]
  }|dz   |z    c}n|}|D cg c]"  }t        j                  j                  ||      $ }}t        t        |||            }|D cg c]  \  }}}|||d
 c}}}D ]  }|  Q y 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 c c}w c c}w c c}w c c}w c c}}}w w)Nr`   r   r_   rF  topTFr   r   )r  rQ  stiA  i     )rW   r  r  r{  keysr   r>   r   r   rX   r   r=  r   r   stat_resultr   ) rH   r   rS  fltr4  r   rf  wrapfoldergr5  apathfilesrdvdr   r  rm2r0  fnamesvpathsapathsr   r   r`  ftsr  dnamesdstatsret2r   s                                    r9   zipgenz
VFS.zipgen  s     $U[[-=b-A-H-H-M-VQVIIfdBu7ER12 "	-Aq%r2$)9qQqTS[99"$8Q!Cq88+./aRYYq\//"$'')<Qq|q<<(+,1RVVAY,,e %**qad*F*:?v6!eckAo6VF6<=bggll5!,=F=s66512CDGHHAqQaqt4H  TYY[!BB4q"b" MNB$&'qad'F'$&'qad'F'd2779o%FrdSWn$F:?v6!eckAo6VF6<=bggll5!,=F=FFF34DAEFFgaAQaq1F C"	98/<,
 +6= I (' 7=Fs   AK*J ,J 0K*6J%J%K*J*%K*9	J/J/K*J4%K*5J9K*	J>	K*!'KK*&K
:AK*KK*K*6K* K/	K*8'KK*=K#
AK*Nc                 &   |t         j                  z   }d| j                  v rt        s|s7t        r|j	                  dd      n|}|r	 t        j                  |      }	 |sJ | j                  }|s0t        j                  | j                        j                  x}| _        ||j                  k7  r=| j                  r0d}| j                  d||| j                  |j                  |fz  d       y d	| j                  v rq| j                  xs | j                  j                  }|D ]%  \  }}	|j                  |      s| |	v r| c S |	d   c S  | j                  r| j                  dd
|d       y | S #  d|vr |j                  dd      d   }Y nxY w|rK6)Nrw  r   r   r   r   zxdev: %s[%r] => %s[%r]rA  r   rx  zxvol: )r   r  r   r   r   r   r|  rsplitr   r   st_devr   r   r   r	  ro  )
rH   rQ  r  r  r   vdevr   r	  vapvnss
             r9   rz  z
VFS.chk_apR  sk   266kTZZ/5bjjs+24 XXc]
 	r88D"%((4=="9"@"@@txryy 880AHHUAt}}bii(L$LaPTZZ&&;$))*;*;G# ;S>>#&#'3;4:CF:; xxb 2A6;4c>!!jja03 s   E, ,F
c                    | j                   ry| j                  j                  d      xs g }|syd}|D ]  }d|v r'|j                  dd      \  }}|j	                  d      }nd}| j
                  r$d}| j                  d	|| j                  |fz  d
       d}	 | j                  |      }t        |d      5 }|j                  d      }	|	j                  |      sd}|||fz  }	 d d d         n	 d d d         |sy| j
                  r$d}| j                  d	||| j                  fz  d       dj                         D ]G  }| j                  j                         D ci c]  \  }}|j                  |      r|| c}}| _        I d| j                  d<   d| j                  d<   y# 1 sw Y   xY w# t        $ r}
d}||
||fz  }Y d }
~
 d }
~
ww xY wc c}}w )NTlandmarkr`   z^=r   utf-8r8   zchecking [/%s] landmark [%s]rA  rG  ?rbi   z3file [%s] does not start with the expected bytes %sz$%r while trying to read [%s] => [%s]zZWARNING: landmark verification failed; %s; will now disable up2k database for volume [/%s]r   ze2d e2t e2vd2dd2tF)r   r   r   rW   encoder   r   rI  openrB  ro  	Exceptionr   )rH   r  failedr  r,  expectr   rQ  r  bufexrmrS   r   s                 r9   check_landmarkszVFS.check_landmarksz  s   88jjnnZ(.B 	Brz$*B7+xx2TZZ$4 4a8B^^B'"d^ q&&,C>>&1Q!"b&\!1 1	2 88lAHHUA 44a8%%' 	WB+/::+;+;+=V41aQ\\RTEU!Q$VDJ	W 

5 

5-   :b"b\) WsB   F.4-F"!F.,F.G3G"F+	'F..	G7
GG)FFFi  )T)FFr=   )r4   r5   r6   __doc__rI   rZ   r  r  r  r/  r2  r6  r?  r   rV  r  rI  r^  rb  rk  r  r  r  rz  r  r7   r8   r9   r   r   p  s    (7r
2.#J 
, %N/.-& !* -'r \L 2h&P-r8   r   z*^([a-zA-Z]:[\\/][^:]*|[^:]*):([^:]*):(.*)$z^([^:]*):([^:]*):(.*)$c                       e Zd ZdZ	 	 ddZd dZd Zd Z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"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y)$AuthSrvz"verifies users against given pathsNc                    t        |      | _        || _        |xs || _        || _        || _        d| _        d| _        |j                  dgk(  | _	        t        |dddt               i       | _        i | _        i | _        i | _        i | _        i | _        i | _        d | _        g | _        d| _        i | _        i | _        i | _        i | _        t5        j6                         | _        | j;                          y )Nr   r`   z
/z/initcfgF)r   ahargsdargsra   warn_anonwriteline_ctrindentr   is_lxcr   r;   rA  acctiacctasessesadefpwgrpsre_pwdcfg_files_loadedbadcfg1idp_volsidp_accs
idp_usr_gh	hid_cache	threadingLockmutexreload)rH   r  ra   r  r  s        r9   rI   zAuthSrv.__init__  s     ,	]d
 ,ff. xRSUB7	
		
	!#  ^^%
r8   c                 D    | j                   r| j                  d||       y y )Nauthr}   r~   s      r9   r   zAuthSrv.log  s    ==MM&#q) r8   c              #   b   K   t        |      }t        |      }|D ]
  }|df |} |df yw)zreturns [value,isFinalValue]FTN)iterr  )rH   iterableitprevr   s        r9   
laggy_iterzAuthSrv.laggy_iter  sB     (^Bx 	A+D	 Djs   -/c                 4    d| j                   j                  dS )NT)r  tcolor)r  r  r  s    r9   vf0zAuthSrv.vf0  s    tyy'7'788r8   c                    || j                   v ry| j                  j                  |      |k(  ry| j                  j                  j                  |      D cg c]  }|j                          }}|j                          | j                  5  || j                  |<   | j                  j                  |      |k(  r
	 d d d        y|| j                  |<   	 | j                  ||       d}| j                  |||fz  d       |s| j                          	 d d d        y	 d d d        |j                  ddd      j                          yc c}w #  | j                  dt               d       Y xY w# 1 sw Y   TxY w)NFzfailed to update the --idp-db:
r   z0reinitializing due to new user from IdP: [%r:%r]Tr  )r  r  r   r  idp_gseprW   r   r   r  r  _update_idp_dbr   r#   _reloadr   )rH   r   r4  gnamer   gnamesr   s          r9   idp_checkinzAuthSrv.idp_checkin  sT    DII??u%.%)YY%7%7%=%=e%DE!'')EEZZ 	%*DOOE"}}  '61	 	
 $*DMM% P##E51 CAHHQ%(!,#	 	 	& 	

8UD)--// FPKQO	 	s0   E/E.E.E
%,E.
E+)E..E7c                 R   | j                   j                  sy t        j                  | j                   j                        }|j                         }|j                  d|f       |j                  d||f       |j                          |j                          |j                          y )Ndelete from us where un = ?zinsert into us values (?,?))	r  	idp_storesqlite3connectidp_dbcursorexecutecommitclose)rH   r4  r  dbcurs        r9   r  zAuthSrv._update_idp_db  sv    yy"" __TYY--.iik1E8<1E5>B
				

r8   c           	         g }t               }|}	|}
|j                         D cg c]  \  }}|D ]  }||f  }}}}|sdg}|D ]  \  }}d}t        t        fD ]  }|j	                  |
      }|s|j                  d      }|j                  dd      }|j                  dd      }|j                  d      D ]D  }|d	d  }|t        k(  r||j                  |      xs g v }n||k(  }|j                  d
      |k7  sCd}F  |r|	j                  d|xs d      }|
j                  d|xs d      }t        j                  |xs d|      }t        j                  |xs d|      }|	|k(  r|
|k(  rd}|j                  d|xs d      }|j                  d|xs d      }t        j                  |xs d|      }t        j                  |xs d|      }||k(  r||k(  rd}d||z   v r|d|}||v r|j                  |       | j                  |||
|||      \  }}|s|j                  ||||f       |s|s|| j                  |<    |S c c}}}w )N)r`   r`   Fr   z,%+z
%+z,%-z
%-rd  ry  z%+T${u}r`   ${g})r>   r   	PTN_U_GRP	PTN_G_GRPr   groupr   rW   r   ro  r   r  _map_volumer   r  )rH   r   r!  mountdaxsmflagsun_gnsr   visitedsrc0r"  ungnsgnun_gnrejectedptnmr,  rulegncr  src1dst1labels                            r9   _map_volume_idpzAuthSrv._map_volume_idp  sz    %)/FFgb##FB"bFFFJE 5	-FBH!9- (JJt$WWQZZZv.ZZv.HHTN 
(Dqr(Ci'!fjjn&:; !Cit,3#'
(($  <<
d3D<<
d3D==tT2D==tT2Dt|,,vrzT2C,,vrzT2C--
dC0C--
dC0Cd{sd{c	" #S)EKK''S$tVLHC

Cb"-.),DMM#&k5	-n 
y Gs   Ic                    t         j                  j                  t         j                  j                  |            }t	        |      }|j                  d      }||v r;d}| j                  |j                  |||   d   |      d       t        t              ||j                         v r~d}|j                  |      }|j                         D 	cg c]  \  }}	|	d   |k(  s| c}	}|gz   D ]  }	|dj                  |	      z  } | j                  |d       t        t              t        j                  j                  |      s!| j                  d	j                  |      d       ||f||<   t               ||<   i ||<   ||fS c c}	}w )
Nr   z9multiple filesystem-paths mounted at [/{}]:
  [{}]
  [{}]r   r   r   z3filesystem-path [{}] mounted in multiple locations:z
  /{}r   z+warning: filesystem-path does not exist: {})r   r   r*  r+  r   r   r   r   r  BAD_CFGr   r   r   isdirr;   )
rH   r   r!  r"  r  r  r   r   rS   r   s
             r9   r  zAuthSrv._map_volumeh  s\    gg  !3!3C!89cliin%<MAHHQXXc5:a=#6!H<G$$%,,. EAA$)KKMADAqQqTS[aASEI )Y%%a(() HHQ!HG$$xx~~c"HHBII#NPQR4[c
ES	sSz Bs   F!Fc                 2   | j                   j                  r| j                  sy |s| j                  s| j	                  d       y |xs d}|j                  dd      j                  dd      }| j	                  dj                  | j                  |      d       y )Nr`   [[[0m][90m]z	 >>> {}{}90)r  vcr  r  r   r   r   )rH   descs     r9   _ez
AuthSrv._e  sr    yy||4==DKKHHRLzr||C,44S+F##DKK6=r8   c           	      $   | j                   j                  r| j                  sy |dk  r|dz  }d}|r'|dz  }|j                  dd      j                  dd      }| j	                  |j                  | j                  || j                  ||             y )	Nr      z[97m{:4} [{}m{}{}z  [0;90m# {}[0mr  r  r  r  )r  r  r  r   r   r   r  )rH   lnr   r  r   s        r9   _lz
AuthSrv._l  s{    yy||4==r6GA'**A<<Z088kJD$--DKKTBCr8   c                    | j                  t        | j                               | j                  j                         D ci c]  \  }}||dd  }}}|j	                  |D ci c]  }||vs|dg c}       |j                         D ]!  \  }}|D ]  }	 ||   j                  |        # |S c c}}w c c}w #  |g||<   Y 3xY w)a  
        generate list of all confirmed pairs of username/groupname seen since last restart;
        in case of conflicting group memberships then it is selected as follows:
         * any non-zero value from IdP group header
         * otherwise take --grps / [groups]
        Nr`   )load_idp_dbboolr  r   updater   )	rH   r  r  r  r  r   r,  r  unss	            r9   
_all_un_gnzAuthSrv._all_un_gn  s     	dmm,-)-)<)<)>?gb#r3q6z??

t=r}BH=>zz| 	#GB ##GNN2&#	# 
 @=
#!dCGs   B1$	B7.B7B<<Cc           
         d| _         t        | j                  ||d       | j                  j                  rQt        |d      D 	cg c]  \  }}	dj                  ||	       }
}}	| j                  ddj                  |
      z          t        | j                  | j                  ||      }t        dd      D ]E  }| j                  j                  r| j                  d|d	fz         | j                  |||||||       G y c c}	}w )
Nr   r`   r   {:4}: {}z$expanded config file (unprocessed):
rd  r   z parsing config files; pass %d/%dry  )r  expand_config_filer   r  r  	enumerater   rX   upgrade_cfg_fmtrange_parse_config_file_2)rH   fp	cfg_linesr  r  r  r   r  r0  slnsnpasss               r9   _parse_config_filezAuthSrv._parse_config_file  s     488YB799<<7@A7NOtq!:$$Q*OCOHH<tyy~MN#DHHdiiBG	 1a[ 	YEyy||;uajHI%%itT65RWX	Y Ps   C>c                    d| _         | j                  ||      }d}	d}
d}d}d}d}d }d }g }|D ]  }| xj                   dz  c_         |j                  d	      d   j                         }|j                  d
      d   j                         s^t	        j
                  d|      r|d d }|||fv }|j                  d      s|r1| j                          |dkD  r ||d}t        |j                  |            |}	|sd x}}d| _
        nd| _
        ||
k(  rd}| j                  |d|       n||k(  r| j                  |dd       n||k(  r| j                  |dd       n|j                  d      r7|dd j                  d      }| j                  |ddj                  |             nC|r/||k(  r| j                  |dd       n(d}| j                  |d|       nt        dt        z         |rdnd| _
        |	|
k(  r| j                  |dd       t        |      }|j                         D ]\  \  }}|j                  d      }|du r!| j                  dj                  |             <| j                  d j                  ||             ^ X|	|k(  r\	 |j                  d!d      D cg c]  }|j                          c}\  }}| j                  |dd"j                  ||             |||<   |	|k(  r	 |j                  d!d      D cg c]  }|j                          c}\  }}|j                  d$      D cg c]  }|j                          }}d%|d&}|d'j!                  d( |D              z  }| j                  |d|       |||<   W|||dk7  rb|}| j                  |dd*j                  |             | j#                  ||||||      }|sd x}}| j                  |dd+       n5t%        |      dkD  r'|D ]"  }| j                  |dd,|d   d-|d   d.       $ |	|k(  r|dk7  s|sd}	 | j                  |dd       |j                  d!      \  }} t	        j&                  d/d|      s|sd0}t        |      d1t	        j&                  d2d|       j                         v rd3}t        |      | j)                  d1d      } | j+                  || ||||       |	|k(  r|dk7  s|sd}	 | j                  |dd5       t        |      }!d}"|!j                         D ]  \  }} t	        j&                  d6d|      j                  d      }#|#r&d7}|j                  |#|      }t        |t        z         | du r	|"d$|z   z  }"a|"d8j                  ||       z  }"|J | j+                  d9|"dd  ||||       d}" |"r| j+                  d9|"dd  ||||       t        d;t        z          | j                          d| _         y c c}w #  d#}t        |t        z         xY wc c}w c c}w #  d)}t        |t        z         xY w# t,        $ r   |d4z  }t-        |t        z         xY w#  |d:z  }t        |t        z         xY w)<Nr   r`   [global]
[accounts][groups]accs:flags:r     ##z	^\[.*\]:$r_   r  zLthe first line after [/{}] must be a filesystem path to share on that volume  zGbegin commandline-arguments (anything from --help; dashes are optional)rG     zbegin user-accounts sectionzbegin user-groups section[/r   ry  zdefine volume at URL [/{}]zvolume access config:z3volume-specific config (anything from --help-flags)zinvalid section header    r)  Tu   └─argument [{}]u#   └─argument [{}] with value [{}]:zaccount [{}], password [{}]z@lines inside the [accounts] section must be "username: password",zgroup [z] = rK   c              3   (   K   | ]
  }d |d  yw)zuser [r  Nr7   rR   r   s     r9   rT   z/AuthSrv._parse_config_file_2.<locals>.<genexpr>3  s     "C!!#5"Cs   zLlines inside the [groups] section must be "groupname: user1, user2, user..."zbound to filesystem-path [{}]u+   └─no users/groups known; was not mappedu   └─mapping: [z] => [r  z[rwmdgGhaA.]zinvalid accs permissions list;  z, *z&list of users is not comma-separated; z4accs entries must be 'rwmdgGhaA.: user1, user2, ...'zvolume-specific config:z
[a-z0-9_-]z*bad characters [{}] in volflag name [{}]; z,{}={}r   zxflags entries (volflags) must be one of the following:
  'flag1, flag2, ...'
  'key: value'
  'flag1, flag2, key: value'zunprocessable line in config)r  r'  rW   r   ry   matchro  r  r  r   r  r!  SBADCFGsplit_cfg_lnr   r  rX   r  r   r   r   _read_vol_str_idpr3   )$rH   r0  r  r  r  r   r  r3  	all_un_gncatcatgcatacatgrpcatxcatfrQ  r  r  r   
subsectionr   ztr,  zauru  r  zs1r&  volr   sksvzdfstrbads$                                       r9   r.  zAuthSrv._parse_config_file_2  s    OOD$/	 X	FBMMQM%#))+B88C=#))+xxb)Wd|+J}}S!Z	19fA#AHHRL11!"NB"$DK"&DK:aAGGB1%4ZGGB#@A6\GGB#>?]]4(Ab,BGGB#?#F#Fr#JKTzA'>?QAq)#$<w$FGG(2fd{Ar"!"% hhj VFB3BTz 5 < <R @A E L LRQS TUV d{113#q1AB2BHHJBDAqGGB#@#G#G1#MNDG f}	146HHS!4DEbrxxzEGB03		#?"288:?C?+-/A"Cs"CCCAGGB1%"DH ~"*A:A>EEbIJ++BE4S"NBGGB#PQY]# YAAPSTUPV'WXYd{A:R/GGB#:;XXc]FBvvnb"5R?'n,bffUB399;;F'n,C,B**2r4D&Q d{A:R3GGB#<=%b)BD"$((* &B ff]B;BB3G"NC"%**S""5C"+C'M"::: C"H,D HOOB$;;D#%>1> 22 #T!"XtYf $&D& ..ab4D& 
 :WDEEqX	Ft 		C C1ZA#AK00
 F?
1fA#AK00H  /QQCg..@3  Y  YC#C'M22sb   W< W77.W<-XXX1X;X,B)X8(C"Y7W<<X
XX58"YY6c           	      T   |j                  d      r|r|d|n|}t        d|      |dk(  rd}	 |j                  dd      \  }}d|v r>|j                  dd      \  }	}|D ]  \  }
}}
}
| j                  |||   |	dd       ! d|v r>|D ]  \  }
}}
}
| j                  |||   ||d       ! y |d	k(  rd
}g }|j	                  dd      j                         j                         D ]  }|j                  d      r|dd  }|j                         D cg c]  }||d   v s|d    }}|dk(  r|j                  |       n)|s'| j                  j                  sd}t        ||fz        |j                  |       |j                  |        |j                         D cg c]  \  }}|D ]  }||f  }}}}|D ]  \  }}}}t        |      }d|v r$|sd}t        ||fz        |j                  |       d|v r=|sd}t        ||fz        |j                  |D cg c]  \  }}||k(  s| c}}       d|v rd}t        ||fz        |j                  d       |j                  d       | j                  |t!        |      ||           y #  Y MxY wc c}w c c}}}w c c}}w )NzcrwmdgGhaA.rB  z*invalid config value (volume or volflag): r   TrN   r   Fr`   *rE  @r   r  zPgroup [%s] must be defined with --grp argument (or in a [groups] config section)r  zScannot use ${u} in accs of volume [%s] because the volume url does not contain ${u}z@${g}zUcannot use @${g} in accs of volume [%s] because the volume url does not contain @${g}z`the accs of volume [%s] contains "${g}" but the only supported way of specifying that is "@${g}")r   r3   rW   _read_volflagr   ro  r   r   r  	idp_h_grpextendr>   r  r%  discard_read_vol_strr   )rH   lvlr4  r  r  r   r   r   cvaln1r5  r  unamesr  grpr   r&  r  r  r  r   r!  vuvgunames2s                            r9   rI  zAuthSrv._read_vol_str_idp  s    99]#*/3&SA!MNN#:D#kk#q1t
 ,!KKQ/	E#' GKAr1a&&r59b$FG ,  $ F2q!""2uRy%uEF B;E--S)//1779 	"B}}S!f%+\\^Csad{qtCC&=MM"%TYY%8%8jASF
++c"b!	" *0FFgb##FB"bFFF $ 	=Cb"&kGmASF
++B& oASF
++Cvr2"(CDvAJ''OOF#OOG$sDM3s8<-	=I( D G  Ds)   J JJ JJ$+J$Jc                 @   t               }|D ]  }dD ],  \  }}d}|D ]   }	|	|vr||	z  }|j                  |||z         }" . d|j                  fd|j                  fd|j                  fd|j
                  fd|j                  fd|j                  fd	|fd
|j                  fd|j                  fd|j                  ff
D ]]  \  }	}
|	|v s|dk(  rd}nd}t        j                  |	d      }| j                  |j                  |	||             |
j                  |       _  y )N))hgh)GgG)r<  zrwmda.Ar`   r   wr
  r   rF  r`  r<  r  ro  rm  r]  u0   └─add permission [{0}] for [everyone] -- {2}u0   └─add permission [{0}] for user [{1}] -- {2}r  )r>   r   r?   r@   rA   rB   rG   rF   rC   rD   rE   r   r   r  r   r  )rH   rd  rg  r   junksetr  aliasmappingexpandedr9  alr   r  s                r9   rc  zAuthSrv._read_vol_str  s=   %  	B# 	?w
 ! ?B} B++eX-=>C?	? cii cjj!cii chhchhcjj!gchhcii cii  B 9SyNN$==S1DGGAHHRT23FF2J) 	r8   c                 v   |t         vr|j                         }|j                  d      }t        |      t        |      z
  }|dkD  rd}| j	                  ||||fz  d       |}d}|t         vrd|v rd|z  |j                  dd      z   }t        j                  |j                  d      d      j                  dd	      }	|s*| j                  d
       d}| j	                  ||fz  d       y t        j                  d|      r,d}| j                  |j                  |dd  |	             d||<   y d}
||
j                         vr1|du rd}nd}| j                  |j                  |||	             |||<   y |j                  |g       }|sy |r||z  }n||gz  }|||<   | j                  dj                  |||	             y )Nr)  r   zWARNING: the config for volume [/%s] specified a volflag with multiple leading hyphens (%s); use one hyphen to remove, or zero hyphens to add a flag. Will now enable flag [%s]r   r   r5  r  rd  rE  u   └─unreadable-linezoWARNING: the config for volume [/%s] indicated that a volflag was to be defined, but the volflag name was blank^-[^-]+$u   └─unset volflag [{}]  ({})TzKext_th landmark mtp on403 on404 xbu xau xiu xbc xac xbr xar xbd xad xm xbanu!   └─add volflag [{}] = {}  ({})u#   └─add volflag [{}] = [{}]  ({})zvolflag [{}] += {}  ({}))r   lowerr  r   r   r   r   r  ry   rF  r   rW   )rH   r   r   r#  valueis_liststrippedzir   r  r,  valss               r9   r_  zAuthSrv._read_volflag  s    y ::<D {{3'HTS]*BAv FeT844a8y(SH_bH$4$4S#$>>}}T[[-s3;;D#FGG+, BAHHQ%\1%88J%0AGGAHHT!"Xt,-E$KZrxxz!}79GGAHHT5$/0E$Kyyr"EMDUGODd*11$dCDr8   c                 h    | j                   5  | j                  |       ddd       y# 1 sw Y   yxY w)z
        construct a flat list of mountpoints and usernames
        first from the commandline arguments
        then supplementing with config files
        before finally building the VFS
        N)r  r  )rH   	verbositys     r9   r  zAuthSrv.reload6  s,     ZZ 	$LL#	$ 	$ 	$s   (1c                 &   i }i }i }i }i }g }i | _         d| _        | j                  j                  r6| j                  j                  D ]  }	 |j	                  dd      \  }	}
|
||	<    | j                  j                  re| j                  j                  D ]L  }	 |j                  dd      j	                  dd      \  }}|j                  dd      j	                  d      ||<   N | j                  j                  r| j                  ||      }| j                  j                  D ]  }t        j                  |      }|st        dj                  |            |j                         \  }}}t        rt        |      }| j!                  ||||||      }|j	                  d      D ]5  }d|v r|j	                  dd      n|d	g\  }}| j#                  ||||||       7  | j                  j$                  r4| j                  j$                  D ]  }g }	 | j'                  |||||||       d
}|D cg c]"  }|j)                  |      s|t+        |      d  $ }}t-        t/        |            D ]  }| j1                  d|z   d        d}|D cg c]%  }|j)                  |      s|j	                  d      ' }}|D cg c]&  }t3        dt+        |      dz
        dz  dz   |d   z   ( }}d}| j1                  |j                  t+        |      dj5                  |                   |} | j;                  |       |j=                         }| j?                  |       t        r/i } |jA                         D ]  \  }!\  }"}#tC        |"      |#f| |!<    | }|s| j                  jD                  stG        dgdgd d       }$d	}%| jH                  r\d}t+        |      dk(  r*| j1                  |dz  d       d}| j1                  |d       n| j1                  |dz  d       tG               }$d}%n6| j                  j$                  r d }| j1                  |d       tG               }$d}%|%r	 tK        jL                  tN        jP                        }&|&D cg c]$  }|jS                         jU                  d!      s#|& }'}|'r7d"}| j1                  |tN        jP                  |%d#j5                  |'      fz  d       d$| j                  jV                  i}(tY        | jZ                  tC        d%      d	d	|$|(      })|$j\                  s<d&| _        n4d	|vr0tY        | jZ                  d	d	d	tG               | j_                               })d}*ta        |jc                         d' (      D ]|  }|je                  d)      }+|*|+k  sJ |+}*||   \  }},|d	k(  r!tY        | jZ                  |||,||   ||         })K)sJ |)jg                  |||,      }-||   |-_4        ||   |-_5        d |-_6        ~ )sJ i |)_7        i |)_8        g |)_9        g |)_:        |)jw                  |)jn                  |)jp                  |)jr                  |)jt                         |)jp                  jy                         D ]E  }.|.jr                  j{                  d* d&+       |.jt                  j{                  d, d&+       |)|._>        G d-}t/        |j	                               }/|)jn                  jy                         D ]  }.t/               }0|.jj                  jA                         D ]5  \  }1}2|1j                  d.      }3|3t        vs |3|/vs%|0jg                  |1       7 |0sbd/}| j1                  ||.j                  d0j5                  |0      fz  d        | j                  j                  }4|4dd }5|4dd  }6|4rGtY        | jZ                  d	|5|5tG               | j_                               }7| j                  j                  }8t        j                  |8      }9|9j                         }:|9j                         };t        j                         }<|:j                  d1      D ]  }=|=\  }>}?}@}A}B}C}D}E|ErE|<k  r| j                  j                  rd2}| j1                  |A|>C@fz         |?rXt        j                  |?j                  d3            j                         }Fd4t        |F      d5d6 j                  d7      }G|?||G<   nd}GtG        d8Av rGgng d9Av rGgng d:Av rGgng d;Av rGgng       }H|5d)|>}!tY        | jZ                  d	|!|!|H|7jj                  j=                               |7j                  |><    |7x|)j                  |5<   |)jn                  |5<   |7j                  jy                         D ]V  }.|.x|)jn                  |.j                  <   |)jp                  |.j                  <   |.j                  |._R        |.j                  |._T        X t/        |      }I|Ij                  | j                         |Ij                  d       dgt-        ta        |I            z   }Jd<j	                         D ]  }Kd=|Kz   }L|)jn                  jA                         D ]8  \  }!}.t        |.jh                  L      }Md|Mv s!JD ]  }NMjg                  |N        : JD ci c]  }|g  }O}JD ]z  }N|)jn                  jA                         D ]H  \  }!}.t        |.jh                  L      }MN|Mv s!|4r|!j)                  |6      r5ON   j                  |!       J ON   j{                          | t        |)d>Kz   O        i }Pi }Qi }R|jy                         D ]  }$|$j\                  |$j                  |$j                  |$j                  |$j                  |$j                  |$j                  |$j                  |$j                  f	D ]4  }S|SD ]-  }NdP|N<   |Ndk7  rN|vrN| j                  vrdQN<   dSvs)dRN<   / 6  Qrwd#j5                  d? ta        Q      D              }| j                  jD                  rd@}| j1                  ||z   dA       n'dB}| j1                  ||z   dA       t        t              t        Pv rt        dCt        z         i }T|jA                         D ]D  \  }N}U|UTv r6dD}| j1                  |j                  TU   N      d       t        t              NTU<   F |D ]e  }N|NRvs|4rNj)                  d4      rt+        |)jn                        dkD  rdE}| j1                  |Nfz  d       MdF}| j1                  |N|Nfz  d       g g }Vg }W|)jn                  jy                         D ]{  }.| j                  j                  |.j                        }X|Xst        j                  t        |.j                              j                         }Ft        j                  |F      j                  d7      jS                         }X|X| j                  |.j                  <   |.jj                  j                  dG      }Y|Yd.k(  rnYr]tJ        j                  j                  tJ        j                  j                  Y            }Yt        rt        Y      nYx|._n        |._o        n5| j                  j                  rt        t+        X            D ]  }ZtJ        j                  j5                  | j                  j                  Xd |Zdz          }[t        j                  |[       tJ        j                  j5                  |[dH      }\	 t        \dI      5 }]|]j                         j                         }^d d d        t        |.j                        j                         }_^d |_fvr^&t        \dJ      5 }]|]j                  _       d d d        [x|._n        |._o         n tC        |.j                        |._n        ~ |)jn                  jy                         D ]]  }.| j                  |.j                     }X|.jj                  j                  dK      }Y|Yd.k(  rnYrVtJ        j                  j                  tJ        j                  j                  Y            }Yt        rt        Y      nY|._o        n-| j                  j                  rt        t+        X            D ]  }ZtJ        j                  j5                  | j                  j                  Xd |Zdz          }[t        j                  |[       tJ        j                  j5                  |[dH      }\	 t        \dI      5 }]|]j                         j                         }^d d d        t        |.j                        j                         }_^d |_fvr^&t        \dJ      5 }]|]j                  _       d d d        [|._o         n tC        |.j                        |._o        |.jl                  st        j                  j                  tJ        j                  j5                  |.j                  dL            rVj                  |.       d |._6        MWj                  |.       ` WD ]'  }-|)jn                  j                  |-j                         ) VrhdMg}`VD ];  }.`j                  dN|.j                  dO|.j                  dP|.j                  dQ       = | j1                  dRj5                  `      dz   dA       i }ai |)_z        |)jn                  jy                         D ]  }-|-j                  }b|5xr! |-j                  j	                  d)      d   |5k(  }cbr\csZbav rVab   }ddS}||b|dj                  |dj                  |-j                  |-j                  fz  }| j1                  |d       t        |      |-ab<   |b|)j                  |-j                  <    i }ei |)_{        |)jn                  jy                         D ]  }-|-j                  }f|5xr! |-j                  j	                  d)      d   |5k(  }cfr\csZfev rVef   }ddT}||f|dj                  |dj                  |-j                  |-j                  fz  }| j1                  |d       t        |      |-ef<   |f|)j                  |-j                  <    |)jn                  jy                         D ]c  }.d}gdUD ]H  }1	 |.jj                  |1   }|dVv rd|.jj                  |1<   't        |      }h|h|.jj                  |1dWz   <   |hsGd&}gJ gsUd&|.jj                  dX<   e |)jn                  jy                         D ]  }.t        | jZ                        }id}g|.jj                  j                  dY      r	d&}gd&i_~        |.jj                  j                  dZ      xs | j                  j                  xs d	}|dVvr$d&}g	 t        |      }j|d[}t        |      i_        |.jj                  j                  d\      }|r7d&}g|j	                  d.      D cg c]  }t        |       c}\  i_        |i_        |.jj                  j                  d]      }|r8d&}g|j	                  d      D cg c]  }t	        |       c}\  i_        |i_        |.jj                  j                  d^      }|rd&}gij                  |       |.jj                  j                  d_      }|r8d&}g|j	                  d      D cg c]  }t	        |       c}\  i_        |i_        |.jj                  j                  d`      }|r7d&}g|j	                  d      D cg c]  }t        |       c}\  i_        |i_        |.jj                  j                  da      }|rd&}gt        |      i_        |.jj                  j                  db      }|rd&}gt        |      i_        gsi|._         | j                  j                  rJ|)jp                  jy                         D ]-  }.|.jj                  j                  dc      rd&|.jj                  dd<   / |)jp                  jy                         D ]  }.| j                  j                   rd&|.jj                  de<   | j                  j"                  rd&|.jj                  df<   | j                  j$                  s|.jj                  j                  dgd      sd&|.jj                  dg<   d&|.jj                  de<   d&|.jj                  df<   d&|.jj                  dh<    d}k|)jp                  jy                         D ]$  }.|.jj                  j                  di      }l|.jj                  j                  dj      }m|mrlsm}llrDld&u rdknt	        l      }l|ldlkD  rdm}t        ||.j                  lfz        l|.jj                  di<   d&}k|.jj                  j                  dn      }n|.jj                  j                  do      }o|.jj                  j                  dp      }p|opdq}t        ||.j                  fz        ornso}nprnsp}nnsnd&urt	        n      ndk|.jj                  dn<   ' krat'        j                  dr| j                  j(                        r5| j1                  dsj                  | j                  j(                               t+        | j                  j(                        }qkrMqdtk  rHdu}tJ        j                  j5                  tN        jP                  dv      }| j1                  |qd6|fz  d       |)jp                  jy                         D ]  }.dw|.jj                  v r+dx|.jj                  vrdy|.jj                  vrd|.jj                  dx<   dz|.jj                  v r't	        |.jj                  dz         |.jj                  dz<   q| j                  j*                  s| j                  j*                  |.jj                  dz<    d| j                  _        i }rd}sd}td}u|)jp                  jy                         D ]  }.| j                  j.                  r|.jh                  j                  s| j                  j0                  rd&|.jj                  d{<   | j                  j2                  sd{|.jj                  v rd&|.jj                  d|<   d}d~gddgddgddgfD ]l  \  }v}w|w|.jj                  v r1t'        j4                  |.jj                  j                  w            }xnt        | j                  v      }xxs^x|.jj                  w<   n t7               jA                         D ]+  \  }v}wt        | j                  |v      sd&|.jj                  w<   - dD ]0  \  }y}z|y|.jj                  v s|.jj                  j                  zd        2 t9               jA                         D ]7  \  }v}w|w|.jj                  vst        | j                  v      |.jj                  w<   9 d}|j	                         D ]7  }1|1|.jj                  v st	        |.jj                  |1         |.jj                  |1<   9 d}|j	                         D ]7  }1|1|.jj                  v st        |.jj                  |1         |.jj                  |1<   9 dD ]_  }1	 |.jj                  |1dz      j	                  d)      \  }}t        |      |.jj                  |1dz   <   t        |      |.jj                  |1dz   <   a dD ]  }1|1dk(  }{|.jj                  j                  |1d	      }|s{rd}|s|.jj                  j                  |1d        It'        j                  d|      s&d}||1|fz  }| j1                  |d       t        |      t	        |dk      }||||.jj                  |1<   {r|dk7  s{rd&}t |.jj                  j                  dd        |.jj                  d   dk7  s|.jj                  d   dk7  rd&|.jj                  d<   |.jj                  j                  dd        d|.jj                  v s|.jj                  j                  d      rd&|.jj                  d<   |.j                  r{|.jj                  d   |.j                  _        d|.jj                  v |.j                  _        |.jj                  d   |.j                  _        |.jj                  d   |.j                  _        |.jj                  j                  d      rd&| j                  _        d|.jj                  v sd|.jj                  v rd&| j                  _        d|.jj                  v rd&}utE        |.jj                  j                  d$d	            j                  d      }t+        |      dk(  r/d	j5                  |D cg c]  }|dz  	 c}      |.jj                  d$<   |.jj                  d   }|j                  dd      |.jj                  d<   |.jj                  j                  d-      rd&|.jj                  d<   |.jj                  j                  d      rd&|.jj                  d<   tF        D ]#  \  }}}~|}|.jj                  v sd&|.jj                  ~<   % tH        D ]#  \  }}}~|}|.jj                  v sd|.jj                  ~<   % d}|.jj                  j                  d      xs | j                  jJ                  x|.jj                  d<   }|j	                  d      vrd}t        ||.j                  fz        dD ]}  }1|1|.jj                  vr2t        | j                  |1      j=                         |.jj                  |1<   CtM        t        | j                  |1      |.jj                  |1         |.jj                  |1<    dj	                         }dj	                         |z   D ]@  }| jO                  |.j                  |.jj                  |t        | j                  |      d&       B D ]   }|.jj                  j                  |      }|s"g }D ]  }g }|}dd d v r.j	                  dd      \  }}j                  |       d|d d v r.dv rQdv rMd}| j1                  |j                        d       D cg c]
  }|dk7  s	| }}dj5                  |gz         }dvr$dvr dk(  rdgz   }dj5                  |gz         }j                          |.jj                  <    i x}|.jj                  d<   d}	 |.jj                  j                  d      xs g D ]  }|j	                  d      \  }1}2|2|1<    	 |.jQ                          dd|gddgddgfD ]v  \  }}|.jj                  j                  |d      s#d&|.jj                  d<   |.jj                  jA                         D 12ci c]  \  }1}2|1j)                        r|1|2 c}2}1|._5        x dd{gddgfD ]v  \  }}|.jj                  j                  |d      s#d&|.jj                  d<   |.jj                  jA                         D 12ci c]  \  }1}2|1j)                        r|1|2 c}2}1|._5        x ddgfD ]k  \  }}|.jj                  j                  |d      r#|.jj                  jA                         D 12ci c]  \  }1}2|1j)                        r|1dk(  r|1|2  c}2}1|._5        m ddgfD ]g  \  }}|.jj                  j                  |d      s#|.jj                  jA                         D 12ci c]  \  }1}2|1j)                        r|1|2 c}2}1|._5        i dg}t-        |.jj                        D ]-  }1|1v st	        |.jj                  |1         |.jj                  |1<   / d||.jj                  vrd|.jj                  v r:d}| j1                  |j                  |.j                        d       |.jj                  d= D cg c]	  }|dv s| }}|D cg c]   }|.jj                  j                  |      s|" }}|r_d}| j1                  |j                  d#j5                        |.j                        d       |D ]  }|.jj                  j                  |        i }i }|.jj                  j                  dg       |.jj                  j                  dg       z   }|D cg c]  }|j	                  d      d    }}|D cg c]  }|j	                  d      D ]  }|  }}}|D ]M  }d&|<   d&}| j                  jR                  xs g D ]  }|j	                  d      d   }|k(  sd}  sId&<   O tU               }|.jj                  j                  di       jc                         D ]E  }d&}d&r|<   d&|<   | j                  jV                  jc                         D ]  }rsk(  sd} G D ]7  }|vsd}| j1                  |j                  |.j                        d       d&}s9  | j                  jR                  xs g }|D cg c]  }|j	                  d      d    }}|D cg c]  }|j	                  d      D ]  }|  }}}|D ],  }|rvsd}| j1                  |j                        d       d&}s. |)jn                  jy                         D ]m  }.|.jj                  j                  d      }|rjX                  gng }g }|.j                  }|)jn                  jc                         D ]m  }|j)                  d)z   j                  d)            s'k7  s-j                  t'        jZ                  t+              d  j                  d)                   o r$j                  ddj5                        dÝ       t'        j4                  dj5                  xs dg            |.jj                  d<   j]                  ddg       t'        j4                  dj5                  |            |.jj                  d<   p d}|)jp                  jy                         D ]J  }.|.jj                  j                  dɫ      xs | j                  j^                  }|s:d&|.jj                  d<   d&}L r-| j                  j`                  rd}| j1                  |d       d&}s| j                  jb                  r.| jd                  jf                  r|r| j1                  dd       d&}s|)jp                  jy                         D ]  }.t-        |.jj                  jc                               D ]  }1t'        j                  d|1      s|.jj                  j                  |1       |1dd  }||.jj                  v r|.jj                  j                  |1dd         hd}| j1                  ||.j                  ||1fz  d        |.jj                  j                  dΫ      s|.jh                  j\                  D ]'  }|.jh                  j                  jg                  |       )  srti        jj                  d       t        | j                  dt       |trtK        jl                  d       |)jo                          d}d}d}g }d}|)jn                  jy                         D ]f  }-| jp                  r|dk  r nQ|4r+|-j                  |5k(  s|-j                  j)                  |6      rF|dj                  |-j                  |-j                        z  }ddgddgddgddgddgddgddgddgddgf	D ]i  \  }}t-        ta        t        |-jh                  |                  }	d|	v rdgn|	}	d#j5                  d |	D              }	|	r|	nd}	|dj                  |	      z  }k d||-jj                  v rd&}d|-jj                  v rd&}d|-jj                  v r<d&}d||-jj                  vr,d|-jj                  vrj                  d)|-j                  z          |dz  }i | jp                  rY|d5kD  rS| j                  jr                  s| j1                  |       s| j                  jD                  r3| ju                         }|r | j1                  dj                  |             rs)d}| j1                  |d       nd}| j1                  |d       r'd}| j1                  |d#j5                        z  d       nsd}| j1                  |d       |)j                  d)ddd      \  }-}j|-j                  jS                         }|dv s|j)                  d      r.d}| j1                  |j                  |-j                        dA       	 |)j                  d	ddd&d      \  }-}j| jp                  rU|d5kD  rPtK        jv                         |-j                  k(  r.d}| j1                  |j                  |-j                        dA       d| _        g | _        g | _        | j                   D ]  }|)j                  |ddd      \  }}j|j~                  }t/        t        j                  |            }t+        |      dkD  r.d}| jz                  j                  |t-              fz         j                         }}st              d   }|)j                  |ddd      \  }}j|j~                  v r9g }g }jh                  j\                  D ],  }N|Njh                  j\                  vsj                  N       . jh                  j                  D ],  }N|Njh                  j                  vsj                  N       . dv rd}ndv rd}nrd}n
rd}n}d}| j|                  j                  |j                  fz         r | jz                  r1d}| j1                  |d	j5                  | jz                        z   d       | j|                  r1d}| j1                  |d	j5                  | j|                        z   d       urbd}th        j                  dk  r| j1                  |dz  d       th        j                  j)                  d      s| j1                  |dz  d       |)| _        || _        || _        || _        |jA                         D 12ci c]  \  }1}2|2|1
 c}2}1| _        || _        | j                          d | _        | j                  jc                         D cg c]  }t'        jZ                  |       }}|j]                  t-        | j                               | j                  j                  r8j]                  |D cg c]  }d|v s|j	                  dd      d    c}       rQ| jd                  jf                  rd }nddj5                        z   dz   }t'        j4                  |      | _        | j                  j                  rx| j                  j                  D ]!  }|j	                  dd      \  }}|t        |<   # t        j                  t        j@                         D 12ci c]  \  }1}2|2|1
 c}2}1       |4r|)jn                  jA                         D ci c]  \  }}||5k7  r|j)                  |6      s|  c}}|)_7        9r:r;r7sJ |:j                  d1      D ]K  }=|=\  }>}?}@}A}B}C}D}E|7j                  j                  |>d       }|s.	 |)j                  @Cd8Av d9|Av d:|Av d;|Av       \  }}g }BrQd}|;j                  ||>f      D ]  \  }j                  |        t/              _        |j                  |_T        nj                  |_T        C_        f|_        |j                  |      |_g        |j                  }"|"jU                  tJ        j                        s|"tJ        j                  z  }"|)jr                  D cg c]  \  }}||d d  f c}}_        d}|j                  D ]t  \  }}|"|k(  rd&}j)                  |"      s	 t        t+        |"      d        }j                  |ddd      \  }}j||k(  sjl                  k(  rj                         v sj                  j                  |"|gf       j                  j{                  d d&+       | j                  j                  s&d}| j1                  |A|>C@j                  fz         N |7j                  jy                         D ]  }|j                  \  }}|rj                        }"t        j                  j                  |"      rIj                  jc                         D ]?  }tY        | jZ                  d	d	d	tG               | j_                               j                  |<   A  |;j                          |:j                          |9j                          i | _        i | _        | j                  jp                  jA                         D ]M  \  }!}|4r|!j)                  |6      rjj                  }wd||wv d|wv d|wv |wd   |wd	   |wd
   |wd   |wd   t        |wj                  d            |wj                  d      xs dwj                  d      xs d	dwv rd	nwj                  d      xs dd_        i d| j                  j                  d| j                  j                  dd|wv d| j                  j                   d| j                  j                  d| j                  j                  d| j                  j                  d| j                  j                   d| j                  j                   d| j                  j                   dt	        | j                  j                        d| j                  j                  d|wj                  d      xs i dd wv rd	nwj                  d!      xs dd"wj                  d#      xs d	d$wj                  d%      xs d	d&| j                  j                  j                  dd      i d't-        wj                  d(      xs g       d)wj                  d      xs d	d*| j                  j                  d+| j                  j                  d,d-wv d.d/|wv d0d|wv d1|wd   d2|wd	   d3|wd
   d4|wd   d5| j                  j                  d6t	        | j                  j                        d7| j                  j                   d8| j                  j                  d9| j                  j                  d:| j                  j                  | j                  j                  | j                  j                  |wd   |wd;   t        |wj                  d            j                  d   | j                  j                  d<}t        t        j                  |            |_        P t-        |)jp                  jy                               }|4r7j                  jy                         D ]N  }.|.j                  |)jp                  vs| j1                  d=|.j                  d>d       |j                  |.       P |5|)jp                  v r| j1                  d?|5d@d       |D ]  }.|.j                  d	      d   }|.j                  xs j                  xs i |._        |.j                  xs j                  xs dA|._        tE        |.jj                  j                  d$      xs | j                  jV                        }|j                  d      |.jj                  d$<    y #  d}t        |j                  |            xY w#  d}t        |j                  |            xY wc c}w c c}w c c}w #  |d | j6                   }t9        |d      D cg c]  \  }}dj                  ||       nc c}}w }}}d}|j                  | j6                  |      }| j1                  dj                  |dj5                  |                    xY w#  g }&Y <xY wc c}w c c}w # 1 sw Y   1xY w#  d }^Y 1xY w# 1 sw Y   1xY w# 1 sw Y   0xY w#  d }^Y 0xY w# 1 sw Y   /xY w#  t        | j                  |1      }Y ,xY w#  Y +xY wc c}w c c}w c c}w c c}w #  d}t        ||.j                  |1|.jj                  j                  |1dz         fz        xY wc c}w c c}w #  d}| j1                  ||.j                  fz  d       Y xY wc c}2}1w c c}2}1w c c}2}1w c c}2}1w c c}w c c}w c c}w c c}}w c c}w c c}}w # tx        $ r d&| _        Y w xY wc c}2}1w c c}w c c}w c c}2}1w c c}}w # t
        $ rB}d}| j1                  ||>C@fz  d       |7j                  j                  |>       Y d }~d }~ww xY wc c}}w #  Y 
xY w(B  NFrA  r   z@
  invalid value "{}" for argument -a, must be username:passwordrN   rB  zS
  invalid value "{}" for argument --grp, must be groupname:username1,username2,...zinvalid -v argument: [{}]r`   #[36m cfg files in zdiscovered config files in rG  #[36m opening cfg file -> r   ry  rE  u   └r_   zloaded {} config files:
{}rd  r)  z-[1;31m
error @ line {}, included from {}[0mz
{0}
{1}{0}r]  a*  Read-access has been disabled due to failsafe: Docker detected, but %s. This failsafe is to prevent unintended access if this is due to accidental loss of config. You can override this safeguard and allow read/write to all of /w/ by adding the following arguments to the docker container:  -v .::rw)zno config-file was providedzit is strongly recommended to add a config-file instead, for example based on https://github.com/9001/copyparty/blob/hovudstraum/docs/examples/docker/basic-docker-compose/copyparty.confr   )z&the config does not define any volumesz>; please try moving them up one level, into the parent folder:a0  Read-access has been disabled due to failsafe: No volumes were defined by the config-file. This failsafe is to prevent unintended access if this is due to accidental loss of config. You can override this safeguard and allow read/write to the working-directory by adding the following arguments:  -v .::rw.confzxHint: Found some config files in [%s], but these were not automatically loaded because they are in the wrong place%s %s
rK   r  rF  Tc                 :    | j                  d      t        |       fS rX  )countr   r   s    r9   <lambda>z!AuthSrv._reload.<locals>.<lambda>  s    qwws|SV6L r8   )keyr   c                     t        | d         S Nr   r   r  s    r9   r  z!AuthSrv._reload.<locals>.<lambda>      3qt9 r8   )r  reversec                     t        | d         S r  r  r  s    r9   r  z!AuthSrv._reload.<locals>.<lambda>  r  r8   neversymlinkr)  zQWARNING: the config for volume [/%s] has unrecognized volflags; will ignore: '%s'z', 'zselect * from shzloading %s share %r by %r => %rr  s_      asciir   rq  r
  r   z+read write move del get pget html admin dotrT  r`  c              3       K   | ]  }|  y wr=   r7   )rR   rS   s     r9   rT   z"AuthSrv._reload.<locals>.<genexpr>G  s     <1<s   z?the following users are unknown, and assumed to come from IdP: r  z!you must -a the following users: zsorry, reserved username: zDaccounts [{}] and [{}] have the same password; this is not supportedzLaccount [%s] is not mentioned in any volume definitions; see --help-accountsa%  WARNING: the account [%s] is not mentioned in any volume definitions and thus has the same access-level and privileges that guests have; please see --help-accounts for details.  For example, if you intended to give that user full access to the current directory, you could do this:  -v .::A,%sr(  z	owner.txtr  wbr  zup2k.dbz
  the following jump-volumes were generated to assist the vfs.
  As they contain a database (probably from v0.11.11 or older),
  they are promoted to full volumes:z  /z  (z)  (rV   z

zinvalid config; multiple volumes share the same histpath (database+thumbnails location):
  histpath: %s
  volume 1: /%s  [%s]
  volume 2: /%s  [%s]zinvalid config; multiple volumes share the same dbpath (database location):
  dbpath: %s
  volume 1: /%s  [%s]
  volume 2: /%s  [%s])zipmaxnzipmaxs)r`   r   _vzipmaxrj   r   r  r   rv   rx   maxnmaxbvmaxbvmaxnrobotsnorobotsdvthumbdathumbdthumbdithumbfkfkar  H   z\max filekey-length is 72; volume /%s specified %d (anything higher than 16 is pointless btw)rm  dksdkyzTWARNING: volume /%s has both dks and dky enabled; this is too yolo and not permittedz
^[0-9\.]+$zfilekey salt: {}   zWARNING: filekeys are enabled, but the salt is only %d chars long; %d or longer is recommended. Either specify a stronger salt using --fk-salt or delete this file and restart copyparty: %szfk-salt.txtpkgzxzscane2dse2dno_hashnohashno_idxnoidxog_ua	srch_excl))	nodotsrchdotsrch)sb_lgno_sb_lg)sb_mdno_sb_mdz=forget_ip gid nrand tail_who u2abort u2ow uid ups_who zip_whoz!convt tail_fd tail_rate tail_tmax)mv_rerm_retry_t_rz#volume "/%s" has invalid %stry [%s])rc   chmod_frc   755z
^[0-7]{3}$zbconfig-option '%s' must be a three-digit octal value such as [755] or [644] but the value was [%s]r^   rf   rd   re   fpermsr  ogunlistcrunlistcwreflinkr<  put_namez{now.z{now:.	put_name2hardlinkonlyhardlinkzacid|swal|wal|yolodbd|z6volume "/%s" has invalid dbd [%s]; must be one of [%s])mtemthexp_mdexp_lgz+xbu xau xiu xbc xac xbr xar xbd xad xm xbanzext_th mtp on404 on403r   r  z<cannot combine flags c and f; removing f from eventhook [{}]xbanext_th_dz(?)ext_thz=WARNING: volume [/%s]: invalid value specified for ext-th: %sr  r  e2te2vd2dsd2tse2tsmtr  d2vlifetimezBremoving lifetime config from volume "/{}" because e2d is disabled)xauxiuz7removing [{}] from volume "/{}" because e2d is disabledmtpmtmzdvolume "/{}" defines metadata tag "{}", but doesnt use it in "-mte" (or with "cmte" in its volflags)zfmetadata tag "{}" is defined by "-mtm" or "-mtp", but is not used by "-mte" (or by any "cmte" volflag)z^(z)/z^$srch_re_dotsz^\.z/\.srch_re_nodotdawzIvolume "/{}" has volflag "daw" (webdav write-access), but --no-dav is setz,--smb can only be used when --ah-alg is nonerx  zyWARNING: the config for volume [/%s] tried to remove volflag [%s] by specifying [%s] but that volflag was not already setdots
free_umaskzvolumes and permissions:
r>  z
[36m"/{}"  [33m{}[0mz  readr?   z writer@   z  moverA   rE  rB   z  dotsrG   z   getrC   z upGetrD   z  htmlrE   rF   c              3   .   K   | ]  }|d k(  rdn|  yw)r]  z[35meverybody[0mNr7   rD  s     r9   rT   z"AuthSrv._reload.<locals>.<genexpr>	  s     WPQAH8!KWs   z[36m--none--[0mz
|  {}:  {}dedupz

[{}[0m
zGhint: enable multimedia indexing (artist/title/...) with argument -e2tsz;hint: enable searching and upload-undo with argument -e2dsazWARNING: symlink-based deduplication is enabled for some volumes, but without indexing. Please enable -e2dsa and/or --hardlink to avoid problems when moving/renaming files. Affected volumes: %szPhint: enable upload deduplication with --dedup (but see readme for consequences))r   zc:\z
c:\windowsz'you are sharing a system directory: {}
r   )r   z.anyone can write to the current directory: {}
zM
WARNING: IdP-volume "/%s" created by "/%s" has multiple IdP placeholders: %szWORLD-READABLEzWORLD-WRITABLEzREADABLE BY zWRITABLE BY zX
WARNING: IdP-volume "/%s" created by "/%s" has parent/grandparent "/%s" and would be %szWARNING! Some IdP volumes include multiple IdP placeholders; this is too complex to automatically determine if safe or not. To ensure that no users gain unintended access, please use only a single placeholder for each IdP volume.a(  WARNING! The following IdP volumes are mounted below another volume where other users can read and/or write files. This is a SECURITY HAZARD!! When copyparty is restarted, it will not know about these IdP volumes yet. These volumes will then be accessible by an unexpected set of permissions UNTIL one of the users associated with their volume sends a request to the server. RECOMMENDATION: You should create a restricted volume where nobody can read/write files, and make sure that all IdP volumes are configured to appear somewhere below that volume.zjWARNING: Reflink-based dedup was requested, but %s. This will not work; files will be full copies instead.)r   r  z%your python version is not new enoughlinuxzyour OS is not Linuxz(\[H\] pw:.*|[?&]pw=)([^&]+)z(\[H\] pw:.*|=)(z)([]&; ]|$)z-removing share [%s] by [%s] to [%s] due to %rzselect vp from sf where k = ?c                     t        | d         S r  r  r  s    r9   r  z!AuthSrv._reload.<locals>.<lambda>
  s    3qt9 r8   z,mapped %s share [%s] by [%s] => [%s] => [%s]nsorthsortnr   cropth3xu2tsrandunlistr  lg_sbfr   )idxitagdnsortdhsortndsortdcropdth3xr  frandr  r  r  SPINNERs_namehave_up2k_idx
have_acodehave_c2flac
have_c2wavhave_shrhave_ziphave_mvhave_delhave_unposthave_empr  r  md_sbfsba_mdmd_sbasba_lglg_sbatxt_ext	def_hcolsr  unlist0see_dotsdqdeldgridgriddgselgselr  r  r  r  r  dvolidxhdutcthemesturbolvlnosubtleu2ow)u2ju2szr  r  r  r  u2sortzBUG: /z not in all_nodeszBUG: z found in all_nodesz{})r  r  r  r`  rW   r  r   rh  r   r   r'  re_volrF  groupsr
   r)   r  rI  r   r4  ro  r   r   r>   r   maxrX   r  r+  setup_pwhashcopy
setup_chpwr   r   	idp_h_usrr;   r  r   r   r   cfgry  r  r  r   ra   r?   r  rn  r  r  r  r   r   r   r  r  r	  r
  r  r   r   r   r  r   r   shrshr_dbr  r  r  r   r  shr_vhashlibsha512r  digestr(   decoder   rV  r  rb  r  r%  r  rb  getattrr   setattrr@   rA   rB   rC   rD   rE   rF   rG   r  rH  r  r   r   r   base64	b32encoder   r*  r+  r  r  r(  r-  r   makedirsr  rB  r   rC  existsr   r   r   r+   r\   rj   r   floatrk   rp   rq   r   rv   rw   r   ru   rt   rs   rr   rn   ro   r   	no_robots	no_vthumb	no_athumbno_thumbry   fk_salt	re_maxagehave_unlistcr  e2dsar  rz   r   r   rc   rf   rd   re   uqer   r   r   r  r$   r_  r  r  r   r  patternr   ra  r  no_davsmbr  onsysexitumaskr/  r  
no_voldumpchk_sqlite_threadsafegetcwdr   idp_warnidp_errr   	PTN_SIGILfindallr-   version_infoplatformrA  r  r  r  r  r  load_sessionsr  r  	usernamesmimer   r   r   rk  r  r   r   rI  r  r   r,   isfiler  r  r  r$  spinnerbnameno_acode
allow_flac	allow_wavno_zipno_mvno_delunpostemp	textfilesr  qdelau_volih	localtimer  turbor  r  r  r  r"   jsondumps)rH   r  r  r  r  r   r  r  r   rT  ru  r   rU  zs2rJ  v_strr
  r   r!  permsr  rd  r4  cfg_fnr2  r,  zstzsttr0  r1  slnsr  casedr  rQ  r&  r   ehintr  hitszvfrA  maxdepthdepthr"  zvrV  k_ignunknown_flagsrS   r   rY   ensharer(  shrsrT  db_pathr  r  cur2r   rows_ks_pws_vps_prs_nfs_uns_t0s_t1zbsuns_axszssrg  permaxs_keyrr  usrumap	all_usersmissing_usersassociated_usersr   seenpwdspwdpromotedemotehidvflagnchhpathpownerr  ownermetarhisttabhistpis_shrzv2rdbpathsr-  usezfr   r5  have_fkr  r  rm  r  r  fk_lenall_mteerrorsr  have_reflinkgavfr	  ver  is_dr}  k1k2dbdsr  hooksr#  hncmdsncmdscmdhfsocmdr  etvrh  r  ints	needs_e2ddrop	local_mtplocal_only_mtptagsr   r`  localb	local_mter  re1exclr  vtopr   have_dawr  have_e2dhave_e2t
have_dedupunsafe_deduptxtattridp_vpidp_vnidp_vp0sigilssigilpar_vppar_vnoth_read	oth_writetaxspwdsextrQ  shns_vfss_remr  fnsqs_fnexactr   r  rq  r%  svnrU  r  r   s                                                                                                                                                                                                      r9   r  zAuthSrv._reload@  s:   99;;YY[[ 11773?DAqDG1 99==YY]] 11  !yyc288a@HC #C 5 ; ;C @DI1 99;; d3I VLL'#$?$F$Fu$MNN"#((*S%*C++CeT69US) VA471Ha1b'JC**3tYfUVV 99;;))++ ++T4vu 3B14IAR8H1SWY<ICI"3s8n H!>!CQGH 6B58MALL<LAGGFOMDMOST!C3q6A:.4="ETCT5AHHQXXc#h		#?@'*$#6 	$		 E!& /IR$R[#.b	/ ETYY00secUD$/CE{{ A'(A-HHQ!AA1E TAHHQNHHQ!LLaPeX GAeJJquu-E $)HaAGGI,>,>w,GHH TAHHQ!%%		$!@@!DTYY--.CdmmWS\2r3DC99#u_dmmRR
CC%**,,LM 	CIIcNEu$$$Hc
ICby$--c4cF3KPJ3c4(B#YBFc{BHBF	" 
ss}}ckk3;;O=='') 	CKK!4dCKK!4dCCH	
 BHHJ<<&&( 	ICEM		) )1XXc]Y&2U?!%%a() gcii])CDDaH	I ))--amqr{dmmRc35$((*ECii&&G)B))+C99;D))+C{{#56 Y@C=T4tT4D3J99??9AHHQ$T4!889 !G(<=DDFB$+BK"$5$<$<W$EGC $DIC D[SEb D[SEb D[SEb D[SEb	 !$S)!$T]]BBsyy~~GW!X		#9Y< 254CIIcNS\\#.yy'') &EHHSYY'#--		*B!00&
 $i

4==!CfSk**AGGI 	+DDjG<<--/ $CSWWg."9% $s$$ &,,ae,D, !"||113 -GB '2Bby't9LS	((,- S	 ! CtT*!	+$ 	;;= 	2C		

						


 2  2C%&IcNczco#T]]:R-.c*!|01(-22	2& <f]&;<<Byy""UR1%7R1%((I%8=HII

 	 HChZ(3-5q9((HSM	   
	0C**s~~d3s||$q(fAHHQ#Z+ @AHHQ#s^Q/
	0 <<&&( $	1C..$$S\\2C^^F3<<$89@@B&&r*11':@@B/2s||,IIMM&)E|**277+=+=e+DE<CE%LNsz S? CGGLLYsQwHELL'WW\\%=F%!&$/ 61$%FFHOO$5E6
  -446BT2J. }!&$/ (1GGBK( 165CL3:), #3<<0CLI$	1L <<&&( %	'C...CIIMM(+E|**277+=+=e+DE-4U5\%
!! S? CGGLL)9)93yq>JELL'WW\\%=F%!&$/ 61$%FFHOO$5E6
  -446BT2J. }!&$/ (1GGBK( "'CJ), !,CJww88??277<<

I#FGNN3'"CGMM#&K%	'P  	'BLLRXX&	'  zB  W		CLL#**UVW HHV[[_t+qH1,,%%' 
	-BKKE:RXX^^C03s:FV(9uo m		3<<2;;OOAl" HUO',CKK$
	- ,,%%' 
	+B))C:RXX^^C03s:F6cXosm ^ciirxxMMAl"HSM'*CKK$
	+ <<&&( 	+CC+ /1B ?#$CIIaL^&(		!d(#C &*		(#!	+$ <<&&( 6	Cdmm$CCyy}}W% 	t$:		:B"b	A"$B %R.t$B=?XXc]%Kjm%K"#(v&B68hhsm%Dc!f%D"#(v&BR v&B68hhsm%Dc!f%D"#(v&B=?XXc]%Kjm%K"#(w'B&rN	w'B&rN	m6	p 99}}++- 1yy}}X.,0CIIj)1
 =='') 		,Cyy""'+		)$yy""'+		)$yy!!SYY]]8U%C&*		(#'+		)$'+		)$'+		)$		, =='') 	CCt$B))--&C2*Q#b'7vA#AB$788"$		$t$B))--&C))--&C3?jSYYL 01122-/t^#b'		$3	C6 rxxtyy/@/@AHH'..tyy/@/@ABTYY&&'v{ OAaee]3BHHQ&"b))1-=='') 	8Csyy T%:t399?T"'		$"$'		&(9$:		&!$$$(II$7$7		&!	8 "'		
=='') C	"C		377>>diioo$(		&!yy}}#)) 3#'		%  H%7#'"k*	 (B ?**SYY]]2%67C!$))R0C$'CIIbM( ")//+ )B499b)$(CIIbM) ,B
 ?IIMM"d+, ")//+ ;BSYY&$+DIIr$:CIIbM; QBXXZ 5		>#&syy|#4CIIaL5 5BXXZ 7		>#(1#6CIIaL7 ( RR"yyU399#>HC*/*CIIa$h'*/*CIIa$h'	R , &I~YY]]1b)dBIIMM!T*xxb1|AQGAHHQN#A,&QZ!		!R5[!%J!&$ IIMM'4(yy2%5)9R)?%)		'"IIMM(D)#))#syy}}Y'?&*		(#ww"%))I"6 '399 4!ii.!ii.yy}}T" $		SYY&*		*A)-		&CII%#SYY]]8R0188=B2w!|&(ggb.Aq1u.A&B		(# :&B%'ZZ%BCIIk"yy}}^,,0		.)yy}}^,(,		*%& )B?$(CIIbM) ' *B?$)CIIbM* (D%(YY]]5%9%JTYY]]JCIIes$**S/)LSYYT$: :;; 8 QCII%#*499a#8#=#=#?CIIaL#+GDIIq,A399Q<#PCIIaL	Q BGGIE06685@ ""IIsyy$		40H$
  &yy}}R( 'CCDRa."%))C"3C

2 Ra. czcSjZ$3*-:Qcq::"xxse4#~#S.R6\"eck"xxse4LL&#'$ !&		"1&4 .0/FSYYz*C299==28b "C99S>DAq !F1I" ! #ENUENUENK YRyy}}S%0#'		% .1iioo.?Xdaq||TVGWQTX	Y $V,vv.>? YRyy}}S%0$(		&!.1iioo.?Xdaq||TVGWQTX	Y #DM? R99==e, !$		 11<<+qEz qD		 #EN+ YRyy}}S%0.1iioo.?Xdaq||TVGWQTX		Y <D#))_ 59#&syy|#4CIIaL5 CII%*\AHHQXXcii0!4		*-(-E1n1DQE	E#,Aa		a0@AAQAHHQXXdiiosyyA1E! )		a() IN99==+ciimmE2.FFD-12AGGCLO2D2#:!QWWS\:A:A:D: 	-#	!," &AQAAv %&
 (,N1%	- IYY]]5"-224 	&!
#	!++- &AA Av %&		& & "i'~AHHQXXcii5q9!F	"C	"J yy}}")-.AQ..6a6A666 	C'!|#*		 <<&&( 	DC99==-C$'CKK=RDF99D||((* K>>4#:"5"5c":;MM"))CD	,<,C,CC,H"IJK (8:;(*

388DNTF3K(LCIIn%KK())+CHHTN)CCIIo&	D  =='') 	 C))--&7$))--C#'		% 		  		(([AHHQNF99==TWWZZDHHCQGF=='') 	+C#))..*+ <88J*IIMM!$12BSYY		ae, XciiQ%7!7;< yy}}V$GGMM +DGGLL$$T*+	+ HHQK		<4HHQK
(,,%%' $	B&&)a-BHHOrxx/B/B4/H5<<RXXr{{SSA7#8$7#6"6"6"7#7#8$
 3	T  567 AXSE1IIWUVWWA 9^**3223"   "(("!
(Zrxx-G ''bhh7IAI$	L 9q=99''499....0HH188;<aAHHQNQA Xdii56:fAGGCeU3EB""$B]"bmmM&B>"++.!4	'GGBUDcG:EB""y1}9SE"++.!4"'D mm '	OFUE:IFAmmG**734F6{Qd$$Q&'4<)H%HIJJLEF*GGFC>	FMM)	!::++ -C&**"2"22 ,- "::,, .C&**"3"33!((-. (?+DI%+D/79D/8:Do##A&,,(M$MN7 '	OR == xAHHQ//3<< {AHHQ..2|A')DDaH<<**7333Q7	
	'+zz|4tq!ad4
 0&*jjoo&78		!88DO$99KKTFSAXa+FGwwzz4(388D>9NJ**R.DK 99>>iinn "HHS!,	T!c
" KK%++-8$!QA89  LL..0Aq8ALL$6 1CL #$3..{{#56 7H@C=T4tT4iimmC.#&77dC4KcTk3RV;$LE5 7A#'<<C6#: )

4() %(HCM [[CF WWCF $$en$u5 \\{{266*"&&LB9<"EAAqt9"E # 
!HCSy $~~b)!"'s3r79~">C%*YYsC%FFC"e|sww%/? #

3
! OO**B;7$$)<d$K99??FAHHQ$T4!FFGo7Ht ii&&( 	UJJ	T]]4(88??2&))..* UB#&t}}b"b#%#TBHHRLU	U JJLIIKHHJ
hh((..0 =	6FB2==.B{!R-h<FFF6
bffVn-FF:.3!&&*0b)R/bffX6F6M#BH*499,,*$))//*  "* $))"4"44	*
 tyy33* dii11* DIIMM* 		 0 00* tyy.* 		 0 00* s499#3#34* DIIMM* "&&,2* zR/bffX6F6M#* "&&*0b*  "&&*0b!*" 499..66sC@#*$ T"&&-"526%*& 266(+1r'*( DII..)** +*, 2-*. 2/*0 'R-1*2 2h<3*4 F5*6 F7*8 F9*: 		((;*< DIILL)=*> DII///?*@ $))**A*B DIIOOC*D DII..E*F yy}}		6
6
bffVn-HHZ0))**S*FV "$**V"45BI{=	6~ CMM((*+yy'') %99CMM1HHCIIGKKK$% cmm#>B 	1C++b/!$C		4SYY4"CI9szz9TCJSYY]]8,@		0@0@AB"$))C.CIIh	1Q%1[A#AHHQK001nA#AHHQK00< J
 NT
o.C@I#q@QR1J--a3RRDRNA7AHH_33AtyyGHHEHf -l6 6% $( (.6 6% $( (x/ A.B4 &L
 &E &E
 &LPR=A#AAsyy}}QY7O(P$PQQV /Bn ; 2Scii--q1 Y Y Y FA 3:> /6\  	'"&D	'B 5 9 G 9" ! GAHHQ#tT2!66:IIMM#&	4 #F! s  DAA	DA:DB*+DBDB6DB*DB DB 2DB*8+DB%#?DB*#DE  $DE%DE7
DEDE#DE6DE#6DE-EDFEDE:E8DFF8DFSDFWDF<X#DGY7DG	[=DG]DGz#ADGFDH
R
DH
RDH
T=DH V5DI
WDI
X6DI
YDI
Z%#DI
\DI
\2DI
_$	DI#_.DI#_8 DI(`DI(cDI-c#DI2h2DI8iDI=FBDJ S*DJT<DJ!V)	DJ&V3DJ&ZDJ+
[#DJ1]	!DJ7aDLbADLADA7A:DBBDB*B* DD?C
DC'
C&ADD?EDE	EDE EDE#E#DE*E-DE7E:DFE?DFFDFFDFFDF9F<DGG;DHH %DIJDJJDJJ7	DLK 7DK=K=DLLDLc                    | j                   j                  }|dk  s| j                   j                  sy t        j                  | j                   j
                        }|j                         }|j                  d      j                         }|j                          |j                          | j                  j                          | j                  j                          | j                   j                  }g }|D ]w  \  }}	|dk  r|| j                  v rd}	|j                  |	      D 
cg c]  }
|
j                          }}
|j!                          || j                  |<   |j#                  |       y |rJ|sGdj%                  |d d       }t'        |      dkD  r|dz  }| j)                  dt'        |      |fz         y y y c c}
w )	Nry  zselect un, gs from usr   r`   rK   	   ...zfound %d IdP users in db (%s))r  r  r&  r  r  r  r  r  fetchallr  r  clearr  r  rW   r   r   r   rX   r   r   )rH   quietlevelr  r  
from_cachegsepr0  r4  r  r   r  r   s                r9   r#  zAuthSrv.load_idp_db  ss   		##19DII// __TYY--.iik[[!89BBD
		

yy!!& 
	LE5qyDMM))-E):;Aaggi;F;KKM $*DMM% HHUO
	 U		!BQ% A1vzU
HH4A{BC	 1 <s   (G c           
         | j                   j                  ri | _        i | _        y i }| j                   j                  dz  dz  }|dz  dz  }t        j                  | j                   j                        }|j                         }|j                  d      D ]  \  }}|| j                  v s|||<    g }d}	t        | j                        }
| j                   j                  r?| j                   j                  r)|
j                  | j                  j!                                |
D ]z  }||vst#        t%        j&                  |            j)                  d      }|j                  |	||t+        t-        j,                               f       |||<   |j/                  |       | |r|j1                          |j3                          |j3                          || _        |j5                         D ci c]  \  }}||
 c}}| _        |rJ|sGdj7                  |d d       }t9        |      dkD  r|dz  }| j;                  dt9        |      |fz         y y y c c}}w )	Nr  r   zselect un, si from uszinsert into us values (?,?,?)r  rK   r  zadded %d new sessions (%s))r  no_sesr  r  ses_lenr  r  ses_dbr  r  r  r   r&  
idp_cookiera  r  r  r(   r   urandomr.  r   r   r   r  r  r   rX   r   r   )rH   r  r  blenr  r  r4  sidr0  r  accsrS   r   r   s                 r9   rO  zAuthSrv.load_sessions%  s   99DIDI 		!!Q&!+qQ__TYY--.iik++&=> 	"JE3		!!U	" +DII99499#7#7KK**,- 	 ED bjj./66w?AsC		,<=>!U	  IIK		

	&*jjl3daQT3	U		!BQ% A1vzU
HH1SVQK?@	 1 4s   +Ic                     | j                   5  | j                  |       d d d        |r |j                  d      j                          y y # 1 sw Y   ,xY w)N_reload_sessions)r  _forget_sessionr   r   )rH   r   r4  s      r9   forget_sessionzAuthSrv.forget_sessionR  sL    ZZ 	(  '	( JJ)*..0 	( 	(s   A

Ac                    | j                   j                  ry t        j                  | j                   j                        }|j                         }|j                  d|f       |j                          |j                          |j                          | j                  j                  | j                  j                  |d      d       | j                  j                  |d       y )Nr  r`   )r  r  r  r  r  r  r  r  r  r  r   r  r   )rH   r4  r  r  s       r9   r  zAuthSrv._forget_sessionY  s    99 __TYY--.iik1E8<
				

		diimmE2.3		eR r8   c                    | j                   j                  sy|dk(  s|| j                  vry|| j                   j                  v ryt	        |      | j                   j
                  k  rd}d|| j                   j
                  fz  fS | j                   j                  r|d|}| j                  j                  r| j                  j                  |      n|}|| j                  |   k(  ry|| j                  v s|| j                  v ry	| j                  5  | j                   j                  }t        j                   j#                  |      si }n,t%        | j&                  |d
      }t)        j*                  |      }|D 	cg c]  }	|	d   |k7  s|	 }}	|j-                  || j                  |   |f       t/        |dd      5 }
t)        j0                  ||
d       d d d        | j'                  d|d       |s| j3                          	 d d d        y	 d d d        |j5                  ddd      j7                          yc c}	w # 1 sw Y   jxY w# 1 sw Y   <xY w)N)Fz!feature disabled in server configr]  )Fznot logged in)Fznot allowed for this accountz&minimum password length: %d charactersFrA  )Fz$that's already your password my dude)Fzpassword is takenTr   rq  r  )encoding)z,
: )
separatorsz0reinitializing due to password-change for user [r  )Tznew password OKr  )r  chpwr  chpw_nor   chpw_lenrP  r  rB  r   r  r  r  r  chpw_dbr   r   r4  r%   r   rc  loadsr   r  dumpr  r   r   )rH   r   r4  pwr   hpwrQ  pwdbjtxtr   r  s              r9   r  zAuthSrv.chpwh  s   yy~~=C<5

2)DII%%%8r7TYY'''8A!tyy11333399!2&B"&''**dggll2"$))E""@$**tyy 0-ZZ 	/""B88??2& 2t4zz$'#5!qtu}A5D5KK

5 1378b#0 =A		$m<= HHeUV.'	/ 	/  !	/* 	

8UE*..0& 6= =	/ 	/s=   A)I:H:H:1I=H?0I:I?I	IIc                    | j                   j                  }| j                   j                  rt        j                  j                  |      sy t        | j                  |d      }t        j                  |      }t               }t               }t               }|D ]L  \  }}	}
|j                  |       ||vr||   |	k7  r|j                  |       7|j                  |       |
||<   N | j                   j                  sy |D ]  }||vs|j                  |        |D ]  }|j                  |        | j                   j                  dk(  s| j                   j                  dk(  r-|s+d}| j                  |t        |      t        |      fz         y | j                   j                  dk(  rDdt        |      fz  }|r |ddj                  t!        |            z  z  }| j                  |d       y d	}|r#d
}||dj                  t!        |            fz  z  }|r(d}|||rdnd	dj                  t!        |            fz  z  }| j                  d|z   d       y )NTr   ry  zchpw: %d changed, %d unchangedzchpw: %d changedz, [0munchanged:[35m %srK   rG  r`   z[0mchanged: [32m%sz%s[0munchanged: [35m%szchpw: )r  r  r  r   r   r4  r%   r   rc  r  r>   r  chpw_vrb  r   rX   r   )rH   r  rQ  r  r  useenurstuokr  origmodr,  r   r   s                 r9   r%  zAuthSrv.setup_chpw  s    YYyy~~SXX__R%82t,zz$ue" 		NCsIIcN$CyD GGCLDI		 yy 	C%	  	BLL	 99q TYY%5%5%:40AHHQ#c(CI../YY""c#h[0A54:9NOOHHQN,A1		$s),...C0A1		$t*%  C
 	C#r8   c                 |   | j                   j                  rNt        |j                               d d  D ]/  \  }}|j	                  d      rt        |      dk(  r&|d|||<   1 t        | j                         | _        | j                  j                  s:| j                   j                  s| j                   j                  rd}t        |      y | j                   j                  r/| j                  j                          t        j                          n| j                   j                  dk(  r/| j                  j                          t        j                          nb| j                   j                  rLt!        | j                  j#                  | j                   j                               t        j                          |sy d}t        |j                               d d  D ]k  \  }}|j	                  d      rt        |      dk(  r&d}| j                  j#                  |      }|||<   d}| j%                  |j'                  ||      d	       m |sy g }|j                         D ]&  \  }}|j)                  d
j'                  ||             ( d}| j%                  |j'                  dj+                  |            d	       y )N+!   rA  z?
  BAD CONFIG:
    cannot --ah-cli or --ah-gen without --ah-algr)  FTz"hashed password for account {}: {}r     {}: {}z<please use the following hashed passwords in your config:
{}rd  )r  rP  r   r   ro  r   r   r  rB  ah_cliah_genr  clirC  rD  stdinprintr   r   r   r   rX   )rH   r  r4  r  r   changedr  r2  s           r9   r#  zAuthSrv.setup_pwhash  s   99!$**,/2 4	r==%#b'R-).3U4
 #wwzzyy499#3#3Wl"99GGKKMHHJYY$GGMMOHHJYY$'',,tyy//01HHJdjjl+A. 	.IE2}}S!c"gmG'',,r"CDK4AHHQXXeS)1-	.  	5IE2JJz((34	5 L$))C.)1-r8   c                 :    t         dd  }|dk(  ry|dk(  ry|dk(  ryy)	Nr_   1r`   2z33m  your sqlite3 was compiled with reduced thread-safety;
   database features (-e2d, -e2t) SHOULD be fine
    but MAY cause database-corruption and crashesr   zt31m  your sqlite3 was compiled WITHOUT thread-safety!
   database features (-e2d, -e2t) will PROBABLY cause crashes!zC36m  cannot verify sqlite3 thread-safety; strange but probably fine)r   )rH   r   s     r9   rG  zAuthSrv.chk_sqlite_threadsafe  s4    rsO88 u8 KTr8   c                 
   | j                   j                  }d}g }	 |j                  dd      \  }}	 |j                  dd      \  }}|j                  d      }|dk(  r(t        | j                  j                               dgz   }n|g}|D ]$  }|| j                  vs|dk7  st        d|z          |dk(  r'| j                  j                  D cg c]  }d|z   	 }}n|g}|D ]G  }|j                  d      st        d      |dd  | j                  j                  vs;t        d|z          | j                  t        |||d	             d
}	| j                  j                  j                         D ]  \  }
}|j                  }|
|j                  |j                  |j                   |j"                  |j$                  |j&                  |j(                  |j*                  |j,                  g
}| j                   |	j.                  |         d|v }d|v }d|v }d|v }g }|D ]  }|dd  }|rdj/                  |      nd}|D ]_  }| j                  dj/                  ||             	 | j                  j1                  ||ddddd      \  }}|j2                  }|t4        j6                  z   }|j9                  |j:                  dg |ddggd| j                   j<                   dd	      }|D ]  \  }}}}}}}|D cg c]  }|d   	 }}|r|D cg c]
  }|dz   |z    c}n|} | D cg c]  }||z   	 }!}|D cg c]"  }t4        j>                  jA                  ||      $ }"}|dz   |t4        j6                  z   fgt        tC        |!|"      D #$cg c]	  \  }#}$|#|$f c}$}#      z   }%|rB|%D cg c]  }|d   j                  |      r| }%}|%rg |d d  |jE                  |%d   d          |%s|r+dg|%D &'cg c]  \  }&}'dj/                  ||&|'       c}'}&z   }(n0dj/                  |||%d   d         g}(|(|%D cg c]  }|d   	 c}z  }(| j                  djA                  |(              |r$| j                  djA                  dg|z                |sS|sWt        d        |stG        jH                  d       y y #  Y xY w#  Y pxY wc c}w #  Y xY 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 )Nr]  rB  r   z**zuser not found: r   zvolumes must start with /zvolume not found: )usersr  r   zN/{}: read({}) write({}) move({}) del({}) dots({}) get({}) upGet({}) uadmin({})r   r   ru  r   z/{}/zchecking /{} as {}TFr`   r   z# user "{}", vpath "{}"
{}zuser {}, vol {}: {} =>rd  z
  zfound symlinks leaving volume:zt[31m
  [--ls] found a safety issue and prevented startup:
    found symlinks leaving volume, and strict is set
[0m)%r  r  rW   r   r  r  r  rA  r  ro  r   r   r   r   r?   r@   rA   rB   rG   rC   rD   rE   rF   r   r   r   r   r  r  r   
no_scandirr   rX   r=  r   rC  rD  ))rH   r  rV  r   r  rT  r   r  r,  r   rS   rr  r  vsflag_vflag_lnflag_pflag_rbadsr   r  r%  r5  atopsafeabsr  r   r  files1r   r0  r  zslr  r  rU  re  r  r  rQ  r  s)                                            r9   dbg_lszAuthSrv.dbg_ls  s   			S!,JE3	iiQ'GCHHSME D=)*cU2EGE 	8A		!a3h 2Q 677	8 #:%)XX%6%67C!G7D75D 	;B==% ;<<!"vTXX... 4r 9::	; 	udUCDE\XX&&,,. 	$EArB				B HHXQXXr]#	$  %- 9	A!"A'(6==#cD 6-44Q:; HHLLAtUE5%PEB {{-GGHHE]O		,,,
 <= ,7Aq%a,23qad3F3?DF;q53;?;&C0341dQh4F4>DEbggll5!4EFE#ck5266>:;d474GHS#sH? E ,1 Rq19Q R R &(DG KKa4   T*/% &B :@@BK% 
 7==auQxPQ{STU3qt33HHTYYr]+5,8 HHV[[*J)Kd)RSTF# X i69	v HHQK c	
	 8T  4;4EH !S% 4s^   R; &S S"$S2S
S
S"
0'S'
S,#S2
=S2
.S71S=;S SSc                    g d}t        dj                               }d}t        |j                               }t        dj                               }d}t        |j                               }t               }|j                  t	                      |j                  t                      |j                         D 	
ci c]  \  }	}
|
|	
 }}	}
t        | j                        j                         D 	
ci c]  \  }	}
|	|

 }}	}
g }t        D ](  \  }}|j                  |      s|j                  |       * |D ]  }|j                  |d         |r|j                  d       |j                         D ]  \  }	}
|	|v r	 |
j                  }
|	dv r|
dd	 }
d
}dt        fdt        ffD ]e  \  }}|	|k7  rt!        t#        t!        |
                  }t!        t#        |j                  d                  }||k(  rd} ndj%                  |      }
g |r|	|v r(dj%                  |
D cg c]  }t'        |       c}      }
	 t)        | j*                  |	      }|	dk(  r0t-        |      dk(  r"dj%                  |D cg c]  }|dz  	 c}      }|
|k(  s|
j/                  dd      |k(  r3	 d|	j/                  dd      z   }|	|v r*|
D ]#  }|j                  dj1                  ||             % w|
du r|j                  |       |
dvs|j                  dj1                  ||
              |j                  d       | j2                  re|j                  d       | j2                  j                         D ]&  \  }}|j                  dj1                  ||             ( |j                  d       | j4                  rj|j                  d       | j4                  j                         D ]+  \  }}|j                  d|ddj%                  |             - |j                  d       | j6                  j8                  j;                         D ]  }|j                  dj1                  |j<                               |j                  d|j>                  z          |j                  d       dd d!d"d#d$d%d&d'd(	}i } |j;                         D ]+  }!t)        |j@                  |!      D ]  }"	 | |"xx   dz  cc<    - | j                         D 	
cg c]	  \  }	}
|
|	f }#}	}
i }$t#        |#      D ]~  \  }%}"d}&|j                         D ]#  \  }'}!|"t)        |j@                  |!      v s|&|'z  }&% d)|&v rd*|&v r|&j/                  d)d      }&|&j/                  d+d,      }&	 |$|&   j                  |"        |$j                         D ]5  \  }&}"|j                  d-j1                  |&dj%                  |"                   7 g }(g })t#        |jB                  j                               D ]/  \  }	}
|	|v r	 |
j                  }
	 ||	   }*t)        | j                  |*      }	 |j                  }||
u rG	 d
}dt        fdt        ffD ]e  \  }}|	|k7  rt!        t#        t!        |
                  }t!        t#        |j                  d                  }||k(  rd} ndj%                  |      }
g |r|	|v r)|
D ]#  }|)j                  dj1                  |	|             % |
du r|(j                  |	       	|
d
us|)j                  dj1                  |	|
             2 g }t        D ]  \  }}||(v s|j                  |        |(D cg c]	  }||vs| }(}|(r |)j                  dj%                  |(             |)r,|j                  d.       |)D ]  }|j                  d/|z           |j                  d        | jE                  d0d1j%                  |      z          y c c}
}	w c c}
}	w #  Y xY wc c}w c c}w #  Y xY w#  d| |"<   Y [xY wc c}
}	w #  |"g|$|&<   Y )xY w#  Y (xY w#  Y xY w#  Y 	xY wc c}w )2N)z## WARNING:z&##  there will probably be mistakes inz)##  commandline-args (and maybe volflags)r`   z'i p th_covers zm_on zm_off zs_on zs_offzMc ihead ohead mtm mtp on403 on404 xac xad xar xau xiu xban xbc xbd xbr xbu xmz!a v c vc cgen exp_lg exp_md themezQexp_lg exp_md ext_th_d mv_re_r mv_re_t rm_re_r rm_re_t srch_re_dots srch_re_nodotr6  )r  tftp_lsfr   r_   Fr  r  rB  TrK   r  r   r`   ry  r=  r5  r)  {}: {})FNr`   r7  r
  r8  r  z[/{}]  accs:r?   r@   rA   rB   rG   rC   rD   rE   rF   )	r   rq  r
  r   rF  r  ro  rm  r`  r  ro  zrwmd.ar<  
    {}: {}  flags:r@  zgenerated config:

rd  )#r>   rW   r   r%  r   r   r   varsr  r   r   r   r   r?  r   r   r   rn  rX   r   r/  r  r   r   r   r  r  rA  r  r   r   r   r   r   r   )+rH   r   csvr,  rt  askipr   fskipamaprS   r   vmapr  popsr  r  r   skipdefstrs1s2rS  v2r   rm  r  rT  ru  r  r&  rV  rg  r  pkeyr4  lusersvpermsr5  pstrpchartruesr~  aks+                                              r9   cgenzAuthSrv.cgen  s   
 ;AACD\"((*o7==?@_AGGI yGIGI!%.A1..!%dii!6!6!89A199" 	 FBxx|B	   	 CHHS$	  JJz"

 ,;1:		A44aG $)7#3eW5E"F %JBBw fT!Wo.BfV\\#%678BRx#A% 8		Q"7r3r7"78A Q/BH}RAWWR%8a!e%89Bw!))D#"6""<  #=
 AIIc3//8 <

8??2r#:;< Dy

2"33

8??2q#9:Y,;Z JJrN99JJ|$		) 41

:,,Q234JJrN99JJz"99??, >C

TYYs^<=>JJrN88$$++- _	CJJw~~cii01JJtcll*+JJy!
E E )$SWWd3 )E)e))) */7Aq!f7F7F"6N +5#(;;= &KE4 66& $;3$;<<R0D||Hc2+4L''.+  &||~ He

<..tTYYu5EFGHEDsyy01 +71:		AaB B/BZZ Qw  
 $)7#3eW5E"F %JBBw fT!Wo.BfV\\#%678BRx#A% 8 <HOOAr$:;<$YLLOe^KK1 56W+7X D& $B;KKO$ !&71$Q7E7DIIe,-

:& ,BJJv{+,JJrN_	B 	(499S>9:Q /9$" #8 &9Z)'(e7+$)7F4L6 8s   <`2`?`$`
>8`#6`
!`#`+`8`>a*aaa-	a$7a$``##`(+`5	>a	aaaa!)TNr   r=   )r  r   ) r4   r5   r6   r  rI   r   r  r  r  r  r  r  r  r!  r'  r4  r.  rI  rc  r_  r  r  r#  rO  r  r  r  r%  r#  rG  r!  r;  r7   r8   r9   r  r    s    , %N*9 DJX!F
>D.Y4qfM=^"H8Et$1B&"DH+AZ1!/'b8$t..`U"yv|;r8   r  c                 r   i }	 | j                         } | s	 |S | j                  d      dz   }| j                  d      dz   }|s
|sd|| <   	 |S |r0||k  s|s)| j                  dd      \  }} d||j                         <   n9| j                  dd      \  }} | j                         ||j                         <   	 |S )NTrB  r   rA  )r   findrW   )r   r   ofs_sepofs_varrS   s        r9   rH  rH  N  s    
C
XXZ J ''#,"''#,"wCG J ')HHS!$EAr!C	NHHS!$EArXXZC	NJ! r8   c                    t        |      }t        |j                  d            dkD  rt        d      t        j
                  j                  |      rt        t        t	        j                  |                  }|D cg c]$  }|j                         j                  d      s#|& }}|sOd}|r|dz  }||dj                  |dd	       fz  }n|d
z  }||fz  }| r	 | |d       |j                  d|d       nd|d|d}|j                  |       |D ]5  }	t        j
                  j                  ||	      }
|
|v r(t        | ||
|       7 yt        j
                  j                  |      s)d}||fz  }| r	 | |d       |j                  d|d       y|d|z   z  }|j                  dj!                  |             t#        | |d      j%                  dd      j                  d      }	 |D cg c]  }|j'                          c}D ]  }|j                  d      d   j)                         }|j+                  d      rdt        |j                  d      d         z  }|dd j)                         }
t        j
                  j                  t        j
                  j-                  |      |
      }
t        |      }t        | ||
|       t/        |t        |            D ]  }|||   z   ||<    |j                  |        |j                  dj!                  |             g }|D ]O  }|j                  d      d   }d|v s|j                  d      d   j)                         s?|j                  |       Q |rRddj                  |      vr>d }|d!j                  |      fz  }| r	 | |       yt1        |t2        j4                  "       yyyc c}w c c}w )#zexpand all % file includesr  @   zhit max depth of 64 includesr  zQwarning: tried to read config-files from folder '%s' but it does not contain any z<.conf files; the following files/subfolders were ignored: %srK   Nr  zfiles at allr   z#[33m z[0mr  z => zJwarning: tried to read config from '%s' but the file/folder does not existz#[31m z#[36m opening cfg file{}[0mT	rE  rd  r;  r   z% %r   z#[36m closed{}[0mz #r<  zno-cfg-cmt-warna6  [33mWARNING: there is less than two spaces before the # in the following config lines, so instead of assuming that this is a comment, the whole line will become part of the config value:

>>> %s

if you are familiar with this and would like to mute this warning, specify the global-option no-cfg-cmt-warn
[0mz
>>> )file)r   r   rW   r  r   r   r  r   rn  r   ry  r  rX   r   r*  r4  r   r%   r   r   r   ro  dirnamer-  r  rC  stderr)r   r   r/  ipathnamesr   cnamesr   r,  r]  fp2r0  olnr   padofsr0  r   s                     r9   r*  r*  d  sy    
B
5;;v"$677	ww}}RVBJJrN+,"Baggi&8&8&A!BBcASSTYYuRay122^#IAq	JJ34  >@HBJJrN 	5B'',,r2&Ce|sCe4	5 	77>>"XI1I

A/0	Vb[EJJ4;;EBC#r4(00s;AA$GI(121AHHJ2 	C5!!$**,B}}T"C		#q 122fllnggll277??2#6<#h"3S%8sCH- *A 3q6\CF*JJsO	 JJ*11%89
C XXe_Q2:"((3-*002JJrN  		#6 Ps#%%F!#**% 7s} CR 3s   >$O#O0Oc                 j	   |D cg c]$  }|j                  d      d   j                         & }}|D cg c]  }|s|	 }}d|v sed|v sad|v s]d|v sY|D cg c]  }|j                  d      s| c}s7t        |      t        |D cg c]  }|j                  d      s| c}      k(  r|S |D cg c]	  }d	|vs| }}t        |      t        |      d
z
  k7  }d}|j                  s|dz  }|r|dz  }| r | |j                  |      d       g }d}	d}
d}d}d}d}d}|D ]?  }|j                         }|sdx}x}	}
|j                  d      d   s|j                  |       B|j                  d      r|d|fv r||k7  r|}|j                  |       |j                  d      }|j                  dd
      }t        |      d
kD  r&dj                  |d   |d
   j                               }|j                  d|z          |j                  d      rv|d||fv ro||k7  r|}|j                  |       |d
d j                  dd
      \  }}|j                  dj                  |j                         |j                                      d|
s|}
j|	sLd|j                  d      z   }	dj                  |	      }|j                  |       |j                  d|
z          |j                  d      r||k7  r|}|j                  |       |d
d j                         }d|v r3|j                  dd
      }|d   j                  dd      }|d |d
   z   z  }n|j                  dd      }|j                  d!|z          S|dd
 d"v r||k7  r|}|j                  |       |j                  d      }|D cg c]  }|s|	 }}t        |      d
k(  r|j                  d#       |j                  d$j                  |d   dj                  |d
d                    d%}|}d}|D ]  }|d
z  }|d&j                  ||      z  } | r | |d
       t        |      t        d'|z          t        |       |j                  r%| r#d(}|d)z  }|D ]
  }||d*z   z  } |d+z  } | |       |S c c}w c c}w c c}w c c}w c c}w c c}w ),zconvert from v1 to v2 formatr<  r   r6  r7  r9  r:  r?  rC  r  r   z(upgrading config file [{}] from v1 to v2zM. Run with argument '--vc' to see the converted config if you want to upgradezd. Please don't include v1 configs from v2 files or vice versa! Upgrade all of them at the same time.r   r`   r%  r'  r)  rE  r$  r=  zu NrA  r
  r   z[{}]zc rN   rB  rK   r  r@  z
rwmdgGhaA.r]  r&  z(did not understand line {} in the configz
{:4} {}z[31mz<new config syntax (copy/paste this to upgrade your config):
zJ
# ======================[ begin upgraded config ]======================

rd  zJ
# ======================[ end of upgraded config ]======================
)rW   r   ro  r   r  r   r   r  r   rX   r  r  )r   r  r  cfg_fpr   ri  inclr   r   r  rQ  rK  rL  rM  rO  rP  r   snr1  r2  t1r0  s                         r9   r,  r,    s    -1
1q1773<?  "
1C
1
Q1
C
c3c>s?1!all40A1s8ss@!all3.?A@AA
D:!C1
DC
Ds8s4y1}$D2A77	\\	ss
AHHVa 
C	B	B
CDDDD < XXZC"rxx}QJJrN]]3CB:$5d{

33B((3"C3x!|__SVSV\\^<JJtby!]]4 SRt,<%<d{

3V\\#q)FBJJz((RXXZ@ABrxx}$B--#CJJsOJJtby!]]4 d{

3ABBbyhhsA&V^^C.dSVm#ZZT*JJv{#V|#d{

3((3-C!'Q1'C'3x1}

3JJ|**3q6499SW3EFG:ABA /Q[''2../ Aq	 B- j1n%B-y< | ww3K	\\ 	BdNA		[[AJK 2
 2@ E@ (s?   )RRRR!-R!R&
R&
1	R+;R+(R00R0)X
__future__r   r   argparser1  r+  rc  r   ry   r|  rC  r  r   r   rI   r   r   r	   r
   r   r   r'  r   r   r   r   r   pwhashr   utilr   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  	broker_mpr.   
broker_thrr/   broker_utilr0   xranger-  rH  SEE_LOGSEESLOGr   SSEELOGr  rG  rz   r  r  rK  r  r3   objectr;   r\   r   r   r  rH  r*  r,  r7   r8   r9   <module>r_     st   7     	 	  
    < <  @ @        < #%& E  *  
(
..
!

%
%g
.
..
!BJJ-.	BJJ-.	BJJ'(		I 	U& U8k<& k<\w& wt RZZEFFRZZ12F[&;f [&;|L,N&bir8   