grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026a q©j‹\ã@s"ddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl m Z ddlmZmZmZmZmZmZmZmZmZmZmZmZmZddlmZddlmZddl m!Z!ddl"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.e /e0¡Z1e 2¡e3ee3d œd d „ƒZ4e3e3d œd d„Z5e 2¡e3dœdd„ƒZ6ede$e%ƒZ7e7e7dœdd„Z8Gdd„deƒZ9Gdd„dƒZ:Gdd„de;e$ƒZGd d!„d!e=ƒZ?Gd"d#„d#e=ƒZ@Gd$d%„d%e;e$ƒZAGd&d'„d'ƒZBGd(d)„d)ƒZCGd*d+„d+ejDd,d-�ZEdS).éN)ÚPath) ÚBinaryIOÚCallableÚClassVarÚDictÚ GeneratorÚIterableÚListÚ NamedTupleÚOptionalÚPatternÚSequenceÚTupleÚTypeVar)Úbusé)Úconfig)Ú __version__) Ú JsonErrorÚ JsonObjectÚ JsonValueÚget_boolÚget_dictÚget_enumÚget_intÚget_objvÚget_strÚget_strvÚjson_merge_patchÚ typechecked)Úaccept_languageÚreturnc Cst d|¡g}| d¡D]†}| ¡ ¡}t d|¡| d¡\}}}zt|pPdƒ}WntylYqYn0|rt d||¡| ||f¡|  d¡\}}}qnq|j dd „d d �t d |¡g}|D]&\}} |d krÜqð||vrÈ| |¡qÈt d|¡t |ƒS)aLParse 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 zparse_accept_language(%r)ú,z entry %rz;q=gð?z adding %r q=%rú-cSs|dS)Nr©)Zpairr$r$ú4/usr/lib/python3.9/site-packages/cockpit/packages.pyÚYóz'parse_accept_language..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 Zlocales_with_qÚentryÚlocaleÚ_ZqstrÚqZ_regionÚresultsZ_qr$r$r%Úparse_accept_language;s0         r=)Úversionr!cCsd dd„| d¡Dƒ¡S)z7Convert a version string to a form that can be comparedÚ.css|]}| d¡VqdS)éN)Úzfill)Ú.0Úpartr$r$r%Ú or'z"sortify_version..)Újoinr.)r>r$r$r%Úsortify_versionlsrF©r!cCs6dD]"}tj tj |d¡¡r|Sqt d¡dS)zkDetect 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-askpasszCould not detect libexecdirz/nonexistent/libexecN)ÚosÚpathÚexistsrEr,Úwarning)Ú candidater$r$r%Úget_libexecdirrs   rNÚJ)Úobjr!cCszt|tƒr>d|vr0t d¡}|dur0| d|¡S| dtƒ¡St|tƒrZdd„| ¡DƒSt|tƒrrdd„|DƒS|SdS)Nz${libexecdir}/cockpit-askpassrHz ${libexecdir}cSsi|]\}}|t|ƒ“qSr$©Úpatch_libexecdir)rBr)Úvaluer$r$r%Ú �r'z$patch_libexecdir..cSsg|] }t|ƒ‘qSr$rQ)rBÚitemr$r$r%Ú ’r'z$patch_libexecdir..) Ú isinstanceÚstrÚshutilÚwhichÚreplacerNÚdictÚitemsÚlist)rPZ abs_askpassr$r$r%rR‡s     rRc@s>eZdZUeed<eed<dZeeed<dZeeed<dS)ÚDocumentÚdataÚ content_typeNÚcontent_encodingÚcontent_security_policy) Ú__name__Ú __module__Ú __qualname__rÚ__annotations__rXrbr rcr$r$r$r%r_™s r_c@seZdZddœdd„ZdS)ÚPackagesListenerNrGcCsdS)z+Called when the packages have been reloadedNr$©Úselfr$r$r%Úpackages_loaded¡sz PackagesListener.packages_loaded)rdrerfrkr$r$r$r%rh srhcs"eZdZedœ‡fdd„ Z‡ZS)Ú BridgeConfig©rScs¶tƒ |¡t|ddƒ|_t|dddgdƒ|_t|ddd�|_t|diƒ|_ |jsb|j sbt |d ƒ‚t |d d ƒ|_ t |dƒ|_ |j sŒt |d ƒ‚t|d d|j vƒ|_|jp®|j d|_dS)NÚlabelÚmethodÚspawnZStartTransientUnitÚ privilegedF)ÚdefaultÚmatchz&must have match rules or be privilegedÚenvironr$zspawn vector must be non-emptyÚpolkitZpkexecr)ÚsuperÚ__init__rrnrrorrqrrsrrrtrpruÚname©rjrS©Ú __class__r$r%rw§s     zBridgeConfig.__init__)rdrerfrrwÚ __classcell__r$r$rzr%rl¦srlc@s8eZdZeedœdd„Zeegefedœdd„ZdS)Ú ConditionrGcCst‚dS©N©ÚNotImplementedErrorrir$r$r%Úget_condition_filesÀszCondition.get_condition_files©Ú path_existsr!cCst‚dSr~r©rjrƒr$r$r%ÚcheckÃszCondition.checkN) rdrerfrrXr�rÚboolr…r$r$r$r%r}¿sr}c@sVeZdZeddœdd„Zedœdd„Zeedœdd „Ze egefed œd d „Z dS) ÚConstantConditionN©rSr!cCs ||_dSr~rmryr$r$r%rwÈszConstantCondition.__init__rGcCsd|j›d�S)NzConstantCondition(ú)rmrir$r$r%Ú__str__ËszConstantCondition.__str__cCsgSr~r$rir$r$r%r�Îsz%ConstantCondition.get_condition_filesr‚cCs|jSr~rmr„r$r$r%r…ÑszConstantCondition.check) rdrerfr†rwrXrŠrr�rr…r$r$r$r%r‡Çsr‡c@sXeZdZeeddœdd„Zedœdd„Zeedœdd „Ze egefed œd d „Z dS) ÚPathExistsConditionN)rJrKr!cCs||_||_dSr~©rJrK)rjrJrKr$r$r%rwÖszPathExistsCondition.__init__rGcCsd|j›d|j›d�S)NzPathExistsCondition(z , exists=r‰rŒrir$r$r%rŠÚszPathExistsCondition.__str__ccs |jVdSr~)rJrir$r$r%r�Ýsz'PathExistsCondition.get_condition_filesr‚cCs|j||jƒkSr~)rKrJr„r$r$r%r…àszPathExistsCondition.check) rdrerfrXr†rwrŠrr�rr…r$r$r$r%r‹Õsr‹c@sZeZdZeeddœdd„Zedœdd„Zeedœdd „Ze ege fe d œd d „Z dS) ÚDisjunctiveConditionN)Ú conditionsr!cCs ||_dSr~)rŽ)rjrŽr$r$r%rwåszDisjunctiveCondition.__init__rGcCsdd dd„|jDƒ¡›d�S)NzDisjunctiveCondition(ú, css|]}t|ƒVqdSr~)rX©rBÚcr$r$r%rDér'z/DisjunctiveCondition.__str__..r‰)rErŽrir$r$r%rŠèszDisjunctiveCondition.__str__ccs|jD]}| ¡EdHqdSr~©rŽr�©rjÚ conditionr$r$r%r�ës z(DisjunctiveCondition.get_condition_filesr‚cst‡fdd„|jDƒƒS)Nc3s|]}| ˆ¡VqdSr~)r…r�©rƒr$r%rDðr'z-DisjunctiveCondition.check..)ÚanyrŽr„r$r•r%r…ïszDisjunctiveCondition.check) rdrerfrr}rwrXrŠr�rr†r…r$r$r$r%r�äsr�csReZdZeoeeƒZeedœ‡fdd„ Zee dœdd„Z e e dœdd „Z ‡ZS) ÚManifest)rJrScsÂtƒ |¡||_t|d|jjƒ|_t|dtƒ|_t|ddƒ|_ t|ddƒ|_ t|d|j ƒ|_ |j dur¾t|diƒ}| ¡D]@\}}|d kr–t|d ƒ‚tt|tƒƒ|j kr|t|d |›d �ƒ‚q|dS) NrxÚbridgesÚpriorityrzcontent-security-policyÚrŽÚrequiresZcockpitznon-cockpit requirement listedzrequired cockpit version (z ) not met)rvrwrJrrxrrlr˜rr™ÚcspÚparse_conditionrŽÚCOCKPIT_VERSIONrr]rrFrrX)rjrJrSr›rxr>rzr$r%rwøs    zManifest.__init__rˆcCs‚t|ƒdkrt|dƒ‚d|vr0tt|dƒdd�Sd|vrJtt|dƒdd�Sd|vrdtt|d|jƒƒSt d |j |¡t dd �SdS) Nrz'must contain exactly one key/value pairz path-existsT)rKzpath-not-existsFr–z0 %s: ignoring unknown predicate in manifest: %srm) Úlenrr‹rr�rr�r,rLrJr‡ryr$r$r%r� s  zManifest.parse_conditionrGccs|jD]}| ¡EdHqdSr~r’r“r$r$r%r�s zManifest.get_condition_files)rdrerfrrFržrrrwr}r�rrXr�r|r$r$rzr%r—ôs r—c@sâeZdZUe d¡Zeeee d<e e d<ee d<e e d<e e d<dZ eeeeeeffe d<dZeeeefe d <e d œd d „Zdd œdd„Zed œdd„Zeedœdd„Zeeeedœdd„Zeeedœdd„ZdS)ÚPackagez%(po|po\.manifest)\.([^.]+)\.js(\.gz)?ÚPO_JS_REÚmanifestrxrJr™NÚ translationsÚfiles©r¢cCs"||_|j|_|j|_|j|_dSr~)r¢rxrJr™)rjr¢r$r$r%rw/szPackage.__init__rGcCs|jdurdSi|_iidœ|_|j d¡D]´}t| |j¡ƒ}|dvrJq,tj |¡}|r¤|  d¡}|  d¡}|  ¡  dd¡}t   d |||¡||j|›d �|<q,t d d |¡}t   d ||¡||j|<|j |  dd¡|¡q,|jdsü|jd|jd<dS)z§Ensure 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Ú*)r?z..z manifest.jsonrér:r#zAdding translation %r %r -> %rz.jsz.gz$ršzAdding content %r -> %rz.min.r?r§r¦)r¤r£rJÚrglobrXÚ relative_tor r¡Ú fullmatchÚgroupr0r[r,r-ÚreÚsubÚ setdefault)rjÚfilerxZpo_matchÚbasenamer9Z lower_localer$r$r%Úensure_scanned5s*       zPackage.ensure_scannedcCslddddddddœ}|jj d¡D],}| ¡}|r"| ¡ d¡\}}}|||<q"d dd„| ¡Dƒ¡d S) Nz'self'z'none'z 'self' data:)z default-srcz connect-srcz form-actionzbase-uriz object-srczfont-srczimg-srcú;ú css"|]\}}|›d|›d�VqdS)rµr´Nr$)rBÚkÚvr$r$r%rDsr'z6Package.get_content_security_policy..z block-all-mixed-content)r¢rœr.r/r1rEr])rjZpolicyrUr)r:rSr$r$r%Úget_content_security_policybsù  z#Package.get_content_security_policy)Úfilenamer!cCs\t |¡\}}d}|dur d}n| d¡r2| ¡}|j|}t d|¡t| d¡|||ƒS)Nz text/plainz text/htmlz loading data from %sÚrb) Ú mimetypesZ guess_typeÚ startswithr¸rJr,r-r_Úopen)rjr¹rarbrcrJr$r$r%Ú load_fileus   zPackage.load_file)rJÚlocalesr!c Csb| ¡|D]F}t t¡�(| |j||¡WdƒS1sH0Yq tt ¡dƒS)Nútext/javascript) r³Ú contextlibÚsuppressÚKeyErrorr¾r£r_ÚioÚBytesIO)rjrJr¿r9r$r$r%Úload_translationƒs  8zPackage.load_translation©rJÚheadersr!cCsB| ¡||jvr.tt|ddƒƒ}| ||¡S| |j|¡SdS)NúAccept-Languagerš)r³r£r=rrÆr¾r¤)rjrJrÈr¿r$r$r%Ú load_path�s   zPackage.load_path)rdrerfr®Úcompiler¡rr rXrgr—rÚintr£r rr¤rwr³r¸r_r¾r rÆrrÊr$r$r$r%r !s  - r c@sžeZdZeedœdd„Zeeedœdd„ƒZee e e dœdd „ƒZ eee dœd d „ƒZ eeedœd d „ƒZe edœdd„Zeeeefdœdd„ZdS)ÚPackagesLoader)rJr!cCs tj |¡Sr~)rIrJrK)rjrJr$r$r%rƒ�szPackagesLoader.path_existsrGccsnztjdVWn ty0tj d¡VYn0ztjd d¡EdHWntyhdEdHYn0dS)NZ XDG_DATA_HOMEz~/.local/shareZ XDG_DATA_DIRSú:)z/usr/local/sharez /usr/share)rIrtrÃrJÚ expanduserr.)Úclsr$r$r%Úget_xdg_data_dirs s  z PackagesLoader.get_xdg_data_dirs)r¢Úparentr!c Csº|dt |j›d�¡tj|j›d�g}|D]‚}zt | ¡¡}WnHtyZYq.Yn4tjyŒ}zt   d||¡WYd}~n d}~00t |t ƒs¦t   d|¡q.t ||ƒ}q.t|ƒS)Nz override.jsonz.override.jsonú%s: %sz%%s: override file is not a dictionary)rZ lookup_configrxZDOT_CONFIG_COCKPITÚjsonÚloadsÚ read_bytesÚFileNotFoundErrorÚJSONDecodeErrorr,rLrWr\rrR)rÐr¢rÒZoverride_filesZ override_fileÚoverrideÚexcr$r$r%Úpatch_manifest¬s ý $   zPackagesLoader.patch_manifestc cs| ¡D]ò}t d|¡t|ƒ d¡D]Ò}t d|¡zt | ¡¡}Wn@tjyˆ}z&t  d||¡WYd}~q&WYd}~n d}~00t |t ƒs¢t  d|¡q&|j }|  ||¡}zt||ƒVWq&työ}zt d||¡WYd}~q&d}~00q&qdS)Nz$Scanning for manifest files under %szcockpit/*/manifest.jsonzConsidering file %srÓz!%s: json document isn't an objectz%s %s)rÑr,r-rÚglobrÔrÕÚ read_textrØÚerrorrWr\rÒrÛr—rrL)rÐZdatadirr±r¢rÚrÒr$r$r%Úload_manifestsÅs$   "   zPackagesLoader.load_manifestsccs | ¡D]}| ¡EdHqdSr~)rßr�)rÐr¢r$r$r%r�Ûs z"PackagesLoader.get_condition_files)r¢r!cCs2|jD]&}| |j¡st d|j|¡dSqdS)Nz2 hiding package %s as its %s condition is not metFT)rŽr…rƒr,r-rJ)rjr¢r”r$r$r%Úcheck_conditionsàs   zPackagesLoader.check_conditionsc csît d¡t t¡}| ¡D]"}t d|j¡||j |¡qt d¡t d¡|  ¡D]‚\}}t |dd„dd�D]f}z2|  |¡rªt d ||j¡|t |ƒfVWq\Wn t yÌt d |j¡Yn0t d |j¡qvq\t d¡dS) Nz)Scanning for available package manifests:z %s/manifest.jsonzdone.zSelecting packages to serve:cSs|jSr~©r™r¥r$r$r%r&õr'z.PackagesLoader.load_packages..Tr(z creating package %s -> %sz1 %s: ignoring package with invalid manifest filez ignoring %s: unmet conditions)r,r-Ú collectionsÚ defaultdictr^rßrJrxr4r]Úsortedràr rrL)rjÚnamesr¢rxZ candidatesrMr$r$r%Ú load_packagesès$        zPackagesLoader.load_packagesN)rdrerfrXr†rƒÚ classmethodrrÑrrrÛr—rßr�ràrr rær$r$r$r%rÍœs rÍc@sþeZdZUeed<eeed<eee fed<e ed<d eeeedœdd„Z dd œd d „Z dd œd d „Z eed œdd„Zejjddd�Zej ¡dd œdd„ƒZej ¡dd œdd„ƒZee edœdd„Zed œdd„Ze d¡Zeeedœdd„ZdS)!ÚPackagesÚloaderÚlistenerÚpackagesÚsaw_first_reload_hintN)rêrécCs$||_|ptƒ|_| ¡d|_dS)NF)rêrÍréÚloadrì)rjrêrér$r$r%rws zPackages.__init__rGcCsBt|j ¡ƒ|_t dd„|j ¡Dƒ¡|_t  dt |jƒ¡dS)NcSsi|]\}}|t|jƒ“qSr$)r\r¢)rBrxÚpackager$r$r%rTr'z!Packages.load..zPackages loaded: %s) r\rérærërÔÚdumpsr]Ú manifestsr,r-r^rir$r$r%rísz Packages.loadcCsœt|jƒD]Œ}|j|}g}t t|jdiƒ ¡t|jdiƒ ¡¡D],}t|tƒrDt |ddƒ}|durD|  |¡qDt |d›dd  |¡d›d|j ›�ƒq dS)NZmenuZtoolsrnZ20rµr�Z40)rärëÚ itertoolsÚchainrr¢ÚvaluesrWr\rr4ÚprintrErJ)rjrxrîZ menuitemsr8rnr$r$r%Úshows þ   z Packages.showcs&ttddfdœ‡fdd„ }t|ƒƒS)NrGc3s.tˆj ¡dd„d�D]}|jjEdHqdS)NcSs|j Sr~rá©rîr$r$r%r&)r'zDPackages.get_bridge_configs..yield_configs..)r))rärërór¢r˜rörir$r%Ú yield_configs(sz2Packages.get_bridge_configs..yield_configs)rrlr7)rjr÷r$rir%Úget_bridge_configs'szPackages.get_bridge_configsÚsz{}rmcCs | ¡|jdur|j ¡dSr~)rírêrkrir$r$r%Úreload0s zPackages.reloadcCs|jr| ¡d|_dS)NT)rìrúrir$r$r%Ú reload_hint6szPackages.reload_hint)rÈÚi18nr!c CsÐt d¡g}|r¢tt|ddƒƒ}|j ¡D]t\}}|dvr>q,| d|¡}|j�6|jdkrnt   |j  ¡¡}n |j  ¡}Wdƒn1sŒ0Y|  |¡q,|  d|j  ¡d¡tt d  |¡¡d ƒS) NzServing /manifests.jsrÉrš)ZstaticZbase1r§Ú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,r-r=rrër]rÆr`rbrýÚ decompressÚreadr4rðÚencoder_rÄrÅrE) rjrÈrüÚchunksr¿rxrîÚ translationr`r$r$r%Úload_manifests_js<s&   (  õ õ zPackages.load_manifests_jscCs t d¡tt |j ¡¡dƒS)NzServing /manifests.jsonzapplication/json)r,r-r_rÄrÅrðrrir$r$r%Úload_manifests_jsonas zPackages.load_manifests_jsonz /(?:([^/]+)/)?((?:[^/]+/)*[^/]+)rÇcCs˜t d|¡|j |¡}|dur.td|›�ƒ‚| ¡\}}|durT|j| ||¡S|dkrj|j|dd�S|dkr€|j|dd�S|dkr�|  ¡St ‚dS) Nzpackages: serving %szInvalid HTTP path z manifests.jsF)rüzmanifests-i18n.jsTzmanifests.json) r,r-ÚPATH_REr¬r3ÚgroupsrërÊrrrÃ)rjrJrÈrsZ packagenamer¹r$r$r%rÊks   zPackages.load_path)NN) rdrerfrÍrgr rhrrXr r†rwrírõr rlrørZ InterfaceZPropertyrðZMethodrúrûrr_rrr®rËrrÊr$r$r$r%rès&    %ÿrèzcockpit.Packages)Z interface)FrârÁÚ functoolsrýrÄrñrÔZloggingr»rIr®rYÚpathlibrÚtypingrrrrrrr r r r r rrZcockpit._vendor.systemd_ctypesrršrÚ_versionrZjsonutilrrrrrrrrrrrrZ getLoggerrdr,Ú lru_cacherXr=rFrNrOrRr_rhr\rlr}r‡r‹r�r—r rÍZObjectrèr$r$r$r%ÚsH <   8 0 -{f