
    ir,                       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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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z< e$rd dl=Z=erdd
l>m?Z? ddl@mAZA ddlBmCZC ereDZEdZFdddddZGdZHdZIdj                  eH      ZKdj                  eH      ZLdj                  eL      ZM ej                  d      ZO ej                  d      ZP ej                  d      ZQ ej                  d      ZR ej                  d      ZS G d deT      ZU G d deV      ZW G d  d!eV      ZX G d" d#eV      ZYer ej                  d$      ZZn ej                  d%      ZZ G d& d'eV      Z[d( Z\d) Z]d* Z^d+ Z_d, Z`d- Zay).    )print_functionunicode_literalsN)datetime   )ANYWINMACOSPY2TYPE_CHECKINGWINDOWSE)bos)	flagdescs	permdescsvf_bmapvf_cmapvf_vmap)PWHash)DEF_MTEDEF_MTHEXTSFAVICON_MIMESFN_EMBHAVE_SQLITE3IMPLICATIONSMETA_NOBOTS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substr(w,1,16)ipatun)wup_ipz.up_atup_byzsee log for detailsz! (see fileserver log for details)z ({})zinvalid config; {}z\$\{u(%[+-][^}]+)\}z\$\{g(%[+-][^}]+)\}z(\${[u][}%])z(\${[g][}%])z(\${[ug][}%])c                       e Zd Zy)CfgExN)__name__
__module____qualname__     D/home/ubuntu/myenv/lib/python3.12/site-packages/copyparty/authsrv.pyr=   r=   n   s    rB   r=   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)
selfrI   rJ   rK   rL   rM   rN   rO   rP   rQ   s
             rC   __init__zAXS.__init__s   s     %+2&
6<R(%+2&
_	_	%+2&
%+2&
6<R(_	rB   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krR   s     rC   	<genexpr>zAXS.__repr__.<locals>.<genexpr>   s     %R!DMM!4D&E%R   !))splitjoin)rR   kss   ` rC   __repr__zAXS.__repr__   s)    CIIK II%Rr%RRTTrB   )	NNNNNNNNN)r>   r?   r@   rS   rd   rA   rB   rC   rE   rE   r   s*     %,UrB   rE   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| _        d| _        d| _        t4        | _        t9        j:                  d      | _        y )N  Fr    )log_funcregchmod_duidgidchownnupsbupsbupcnosubdfldftdfvvbmaxvnmaxc_vb_vc_vb_rsminsmaxbwinbmaxnwinnmaxrotnrotlrotfr   rotf_tzrecompilerot_re)rR   rk   s     rC   rS   zLim.__init__   s       48
			


									jjnrB   c                 D    | j                   r| j                  d||       y y )Nzup-limrk   rR   msgcs      rC   logzLim.log   s    ==MM(C+ rB   c                    || _         |dk7  rddlm}  ||      | _        t	        j
                  |      j                  dd      j                  dd      }t	        j                  dd	|      }t	        j                  d
|z   dz         | _	        y )Nr   r   )ZoneInfoz%Yz[0-9]{4}z%jz[0-9]{3}z
%[mdHMSWU]z[0-9]{2}z(^|/)$)
r   zoneinfor   r   r   escapereplacesubr   r   )rR   fmttzr   rs        rC   set_rotfzLim.set_rotf   sp    	;)#B<DLIIcN""44<<T:NFF<Q/jj1s!23rB   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   ri   {}/{})
rl   rv   chk_nupchk_bupchk_remchk_szchk_vszchk_dfrotformat)rR   r6   remszptopabspathbrokerrl   	volgetterap2vp2s              rC   allzLim.all   s     ?txx/DHDHRRS8KKOBVT2y1GR 88G$Sc>8OW^^C->>#>>rB   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)r|   r!   r}   )rR   r   s     rC   r   z
Lim.chk_sz   s@    		>.//99diin-- (9rB   c                 N   |r| j                   | j                  z   sy |j                  ||      }|j                         \  | _        }| j                   r(| j                   | 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)rx   ry   askgetrz   r!   )rR   r   r   r   r   xnfiless          rC   r   zLim.chk_vsz   s     TZZ$**4JJy$'eegV::$**t{{R'77<==::$**vz1ABB 2:rB   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 {}  )ru   rv   timeintr$   r   rw   rl   listvalueslenminr!   r   r%   )	rR   r   r   already_writtendfduerrtjs	            rC   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rB   c                 :    | j                   r|rt        dd      y y )Nr   zno subdirectories allowed)rt   r!   rR   r   s     rC   r   zLim.chk_rem  s     ::#9:: :rB   c                    | j                   s| j                  s|dfS | j                   r|j                  d      }| j                  j	                  |j                  dd            r|dfS t        j                  | j                        j                  | j                         }|r|dz  }||z   |fS | j                  || j                        }|st        dd      |t        |      d  j                  d      j                  dd      }||fS )Nrj   z/\\/r   zno available slots in volume)r   r   rstripr   searchr   r   nowr   strftimediver   r!   r   strip)rR   pathsufretds        rC   r   zLim.rot  s    yy8O99;;u%D{{!!$,,tS"9:Rx,,t||,55dii@C#:s?"iidii(<==D	""5)11$<AvrB   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 )Nrj   c              3   $   K   | ]  }|d v  
 yw)
1234567890NrA   )r\   ys     rC   r^   zLim.dive.<locals>.<genexpr>:  s     2P13D2Ps   0ri   r   r   zrotation bug)r   listdirr   r   r   r   sortosr   rb   mkdirrm   rp   rn   ro   strr   r!   )rR   r   lvsitemsr   dirsr   r   s           rC   r   zLim.dive3  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rG   )rq   appendr   )rR   r6   s     rC   nupzLim.nupZ  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rG   )r   rr   r   rs   )rR   r6   nbytesvs       rC   bupzLim.bup`  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)r   rq   r   r   popr   r!   )rR   r6   rq   cutoffs       rC   r   zLim.chk_nupi  s    yyBdii/yy}tyy(tAw'HHQK tAw' t9		!011 "rB   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)r   rr   r   r~   rs   r   r!   )rR   r6   rr   r   marks        rC   r   zLim.chk_bupu  s    yyBdii/yy}tyy(yy}tAwqzF*DHHQKN"D tAwqzF* 		"499:;; rB   r   )NNup2k.get_volsize)r   F)r>   r?   r@   rS   r   r   r   r   r   r   r   r   r   r   r   r   r   rA   rB   rC   rf   rf      s\    $%L,4" '?@. (C&8;,%&N*#
2<rB   rf   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 ZddZd Zd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                 *   || _         || _        || _        || _        || _        i | _        || _        | | _        d| _        i | _	        i | _
        i | _        d | _        d | _        d | _        t               | _        d| _        g | _        i | _        i | _        i | _        i | _        i | _        i | _        i | _        i | _        i | _        i | _        d| _        i | _        i | _        i | _         |r||jC                  tD        jF                        rdntD        jF                  z   }||rdndz   }tD        jH                  jK                  |d      | _&        | jL                  | _'        | | j<                  |<   | | j>                  |<   || gfg| _(        || fg| _)        | jT                  | _+        | jX                  | _-        n>dx| _&        | _'        g | _(        g | _)        | j\                  | _+        | j^                  | _-        | j`                  | _1        | jd                  | _3        y )Nr   rj   r   .hist)4r   realpathvpathvpath0axsuaxsflagsrootdevnodeshisttabdbpathsdbvlimshr_srcrH   	shr_files	shr_ownershr_all_apsareadawriteamoveadelagetapgetahtmlaadminadotjs_lsjs_htmall_vols	all_nodes	all_fvolsendswithr   sepr   rb   histpathdbpathall_apsall_vps
_canonical	canonical_dcanonical
dcanonical_canonical_null_dcanonical_null_get_dbvget_dbv_lsls)	rR   r   r   r   r   r   r   rpvps	            rC   rS   zVFS.__init__  s     
24	 
	
%

		

	
8#4#4RVV#<R"&&IB#B/BGGLL7;DM--DK#'DMM% $(DNN5!$L>DLJ<DL!__DN"..DO*,,DMDKDLDL!11DN"33DO}}((rB   c                 Z     ddj                   fddj                         D              z  S )NzVFS(%s)rU   c              3   F   K   | ]  }|d j                   |     ywrW   rY   r[   s     rC   r^   zVFS.__repr__.<locals>.<genexpr>  s'       dmmA./r_   zrealpath vpath axs flags)rb   ra   rR   s   `rC   rd   zVFS.__repr__  s2    II 399; 
 	
rB   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 )Nrj   r   c              3   :   K   | ]  }|d    k(  s|d     yw)r   r   NrA   )r\   r   r'  s     rC   r^   z#VFS.get_all_vols.<locals>.<genexpr>  s     8QqTRZ!8s   
)
r   r   r  r   r  nextr   r   r   get_all_vols)	rR   volsr   apsvpsr(  hitr   r'  s	           @rC   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	2rB   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   rj   r   )r  ra   r   addr   r   r   r   r   rb   r   r   lstripr   r   _copy_flagsr  rE   )	rR   srcdstdst0namename0vnr(  vp0s	            rC   r5  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	rB   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)rR   r;  r]   r   r   r@  zsdbps           rC   r7  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)rR   r]   r   ns       rC   rG  zVFS.bubble_flags  sk    88,,. &1..$%DJJqM& ""$ 	ANN	rB   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]rj   r   r   )ra   r   _find)rR   r   r;  r   s       rC   rJ  z	VFS._find$  sc    8O%<C+ID#DC4::::d#))#..U{rB   c                 d    |r| j                  t        |            \  }}n| }|j                  |   S )z3can Read,Write,Move,Delete,Get,Upget,Html,Admin,Dot)rJ  r.   r   )rR   r   unamer=  _s        rC   
can_accesszVFS.can_access4  s0    
 JJuU|,EBBwwu~rB   c                     | j                  ||      }dj                  d t        d|      D              }d|v r	d|v r|dz  }|S )Nrj   c              3   ,   K   | ]  \  }}|s	|  y wrG   rA   )r\   choks      rC   r^   z VFS.get_perms.<locals>.<genexpr>B  s     CVRbCs   
z	rwmdgGha.rwmdza.A)rN  rb   zip)rR   r   rL  zblr   s        rC   	get_permszVFS.get_perms@  sH    ooeU+ggCs;'<CCS=TS[3JC
rB   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.   rJ  r   rI   rJ   rK   rL   rM   LEELOO_DALLASr  r   )rR   r   rL  	will_read
will_write	will_movewill_delwill_getr   cvpathr=  r   r   reqr   r   apr   s                     rC   r   zVFS.getG  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rB   c                     | j                   }|s| j                  |      S |\  }}|j                  t        ||            S rG   )r  r#  r0   )rR   vremr8  shvsrems        rC   _get_share_srczVFS._get_share_srcn  s<    ll==&&	T||E$-..rB   c                     | j                   }|s| |fS t        | j                  t        |j                        d  j	                  d      |      }||fS Nr   )r  r0   r   r   r6  )rR   rj  r  s      rC   r#  zVFS._get_dbvv  sM    hh:TZZCII 0188=tDDyrB   c                    | j                  |d      }|r t        j                  j                  |      syt        j                  j                  |      \  }}|sy	 t	        j                  |      }||v ryd}|j                         }|D ]  }	||	j                         k(  s|	} n |sy| j                  rd}
| j                  d|
||fz         y#  Y yxY w)NFTz<?>zZreturning 404 due to underlying case-insensitive filesystem:
  http-req: %r
  local-fs: %rrY  )	r  r   r   existsr   ra   r   lowerr   )rR   r   do_statrh  dpfnfnsr3  lfnrD  r   s              rC   casechkzVFS.casechk~  s    ^^C'388??2.r"B	**R.C 9hhj 	Bbhhj 	 88nAHHUAS	M*	s   C Cc                      yNrj   rA   )rR   r   resolves      rC   r!  zVFS._canonical_null      rB   c                      yrz  rA   r   s     rC   r"  zVFS._dcanonical_null  r|  rB   c                 L    | j                   }|r|d|z   z  }|rt        |      S |S )<returns the canonical path (fully-resolved absolute fs path)r   )r   r"   )rR   r   r{  rh  s       rC   r  zVFS._canonical  s,    ]]#)OB%wr{-2-rB   c                     | j                   }|r|d|z   z  }t        j                  j                  |      \  }}t        j                  j	                  t        |      |      S )-resolves until the final component (filename)r   )r   r   r   ra   rb   r"   )rR   r   rh  adru  s        rC   r  zVFS._dcanonical  sJ    ]]#)OBr"Bww||GBK,,rB   c                 b   | j                   }|r|d|z   z  }t        |      }| j                  r}| j                  \  }}t        t        j
                  j                  |j                   |            }||k7  r6t        j
                  j                  |      \  }}||k7  s|| j                  vry|r|S |S )r  r   

)r   r"   r  r  r   r   rb   ra   )	rR   r   r{  rh  rapr=  chkr  ru  s	            rC   _canonical_shrzVFS._canonical_shr  s    ]]#)OBbk>>llGB"'',,r{{C89Cczs+B"9$.. 8!s%2%rB   c                    | j                   }|r|d|z   z  }t        j                  j                  |      \  }}t	        |      }| j
                  rd| j                  \  }}t	        t        j                  j                  |j                   |            }|t	        |      k7  r||k7  s|| j
                  vryt        j                  j                  ||      S )r  r   r  )r   r   r   ra   r"   r  r  rb   )rR   r   rh  r  ru  r=  r  s          rC   _dcanonical_shrzVFS._dcanonical_shr  s    ]]#)OBr"BR[>>llGB"'',,r{{C89Cgbk!9$.. 8!ww||B##rB   c                     t        dd      )Nr   znope.avi)r!   )rR   akas      rC   _ls_nopezVFS._ls_nope  s     S*%%rB   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  )rR   r   rL  scandirpermsetslstatthrowr=  r   realrM  r   s               rC   _ls_shrzVFS._ls_shr  st     ,,C55dGXueLqLa277#3#3AaD#9T^^#KLLb   Ms   3A-"A-c           	      v   i }| j                  |      }|r3t        t        | j                  ||||            }	|	j	                          ng }	|s|	D 
cg c]  }
|
d   | j
                  vs|
 }	}
| j                  xs | }t        | j
                  j                               D ]  \  }}|j                  |k(  r!| j                  j                  d      r|||<   6|j                  j                  |      xs dgdz  }|D ]*  }d}t        ||      D ]  \  }}|s	|rd} 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   dkF	   Tr   r   r   z/.histzup2k.z
/.hist/th/zdir.txt)r  r   r+   r   r   r   r  sortedr   r   r   r   rU  r   r   r  
startswith)rR   r   rL  r  r  r  r  virt_visr   r  r   r  r;  vn2u_haspsetrR  rg  zbps                       rC   r%  zVFS._ls  s    ..%'5'5IJDIIKD#>!qt4::'=A>D>(("dC#DJJ$4$4$67 	c77c>djjnnT&:%(HTNU+:w{$ DB#&tU#3 "Rr!&B!" ),  g.5c*7Azz(##'Haqtw/GHH"#'Haqt}}Y/GHHh&&5 ?, IHs$   F,(F,F18F1F6!F6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
        )r  ri   z@bailing from symlink loop,
  prev: %r
  curr: %r
  from: %r / %rzvfs.walkr   Nxdevxvolr   rj   TF   /.r   r   r^  )r&  r$  r  r   r   r   r"   r   r   rb   chk_apr   r   remover   rQ   statS_ISDIRst_moder   r6  walkr  r   )rR   relr   seenrL  r  wantdotsr  r  subvolsfsrootvfs_lsvfs_virtr  rj  r   rm1lerh  r  r   rM  dots_okrfilesrdirsrdirwrelwremrH  rY  s                                 rC   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 ]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)Nrj   r   ri   r^  topTFr   r   )r(  rh  stiA  i     )ra   r6  r  r  keysr   rH   r   r   rb   r   rU  r   r   stat_resultr   )!rR   r   rj  fltrL  r   dotsr  wrapfoldergrM  apathfilesrdvdr   r  rm2rH  fnamesvpathsapathsr   r   r  ftsr  dnamesdstatsret2r   s!                                    rC   zipgenz
VFS.zipgenu  s     $U[[-=b-A-H-H-M-VQVIIfdBuguU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 r| j                  t         j                  z   }|j                  |      rO|t        |      d  }t        r |j	                  t         j                  d      }| j                  |      \  }	}
| |	k(  r| S | 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Ȑ)Nr  r   r   r   r   zxdev: %s[%r] => %s[%r]rY  r   r  zxvol: )r   r  r   r   r   r   r  rsplitr   r   st_devr   r  r   rJ  r  r   r  )rR   rh  r  r1  r   vdevr   self_apr(  r  rM  r  vapvnss                 rC   r  z
VFS.chk_ap  s   266kTZZ/5bjjs+24 XXc]
 	r88D"%((4=="9"@"@@txryy 880AHHUAt}}bii(L$LaPTZZmmbff,G~~g&W(BFFC0BBQ3;K&&;$))*;*;G# ;S>>#&#'3;4:CF:; xxb 2A6M4c>!!jja03 s   G) )H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landmarkrj   z^=r   utf-8rB   zchecking [/%s] landmark [%s]rY  r_  ?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   ra   encoder   r   r  openrZ  r  	Exceptionr   )rR   r2  failedr(  rD  expectr   rh  r  bufexrmr]   r   s                 rC   check_landmarkszVFS.check_landmarks  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)FFrG   )r>   r?   r@   __doc__rS   rd   r/  r5  r7  rG  rJ  rN  rW  r   rm  r#  rx  r!  r"  r  r  r  r  r  r  r%  r  r  r  r  rA   rB   rC   r   r     s    (?B
2.#J 
 %N/4.-&$$$& !* .'t \N 3j/b-rB   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 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 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(  | _	        | j                  j                  | j                  j                  | j                  j                  | j                  j                  r| j                  j                  ndt        dd| _        | j                   j#                         | _        d| j$                  d<   t'        |dddt)               i       | _        i | _        i | _        i | _        i | _        i | _        i | _        d | _        g | _        d	| _        i | _        i | _         i | _!        i | _"        tG        jH                         | _%        | jM                          y )
Nr   rj   z
/z/initcfgnorj   rj   )cachectltcolordu_iwhoshr_whoemb_allls_q_mTr  F)'r   ahargsdargsrk   warn_anonwriteline_ctrindentr   is_lxcr  r  r  shrr  r   _vf0bcopy_vf0r   rE   rY  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)rR   r  rk   r  r  s        rC   rS   zAuthSrv.__init__  sT    ,	]d
 ,ff. 		**ii&&yy((,0IIMMtyy((t

 JJOO%			% xRSUB7	
		
	!#  ^^%
rB   c                 D    | j                   r| j                  d||       y y )Nauthr   r   s      rC   r   zAuthSrv.logF  s    ==MM&#q) rB   c              #   b   K   t        |      }t        |      }|D ]
  }|df |} |df yw)zreturns [value,isFinalValue]FTN)iterr.  )rR   iterableitprevr   s        rC   
laggy_iterzAuthSrv.laggy_iterJ  sB     (^Bx 	A+D	 Djs   -/c                 6    | j                   j                         S rG   )r  r  r+  s    rC   vf0zAuthSrv.vf0T  s    yy~~rB   c                 6    | j                   j                         S rG   )r   r  r+  s    rC   vf0bzAuthSrv.vf0bW  s    zz  rB   c                    | 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  idp_gsepra   r   r   r  r  _update_idp_dbr   r'   _reloadr   )rR   r   rL  gnamer   gnamesr   s          rC   idp_checkinzAuthSrv.idp_checkinZ  sE    ??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   D6</E4ED;,E;EEE(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)rR   rL  r$  dbcurs        rC   r"  zAuthSrv._update_idp_dby  sv    yy"" __TYY--.iik1E8<1E5>B
				

rB   c           	      8   g }t               }|}	|}
g }t        dft        dffD ]L  \  }}t        |j	                  |            t        |j	                  |            k7  s<|j                  |       N |rDd}dj                  |D cg c]
  }||||fz   c}      }| j                  |d       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"                  j$                  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}|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 c c}}}w )N${u}${g}zERROR: if %s is mentioned in a volume definition, it must be included in both the filesystem-path [%s] and the volume-url [/%s]r  r   r  Fz,%+z
%+z,%-z
%-r  z%+Trj   )rH   	PTN_U_ANY	PTN_G_ANYboolr   r   rb   r   r  r   	PTN_U_GRP	PTN_G_GRPgroupr   ra   r   r  r  grp_allr   r5  _map_volumer  )rR   r8  r9  mountdaxsmflagsun_gnsr   visitedsrc0r:  zslptnsigilr   r   r8   gnsgnun_gnrejectedmrD  rulegncr3  src1dst1labels                                rC   _map_volume_idpzAuthSrv._map_volume_idp  s3    %%v.F0CD 	"JCCJJsO$SZZ_(==

5!	"  RA		c:13},:;AHHQNA,)/FFgb##FB"bFFFJE 8	-FBH!9- (JJt$WWQZZZv.ZZv.HHTN 
(Dqr(Ci'!fjjn&:; !Cit,3#'
(($ TYY&&& <<
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#&q8	-t 
G ; Gs   LL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	|d       i }
|j                  d
      sd|v r
d|
d<   d|
d<   ||f||<   t               ||<   |
||<   ||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 did not exist: r^  r  Tunlistcrunlistcw)r   r   rB  rC  r"   r   r   r   r  BAD_CFGr   r   r   rq  r  rE   )rR   r8  r9  r:  r>  r?  r@  r   r]   r   vfs              rC   r=  zAuthSrv._map_volume  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s#HHSJAN>>#$#+!BzN!BzN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 )Nrj   [[[0m][90m]z	 >>> {}{}90)r  vcr  r  r   r   r   )rR   descs     rC   _ez
AuthSrv._e	  sr    yy||4==DKKHHRLzr||C,44S+F##DKK6=rB   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# {}[0mrY  rZ  r[  r\  )r  r^  r  r   r   r   r  )rR   lnr   r_  r   s        rC   _lz
AuthSrv._l  s{    yy||4==r6GA'**A<<Z088kJD$--DKKTBCrB   c                    | j                  t        | j                               | j                  j                         D ci c]  \  }}||dd  }}}|j	                  |D ci c]  }||vs|dg c}       t        |j                               || j                  j                  <   |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]
        Nrj   )
load_idp_dbr8  r  r   updater   r  r  r<  r   )	rR   r  r  r8   rG  r   rD  rH  unss	            rC   
_all_un_gnzAuthSrv._all_un_gn#  s     	dmm,-)-)<)<)>?gb#r3q6z??

t=r}BH=>"&sxxz"2TYYzz| 	#GB ##GNN2&#	# 
 @=#!dCGs   C!$	C'.C'C,,C6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   rj   r   {:4}: {}z$expanded config file (unprocessed):
r  r   z parsing config files; pass %d/%dr  )r  expand_config_filer   r  r^  	enumerater   rb   upgrade_cfg_fmtrange_parse_config_file_2)rR   fp	cfg_linesr  r  r?  r@  r>  rH  slnsnpasss               rC   _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 ]b  }| 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|v r/d}|j                  dd      \  }}| j!                  ||||fz  d       |d u r!| j                  d!j                  |             o| j                  d"j                  ||              |	|k(  r	 |j                  d#d      D cg c]  }|j                          c}\  }}d|v r1|s/d$}|j                  dd      \  }}| j!                  ||||fz  d%       | 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|       ||v r||   j%                  |       n|||<   |||dk7  r|}| j                  |dd.j                  |             | j'                  ||||||      }|sd x}}| j                  |dd/       n5t)        |      dkD  r'|D ]"  }| j                  |dd0|d   d1|d   d2       $ n|	|k(  r|dk7  s|s|d}	 | j                  |dd       |j                  d#      \  } }!t	        j*                  d3d|       s| sd4}t        |      d5t	        j*                  d6d|!      j                         v rd7}t        |      |!j-                  d5d      }!| j/                  | |!||||       *|	|k(  r#|dk7  s|s9d}	 | j                  |dd9       t        |      }"d}#|"j                         D ]  \  } }!d| v r/d:}| j                  dd      \  }}| j!                  || ||fz  d%       t	        j*                  d;d|       j                  d      }$|$r&d<}|j                  |$|       }t        |t        z         |!d u r	|#d(| z   z  }#|#d=j                  | |!      z  }#|J | j/                  d>|#dd  ||||       d}# |#r| j/                  d>|#dd  ||||       St        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# t0        $ r   |d8z  }t1        |t        z         xY w#  |d?z  }t        |t        z         xY w)ANr   rj   [global]
[accounts][groups]accs:flags:r     ##z	^\[.*\]:$ri   rY  zLthe first line after [/{}] must be a filesystem path to share on that volume  zGbegin commandline-arguments (anything from --help; dashes are optional)r_     zbegin user-accounts sectionzbegin user-groups section[/r   r  zdefine volume at URL [/{}]zvolume access config:z3volume-specific config (anything from --help-flags)zinvalid section header    rA  rX   zbWARNING: found an option named [%s] in your [global] config; did you mean to say [%s: %s] instead?Tu   └─argument [{}]u#   └─argument [{}] with value [{}]:z]WARNING: found username [%s] in your [accounts] config; did you mean to say [%s: %s] instead?r   zaccount [{}], password [{}]z@lines inside the [accounts] section must be "username: password",zgroup [z] = rU   c              3   (   K   | ]
  }d |d  yw)zuser [r[  NrA   r\   r   s     rC   r^   z/AuthSrv._parse_config_file_2.<locals>.<genexpr>  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:zYWARNING: found a volflag named [%s] in your config; did you mean to say [%s: %s] instead?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  ri  ra   r   r   matchr  r`  r  r   r  rd  SBADCFGsplit_cfg_lnr   r6  r   rb   extendrQ  r   r   r   _read_vol_str_idpr=   )%rR   rr  r  r  r?  r@  r>  ru  	all_un_gncatcatgcatacatgrpcatxcatfrh  r(  r0  rc  
subsectionr   ztrD  zazs1zs2ur  rH  rh  volr   sksvzdfstrbads%                                        rC   rp  zAuthSrv._parse_config_file_2U  s}    OOD$/	 g	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by A#%88C#3Sb#s^!3Q7Tz 5 < <R @A E L LRQS TU	V d{
113#q1AB2BHHJBDAqax{#$773?Sac]!2A6GGB#@#G#G1#MNDG f}146HHS!4DEbrxxzEGB03		#?"288:?C?+-/A"Cs"CCCAGGB1%TzR,#&R ~"*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"9 {A')xxQ'7HC HHQ"c3%7; 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EOg	FR 		Y C1ZA#AK00
 F?1fA#AK00H  /QQCg..H3  Y  YC#C'M22sd   ?Z1Z,*A#Z1[)[
 [[0A[-B)[-*D\,Z11[

[[*-"\\+c           	         |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                  |       nB|s@| j                  j                  s*|| j                  j                  k7  r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 fxY wc c}w c c}}}w c c}}w )NzcrwmdgGhaA.r  z*invalid config value (volume or volflag): r   TrX   r   Frj   *r  @r   r5  zPgroup [%s] must be defined with --grp argument (or in a [groups] config section)r4  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   r=   ra   _read_volflagr   r  r   r   r  	idp_h_grpr<  r  rH   r5  rg  discard_read_vol_strr   )rR   lvlrL  r0  rA  r   r   r   cvaln1rM  r(  unamesr8   grpr   rh  rG  rH  rI  r8  r9  vuvgunames2s                            rC   r  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%8SDIIDUDU=U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) J1J19J66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)rT  zrwmda.Arj   r   r9   rK  r   r^  r  rT  r  r  r  r  u0   └─add permission [{0}] for [everyone] -- {2}u0   └─add permission [{0}] for user [{1}] -- {2}r  )rH   r   rI   rJ   rK   rL   rQ   rP   rM   rN   rO   r   r   r`  r   r5  )rR   r  r  r   junksetr8   aliasmappingexpandedrQ  alr   r_  s                rC   r  zAuthSrv._read_vol_strf  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) 	rB   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 )NrA  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   rM  r  r  r  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   rr  r6  r   r   r   r   r`  r   r  r   ra   )rR   r   r   r;  valueis_liststrippedzir   r_  rD  valss               rC   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DrB   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#  )rR   	verbositys     rC   r  zAuthSrv.reload  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                  r| j                  j                  D ]p  }	 |j                  dd      j	                  dd      \  }}|j                  dd      j	                  d      ||<   ||   D cg c]  }|j                          c}||<   r | 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/        t1        |            D ]  }| j3                  d|z   d        d}|D cg c]%  }|j+                  |      s|j	                  d      ' }}|D cg c]&  }t5        dt-        |      dz
        dz  dz   |d   z   ( }}d}| j3                  |j                  t-        |      dj7                  |                   |} t=        | j                         | j?                          | j                  j@                  r| j                  jB                  sq| j                  j@                  D cg c]  }|j	                  dd      d    }}|D cg c]  }|s||vs| }}|r"d|}| j3                  |d       t        |      | jE                  |       |jG                         } | jI                  |       t        r/i }!|jK                         D ]  \  }"\  }#}$tM        |#      |$f|!|"<    |!}|s| j                  jB                  stO        dgdgd d       }%d	}&| jP                  r\d}t-        |      dk(  r*| j3                  |dz  d       d}| j3                  |d       n| j3                  |dz  d       tO               }%d }&n6| j                  j&                  r d!}| j3                  |d       tO               }%d}&|&r	 tS        jT                  tV        jX                        }'|'D cg c]4  }|j[                         j]                  d"      r|j+                  d#      s|6 }(}|(r7d$}| j3                  |tV        jX                  |&d%j7                  |(      fz  d       t_        | j`                  tM        d#      d	d	|%| jc                               })|%jd                  s<d&| _        n4d	|vr0t_        | j`                  d	d	d	tO               | jg                               })d}*ti        |jk                         d' (      D ]|  }|jm                  d)      }+|*|+k  sJ |+}*||   \  }},|d	k(  r!t_        | j`                  |||,||   ||         })K)sJ |)jo                  |||,      }-||   |-_8        ||   |-_9        d |-_:        ~ )sJ i |)_;        i |)_<        g |)_=        g |)_>        |)j                  |)jv                  |)jx                  |)jz                  |)j|                         |)jx                  j                         D ]E  jz                  j                  d* d&+       j|                  j                  d, d&+       |)_B        G d-}t1        |j	                               }.|)jv                  j                         D ]  t1               }/jr                  jK                         D ]5  \  }0}1|0j                  d.      }2|2t        vs |2|.vs%|/jo                  |0       7 |/sbd/}| j3                  |j                  d0j7                  |/      fz  d        | j                  j                  }3|3dd }4|3dd  }5|3rOt_        | j`                  d	|4|4tO               | jg                               }6| j                  j                  }7t        j                  |7      }8|8j                         }9|8j                         }:t        j                         };|9j                  d1      D ]  }<|<\  }=}>}?}@}A}B}C}D|DrD|;k  r| j                  j                  rd2}| j3                  |@|=B|?fz         |>rXt        j                  |>j                  d3            j                         }Ed4t        |E      d5d6 j                  d7      }F|>||F<   nd}FtO        d8@v rFgng d9@v rFgng d:@v rFgng d;@v rFgng d<@v rFgng       }G|4d)|=}"t_        | j`                  d	|"|"|G|6jr                  jG                               |6j                  |=<    |6x|)j                  |4<   |)jv                  |4<   |6j                  j                         D ]V  x|)jv                  j                  <   |)jx                  j                  <   j                  _V        j                  _X        X t1        |      }H|Hj                  | j                         |Hj                  d       dgt/        ti        |H            z   }Id=j	                         D ]  }Jd>|Jz   }K|)jv                  jK                         D ]  \  }"t        jp                  K      }Ld|Lv rd?LvrID ]  }MLjo                  |M        t/        L      D ]}  }|j+                  d.      sLj                  |       |dd  }|Lj                  |       |j+                  d@      sN|dd  }|j                  |      xs g D ]  }Lj                  |          ID ci c]  }|g  }N}ID ]z  }M|)jv                  jK                         D ]H  \  }"t        jp                  K      }LM|Lv s!|3r|"j+                  |5      r5NM   j                  |"       J NM   j                          | t        |)dAJz   N        |)jx                  j                         D ]  jp                  }OID Pci c]z  }P|P|POjd                  v |P|Oj                  v |P|Oj                  v |P|Oj                  v |P|Oj                  v |P|Oj                  v |P|Oj                  v |P|Oj                  v |P|Oj                  v f	| c}P_h         i }Qi }Ri }S|j                         D ]  }%|%jd                  |%j                  |%j                  |%j                  |%j                  |%j                  |%j                  |%j                  |%j                  f	D ]4  }T|TD ]-  }MdQ|M<   |Mdk7  rM|vrM| j                  vrdRM<   dTvs)dSM<   / 6  Rrwd%j7                  dB ti        R      D              }| j                  jB                  rdC}| j3                  ||z   dD       n'dE}| j3                  ||z   dD       t        t              t        Qv rt        dFt        z         g }t/        |      d d  D ]Z  }M||M   j                         }|s>t        tS        j                  dG            j                  d7      }|j                  M       ||M<   \ |r| j3                  dH|d       i }U|jK                         D ]D  \  }M}V|VUv r6dI}| j3                  |j                  UV   M      d       t        t              MUV<   F |D ]e  }M|MSvs|3rMj+                  d4      rt-        |)jv                        dkD  rdJ}| j3                  |Mfz  d       MdK}| j3                  |M|Mfz  d       g g }Wd}X|)jv                  j                         D ]  j                  rqdLjr                  vr:dMjr                  vr,| j                  j                  s| j                  j                  r)t        j                  j                  j                        rdLjr                  v s| j                  j                  r0dN}| j3                  |j                  j                  fz  d       d&}XdO}| j3                  |j                  j                  fz  d       Wj                          Xrt        j                  d       WD ]k  tO               _8        i _h        |)jv                  j                  j                  d        |)jx                  j                  j                  d        |)jx                  j                         D ]  }-	 |-jz                  j                  j                         |-j|                  j                  j                         |-jv                  j                  j                         |-jx                  j                  j                         t        fdP|-j                  jK                         D        d	      }|s|-j                  j                  |        d	_l        n g }Yg }Z|)jv                  j                         D ]  j                  s| j                  j                  j                        }[|[st        j                  t        j                              j                         }Et        j                  |E      j                  d7      j[                         }[|[| j                  j                  <   jr                  j                  dQ      }\|\d.k(  rn\r]tR        j                  j                  tR        j                  j                  \            }\t        rt!        \      n\x_}        _~        n=| j                  j                  r&t        t-        [            D ]  }]tR        j                  j7                  | j                  j                  [d |]dz          }^t        j                  |^       tR        j                  j7                  |^dR      }_	 t        _dS      5 }`|`j                         j	                         }ad d d        t        j                        j	                         }bad |bfvra(t        _dT      5 }`|`j                  b       d d d        ^x_}        _~         n tM        j                        _}         |)jv                  j                         D ]s  j                  s| j                  j                     }[jr                  j                  dU      }\|\d.k(  rn\rVtR        j                  j                  tR        j                  j                  \            }\t        rt!        \      n\_~        n6| j                  j                  rt        t-        [            D ]  }]tR        j                  j7                  | j                  j                  [d |]dz          }^t        j                  |^       tR        j                  j7                  |^dR      }_	 t        _dS      5 }`|`j                         j	                         }ad d d        t        j                        j	                         }bad |bfvra(t        _dT      5 }`|`j                  b       d d d        ^_~         n tM        j                        _~        jt                  st        j                  j                  tR        j                  j7                  j                  dV            rYj                         d _:        cZj                         v ZD ]'  }-|)jv                  j                  |-j                         ) YrhdWg}cYD ];  cj                  dXj                  dYj                  dZj                  d[       = | j3                  d\j7                  c      dz   dD       i }di |)_        |)jv                  j                         D ]  }-|-j                  }e|4xr! |-j                  j	                  d)      d   |4k(  }fer\fsZedv rVde   }gd]}||e|gj                  |gj                  |-j                  |-j                  fz  }| j3                  |d       t        |      |-de<   |e|)j                  |-j                  <    i }hi |)_        |)jv                  j                         D ]  }-|-j                  }i|4xr! |-j                  j	                  d)      d   |4k(  }fir\fsZihv rVhi   }gd^}||i|gj                  |gj                  |-j                  |-j                  fz  }| j3                  |d       t        |      |-hi<   |i|)j                  |-j                  <    |)jv                  j                         D ]d  d}jd_D ]I  }0	 jr                  |0   }|d`v rdjr                  |0<   't        |      }k|kjr                  |0daz   <   |ksHd&}jK jsVd&jr                  db<   f |)jv                  j                         D ]  t        | j`                        }ld}jjr                  j                  dc      r	d&}jd&l_        jr                  j                  dd      xs | j                  j                  xs d	}|d`vr%d&}j	 t        |      }m|d<}t        |      l_        jr                  j                  de      }|r8d&}j|j	                  d.      D cg c]  }t        |       c}\  l_        |l_        jr                  j                  df      }|r8d&}j|j	                  d      D cg c]  }t!        |       c}\  l_        |l_        jr                  j                  dg      }|r2d&}jlj'                  |jr                  j                  dh      xs di       jr                  j                  dj      }|r8d&}j|j	                  d      D cg c]  }t!        |       c}\  l_        |l_        jr                  j                  dk      }|r8d&}j|j	                  d      D cg c]  }t        |       c}\  l_        |l_        jr                  j                  dl      }|rd&}jt        |      l_        jr                  j                  dm      }|rd&}jt        |      l_        jsl_         | j                  j6                  rJ|)jx                  j                         D ]-  jr                  j                  dn      rd&jr                  do<   / |)jx                  j                         D ]  | j                  j8                  rd&jr                  dp<   | j                  j:                  rd&jr                  dq<   | j                  j<                  sjr                  j                  drd      sd&jr                  dr<   d&jr                  dp<   d&jr                  dq<   d&jr                  ds<    d}n|)jx                  j                         D ]$  jr                  j                  dt      }ojr                  j                  du      }p|prosp}oorDod&u rdvnt!        o      }o|odwkD  rdx}t        |j                  ofz        ojr                  dt<   d&}njr                  j                  dy      }qjr                  j                  dz      }rjr                  j                  d{      }s|rsd|}t        |j                  fz        rrqsr}qsrqss}qqsqd&urt!        q      ndvjr                  dy<   ' nrat?        j                  d}| j                  j@                        r5| j3                  d~j                  | j                  j@                               t-        | j                  j@                        }tnrMtdk  rHd}tR        j                  j7                  tV        jX                  d      }| j3                  |td6|fz  d       |)jx                  j                         D ]  djr                  v r+djr                  vrdjr                  vrdjr                  d<   djr                  v r't!        jr                  d         jr                  d<   q| j                  jB                  s| j                  jB                  jr                  d<    d| j                  _        i }ud}Xd}vd}w|)jx                  j                         D ]  tR        j                  jG                  j                        rd&jr                  d<   d&jr                  d<   | j                  jH                  rjp                  j                  s| j                  jJ                  rd&jr                  d<   | j                  jL                  sdjr                  v rd&jr                  d<   ddgddgddgddgfD ]l  \  }x}y|yjr                  v r1t?        jN                  jr                  j                  y            }znt        | j                  x      }zzs^zjr                  y<   n tQ               jK                         D ]+  \  }x}yt        | j                  |x      sd&jr                  y<   - dD ]0  \  }{}||{jr                  v sjr                  j                  |d        2 tS               jK                         D ]7  \  }x}y|yjr                  vst        | j                  x      jr                  y<   9 d}|j	                         D ]7  }0|0jr                  v st!        jr                  |0         jr                  |0<   9 d}|j	                         D ]7  }0|0jr                  v st        jr                  |0         jr                  |0<   9 dD ]_  }0	 jr                  |0dz      j	                  d)      \  }}t        |      jr                  |0dz   <   t        |      jr                  |0dz   <   a dD ]  }0|0dk(  }}jr                  j                  |0d	      }|s}rd}|sjr                  j                  |0d        It?        j                  d|      s&d}||0|fz  }| j3                  |d       t        |      t!        |dv      }~|~jr                  |0<   }r~dk7  s}rd&}v jr                  j                  dd        jr                  d   dk7  sjr                  d   dk7  rd&jr                  d<   jr                  j                  dd        djr                  v sjr                  j                  d      rd&jr                  d<   j4                  r{jr                  d   j4                  _        djr                  v j4                  _        jr                  d   j4                  _        jr                  d   j4                  _        t]        jr                  d         jr                  d<   |3s dxjr                  d<   | j                  _        jr                  j                  d      rd&| j                  _        djr                  v sdjr                  v rd&| j                  _        djr                  v rd&}wtc        jr                  j                  dd	            j                  d      }t-        |      dk(  r/d	j7                  |D cg c]  }|dz  	 c}      jr                  d<   jr                  d   }|j                  dd      jr                  d<   jr                  j                  d      rd&jr                  d<   jr                  j                  d      rd&jr                  d<   td        D ]#  \  }}|jr                  v sd&jr                  <   % tf        D ]#  \  }}|jr                  v sdjr                  <   % d}jr                  j                  d      xs | j                  jh                  xjr                  d<   }|j	                  d      vrd}t        |j                  fz        dD ]}  }0|0jr                  vr2t        | j                  |0      jG                         jr                  |0<   Ctk        t        | j                  |0      jr                  |0         jr                  |0<    dj	                         }dj	                         |z   D ]@  }| jm                  j                  jr                  |t        | j                  |      d&       B D ]   }jr                  j                  |      }|s"g }D ]  }g }|}dd d v r.j	                  dd      \  }}j                  |       d|d d v r.dv rQdv rMd}| j3                  |j                        d       D cg c]
  }|dk7  s	| }}dj7                  |gz         }dvr$dvr dk(  rdgz   }dj7                  |gz         }j                          jr                  <    i x}jr                  d<   d}	 jr                  j                  d      xs g D ]  }|j	                  d      \  }0}1|1|0<    	 jr                  d   j	                  d      D cg c]  }|j                          }}|D cg c]  }|s|	 }}dj7                  |      jr                  d<   t1        dĄ |D              jr                  d<   t1               x}jr                  d<   jr                  d   j	                  d      D cg c]  }|s|	 }}jr                  d   j	                  d      D cg c]  }|s|	 }}t/        t1        D cg c]  }|j[                          c}            }t/        t1        D cg c]  }|j[                          c}            }j                         |j                  |       d|gd|ggjr                  d<   jr                  d   j	                  d      D cg c]  }|s|	 }}jr                  d   j	                  d      D cg c]  }|s|	 }}t/        t1        D cg c]  }|j[                          c}            }t/        t1        D cg c]  }|j[                          c}            }j                         |j                  |       d|gd|ggjr                  d<   tc        jr                  j                  dͫ      xs d	      }|r@|d d dv r9|jr                  d<   tc        jr                  j                  dЫ      xs d	      }nXtc        jr                  j                  dЫ      xs d	      }|r'|r%|j                         d|j                         d}n|xs |}rj]                  d      sdz  }dojr                  v r
tn        z  }jr                  j                  dѫ      }|rtd	}j	                  dҫ      d   j	                  d#      d   j[                         }|tp        v rd}|tp           fz  }ndk(  rd}|fz  }rjr                  d<   |z  }rjr                  d<   njr                  j                  dd        jr                  j                  dϫ      sjr                  j                  dd        js                          jr                  j                  d׫      rd&| j                  _        tc        jr                  d         }|j+                  dث      }|r|dd  }|j	                  d      D cg c]  }|j                          }}|D cg c]  }|s|	 }}rt1        |      jr                  d<   n|jr                  d<   ddgddgddgfD ]v  \  }}jr                  j                  |d      s#d&jr                  d<   jr                  jK                         D 01ci c]  \  }0}1|0j+                        r|0|1 c}1}0_9        x ddgddgfD ]v  \  }}jr                  j                  |d      s#d&jr                  d<   jr                  jK                         D 01ci c]  \  }0}1|0j+                        r|0|1 c}1}0_9        x ddgfD ]k  \  }}jr                  j                  |d      r#jr                  jK                         D 01ci c]  \  }0}1|0j+                        r|0dk(  r|0|1  c}1}0_9        m ddgfD ]g  \  }}jr                  j                  |d      s#jr                  jK                         D 01ci c]  \  }0}1|0j+                        r|0|1 c}1}0_9        i dg}t/        jr                        D ]-  }0|0v st!        jr                  |0         jr                  |0<   / djr                  vrd}|j	                         D cg c]  }|jr                  v s| }}d}||j	                         D cg c]   }jr                  j                  |      s|" c}z  }|D ]@  }0d}| j3                  ||0j                  fz  d       jr                  j                  |0       B jr                  j                  d      xs d}~t        j                         dz  }|dz  dz  }|~dk  s~kD  r2d}|j                  ~fz  }| j3                  |d       t        |      d쉩jr                  v r/djr                  vr!jr                  d   dk7  rdjr                  d<   i }i }jr                  j                  dg       jr                  j                  dg       z   }|D cg c]  }|j	                  d      d    }}|D cg c]  }|j	                  d      D ]  }|  }}}|D ]M  }d&|<   d&}| j                  jv                  xs g D ]  }|j	                  d      d   }|k(  sd}  sId&<   O ty               }jr                  j                  di       jk                         D ]E  }d&}d&u|<   d&|<   | j                  jz                  jk                         D ]  }rsk(  sd} G D ]7  }|vsd}| j3                  |j                  j                        d       d&}X9 jr                  j                  d      xs i }t|        D cg c]	  }|v s| }}|D cg c]  }t|        |    }}dd%j7                  |      d}r|nd	fjr                  d<    |)jv                  jK                         D ci c]  \  }}d|jr                  v s| c}}|)_        |)jx                  j                         D ]Q  jr                  j                  d      sd}|j	                         D ]  }jr                  j                  |d          S |)jv                  j                         D ]  j                  rjr                  j                  d      r,jr                  d   d d j[                         }|dv rdk(  rd&jr                  d<   e	 t        j                  j                  jr                         tS        jT                  j                        }'|'D ]  }|j[                         }||k(  rj                         }k(  s|'v r3tR        j                  j                  tR        j                  j7                  j                              }|rdnd} n dvrtR        j                  j7                  j                  d      }#t        |#dT      j                          tR        j                  j                  |#d d dz         rdnd}tS        j                  |#       jr                  d<   |dk(  sd&jr                  d<    | j                  jv                  xs g }|D cg c]  }|j	                  d      d    }}|D cg c]  }|j	                  d      D ]  }|  }}}|D ]-  }|uvsd}| j3                  |j                        d       d&}X/ |)jv                  j                         D ]t  jr                  j                  d      }|rj                  gng }g }j                  }|)jv                  jk                         D ]m  }|j+                  d)z   j                  d)            s'k7  s-j                  t?        j                  t-              d  j                  d)                   o r&j                  ddj7                        d       t?        jN                  dj7                  xs dg            jr                  d<   j                  ddg       t?        jN                  dj7                  |            jr                  d<   w d}|)jx                  j                         D ]L  jr                  j                  d	      xs | j                  j                  }|s;d&jr                  d	<   d&}N r.| j                  j                  rd
}| j3                  |d       d&}X| j                  j                  r/| j                  j                  r|r| j3                  dd       d&}X|)jx                  j                         D ]  t/        jr                  jk                               D ]  }0t?        j                  d|0      sjr                  j                  |0       |0dd  }|jr                  v rjr                  j                  |0dd         id}| j3                  |j                  ||0fz  d        jr                  j                  d      sԉjp                  jd                  D ]'  }jp                  j                  jo                  |       )  Xrt        j                  d       t        | j                  dv       |vrtS        j                  d       |)j                          d}d}d}d}g }d}|)jv                  j                         D ]  }-| j                  r|dk  r nz|3r+|-j                  |4k(  s|-j                  j+                  |5      rG|dj                  |-j                  |-j                        z  }ddgddgddgddgddgddgdd gd!d"gd#d#gf	D ]o  \  }}t/        ti        t        |-jp                  |                  }	|	dgk(  r|rd$g}	nd|	v rd%g}	|	sd&g}	d%j7                  |	      }	|d'j                  |	      z  }q d|-jr                  v rd&}d|-jr                  v rd&}d|-jr                  v rLd&}d|-jr                  vr<d|-jr                  vr.d&}d|-jr                  vrj                  d)|-j                  z          |dz  } r+| j                  j                  rd(}d	| j                  _        | j                  ra|d5kD  r[| j                  j                  s| j3                  |       s| j                  jB                  r4| j                         }|r!| j3                  d)j                  |             rs+d*}| j3                  |d       nd+}| j3                  |d       r(d,}| j3                  |d%j7                        z  d       nsd-}| j3                  |d       |)j                  d)ddd      \  }-}m|-j                  j[                         }|d.v s|j+                  d/      r/d0}| j3                  |j                  |-j                        dD       	 |)j                  d	ddd&d12      \  }-}m| j                  rV|d5kD  rQtS        j                         |-j                  k(  r/d3}| j3                  |j                  |-j                        dD       d| _        g | _        g | _        | j                   D ]  }|)j                  |ddd      \  }}m|j                  }t1        t        j                  |            }t-        |      dkD  r/d4}| j                  j                  |t/              fz         j                         }}st        «      d   }|)j                  |ddd      \  }}m|Ðj                  v r9g }g }jp                  jd                  D ],  }M|Mjp                  jd                  vsj                  M       . jp                  j                  D ],  }M|Mjp                  j                  vsj                  M       . dv rd5}ndv rd6}nrd7ě}nrd8ś}nd9}| j                  j                  |j                  fz         r | j                  r2d:}| j3                  |d	j7                  | j                        z   d       | j                  r2d;}| j3                  |d	j7                  | j                        z   d       wr:d<}t        j                  j+                  d=      s| j3                  |d>z  d       |)| _        || _        | | _        || _        |jK                         D 01ci c]  \  }0}1|1|0
 c}1}0| _        || _        | j                          d | _        | j                  jk                         D cg c]  }t?        j                  |       }}|ǐj                  t/        | j                               | j                  j                  r8ǐj                  |D cg c]  }d|v s|j	                  dd      d    c}       r| j                  j                  r5d?}|| j                  j                  | j                  j                  fz  }n5d@| j                  j                  dA}|dj7                  ǫ      dBz   z  }t?        jN                  |      | _        | j                  j                  rx| j                  j                  D ]!  }|j	                  dd      \  }}|ɐt        |<   # t        j                  t        jJ                         D 01ci c]  \  }0}1|1|0
 c}1}0       |3rV|)jv                  jK                         D ci c]  \  }}||4k7  r|j+                  |5      s|  c}}|)_;        8r9r:r6sJ |9j                  d1      D ]  }<|<\  }=}>}?}@}A}B}C}D|6j                  j                  |=d       }|s.	 |)j                  |?Bd8@v d9|@v d:|@v d;|@v       \  }}g }ArudD}|:j                  ||=f      D ]  \  }j                  |ϫ        t1        ͫ      _        |ʐj                  |_X        |ʐj                  |_        |ʐj                  |_        n6ʐj                  |_X        |ʐj                  |_        |ʐj                  |_        B_        f|_        |ːj                  |̫      |_l        |j                  d	      \  }}m|Аj4                  |_        |jr                  jG                         |_9        |j                  |_~        |j                  |_}        |j                  }#|#j]                  tR        j                        s|#tR        j                  z  }#|)jz                  D cg c]  \  }}||d d  f c}}_        d}|ʐj                  D ]t  \  }}|#|k(  rd&}j+                  |#      s	 t        t-        |#      d        }j                  |ddd      \  }}m||k(  sjt                  k(  rj                  ʫ       v sʐj                  j                  |#|gf       ʐj                  j                  dE d&+       | j                  j                  sՐdF}| j3                  |@|=B|?j                  fz          |6j                  j                         D ]  }|Րj                  \  }}|r֐j                  ׫      }#t        j                  jG                  |#      rIj                  jk                         D ]?  }t_        | j`                  d	d	d	tO               | jg                               j                  |<   A  |:j                          |9j                          |8j                          i | _        i | _        | j                  jx                  jK                         D ];  \  }"}|3r|"j+                  |5      rjr                  }yi dGd|yv dHd|yv dIdI|yv dJdK|yv dLdM|yv dN|ydO   dP|ydQ   dR|ydS   dT|ydU   dV|ydV   d|yd   dWt        |yj                  dX            d|yj                  d      xs ddYyj                  dY      xs d	dZd[yv rd	nyj                  d\      xs dd]d^yv rd	nyj                  d_      xs ddyd   _        d|yv ryd   Րj                  d<   i d`| j                  j                  da| j                  j                  db| j                  j                  dcdyv dd| j                  j                   de| j                  j                   df| j                  j                  dg| j                  j                  d|yd   dh| j                  j                   di| j                  j                   dj| j                  j                   dk| j                  j
                   dlt!        | j                  j                        dmt!        | j                  j                        dnt!        |yj                  dn      xs d      dyj                  d      xs i i dZՐj                  dZ   d]|Րj                  d]   doyj                  dp      xs d	dqyj                  dr      xs d	dyd   ds| j                  j                  j                  dd      dtt/        |yj                  du      xs g       dvyj                  dY      xs d	dw| j                  j                  dx| j                  j                  dIՐj                  dI   dJ|Րj                  dJ   dydzyv dLdM|yv dN|ydO   dP|ydQ   dR|ydS   i dT|ydU   d{| j                  j                  d|| j                  j                  d}t!        | j                  j                        d~| j                  j                   d| j                  j                  j                  d.      d| j                  j                   d| j                  j"                  d| j                  j$                  d| j                  j&                  d| j                  j(                  dV|ydV   d|yd   dWt        |yj                  dX            d|Րj                  d   d| j                  j*                  }ؐd}|j	                         D ]  }yj                  |      sd|<    d}|j	                         D ]  }t        | j                  |d      sd|<   ! d}|j	                         D ]!  }t        | j                  |d	      }|s||<   # t-        t/        j0                  ث            _        > t/        |)jx                  j                               }|3r6j                  j                         D ]N  j                  |)jx                  vs| j3                  dj                  dd       |j                         P |4|)jx                  v r&d}||4fz  }| j3                  |d       t        |      |D ]  j                  d	      d   }ىj                  xs ِj                  xs i _        j                  xs ِj                  xs d_        tc        jr                  j                  d      xs | j                  j2                        }|j                  d      jr                  d<    y #  d}t        |j                  |            xY wc c}w #  d}t        |j                              xY wc c}w c c}w c c}w #  |d | j8                   }t;        |d      D cg c]  \  }}dj                  ||       nc c}}w }}}d}|j                  | j8                  |      }| j3                  dj                  |dj7                  |                    xY wc c}w c c}w #  g }'Y NxY wc c}w c c}w c c}Pw #  Y AxxY w# 1 sw Y   >xY w#  d }aY ?	xY w# 1 sw Y   >xY w# 1 sw Y   =xY w#  d }aY =xY w# 1 sw Y   <xY w#  t        | j                  |0      }Y 9xY w#  Y 8xY wc c}w c c}w c c}w c c}w #  d}t        |j                  |0jr                  j                  |0dz         fz        xY wc c}w c c}w #  d}| j3                  |j                  fz  d       Y )Jx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 c c}w c c}w c c}w c c}w c c}1}0w c c}1}0w c c}1}0w c c}1}0w c c}w c c}w c c}w c c}}w c c}w c c}w c c}}w # t
        $ rM}t        rd}d}nt        rd}d}nd}d}d }| j3                  |j                  |fz  d       Y d }~d }~ww xY wc c}w c c}}w # t        $ r d&| _        Y #w xY wc c}1}0w c c}w c c}w c c}1}0w c c}}w # t
        $ rB}dC}| j3                  ||=B|?fz  d       |6j                  j                  |=       Y d }~Pd }~ww xY wc c}}w #  Y ^xY w(  NFr  r   z@
  invalid value "{}" for argument -a, must be username:passwordrX   r  zS
  invalid value "{}" for argument --grp, must be groupname:username1,username2,...zinvalid -v argument: [{}]rj   #[36m cfg files in zdiscovered config files in r_  #[36m opening cfg file -> r   r  r  u   └ri   zloaded {} config files:
{}r  rk  z-[1;31m
error @ line {}, included from {}[0mz
{0}
{1}{0}zERROR: unknown users in ipu: 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.confr^  zxHint: Found some config files in [%s], but these were not automatically loaded because they are in the wrong place%s %s
rU   Tc                 :    | j                  d      t        |       fS ro  )countr   r   s    rC   <lambda>z!AuthSrv._reload.<locals>.<lambda>_  s    qwws|SV6L rB   )keyr   c                     t        | d         S Nr   r   r  s    rC   r  z!AuthSrv._reload.<locals>.<lambda>w      3qt9 rB   )r  reversec                     t        | d         S r  r  r  s    rC   r  z!AuthSrv._reload.<locals>.<lambda>x  r  rB   z#du_iwho emb_all ls_q_m neversymlinkrA  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   r9   rK  r   r  z+read write move del get pget html admin dotr  z-@acctr  r  c              3       K   | ]  }|  y wrG   rA   )r\   r]   s     rC   r^   z"AuthSrv._reload.<locals>.<genexpr>   s     <1<s   z?the following users are unknown, and assumed to come from IdP: rS  z!you must -a the following users: zsorry, reserved username: 0   z%generated random passwords for users 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,%sassert_rootnospawnzlERROR: volume [/%s] root folder %r does not exist on server HDD; will now crash due to volflag 'assert_root'zvWARNING: volume [/%s] root folder %r does not exist on server HDD; volume will be unavailable due to volflag 'nospawn'c              3   4   K   | ]  \  }}|k(  s|  y wrG   rA   )r\   r   r   r  s      rC   r^   z"AuthSrv._reload.<locals>.<genexpr>P  s     FAQ#X1Fs   r@  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)  (r`   r  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)rj   r   _vzipmaxrt   r   r   r   r   r   r   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)r  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is_filer  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 th_qv th_qvx th_spec_p u2abort u2ow uid unp_who ups_who zip_whoz(aconvt convt tail_fd tail_rate tail_tmax)mv_rerm_retry_t_rz#volume "/%s" has invalid %stry [%s])rm   chmod_frm   755z^[0-7]{3,4}$zlconfig-option '%s' must be a three- or four-digit octal value such as [0755] or [644] but the value was [%s]rh   rp   rn   ro   fpermsr  du_whor  r  r  ogrT  rU  reflinkr  r~  put_namez{now.z{now:.	put_name2neversymlink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: %srw_editc              3   &   K   | ]	  }|s|  y wrG   rA   r  s     rC   r^   z"AuthSrv._reload.<locals>.<genexpr>
  s     *?Q1*?s   rw_edit_setr  preadmesreadmesemb_mds	prologues	epiloguesemb_lgs	html_headz%@html_head_dhtml_head_sufavicor  z&<link rel="icon" type="%s" href="%s">
icoz%<link rel="shortcut icon" href="%s">
	ufavico_hdb_xattrz~~db_xattr_nodb_xattr_yesr  e2te2vd2dsd2tse2tsmtr  d2vlifetimezlifetime rsszxau xiuzcannot enable [%s] for volume "/%s" because this requires one of the following: e2d / e2ds / e2dsa  (either as volflag or global-option)i3iQ im  zBthe lifetime of volume [/%s] (%d) exceeds max value (%d years; %d)dedupapnd_whonddmtpmtmzdvolume "/{}" defines metadata tag "{}", but doesnt use it in "-mte" (or with "cmte" in its volflags)zselect z from up where rd=? and fn=?r  zog opds xlinkrx  )r   rH  r   bcasechk)rW  rH  KWindowsMacosLinuxzdunable to determine if filesystem at %r is case-insensitive due to %r; assuming casechk=%s due to %szfmetadata 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 noner  zyWARNING: the config for volume [/%s] tried to remove volflag [%s] by specifying [%s] but that volflag was not already setr  
free_umaskzvolumes and permissions:
r  z
[36m"/{}"  [33m{}[0mz  readrI   z writerJ   z  moverK   r]  rL   z  dotsrQ   z   getrM   z upGetrN   z  htmlrO   rP   z[35monly-anonymous[0mz[35meverybody[0mz[36m--none--[0mz
|  {}:  {}zWARNING: disabling fika due to symlink-based dedup in at least one volume; uploads/deletes will be blocked during filesystem-indexing. Consider --reflink or --hardlinkz

[{}[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.linuxzyour OS is not Linuxz(\[H\] %s:.*|[?&]%s=)([^&]+)z(\[H\] z:.*|=)(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    rC   r  z!AuthSrv._reload.<locals>.<lambda>=  s    3qt9 rB   z,mapped %s share [%s] by [%s] => [%s] => [%s]idxitagdlnidgridgriddnsortnsortdhsortnhsortndsortr   dcropcropdth3xth3xu2tsfrandrandunlistr  r   lg_sbfr  r  md_sbfSPINNERs_name	idp_loginhave_up2k_idx
have_acodehave_c2flac
have_c2wavhave_shrhave_ziphave_zlshave_mvhave_delhave_unposthave_empmd_no_brsba_mdmd_sbasba_lglg_sbatxt_ext	def_hcolsr  unlist0see_dotsdqdeldgselgseldrcmdvolidxhdutcdfszfthemesturbolvlnosubtleu2ju2szu2owu2sortzXui_noacci ui_nocpla ui_noctxb ui_nolbar ui_nombar ui_nonav ui_notree ui_norepl ui_nosrvi
notooltipsup_sitezBUG: /z not in all_nodeszJinvalid config: a volume is overlapping with the --shr global-option (/%s)z{}(  r  r  r  r  ra   r  r   r  r   r   r   ri  re_volr  groupsr   r-   rQ  r  r   rv  r  r   r   rH   r   maxrb   r  rm  derive_argssetup_auth_ordipuhave_idp_hdrssetup_pwhashr  
setup_chpwr   r"   rE   r  r   r   r   cfgrr  r  r   rk   r  rI   r  r  r  r  r5  r   r   r  r  r  r  r  r/  r   r   r   r6  r   r   r  shr_dbr*  r+  r-  r   r.  shr_vhashlibsha512r  digestr,   decoder   rm  r$  r  r&  rg  r  r  getattrr   r   setattrrJ   rK   rL   rM   rN   rO   rP   rQ   r   rV  r`  urandomr   vol_or_crashvol_nospawnr   r   rq  sysexitr   r  r.  r  r#   base64	b32encoderB  rC  r  r  r@  ro  makedirsr  rZ  r   r[  r  r  r/   rf   rt   r   floatru   r|   r}   r   r   r   r   r   r   r   r~   rx   ry   r  	no_robots	no_vthumb	no_athumbno_thumbr   fk_salt	re_maxagehave_unlistcisfiler  e2dsar  r   r   r   rm   rp   rn   ro   n_du_whor  uqer   r   r   r  r(   r  r   r   r  have_db_xattrr9  r    r  
UP_MTE_MAPr  upperr0  unlinkr   r   patternr   r  rB  no_davsmbr  onumaskrG  r  fika
no_voldumpchk_sqlite_threadsafegetcwdr!   idp_warnidp_errr   	PTN_SIGILfindallr1   platformrY  r  r  r  r  r
  load_sessionsr	  r  	usernamespw_hdrpw_urlpmimer   r   r  r  r  r  r  r   r%  r  r  r  r  r  r  r0   r  r  r8  spinnerbnamer\  no_acode
allow_flac	allow_wavno_zipno_zlsno_mvno_delunpostemp	textfilesrp  qdelrcmau_volih	localtime	ui_fileszry  turbor{  r|  r}  r  r&   jsondumpsr  )rR   r  r  r  r?  r@  r>  r
  r   r  r  r   r  r  r  v_strrK  r8  r9  permsr0  r  rL  cfg_fnrt  rD  zstzsttrH  rs  slnsrD  r  casedr(  rh  r>  r   ehintr  hitsrY  maxdepthdepthr:  zvk_ignunknown_flagsr]   r   rc   ensharer  shrsrk  db_pathr1  r2  cur2r   rows_ks_pws_vps_prs_nfs_uns_t0s_t1r  suns_axszssr  permaxs_keyzxusrumapr  r8   	all_usersmissing_usersassociated_usersr   seenpwdspwddropvolserrorspromotedemotehidvflagnchhpathpownerr  ownermetarhisttabhistpis_shrzv2rdbpathsrE  usezfr  rM  have_fkr  r  r  r  r  fk_lenall_mterC  have_reflinkgarW  rE  ver  is_dr  k1k2dbdsr  hooksr;  hncmdsncmdscmdhfsocmdr  etvr  zsl1zsl2zsl3zsl4head_sico_urlico_hico_extnegr  r  intsdropzi2zi3	local_mtplocal_only_mtptagsr   r  localb	local_mter9  r  up_mup_qr  ccsru  fn2is_cir  re1exclr  vtopr   have_dawrB  have_e2dhave_e2t
have_deduphave_symdupunsafe_deduptxtattridp_vpidp_vnidp_vp0sigilsrF  par_vppar_vnoth_read	oth_writetaxspwdsextr  shns_vfss_remrv  qs_fno_vnexactr   r  r  r=  svnrl  r  r  s                                                                                                                                                                            `                                                rC   r#  zAuthSrv._reload  sK   99;;YY[[ 11773?DAqDG1 99==YY]] 	11  !yyc288a@HC #C 5 ; ;C @DI48I >q >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 	DII99==!8!8/3yy}}=!1773?1%=C=!9Q1D=19C99<>Al"$		 E!& /IR$R[#.b	/ ETYY44secUD$/CE{{ A'(A-HHQ!AA1E TAHHQNHHQ!LLaPeX GAeJJquu-E
 #wwy))'21<<;L  
  TAHHQ!%%		$!@@!DdmmWS\2r3		LC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	
 3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 D[SEb !$S)!$T]]BBsyy~~GW!X		#;Y> 254CIIcNS\\#.yy'') &EHHSYY'#--		*B!00&
 $i

4==!CfSk**AGGI 	+DDjG<<--/ /CSWWg."9!3% $s$r( /B}}S)

2V

2==-!#ABB&*hhrl&8b / "

2///  &,,ae,D, !"||113 -GB '2Bby't9LS	((,- S	 ! CtT*3	+6 =='') 	CB !  "((N"))O"((N"''M"''M"((N"((N"))O"''M
 
CH	" 	;;= 	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:a= 	Cc"BRZZ^,33G<

3DI	 HH#GK

 	 HChZ(3-5q9((HSM	   
	0C**s~~d3s||$q(fAHHQ#Z+ @AHHQ#s^Q/
	0 <<&&( 	%CLL!2!2 II22 II1188??3<<0#))+tyy/E/E Ccii66: Mcii66:$'	%( HHQK 	CeCGCHLLSYY-MMcii.mm**, %JJ%%cll3JJ%%cii0KKOOCII.LL$$SYY/ F)9FKHHLL$% CL#	& <<&&( &	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<<0CLM&	1P <<&&( '	'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#&O'	'T  	'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y!9!BUC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 "'		
=='') k	=Cww~~cll+'+		)$#'		% 		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; pBXXZ 5		>#&syy|#4CIIaL5 <B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3 G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.#+CIIh,?#@CIIi ;??		)$tyy'8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" '*ii	&:&@&@&EF1779FCF!'Q1'C'#&88C=CIIi '**?c*?'?CIIm$-0U2Gcii	*"yy4::3?E!1AEDE"yy399#>D!!ADDD51QWWY567D51QWWY567DNN4 NN4 %&dOat_#ECIIi "yy5;;C@F!AAFDF"yy5;;C@F!AAFDF51QWWY567D51QWWY567DNN4 NN4 %&dOat_#ECIIi SYY]];/526Bb!fn+-		-(SYY]]=9?R@#))--6<"=2+.99;
CF YBFfood3$SYY&+%iimmI.G!--,Q/55c:2>DDFm+BB-"8'!BBE%AB'OE-2CIIk*eOF+1		-(		mT299==/		mT2!yy}}Z(*.		':./mmD)ABB*,((3-8Qqwwy88"%+Qq++/23xCIIm,03CIIn- #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%##%88:@acii@@BHHJCq#))--2BCC %A cAHHQ!SYY/3IIMM!$%
 z*/aB))++.C+#CAvcXBS11Al" 399$SYY.IIj)T1(-		*% 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)6!Q#XA6D6+/0aJqM0D0<@IIdOMB)-22t"<CIIhWk	=\ $'<<#5#5#7
C9		;QBG
 =='') 	(C99==+ Bhhj (		b$'(		( <<&&( '	-C<<399==#;))I&r*002Cj #:,0CIIj)=S\\cii8

3<<0 B((*CSy hhjSyC5L GGNN277<<c+JKE!&#CC j(cllI>BTN((*!#3B#!>#CCIIbM $'CIIi cz(,		*%O'	-R 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:$89AAX34A23AIIaL^**322'3*   "(("!
RXX-)2882K"&KBHH,$++C"((N;IAU*	X 499>> zADIIN9q=99''49922..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<<**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499++TYY->->??  -1II,<,<>chhtn~55**R.DK 99>>iinn "HHS!,	T!c
" KK%++-8$!QA89  LL..0Aq8ALL$6 1CL #$3..{{#56 AH@C=T4tT4iimmC.#&77dC4KcTk3RV;$LE5 7A#'<<C6#: )

4() %(HCM [[CF$'$6$6CM%(%8%8CN WWCF$'NNCM%(__CN $$en$u5,,R0a(( JJOO-	![[
#}} \\{{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GCAHH ii&&( 	UJJ	T]]4(88??2&))..* UB#&t}}b"b#%#TBHHRLU	U JJLIIKHHJ
hh((..0 Z	6FB2==.Bu{ " 2	
 'R- 2h< F F F 6
 2i= bffVn- BFF:.3! "&&*0b zR/bffX6F6M#  zR/bffX6F6M#!" 2i=#BH& b &(o#3499,,3$))//3 TYY003  "	3
 $))"4"443 tyy333 dii113 DIIMM3 2i=3 		 0 003 		 0 003 tyy.3 		 0 003 s499#3#343 C		.3  Cz 2 7a8!3" "&&,2#3$ '*%3& '*'3( "&&*0b)3* "&&*0b+3, 2i=-3. 499..66sC@/30 T"&&-"526132 266(+1r334 DII..536 738 (93: '*;3< 2=3> 'R-?3@ 2h<A3B FC3D FE3F FG3H 		I3J 		((K3L DIILL)M3N DII///O3P ,,2237Q3R $))**S3T DIIOOU3V DII..W3X tyy}}Y3Z 		[3\ 6
]3^ 6
_3` bffVn-a3b BHHZ0c3d $))**e3Fh lBhhj #66":!"F2J# Bhhj #499b%0!"F2J# Bhhj %diiR0!$F2J% "$**V"45BIuZ	6x CMM((*+yy'') %99CMM1HHCIIGKKK$% cmm#`JAl" 	1C++b/!$C		4SYY4"CI9szz9TCJSYY]]8,@		0@0@AB"$))C.CIIh	1}.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 >9PE@ -h<6 6% $( (26 6% $( (x/ A.B4 &L
 &E &E
 &LXR=A#AAsyy}}QY7O(P$PQQ` /Bn ; 2Scii--q1F' FD55
 GF55h 9+ Y Y Y A D6 3:> 70
H  ="BC BC BCzcllBR88!<<=" /6t  	'"&D	'~ 5 9 G  9" ! GAHHQ#tT2!66:IIMM#&	H #F! s  EK(AEL(EL	?EL3EL>EL/'EL/76EL>-EL4EL4EL>+EL9?EL>3EOEOEO"EO #EO  '9EO*;
EO/A?EO4G2BEO9SEPS#!EPTEPUEP[.EP2[;!EP%\EP2]EP<jEQ	m<EQ'oEQ/p%EQ4s	EQ9tEQ>R:AER_8ES
k$
ES
k/ES
m+=ESo	ES6o&ES;o.ES;q*ET q2ET rETr ETr4ET
s$ETuETu'ETvETvETv)ETwET#BET(B;ET-CET-EET2
E'ET2
GET8
G(ET8
H=#ET>
J0EU
K
EU
MEU
MEU
M3 EUNEUSEUS<EUY	EUYEUY%EU$[EU)[EU)_EEU/e5EWfEWD?BEW R EW+SEW1T?	EW6U	EW6ZEW;
Z6#EX\,!EXcEYd"AEYK(ELL	ELLEL,L/EL>L> EOMEM;
M:AEOO EO'O9EO>PEPPEPPEPPEP"P%EP/P*EP2P2EP9P<EQQ	EQ$Q'EQ,R;ER>S%ES3U/	EWU8AEW W EWWEW(W'EW(X	EYX7EYYEYYEY c                 <   | j                   j                  j                  d      D cg c]  }|j                          }}d|v r!|j	                  d      }|d | ddgz   ||d  z   }dj                         }|D cg c]  }||v r|j	                  |      nd c}\  }}}}t        ||      |k  | j                   _        ||k  | j                   _        |dk(  | j                   _        |dk  xs | j                   j                   | j                   _
        y c c}w c c}w )Nr  idpzidp-hmzidp-hzpw idp-h idp-hm ipuc   r   )r  auth_ordra   r   indexr   ao_idp_before_pwao_h_before_hmao_ipu_winsr  
ao_have_pw)	rR   r   aor  rD  pwr  hmr  s	            rC   r  zAuthSrv.setup_auth_ord  s   !%!3!3!9!9#!>?Aaggi??B;%BCRHg..BC8B#))+BEFQb"((1+b8FAr3%(BZ"_		"#$r6		  #q		!BwEdii.E.E*E		 @
 Gs   D:D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 )	Nr  zselect un, gs from usr   rj   rU   r  ...zfound %d IdP users in db (%s))r  r)  r  r*  r+  r,  r-  r.  fetchallr0  r  clearr  r!  ra   r   r   r   rb   r   r   )rR   quietlevelr1  r2  
from_cachegseprH  rL  r$  r   r%  r   s                rC   rf  zAuthSrv.load_idp_db  ss   		##19DII33 __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  rU   rd  zadded %d new sessions (%s))r  no_sesr  r  ses_lenr*  r+  ses_dbr-  r.  r  r   r  
idp_cookier  r  r  r,   r   r  r  r   r   r   r/  r0  r   rb   r   r   )rR   rg  r  blenr1  r2  rL  sidrH  rR  accsr]   r   r   s                 rC   r  zAuthSrv.load_sessions  s   99DIDI 		!!Q&!+qQ__TYY--.iik++&=> 	"JE3		!!U	" +DII99""tyy';';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   )rR   r   rL  s      rC   forget_sessionzAuthSrv.forget_session"  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(  rj   )r  rl  r*  r+  rn  r-  r.  r/  r0  r  r   r  r   )rR   rL  r1  r2  s       rC   ru  zAuthSrv._forget_session)  s    99 __TYY--.iik1E8<
				

		diimmE2.3		eR rB   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
      }|j)                         rt+        j,                  |      ni }|D 	cg c]  }	|	d   |k7  s|	 }}	|j/                  || j                  |   |f       t1        |dd      5 }
t+        j2                  ||
d       d d d        | j'                  d|d       |s| j5                          	 d d d        y	 d d d        |j7                  ddd      j9                          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 charactersFr  )Fz$that's already your password my dude)Fzpassword is takenTr   r9   r  )encoding)z,
: )
separatorsz0reinitializing due to password-change for user [r[  )Tznew password OKr  )r  chpwr  chpw_nor   chpw_lenr  r  r  r   r  r  r  r  chpw_dbr   r   rq  r)   r   r   r  loadsr   r  dumpr#  r   r   )rR   r   rL  ra  r   hpwrh  pwdbjtxtr   r  s              rC   r|  zAuthSrv.chpw8  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+/::<tzz$'R#5!qtu}A5D5KK

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

8UE*..0& 6= =	/ 	/s=   A;III1II(0III	II&c                    | j                   j                  }| j                   j                  rt        j                  j                  |      sy t        | j                  |d      }|j                         rt        j                  |      ni }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   r  zchpw: %d changed, %d unchangedzchpw: %d changedz, [0munchanged:[35m %srU   r_  rj   z[0mchanged: [32m%sz%s[0munchanged: [35m%szchpw: )r  r  r|  r   r   rq  r)   r   r   r  r  rH   r5  chpw_vr  r   rb   r   )rR   r  rh  r  r  useenurstuokr  origmodrD  r   r   s                 rC   r  zAuthSrv.setup_chpwi  s*   YYyy~~SXX__R%82t,#'::<tzz$R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#rB   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+!   r  z?
  BAD CONFIG:
    cannot --ah-cli or --ah-gen without --ah-algrA  FTz"hashed password for account {}: {}r     {}: {}z<please use the following hashed passwords in your config:
{}r  )r  r  r   r   r  r   r   r  r  ah_cliah_genr  clir  r  stdinprintr   r   r   r   rb   )rR   r  rL  ra  r   changedr  rt  s           rC   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-rB   c                 :    t         dd  }|dk(  ry|dk(  ry|dk(  ryy)	Nri   1rj   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   )rR   r   s     rC   r  zAuthSrv.chk_sqlite_threadsafe  s4    rsO88 u8 KTrB   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  r  r   z**zuser not found: r   zvolumes must start with /zvolume not found: )usersr0  r   zW/{}: read({}) write({}) move({}) del({}) dots({}) get({}) upGet({}) html({}) uadmin({})r   rc  r  r   z/{}/zchecking /{} as {}TFrj   r   z# user "{}", vpath "{}"
{}zuser {}, vol {}: {} =>r  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&  ra   r   r  r  r  rY  r  r  r   r   r   r   rI   rJ   rK   rL   rQ   rM   rN   rO   rP   r   r   r   r   r  r  r   
no_scandirr   rb   rU  r   r  r  ))rR   r  r  r   r  r  r   r0  rD  r   r]   r  r^  vsflag_vflag_lnflag_pflag_rbadsr   r;  r=  rM  atopsafeabsr  r   r  files1r   rH  r  rD  r  r  r  r  r  r(  rh  r  s)                                            rC   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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)rj   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_nodotrx  )r!  tftp_lsfr   ri   Fr  r  r  TrU   r  r   rj   r  r  rM  rA  {}: {})FNrj   ry  r  rz  rz  z[/{}]  accs:rI   rJ   rK   rL   rQ   rM   rN   rO   rP   )	r   r9   rK  r   r^  r  r  r  r  r  r  zrwmd.arT  
    {}: {}  flags:r  zgenerated config:

r  )#rH   ra   r   rg  r   r   r   varsr  r   r   r   r   r  r   r   r   r  rb   r   r  r  r   r   r   r  r  rY  r  r   r   r   r   r   r   )+rR   r   csvrD  lstaskipr   fskipamapr]   r   vmapr  popsr  r  r   skipdefstrs1s2r  v2r   r  r  r  r  rH  rh  r  r  r  pkeyrL  lusersvpermsrM  pstrpchartruesr  aks+                                              rC   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   rG   )r  r   )"r>   r?   r@   r  rS   r   r  r  r  r&  r"  rQ  r=  r`  rd  ri  rv  rp  r  r  r  r  r#  r  rf  r  rv  ru  r|  r  r  r  r  r  rA   rB   rC   r  r    s    , 0d* !>Wr&P
>D0Y4@DM=^"H8Et$u1n/
F"DH+AZ1!/'b8$t..`U"yv|;rB   r  c                     t        | j                  xs | j                        | _        t        | j                  xs | j
                        | _        y rG   )r8  	idp_h_usr
idp_hm_usrr  r  iprhave_ipu_or_ipr)r  s    rC   r  r    s6    dnn?@D 4DHH5DrB   c                 @    | dk(  ry| dk(  ry| dk(  ry| dk(  ry| d	k(  ry
y)Nr   r  r     r9   r  rwr  r  r   r   rA   rs  s    rC   r  r  #  s7    EzF{CxDyCxrB   c                 (    | dk(  ry| dk(  ry| dk(  ryy)Nr   r  r  r_  r  r   r   rA   r  s    rC   	n_ver_whor  1  s#    EzF{CxrB   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 )NTr  r   r  )r   findra   )rc  r   ofs_sepofs_varr]   s        rC   r  r  ;  s    
C
XXZ J ''#,"''#,"wCG J ')HHS!$EAr!C	NHHS!$EArXXZC	NJ! rB   c                    t        |      }t        |j                  d            dkD  rt        d      t        j
                  j                  |      rt        t        t	        j                  |                  }|D cg c]6  }|j                         j                  d      s#|j                  d      r5|8 }}|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  r^  zQwarning: tried to read config-files from folder '%s' but it does not contain any z<.conf files; the following files/subfolders were ignored: %srU   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	r  r  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   ra   r  r   r   isdirr   r  r   rr  r  r  rb   r   rl  rq  r   r)   r   r   r   dirnamero  r  r  stderr)r   r   rq  ipathnamesr   cnamesr   rD  ru  fp2rr  olnrc  padofsrH  rD  s                     rC   rl  rl  Q  s    
B
5;;v"$677	ww}}RVBJJrN+,
	 2 27 ;ALLQTDUA
 
 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!#**% 7sA
V 3s   ?$O $O 6O 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   rx  ry  r{  r|  r  r  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   rj   r  r  rA  r  r  r  zu Nr  r  r   z[{}]zc rX   r  rU   rz  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 ]======================

r  zJ
# ======================[ end of upgraded config ]======================
)ra   r   r  r   r^  r   r   r6  r   rb   r  r  )r   r  r  cfg_fpr   r  inclr   r   r(  rh  r  r  r  r  r  rc  snr  r  t1rH  s                         rC   rn  rn    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)b
__future__r   r   argparser  r  r  r   r   r  r  r  r   r   rS   r   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/   r0   r1   r*  	broker_mpr2   
broker_thrr3   broker_utilr4   xrangero  r`  r  SEE_LOGSEESLOGr   SSEELOGrV  r  r   r9  r:  r6  r7  r  r  r=   objectrE   rf   r   r  r  r  r  r  r  rl  rn  rA   rB   rC   <module>r     s   7     	 	  
    C C  @ @        B #%& E  , 
	
  
-
..
!

%
%g
.
..
!BJJ-.	BJJ-.	BJJ'	BJJ'	BJJ'(		I 	U& U8s<& s<lD
& D
N RZZEFFRZZ12FJ,;f J,;ZX6
,P&firB   