a ‚oe,ã@s0dZddlZddlZddlmZddlmZddlmZddlmZddlmZddlm Z dd lm Z dd lm Z dd lm Z dd lm Z dd lmZddlmZddlmZddlmZddlmZddlmZejdkrìddlmZnddlZe e¡Zejej ej!gZ"Gdd„dƒZ#Gdd„de ƒ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@sVeZdZdZdZejddœdd„Zee e dœdd„Z e eje dœd d „ƒZ ee d œd d „ƒZee d œdd„ƒZee d œdd„ƒZee d œdd„ƒZeee dœdd„Zee d œdd„ƒZd*eejejdœdd„Zee d œdd„ƒZee efd œdd„Zee 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_pointÚreturncCs2| |¡|_| ¡|_||_d|_d|_d|_dS©N)Úentry_point_to_plugin_nameÚnameÚloadÚ plugin_clsrZwarning_messageÚ _initializedÚ _prepared)Úselfr©rú@C:\Program Files\Certbot\pkgs\certbot\_internal\plugins\disco.pyÚ__init__(s   zPluginEntryPoint.__init__©rrcCs||jkrdSdS)z(Check if the name refers to this plugin.TF©r©rrrrr Ú check_name0s zPluginEntryPoint.check_namecCs|jS)z)Unique plugin name for an ``entry_point``r#)Úclsrrrr r6sz+PluginEntryPoint.entry_point_to_plugin_name©rcCs|jjS)zDescription of the plugin.)rÚ description©rrrr r(;szPluginEntryPoint.descriptioncCsd |j|j¡S)z$Description with name. Handy for UI.z {0} ({1}))Úformatr(rr)rrr Údescription_with_name@sz&PluginEntryPoint.description_with_namecCst|jd|jƒS)zLong description of the plugin.Úlong_description)Úgetattrrr(r)rrr r,Esz!PluginEntryPoint.long_descriptioncCst|jddƒS)z%Should this plugin be hidden from UI?ÚhiddenF)r-rr)rrr r.JszPluginEntryPoint.hidden©Ú ifaces_groupsrcs| pt‡fdd„|DƒƒS)z1Does plugin implement specified interface groups?c3s$|]}t‡fdd„|DƒƒVqdS)c3s|]}tˆj|ƒVqdSr)Ú issubclassr©Ú.0Zifacer)rr Ú Rsÿz4PluginEntryPoint.ifaces...N)Úall)r3Úifacesr)rr r4Qsþ ÿz*PluginEntryPoint.ifaces..)Úany©rr0rr)r r6OsýzPluginEntryPoint.ifacescCs |jduS)z(Has the plugin been initialized already?N)rr)rrr Ú initializedVszPluginEntryPoint.initialized©ÚconfigrcCs|js| ||j¡|_|jS)zMemoized plugin initialization.)rrr©rr;rrr Úinit[szPluginEntryPoint.initcCs|jst d|¡|jduS)z%Has the plugin been prepared already?z$.prepared called on uninitialized %rN)r9ÚloggerÚdebugrr)rrr Úpreparedcs zPluginEntryPoint.preparedc Csü|jdurtdƒ‚|jdurèz|j ¡Wn¶tjyh}z$tjd||dd�||_WYd}~nˆd}~0tjy¤}z$tjd||dd�||_WYd}~nLd}~0tj yà}z$tjd||dd�||_WYd}~nd}~00d|_t t t t f|jƒS)zMemoized plugin preparation.NzPlugin is not initialized.zMisconfigured %r: %sT)Úexc_infozNo installation (%r): %szOther error:(%r): %s)rÚ ValueErrorrÚpreparer ÚMisconfigurationErrorr>r?ZNoInstallationErrorÚ PluginErrorrr Úboolr)rÚerrorrrr rCjs$  ÿzPluginEntryPoint.preparecCst|jtjƒS)zIs plugin misconfigured?)Ú isinstancerr rDr)rrr Ú misconfigured€szPluginEntryPoint.misconfiguredcCst|jtƒr|jSdS)zGReturn the Exception raised during plugin setup, or None if all is wellN)rHrÚ Exceptionr)rrr Úproblem…s zPluginEntryPoint.problemcCs|jdup|jS)z4Is plugin available, i.e. prepared or misconfigured?T)rrIr)rrr Ú availableŒszPluginEntryPoint.availablecCs d |j¡S)NzPluginEntryPoint#{0})r*rr)rrr Ú__repr__‘szPluginEntryPoint.__repr__c s~d ˆj¡d ˆjj¡d d ‡fdd„tDƒ¡¡d ˆj¡g}ˆjrt| d ˆ  ¡¡¡ˆj rt| d  ˆ  ¡¡¡d  |¡S) Nz* {0}zDescription: {0}zInterfaces: {0}z, c3s |]}tˆj|ƒr|jVqdSr)r1rÚ__name__r2r)rr r4˜s ÿz+PluginEntryPoint.__str__..zEntry point: {0}zInitialized: {0}z Prep: {0}Ú ) r*rrr(ÚjoinÚPLUGIN_INTERFACESrr9Úappendr=r@rC)rÚlinesrr)r Ú__str__”s  ÿ ù zPluginEntryPoint.__str__)N)&rNÚ __module__Ú __qualname__Ú__doc__Ú__hash__Úimportlib_metadataÚ EntryPointr!r ÚstrrFr%Ú classmethodrÚpropertyr(r+r,r.rr r6r9r ÚNamespaceConfigrÚPluginr=r@r rrCrIrJrKrLrMrTrrrr r"s:rc@s8eZdZdZeeefddœdd„Zeddœdd„ƒZ ee j e eefdd œd d „ƒZ eed œd d„Zeedœdd„Zedœdd„Zejeejdœdd„Zeegefddœdd„Zddœdd„Zeeddœdd„Zee ee!fdœdd„Z"ddœd d!„Z#eje$ed"œd#d$„Z%edœd%d&„Z&edœd'd(„Z'dS))ÚPluginsRegistryzPlugins registry.N)ÚpluginsrcCstt| ¡ƒƒ|_dSr)ÚdictÚsortedÚitemsÚ_plugins)rrarrr r!ªszPluginsRegistry.__init__r'c Cs¸i}t d¡}|r| d¡ng}tj |¡ttjt j d�ƒ}ttjt j d�ƒ}||D]V}z|  ||¡WqXt y¬}z(t d|j›d|›d�¡|‚WYd}~qXd}~00qX||ƒS)z+Find plugins using setuptools 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)rÚgetenvÚsplitÚsysÚpathÚextendÚlistrYÚ entry_pointsrZSETUPTOOLS_PLUGINS_ENTRY_POINTZ"OLD_SETUPTOOLS_PLUGINS_ENTRY_POINTÚ_load_entry_pointrJr rEÚmodule)r&raZplugin_paths_stringZ plugin_pathsrnZold_entry_pointsrÚerrr Úfind_all±s(  ÿÿ ÿüzPluginsRegistry.find_all)rrarc CsŽt|ƒ}|j|vrd||j}|jj}|jj}|r:|j ¡nd}|rL|j ¡nd}td |j||¡ƒ‚t|jt j ƒr~|||j<n t   d|¡dS)NÚunknownz+Duplicate plugin name {0} from {1} and {2}.z)%r does not inherit from Plugin, skipping) rrrZdistÚlowerrJr*r1rrr_r>Zwarning) r&rraÚ plugin_epZother_epZ plugin1_distZ plugin2_distZplugin1Zplugin2rrr roÈs  ÿ ÿz!PluginsRegistry._load_entry_pointr"cCs |j|Sr)rer$rrr Ú __getitem__ÛszPluginsRegistry.__getitem__cCs t|jƒSr)Úiterrer)rrr Ú__iter__ÞszPluginsRegistry.__iter__cCs t|jƒSr)Úlenrer)rrr Ú__len__ászPluginsRegistry.__len__r:cs‡fdd„|j ¡DƒS)z'Initialize all plugins in the registry.csg|]}| ˆ¡‘qSr)r=©r3ru©r;rr Ú æóz(PluginsRegistry.init..©reÚvaluesr<rr|r r=äs ÿzPluginsRegistry.init)Úpredrcs t|ƒ‡fdd„|j ¡DƒƒS)z"Filter plugins based on predicate.csi|]\}}ˆ|ƒr||“qSrr)r3rru©r�rr Ú ës ÿz*PluginsRegistry.filter..)Útypererd)rr�rr‚r ÚfilterésÿzPluginsRegistry.filtercCs| dd„¡S)z#Filter plugins based on visibility.cSs|j Sr)r.)rurrr Úðr~z)PluginsRegistry.visible..©r…r)rrr ÚvisibleîszPluginsRegistry.visibler/cs| ‡fdd„¡S)z#Filter plugins based on interfaces.cs |jˆŽSr)r6©Úp_ep©r0rr r†ôr~z(PluginsRegistry.ifaces..r‡r8rr‹r r6òszPluginsRegistry.ifacescCsdd„|j ¡DƒS)z$Prepare all plugins in the registry.cSsg|] }| ¡‘qSr)rCr{rrr r}ør~z+PluginsRegistry.prepare..rr)rrr rCöszPluginsRegistry.preparecCs| dd„¡S)z%Filter plugins based on availability.cSs|jSr)rLr‰rrr r†ür~z+PluginsRegistry.available..r‡r)rrr rLúszPluginsRegistry.available)Úpluginrcs8‡fdd„|j ¡Dƒ}t|ƒdks(J‚|r4|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{©rŒrr r} sÿz-PluginsRegistry.find_init..érN)rer€ry)rrŒZ candidatesrr�r Ú find_initÿs zPluginsRegistry.find_initcCs&d |jjd dd„|j ¡Dƒ¡¡S)Nz{0}({1})ú,css|]}t|ƒVqdSr)Úrepr©r3rŠrrr r4sz+PluginsRegistry.__repr__..)r*Ú __class__rNrPrer€r)rrr rMs ÿÿzPluginsRegistry.__repr__cCs$|js dSd dd„|j ¡Dƒ¡S)Nz No pluginsz css|]}t|ƒVqdSr)r[r’rrr r4r~z*PluginsRegistry.__str__..)rerPr€r)rrr rTszPluginsRegistry.__str__)(rNrUrVrWrr[rr!r\rrrYrZrrorvrrxÚintrzr r^rrr_r=rrFr…rˆrr r6r rrCrLr r�rMrTrrrr r`§s( ÿr`)%rWZloggingrjÚtypingrrrrrrrr r r Zcertbotr r rZcertbot._internalrZcertbot.compatrZcertbot.errorsrÚ version_infoÚimportlib.metadataÚmetadatarYZ getLoggerrNr>Z AuthenticatorZ Installerr_rQrr`rrrr Ús4