
    hT                        S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
r
S SKrS SKJr  S SKJrJrJrJrJrJrJrJrJrJrJrJr  S SKJr  SSKJr  SSKJ r   SSK!J"r"J#r#J$r$J%r%J&r&J'r'J(r(J)r)J*r*J+r+J,r,  \RZ                  " \.5      r/\R`                  " 5       S	\1S
\\1   4S j5       r2S\1S
\14S jr3\R`                  " 5       S
\14S j5       r4\" S\#\$5      r5S\5S
\54S jr6 " S S\5      r7 " S S5      r8 " S S\9\#5      r: " S S5      r; " S S\9\#5      r< " S S5      r= " S S5      r> " S  S!\R~                  S"S#9r@g)$    N)Path)BinaryIOCallableClassVarDictIterableList
NamedTupleOptionalPatternSequenceTupleTypeVar)bus   )config)__version__)	JsonError
JsonObject	JsonValueget_boolget_dictget_intget_objvget_strget_strvjson_merge_patchtypecheckedaccept_languagereturnc                    [         R                  SU 5        / nU R                  S5       H  nUR                  5       R	                  5       n[         R                  SU5        UR                  S5      u  p4n [        U=(       d    S5      nU(       d  Mi  [         R                  SX65        UR                  X645        UR                  S5      u  p4nU(       a  ME  M     UR                  S S	S
9  [         R                  SU5        / nU H%  u  p9US:X  a    OX8;  d  M  UR                  U5        M'     [         R                  SU5        [        U5      $ ! [         a     GM5  f = f)a4  Parse the Accept-Language header, if it exists.

Returns an ordered list of languages, with fallbacks inserted, and
truncated to the position where 'en' would have otherwise appeared, if
applicable.

https://tools.ietf.org/html/rfc7231#section-5.3.5
https://datatracker.ietf.org/doc/html/rfc4647#section-3.4
zparse_accept_language(%r),z
  entry %rz;q=g      ?z    adding %r q=%r-c                     U S   $ )Nr    )pairs    2/usr/lib/python3/dist-packages/cockpit/packages.py<lambda>'parse_accept_language.<locals>.<lambda>c   s    a    Tkeyreversez  sorted list is %renz  results list is %r)loggerdebugsplitstriplower	partitionfloat
ValueErrorappend
rpartitionsorttuple)
r   locales_with_qentrylocale_qstrq_regionresults_qs
             r'   parse_accept_languagerD   E   s9    LL,o>N &&s+##%\5)//%04	dkc"A fLL-v9!!6+.!'!2!23!7Fw	 f ,  0$?
LL&7 G$
T> NN6"	 % LL'1>5  		s   6E
E E versionc                 P    SR                  S U R                  S5       5       5      $ )z7Convert a version string to a form that can be compared.c              3   B   #    U  H  oR                  S 5      v   M     g7f)   N)zfill).0parts     r'   	<genexpr>"sortify_version.<locals>.<genexpr>y   s     A.@dJJqMM.@s   )joinr1   )rE   s    r'   sortify_versionrP   v   s"     88AgmmC.@AAAr*   c                      S HI  n [         R                  R                  [         R                  R                  U S5      5      (       d  MG  U s  $    [        R                  S5        g)zcDetect libexecdir on current machine

This only works for systems which have cockpit-ws installed.
)z/usr/local/libexecz/usr/libexecz/usr/local/lib/cockpitz/usr/lib/cockpitcockpit-askpasszCould not detect libexecdirz/nonexistent/libexec)ospathexistsrO   r/   warning)	candidates    r'   get_libexecdirrX   |   sK     j	77>>"'',,y2CDEE j 	45%r*   Jobjc                    [        U [        5      (       aK  SU ;   a+  [        R                  " S5      nUb  U R	                  SU5      $ U R	                  S[        5       5      $ [        U [        5      (       a/  U R                  5        VVs0 s H  u  p#U[        U5      _M     snn$ [        U [        5      (       a  U  Vs/ s H  n[        U5      PM     sn$ U $ s  snnf s  snf )Nz${libexecdir}/cockpit-askpassrR   z${libexecdir})

isinstancestrshutilwhichreplacerX   dictitemspatch_libexecdirlist)rZ   abs_askpassr,   valueitems        r'   rc   rc      s    #s*c1 ,,'89K&{{#BKPP{{?N,<==	C		?Byy{K{%e,,{KK	C		36734 &377
	 L7s   	C>Cc                   R    \ rS rSr% \\S'   \\S'   Sr\\   \S'   Sr	\\   \S'   Sr
g)Document   datacontent_typeNcontent_encodingcontent_security_policyr%   )__name__
__module____qualname____firstlineno__r   __annotations__r]   rm   r   rn   __static_attributes__r%   r*   r'   ri   ri      s+    
N&*hsm*-1Xc]1r*   ri   c                       \ rS rSrSS jrSrg)PackagesListener   Nc                     g)z+Called when the packages have been reloadedNr%   selfs    r'   packages_loaded PackagesListener.packages_loaded   s    r*   r%   r    N)ro   rp   rq   rr   r{   rt   r%   r*   r'   rv   rv      s    :r*   rv   c                   0   ^  \ rS rSrS\4U 4S jjrSrU =r$ )BridgeConfig   rf   c                   > [         TU ]  U5        [        U SS 5      U l        [	        U SSS9U l        [        U S0 5      U l        U R
                  (       d  U R                  (       d  [        US5      e[        U SS5      U l
        [        U S	5      U l        U R                  (       d  [        US
5      eU R                  =(       d    U R                  S   U l        g )Nlabel
privilegedF)defaultmatchz&must have match rules or be privilegedenvironr%   spawnzspawn vector must be non-emptyr   )super__init__r   r   r   r   r   r   r   r   r   r   name)rz   rf   	__class__s     r'   r   BridgeConfig.__init__   s    T7D1
"4uEdGR0
tzzE#KLLi4dG,
zzE#CDDJJ/$**Q-	r*   )r   r   r   r   r   r   )ro   rp   rq   rr   r   r   rt   __classcell__r   s   @r'   r   r      s    0j 0 0r*   r   c                   "    \ rS rSrS\4S jrSrg)	Condition   rf   c                      UR                  5       u  u  U l        U l        g ! [         a  n[	        US5      UeS nAff = f)Nz'must contain exactly one key/value pair)rb   r   rf   r6   r   )rz   rf   excs      r'   r   Condition.__init__   sB    	W',{{}$#TY
 	WE#LMSVV	Ws   " 
>9>)r   rf   N)ro   rp   rq   rr   r   r   rt   r%   r*   r'   r   r      s    Wj Wr*   r   c                   V   ^  \ rS rSr\=(       a    \" \5      rS\S\4U 4S jjr	Sr
U =r$ )Manifest   rT   rf   c                   > [         TU ]  U5        Xl        [        U SU R                  R                  5      U l        [        U S[        5      U l        [        U SS5      U l	        [        U SS5      U l
        [        U S[        5      U l        U R                  bp  [        U S0 5      nUR                  5        HN  u  pEUS	:w  a  [!        US
5      e[#        [%        U[&        5      5      U R                  :  d  M@  [!        USU S35      e   g g )Nr   bridgespriorityr   zcontent-security-policy 
conditionsrequirescockpitznon-cockpit requirement listedzrequired cockpit version (z	) not met)r   r   rT   r   r   r   r   r   r   r   cspr   r   COCKPIT_VERSIONr   rb   r   rP   r   r]   )rz   rT   rf   r   r   rE   r   s         r'   r   Manifest.__init__   s    	D&$))..9	i>j!44!:B?"4yA +j"5H!)!19$#D*JKK";w#<=@T@TT#G/I'R[-\]]	 "2 ,r*   )r   r   r   r   rT   r   )ro   rp   rq   rr   r   rP   r   r   r   r   rt   r   r   s   @r'   r   r      s.    !Bok&BO^T ^* ^ ^r*   r   c                   "   \ rS rSr% \R
                  " S5      r\\   \	S'   \
\	S'   \\	S'   \\	S'   \\	S'   Sr\\\\\\4   4      \	S	'   Sr\\\\4      \	S
'   S\
4S jrSS jrS\4S jrS\S\4S jrS\S\\   S\4S jrS\S\S\4S jrSrg)Package   z%(po|po\.manifest)\.([^.]+)\.js(\.gz)?PO_JS_REmanifestr   rT   r   Ntranslationsfilesc                 v    Xl         UR                  U l        UR                  U l        UR                  U l        g N)r   r   rT   r   )rz   r   s     r'   r   Package.__init__   s*     MM	MM	 ))r*   r    c                 >   U R                   b  g0 U l         0 0 S.U l        U R                  R                  S5       GH-  n[	        UR                  U R                  5      5      nUS;   a  M0  [        R                  R                  U5      nU(       ao  UR                  S5      nUR                  S5      nUR                  5       R                  SS5      n[        R                  S	XFU5        X R                  U S
3   U'   M  [        R                  " SSU5      n[        R                  SXB5        X R                   U'   U R                   R!                  UR                  SS5      U5        GM0     U R                  S   (       d  U R                  S   U R                  S'   gg)zEnsure that the package has been scanned.

This allows us to defer scanning the files of the package until we know
that we'll actually use it.
N)po.jspo.manifest.js*)rG   z..zmanifest.jsonr      r>   r#   zAdding translation %r %r -> %rz.jsz.gz$r   zAdding content %r -> %rz.min.rG   r   r   )r   r   rT   rglobr]   relative_tor   r   	fullmatchgroupr3   r`   r/   r0   resub
setdefault)rz   filer   po_matchbasenamer=   lower_locales          r'   ensure_scannedPackage.ensure_scanned   s^    ::!
&(B?IIOOC(Dt''		23D33''11$7H#>>!,!*%||~55c3?=xW[\DH!!XJc"23LA 66'2t46G'+

8$ 

%%h&6&6w&DdK5 ):   !12262C2CG2LD./ 3r*   c                 >   SSSSSSSS.nU R                   R                  R                  S5       HB  nUR                  5       nU(       d  M  UR                  5       R	                  S5      u  p4nXQU'   MD     SR                  S UR                  5        5       5      S-   $ )	Nz'self'z'none'z'self' data:)zdefault-srczconnect-srczform-actionzbase-uriz
object-srczfont-srczimg-src; c              3   6   #    U  H  u  pU S U S3v   M     g7f)r   r   Nr%   )rK   kvs      r'   rM   6Package.get_content_security_policy.<locals>.<genexpr>3  s     ?1#Qqcs   z block-all-mixed-content)r   r   r1   r2   r4   rO   rb   )rz   policyrg   r,   r>   rf   s         r'   get_content_security_policy#Package.get_content_security_policy"  s    ### "&%
 MM%%++C0D::<Dt $

 6 6s ;#s	 1 xx???B\\\r*   filenamec                    [         R                  " U5      u  p#S nUc  SnO&UR                  S5      (       a  U R                  5       nU R                  U-  n[
        R                  SU5        [        UR                  S5      X#U5      $ )Nz
text/plainz	text/htmlz  loading data from %srb)		mimetypes
guess_type
startswithr   rT   r/   r0   ri   open)rz   r   rl   rm   rn   rT   s         r'   	load_filePackage.load_file5  s{    )2)=)=h)G&"&'L$$[11&*&F&F&H#yy8#-t4		$I`aar*   localesc                 >   U R                  5         U R                  c   eU HH  n[        R                  " [        5         U R                  U R                  U   U   5      sS S S 5        s  $    [        [        R                  " 5       S5      $ ! , (       d  f       Mz  = f)Ntext/javascript)	r   r   
contextlibsuppressKeyErrorr   ri   ioBytesIO)rz   rT   r   r=   s       r'   load_translationPackage.load_translationC  s}      ,,, F$$X.~~d&7&7&=f&EF /.  

&788 /.s   !B
B	headersc                    U R                  5         U R                  c   eU R                  c   eXR                  ;   a'  [        [	        USS5      5      nU R                  X5      $ U R                  U R                  U   5      $ )NAccept-Languager   )r   r   r   rD   r   r   r   )rz   rT   r   r   s       r'   	load_pathPackage.load_pathP  sz    zz%%%  ,,,$$$+GG=NPR,STG((77>>$**T"233r*   )r   r   r   rT   r   r   r}   )ro   rp   rq   rr   r   compiler   r   r   rs   r   r]   r   intr   r   r   r   r   r   r   ri   r   r   r   r   r   rt   r%   r*   r'   r   r      s    "$**-U"VHhwV 
I
JM 9=L(4T#s(^ 345<&*E8DcN#** *+MZ]S ]&b# b( b9S 98C= 9X 9	4c 	4J 	48 	4r*   r   c                      \ rS rSr% \R
                  R                  S S.r\\	\
\\
/\4   4      \S'   \S\\
   4S j5       r\S\S\S\4S	 j5       r\S\\   4S
 j5       rS\
S\S\4S jrS\S\4S jrS\\\
\4      4S jrSrg)PackagesLoaderi\  c                 J    [         R                  R                  U 5      (       + $ r   )rS   rT   rU   )ps    r'   r(   PackagesLoader.<lambda>_  s    ):%:r*   )zpath-existszpath-not-exists
CONDITIONSr    c              #   *  #     [         R                  S   v    [         R                  S   R                  S5       S h  vN   g ! [         a$    [         R                  R	                  S5      v    NYf = f N6! [         a    S S h  vN     g f = f7f)NXDG_DATA_HOMEz~/.local/shareXDG_DATA_DIRS:)z/usr/local/sharez
/usr/share)rS   r   r   rT   
expanduserr1   )clss    r'   get_xdg_data_dirs PackagesLoader.get_xdg_data_dirsb  s~     	7**_--	:zz/288===	  	7''$$%566	7 > 	:999	:sb   BA %A8 A6 A8 B+A30B2A33B6A8 8BB
BBBBr   parentc                    US-  [         R                  " UR                   S35      [         R                  UR                   S3-  /nU H`  n [        R
                  " UR                  5       5      n[        W[        5      (       d  [        R                  SU5        MU  [        X5      nMb     [        U5      $ ! [         a     M|  [        R                   a   n[        R                  SXF5         S nANS nAff = f)Nzoverride.jsonz.override.json%s: %sz%%s: override file is not a dictionary)r   lookup_configr   DOT_CONFIG_COCKPITjsonloads
read_bytesFileNotFoundErrorJSONDecodeErrorr/   rV   r\   ra   r   rc   )r   r   r   override_filesoverride_fileoverrider   s          r'   patch_manifestPackagesLoader.patch_manifestn  s     _$  FKK=!?@%%6;;-~(FF
 ,M=&*jj1I1I1K&L h--FV';H ,  )) % '' =x<<=s   $B99
C9C9C44C9c              #     #    U R                  5        H  n[        R                  SU5        [        U5      R	                  S5       H  n[        R                  SU5         [
        R                  " UR                  5       5      n[        U[        5      (       d  [        R                  SU5        Mk  UR                  nU R                  X55      n [        XS5      v   M     M     g ! [
        R                   a!  n[        R                  SX$5         S nAM  S nAff = f! [         a!  n[        R!                  SX$5         S nAM  S nAff = f7f)Nz$Scanning for manifest files under %szcockpit/*/manifest.jsonzConsidering file %sr   z!%s: json document isn't an objectz%s %s)r   r/   r0   r   globr   r   	read_textr   errorr\   ra   r   r   r   r   rV   )r   datadirr   r   r   r   s         r'   load_manifestsPackagesLoader.load_manifests  s     ,,.GLL?IW**+DE2D9#zz$..*:;H "(D11LL!DdK--h?7"644 F / ++ LL45 ! 7NN7D667s[   AE $C%A
ED	E%D9DEDE
E'E=EEE	conditionrf   c                 \    U R                   U   n[        U[        5      (       d  gU" U5      $ NF)r   r\   r]   )rz   r  rf   check_fns       r'   check_conditionPackagesLoader.check_condition  s,    ??9- %%%r*   c                 D   UR                    HT  n U R                  UR                  UR                  5      nU(       a  M3  [
        R                  SUR                  U5          g   g! [         a/    [
        R                  SUR                  UR                  5         M  f = f)Nz0  %s: ignoring unknown predicate in manifest: %sz2  hiding package %s as its %s condition is not metFT)	r   r
  r   rf   r   r/   rV   rT   r0   )rz   r   r  okays       r'   check_conditionsPackagesLoader.check_conditions  s    !,,I++INNIOOL 4QS[S`S`bkl -   QS[S`S`bkbpbpqs   &A&&5BBc              #     #    [         R                  S5        [        R                  " [        5      nU R                  5        H@  n[         R                  SUR                  5        XR                     R                  U5        MB     [         R                  S5        [         R                  S5        UR                  5        H  u  p4[        US SS9 Hm  n U R                  U5      (       a2  [         R                  SX5R                  5        U[        U5      4v     M]   [         R                  S
UR                  5        Mo     M     [         R                  S5        g ! [         a#    [         R                  S	UR                  5         Njf = f7f)Nz)Scanning for available package manifests:z  %s/manifest.jsonzdone.zSelecting packages to serve:c                     U R                   $ r   r   )r   s    r'   r(   .PackagesLoader.load_packages.<locals>.<lambda>  s
    XEVEVr*   Tr+   z  creating package %s -> %sz1  %s: ignoring package with invalid manifest filez  ignoring %s: unmet conditions)r/   r0   collectionsdefaultdictrd   r  rT   r   r7   rb   sortedr  r   r   rV   )rz   namesr   r   
candidatesrW   s         r'   load_packagesPackagesLoader.load_packages  s0    @A+6+B+B4+H++-HLL-x}}=-- ''1 . 	W34 %D $J4V`de	h,,Y77%BD..Y"GI$666 8 >	O f !. 	W	 ! hNN#VXaXfXfghs,   CFAEAF*F	FF		Fr%   N)ro   rp   rq   rr   rS   rT   rU   r   r   r   r]   r   boolrs   classmethodr   r   r   r   r   r   r  objectr
  r  r   r   r  rt   r%   r*   r'   r   r   \  s    ww~~:>Jc8SE4K#889: 
 	:(3- 	: 	: *j *$ *: * *0 7x1 7 7* V   d xc7l(;< r*   r   c                      \ rS rSr% \\S'   \\   \S'   \\	\
4   \S'   \\S'   SS\\   S\\   4S jjrSS	 jrS
 rS\\   4S jr\R&                  R)                  SSS9r\R&                  R-                  5       S 5       r\R&                  R-                  5       S 5       rS\S\S\4S jrS\4S jr\R<                  " S5      rS\	S\S\4S jr Sr!g)Packagesi  loaderlistenerpackagessaw_first_reload_hintNc                 n    Xl         U=(       d
    [        5       U l        U R                  5         SU l        g r  )r!  r   r   loadr#  )rz   r!  r   s      r'   r   Packages.__init__  s)     0 0		 &+"r*   r    c           
      j   [        U R                  R                  5       5      U l        [        R
                  " U R                  R                  5        VVs0 s H  u  pU[        UR                  5      _M     snn5      U l        [        R                  S[        U R                  5      5        g s  snnf )NzPackages loaded: %s)ra   r   r  r"  r   dumpsrb   r   	manifestsr/   r0   rd   )rz   r   packages      r'   r%  Packages.load  s|    T[[6689W[WdWdWjWjWl$mWlmdT40@0@+A%AWl$mn*D,?@ %ns   "B/
c                 (   [        U R                  5       H  nU R                  U   n/ n[        R                  " UR                  R                  S0 5      R                  5       UR                  R                  S0 5      R                  5       5       H:  n[        R                  " [        5         UR                  US   5        S S S 5        M<     [        US SSR                  U5      S SUR                   35        M     g ! , (       d  f       M  = f)Nmenutoolsr   20r   z, 40)r  r"  	itertoolschainr   getvaluesr   r   r   r7   printrO   rT   )rz   r   r*  	menuitemsr<   s        r'   showPackages.show  s    4==)DmmD)GI"$$((4;;=$$(("5<<>@  ((2$$U7^4 32@
 T"IQtyy3B7qGH * 32s   .D
Dc                 0   ^  U 4S jn[        U" 5       5      $ )Nc               3      >#    [        TR                  R                  5       S S9 H!  n U R                  R                   S h  vN   M#     g  N	7f)Nc                     U R                   * $ r   r  )r*  s    r'   r(   DPackages.get_bridge_configs.<locals>.yield_configs.<locals>.<lambda>  s    wO_O_N_r*   )r,   )r  r"  r4  r   r   )r*  rz   s    r'   yield_configs2Packages.get_bridge_configs.<locals>.yield_configs  s>     !$--"6"6"8>_`"++3333 a3s   A AA
A)r:   )rz   r=  s   ` r'   get_bridge_configsPackages.get_bridge_configs  s    	4 ]_%%r*   sz{})rf   c                 t    U R                  5         U R                  b  U R                  R                  5         g g r   )r%  r!  r{   ry   s    r'   reloadPackages.reload  s*    		==$MM))+ %r*   c                 T    U R                   (       a  U R                  5         SU l         g )NT)r#  rC  ry   s    r'   reload_hintPackages.reload_hint  s    %%KKM%)"r*   r   i18nc                   [         R                  S5        / nU(       a  [        [        USS5      5      nU R                  R                  5        H  u  pVUS;   a  M  UR                  SU5      nUR                     UR                  S:X  a/  [        R                  " UR                  R                  5       5      nOUR                  R                  5       nS S S 5        UR                  W5        M     UR                  SU R                  R                  5       -   S-   5        [        [         R"                  " S	R%                  U5      5      S
5      $ ! , (       d  f       N= f)NzServing /manifests.jsr   r   )staticbase1r   gzipsh  
            (function (root, data) {
                if (typeof define === 'function' && define.amd) {
                    define(data);
                }

                if (typeof cockpit === 'object') {
                    cockpit.manifests = data;
                } else {
                    root.manifests = data;
                }
            }(this, s   ))   
r   )r/   r0   rD   r   r"  rb   r   rk   rm   rL  
decompressreadr7   r)  encoderi   r   r   rO   )	rz   r   rH  chunksr   r   r*  translationrk   s	            r'   load_manifests_jsPackages.load_manifests_js  s"   ,-  +GG=NPR,STG!%!4!4!6.. &667GQ %%"33v=#{/?/?/D/D/FG*//446	 & d# "7 	  ..//12 5>> 	? 

5::f#568IJJ+ &%s   :AE
E	c                     [         R                  S5        [        [        R                  " U R
                  R                  5       5      S5      $ )NzServing /manifests.jsonzapplication/json)r/   r0   ri   r   r   r)  rP  ry   s    r'   load_manifests_jsonPackages.load_manifests_json,  s3    ./

4>>#8#8#:;=OPPr*   z /(?:([^/]+)/)?((?:[^/]+/)*[^/]+)rT   c                 |   [         R                  SU5        U R                  R                  U5      nUc  [	        SU 35      eUR                  5       u  pEUb  U R                  U   R                  XR5      $ US:X  a  U R                  USS9$ US:X  a  U R                  USS9$ US:X  a  U R                  5       $ [        e)	Nzpackages: serving %szInvalid HTTP path zmanifests.jsF)rH  zmanifests-i18n.jsTzmanifests.json)r/   r0   PATH_REr   r6   groupsr"  r   rS  rV  r   )rz   rT   r   r   packagenamer   s         r'   r   Packages.load_path6  s    +T2&&t,=1$899 %"==-77JJ'))')>>,,))')==))++--Nr*   )r!  r   r)  r"  r#  )NNr}   )"ro   rp   rq   rr   r   rs   r   rv   r   r]   r   r  r   r%  r7  r   r   r?  r   	InterfacePropertyr)  MethodrC  rF  r   ri   rS  rV  r   r   rY  r   rt   r%   r*   r'   r  r    s   '((3<  +*:!; +HUcLd +A
	I&H\$: & &&s$&7I]], ,
 	]]* *
#K #Kd #Kx #KJQX Q jj	Gc J 8 r*   r  zcockpit.Packages)	interface)Ar  r   	functoolsrL  r   r1  r   loggingr   rS   r   r^   pathlibr   typingr   r   r   r   r   r	   r
   r   r   r   r   r   cockpit._vendor.systemd_ctypesr   r   r   _versionr   jsonutilr   r   r   r   r   r   r   r   r   r   r   	getLoggerro   r/   	lru_cacher]   rD   rP   rX   rY   rc   ri   rv   ra   r   r   r   r   r   Objectr  r%   r*   r'   <module>rk     so  $     	     	 	      /  !    
		8	$
 -3 -8C= - -`BS BS B & & &" CY'!  $2z 2: :
04 0&W W^tZ ^.x4 x4vp pfxszz%7 xr*   