a }|g,@s0dZddlZddlZddlmZddlmZddlmZddlmZddlmZddlm Z dd lm Z dd lm Z dd lm Z dd lm Z dd lmZddlmZddlmZddlmZddlmZddlmZejdkrddlmZnddlZeeZejej ej!gZ"GdddZ#Gddde Z$dS)z.Utilities for plugins discovery and selection.N)Callable)cast)Dict)Iterable)Iterator)List)Mapping)Optional)Type)Union) configuration)errors) interfaces) constants)os)Error) c@sVeZdZdZdZejddddZee e dddZ e eje dd d Z ee d d d Zee d ddZee d ddZee d ddZeee dddZee d ddZd*eejejdddZee d ddZee efd ddZee d d d!Z eee!d d"d#Z"ee d d$d%Z#e d d&d'Z$e d d(d)Z%dS)+PluginEntryPointzPlugin entry point.N) entry_pointreturncCs2|||_||_||_d|_d|_d|_dSN)entry_point_to_plugin_namenameload plugin_clsrZwarning_message _initialized _prepared)selfrrC/usr/lib/python3.9/site-packages/certbot/_internal/plugins/disco.py__init__(s   zPluginEntryPoint.__init__rrcCs||jkrdSdS)z(Check if the name refers to this plugin.TFrrrrrr check_name0s zPluginEntryPoint.check_namecCs|jS)z)Unique plugin name for an ``entry_point``r#)clsrrrr r6sz+PluginEntryPoint.entry_point_to_plugin_namercCs|jjS)zDescription of the plugin.)r descriptionrrrr r(;szPluginEntryPoint.descriptioncCsd|j|jS)z$Description with name. Handy for UI.z {0} ({1}))formatr(rr)rrr description_with_name@sz&PluginEntryPoint.description_with_namecCst|jd|jS)zLong description of the plugin.long_description)getattrrr(r)rrr r,Esz!PluginEntryPoint.long_descriptioncCst|jddS)z%Should this plugin be hidden from UI?hiddenF)r-rr)rrr r.JszPluginEntryPoint.hidden ifaces_groupsrcs| ptfdd|DS)z1Does plugin implement specified interface groups?c3s$|]}tfdd|DVqdS)c3s|]}tj|VqdSr) issubclassr.0Zifacer)rr Rsz4PluginEntryPoint.ifaces...N)all)r3ifacesr)rr r4Qs z*PluginEntryPoint.ifaces..)anyrr0rr)r r6OszPluginEntryPoint.ifacescCs |jduS)z(Has the plugin been initialized already?N)rr)rrr initializedVszPluginEntryPoint.initializedconfigrcCs|js|||j|_|jS)zMemoized plugin initialization.)rrrrr;rrr init[szPluginEntryPoint.initcCs|jstd||jduS)z%Has the plugin been prepared already?z$.prepared called on uninitialized %rN)r9loggerdebugrr)rrr preparedcs zPluginEntryPoint.preparedc Cs|jdurtd|jdurz|jWntjyh}z$tjd||dd||_WYd}~nd}~0tjy}z$tjd||dd||_WYd}~nLd}~0tj y}z$tjd||dd||_WYd}~nd}~00d|_t t t t f|jS)zMemoized plugin preparation.NzPlugin is not initialized.zMisconfigured %r: %sT)exc_infozNo installation (%r): %szOther error:(%r): %s)r ValueErrorrpreparer MisconfigurationErrorr>r?ZNoInstallationError PluginErrorrr boolr)rerrorrrr rCjs$  zPluginEntryPoint.preparecCst|jtjS)zIs plugin misconfigured?) isinstancerr rDr)rrr misconfiguredszPluginEntryPoint.misconfiguredcCst|jtr|jSdS)zGReturn the Exception raised during plugin setup, or None if all is wellN)rHr Exceptionr)rrr problems zPluginEntryPoint.problemcCs|jdup|jS)z4Is plugin available, i.e. prepared or misconfigured?T)rrIr)rrr availableszPluginEntryPoint.availablecCs d|jS)NzPluginEntryPoint#{0})r*rr)rrr __repr__szPluginEntryPoint.__repr__c s~djdjjddfddtDdjg}jrt|d j rt|d d |S) Nz* {0}zDescription: {0}zInterfaces: {0}z, c3s |]}tj|r|jVqdSr)r1r__name__r2r)rr r4s z+PluginEntryPoint.__str__..zEntry point: {0}zInitialized: {0}z Prep: {0} ) r*rrr(joinPLUGIN_INTERFACESrr9appendr=r@rC)rlinesrr)r __str__s    zPluginEntryPoint.__str__)N)&rN __module__ __qualname____doc____hash__importlib_metadata EntryPointr!r strrFr% classmethodrpropertyr(r+r,r.rr r6r9r NamespaceConfigrPluginr=r@r rrCrIrJrKrLrMrTrrrr r"s:rc@s8eZdZdZeeefddddZeddddZ ee j e eefdd d d Z eed d dZeedddZedddZejeejdddZeegefddddZddddZeeddddZee ee!fdddZ"ddd d!Z#eje$ed"d#d$Z%edd%d&Z&edd'd(Z'dS))PluginsRegistryzPlugins registry.N)pluginsrcCstt||_dSr)dictsorteditems_plugins)rrarrr r!szPluginsRegistry.__init__r'c Csi}td}|r|dng}tj|ttjt j d}ttjt j d}||D]V}z| ||WqXt y}z(td|jd|d|WYd}~qXd}~00qX||S)zFind plugins using Python package entry points. See https://packaging.python.org/en/latest/specifications/entry-points/ for more info on entry points. ZCERTBOT_PLUGIN_PATH:)groupzThe 'z ' plugin errored while loading: z. You may need to remove or update this plugin. The Certbot log will contain the full error details and this should be reported to the plugin developer.N)rgetenvsplitsyspathextendlistrY entry_pointsrZSETUPTOOLS_PLUGINS_ENTRY_POINTZ"OLD_SETUPTOOLS_PLUGINS_ENTRY_POINT_load_entry_pointrJr rEmodule)r&raZplugin_paths_stringZ plugin_pathsrnZold_entry_pointsrerrr find_alls(   zPluginsRegistry.find_all)rrarc Cst|}|j|vrd||j}|jj}|jj}|r:|jnd}|rL|jnd}td|j||t|jt j r~|||j<n t d|dS)Nunknownz+Duplicate plugin name {0} from {1} and {2}.z)%r does not inherit from Plugin, skipping) rrrZdistlowerrJr*r1rrr_r>Zwarning) r&rra plugin_epZother_epZ plugin1_distZ plugin2_distZplugin1Zplugin2rrr ros   z!PluginsRegistry._load_entry_pointr"cCs |j|Sr)rer$rrr __getitem__szPluginsRegistry.__getitem__cCs t|jSr)iterrer)rrr __iter__szPluginsRegistry.__iter__cCs t|jSr)lenrer)rrr __len__szPluginsRegistry.__len__r:csfdd|jDS)z'Initialize all plugins in the registry.csg|]}|qSr)r=r3rur;rr z(PluginsRegistry.init..revaluesr<rr|r r=s zPluginsRegistry.init)predrcs t|fdd|jDS)z"Filter plugins based on predicate.csi|]\}}|r||qSrr)r3rrurrr s z*PluginsRegistry.filter..)typererd)rrrrr filterszPluginsRegistry.filtercCs|ddS)z#Filter plugins based on visibility.cSs|j Sr)r.)rurrr r~z)PluginsRegistry.visible..rr)rrr visibleszPluginsRegistry.visibler/cs|fddS)z#Filter plugins based on interfaces.cs |jSr)r6p_epr0rr rr~z(PluginsRegistry.ifaces..rr8rrr r6szPluginsRegistry.ifacescCsdd|jDS)z$Prepare all plugins in the registry.cSsg|] }|qSr)rCr{rrr r}r~z+PluginsRegistry.prepare..rr)rrr rCszPluginsRegistry.preparecCs|ddS)z%Filter plugins based on availability.cSs|jSr)rLrrrr rr~z+PluginsRegistry.available..rr)rrr rLszPluginsRegistry.available)pluginrcs(fdd|jD}|r$|dSdS)aMFind an initialized plugin. This is particularly useful for finding a name for the plugin:: # plugin is an instance providing Plugin, initialized # somewhere else in the code plugin_registry.find_init(plugin).name Returns ``None`` if ``plugin`` is not found in the registry. cs"g|]}|jr|ur|qSr)r9r=r{rrr r}sz-PluginsRegistry.find_init..rNr)rrZ candidatesrrr find_inits zPluginsRegistry.find_initcCs&d|jjddd|jDS)Nz{0}({1}),css|]}t|VqdSr)reprr3rrrr r4sz+PluginsRegistry.__repr__..)r* __class__rNrPrerr)rrr rMs zPluginsRegistry.__repr__cCs$|js dSddd|jDS)Nz No pluginsz css|]}t|VqdSr)r[rrrr r4 r~z*PluginsRegistry.__str__..)rerPrr)rrr rTszPluginsRegistry.__str__)(rNrUrVrWrr[rr!r\rrrYrZrrorvrrxintrzr r^rrr_r=rrFrrrr r6r rrCrLr rrMrTrrrr r`s( r`)%rWZloggingrjtypingrrrrrrrr r r Zcertbotr r rZcertbot._internalrZcertbot.compatrZcertbot.errorsr version_infoimportlib.metadatametadatarYZ getLoggerrNr>Z AuthenticatorZ Installerr_rQrr`rrrr s4