a „oeœkã@s”dZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl m Z m Z ddl mZmZdZdZdZdZdZd Zd Zd Zd Zd ZdZeZdZdZdZdZdZ dZ!dZ"dd„e #¡DƒZ$de$vZ%ej& 'ej& (e)¡¡Z*Gdd„dƒZ+Gdd„dƒZ,Gdd„dƒZ-Gdd„dƒZ.da/dd„Z0dd„Z1Gd d!„d!e2ƒZ3Gd"d#„d#e3ƒZ4Gd$d%„d%e3ƒZ5d&d'„Z6d(d)„Z7dld*d+„Z8d,d-„Z9d.d/„Z:d0d1„Z;d2d3„Zd9d:„Z?d;d<„Z@d=d>„ZAd?d@„ZBdAdB„ZCdCdD„ZDdEdF„ZEdGdH„ZFdIdJ„ZGdKdL„ZHdMdN„ZIdOdP„ZJdQdR„ZKdSdT„ZLdUdV„ZMdWdX„ZNdndYdZ„ZOdod[d\„ZPd]d^„fd_d`„ZQdad^„fdbdc„ZReQeRddœZSdedf„ZTdgdh„ZUdddidifdjdk„ZVdS)pz?Installation utilities for Python ISAPI filters and extensions.éN)ÚDispatchÚ GetObject)ÚEnsureDispatchÚ EnsureModuleéézIIS://LocalHost/W3SVCZ IIsWebServerZIIsWebDirectoryZIIsWebVirtualDirZ IIsFiltersZ IIsFilterzDefault Web SitezX-Powered-By: PythonTFcCsg|]\}}}|‘qS©r)Ú.0ÚextÚ_rrú.C:\Program Files\Certbot\pkgs\isapi\install.pyÚ *ór z_d.pydc@s8eZdZdZdZdZdZdZdZdZ dZ dZ dd„Z dS)ÚFilterParametersNTcKs|j |¡dS©N©Ú__dict__Úupdate©ÚselfÚkwrrr Ú__init__<szFilterParameters.__init__) Ú__name__Ú __module__Ú __qualname__ÚNameÚ DescriptionÚPathÚServerÚAddExtensionFileÚAddExtensionFile_EnabledÚAddExtensionFile_GroupIDÚAddExtensionFile_CanDeleteÚAddExtensionFile_Descriptionrrrrr r0src@sheZdZdZdZeZeZdZ e Z e Z eZeZeZeZeZeZdZgZdZdZdd„Zdd„Zdd„Z dS) ÚVirtualDirParametersNÚendcKs|j |¡dSrrrrrr rSszVirtualDirParameters.__init__cCs| ¡\}}| o| S)zGThis virtual directory is a root directory if parent and name are blank)Ú split_path)rÚparentÚnamerrr Úis_rootVs zVirtualDirParameters.is_rootcCs t|jƒSr)r&r)rrrr r&[szVirtualDirParameters.split_path)!rrrrrÚ_DEFAULT_PROTECTIONÚ AppProtectionÚ_DEFAULT_HEADERSÚHeadersrÚ_IIS_WEBVIRTUALDIRÚTypeÚ_DEFAULT_ACCESS_EXECUTEÚ AccessExecuteÚ_DEFAULT_ACCESS_READÚ AccessReadÚ_DEFAULT_ACCESS_WRITEÚ AccessWriteÚ_DEFAULT_ACCESS_SCRIPTÚ AccessScriptÚ_DEFAULT_CONTENT_INDEXEDÚContentIndexedÚ_DEFAULT_ENABLE_DIR_BROWSINGÚEnableDirBrowsingÚ_DEFAULT_ENABLE_DEFAULT_DOCÚEnableDefaultDocÚ DefaultDocÚ ScriptMapsÚScriptMapUpdaterrr)r&rrrr r$@s(r$c@s@eZdZdZdZdZdZdZdZdZ dZ dZ dd„Z dd„Z dS) ÚScriptMapParamsNéÚTcKs|j |¡dSrrrrrr rkszScriptMapParams.__init__cCs:|j|j|jg}|jr"| |j¡dd„|Dƒ}d |¡S)z&Format this parameter suitable for IIScSsg|] }t|ƒ‘qSr©Ústr©r Úitemrrr r trz+ScriptMapParams.__str__..ú,)Ú ExtensionÚModuleÚFlagsÚVerbsÚappendÚjoin)rÚitemsrrr Ú__str__ns  zScriptMapParams.__str__)rrrrIrJrKrLrr r!r"r#rrPrrrr rA_srAc@s eZdZeZgZgZdd„ZdS)ÚISAPIParameterscKs|j |¡dSrrrrrr r~szISAPIParameters.__init__N)rrrÚ_DEFAULT_SERVER_NAMEZ ServerNameÚFiltersÚ VirtualDirsrrrrr rQxsrQcCst|krt|ƒdSr)ÚverboseÚprint)ÚlevelZwhatrrr Úlog…srXcCs2|j}|jr|jd}t |¡tjkr(‚t |¡S)Néÿÿÿÿ)ÚhresultÚ excepinfoÚwinerrorÚHRESULT_FACILITYÚFACILITY_WIN32Z SCODE_CODE)Zcom_excÚhrrrr Ú_GetWin32ErrorCode‹s  r`c@s eZdZdS)ÚInstallationErrorN©rrrrrrr ra•srac@s eZdZdS)Ú ItemNotFoundNrbrrrr rc™srcc@s eZdZdS)ÚConfigurationErrorNrbrrrr rd�srdcCs@| ¡ d¡r|S|r*|ddkr*d|}t||ƒd|SdS)Nziis://rú/z/ROOT)ÚlowerÚ startswithÚ FindWebServer)ÚoptionsÚserverr(rrr ÚFindPath¡s rkcsjt|ƒdksJdƒ‚ttƒ}| ¡ ¡}|D](‰‡fdd„dDƒ}||vr,ˆjSq,d|}t|ƒ‚dS)zë Find an IIS web server whose name or comment matches the provided description (case-insensitive). >>> LocateWebServerPath('Default Web Site') # doctest: +SKIP or >>> LocateWebServerPath('1') #doctest: +SKIP rz"Server name or comment is requiredcs g|]}tˆ|dƒ ¡ ¡‘qS)rC)ÚgetattrrfÚstrip)r Úattr©Zsiterr r ºsÿz'LocateWebServerPath..)rZ ServerCommentz'No web sites match the description '%s'N)ÚlenrÚ _IIS_OBJECTrfrmZAdsPathrc)Ú descriptionZiisZsite_attributesÚmsgrror ÚLocateWebServerPathªs   þ rtcCs|pd}t|ƒ}t|ƒ}|S)z» Load the web server instance (COM object) for a given instance or description. If None is specified, the default website is retrieved (indicated by the identifier 1. Ú1)rtÚ LoadWebServer)rrÚpathrjrrr Ú GetWebServerÄsrxc Cslz t|ƒ}WnZtjyf}z@|j}tjr>tjdr>tjd}d||f}t|ƒ‚WYd}~n d}~00|S)NrzWebServer %s: %s)rÚ pythoncomÚ com_errorÚstrerrorÚexcr[rc)rwrjÚdetailsrsrrr rvÑs   rvcCs0|jp|}|r"t|tƒs"| d¡}t|ƒ}|jS)z‡ Legacy function to allow options to define a .server property to override the other parameter. Use GetWebServer instead. Úmbcs)rjÚ isinstancerEÚdecoderxZadsPath)riZ server_descrjrrr rhÝs   rhcCs| d¡sd|}| dd¡S)a4 Get the parent path and basename. >>> split_path('/') ['', ''] >>> split_path('') ['', ''] >>> split_path('foo') ['', 'foo'] >>> split_path('/foo') ['', 'foo'] >>> split_path('/foo/bar') ['/foo', 'bar'] >>> split_path('foo/bar') ['/foo', 'bar'] rer)rgÚrsplit)rwrrr r&îs r&cCs"z2| d¡sJdƒ‚| d|¡tdd|fƒWntjyFYn0| |j|¡}tdd||jfƒ|jpt|j}||_ z|j pˆ|j }||_ Wnt y¤Yn0|  |j ¡|jrÀ|j|_tddƒ|j|_|j|_|j|_|j|_|j|_|j|_|j|_|jdu�r|j|_| ¡|S)Nreúmustn't delete the root!rCrzDeleted old directory '%s'z$Creating new directory '%s' in %s...zSetting directory options...)rmÚDeleterXryrzÚCreater/rrZAppFriendlyNamerÚAttributeErrorZ AppCreate2r+r-ZHttpCustomHeadersr1r3r5r7r9r;r=r>ÚSetInfo)Ziis_dirr(ÚparamsZnewDirZfriendlyrwrrr Ú_CreateDirectory s<        rˆcCs€t|d|ƒ|jstdƒ‚| ¡\}}tt||j|ƒƒ}| ¡sLt|||ƒ}t |j ||j ƒt|d||ƒt dd|jfƒ|S)NÚ PreInstallz No Name paramÚ PostInstallrz Configured Virtual Directory: %s) Ú _CallHookrrdr&rrkrr)rˆÚAssignScriptMapsr?r@rX)r‡rir'r(Ú target_dirrrr ÚCreateDirectory<s   rŽÚreplacecCs`d| ¡}z t|ƒ}Wn"ty:d|}t|ƒ‚Yn0dd„|Dƒ}|||ƒ| ¡dS)aUpdates IIS with the supplied script map information. script_maps is a list of ScriptMapParameter objects target is an IIS Virtual Directory to assign the script maps to update is a string indicating how to update the maps, one of ('start', 'end', or 'replace') Z_AssignScriptMapsz#Unknown ScriptMapUpdate option '%s'cSsg|] }t|ƒ‘qSrrD)r Úsrrr r _rz$AssignScriptMaps..N)Ú capitalizeÚevalÚ NameErrorrdr†)Ú script_mapsÚtargetrZscript_map_funcrsrrr rŒMs    rŒcst‡fdd„|DƒƒS)z:Return items in sequence that can't be found in reference.csg|]}|ˆvr|‘qSrrrF©Ú referencerr r grz$get_unique_items..)Útuple)Zsequencer—rr–r Úget_unique_itemsesr™cCs ||_dSr)r?)r•r”rrr Ú_AssignScriptMapsReplacejsršcCst||jƒ}|j||_dSr©r™r?©r•r”Zunique_new_mapsrrr Ú_AssignScriptMapsEndns r�cCst||jƒ}||j|_dSrr›rœrrr Ú_AssignScriptMapsStartss ržc Cs�t||jƒ}t|d|ƒzt|dƒ}Wnntjy–}zTt |j¡tj ks^t  |j¡tj kr`‚t|ƒ}|  t d¡}d|_| ¡WYd}~n d}~00|j d¡s¬Jdƒ‚z$| t|j¡tdd|jfƒWntjyäYn0|  t|j¡}tdd ƒtj |j¡�sJ‚|j|_|j|_| ¡d d „|j d ¡Dƒ}|j|v�rl| |j¡d  |¡|_| ¡t|d ||ƒtdd|jfƒ|S)Nr‰ú/FiltersrSrCrer‚rzDeleted old filter '%s'zCreated new ISAPI filter...cSsg|]}|r| ¡‘qSr©rm©r Úbrrr r —rz%CreateISAPIFilter..rHrŠrzConfigured Filter: %s)rhrr‹rryrzr\r]rZr^Z HRESULT_CODEÚERROR_PATH_NOT_FOUNDr„Ú _IIS_FILTERSÚFilterLoadOrderr†rrmrƒÚ _IIS_FILTERrXÚosrwÚisfilerZ FilterPathrZFilterDescriptionÚsplitrMrN)Ú filterParamsrirjÚfiltersr|Z server_obZ newFilterÚ load_orderrrr ÚCreateISAPIFilterxsD  ÿþ     r­c CsPt|d|ƒt||jƒ}|d}z t|ƒ}Wn8tjyd}ztdd|fƒWYd}~dSd}~00z8|j d¡s|Jdƒ‚|  t |j¡tdd|jfƒWnLtjyê}z2t |ƒ}|t j krÄ‚tdd|jfƒWYd}~n d}~00d d „|j d ¡Dƒ}|j|v�r.| |j¡d  |¡|_| ¡t|d |ƒtd d|jfƒdS)NÚ PreRemoverŸrz%ISAPI filter path '%s' did not exist.rer‚zDeleted ISAPI filter '%s'z ISAPI filter '%s' did not exist.cSsg|]}|r| ¡‘qSrr r¡rrr r ¶rz%DeleteISAPIFilter..rHÚ PostRemoverzDeleted Filter: %s)r‹rhrrryrzrXrrmrƒr¦r`r\r£r¥r©ÚremoverNr†)rªrirjZob_pathr«r}Úrcr¬rrr ÚDeleteISAPIFilter¡s0    (    r²c CsŠ|jp|}|jp|}z4ttƒ}| ||j||j|¡tdd||fƒWn<tj t fy„}ztdd||fƒWYd}~n d}~00dS)NrzAdded extension file '%s' (%s)z%Failed to add extension file '%s': %s) r!r#rrqrr r"rXryrzr…) ÚmoduleZ def_groupidZdef_descr‡riZgroup_idÚdescÚobr}rrr Ú_AddExtensionFile¿s  ûr¶cCsŒi}|jD]@}|jD]4}|j|vr|jrt|j|j|j||ƒd||j<qq |jD]4}|j|vrR|jrRt|j|j|j||ƒd||j<qRdS)z‰Register the modules used by the filters/extensions as a trusted 'extension module' - required by the default IIS6 security settings.TN) rTr?rJrr¶rrrSr)r‡riZaddedÚvdÚsmpÚfdrrr ÚAddExtensionFilesÒs   rºc Csfz$ttƒ}| |¡tdd|ƒWn<tjtfy`}ztdd||fƒWYd}~n d}~00dS)Nrz&Deleted extension file record for '%s'z(Failed to remove extension file '%s': %s)rrqZDeleteExtensionFileRecordrXryrzr…)r³rirµr}rrr Ú_DeleteExtensionFileRecordãs  r»cCsxi}|jD]6}|jD]*}|j|vr|jrt|j|ƒd||j<qq |jD]*}|j|vrH|jrHt|j|ƒd||j<qHdS)NT)rTr?rJrr»rSr)r‡riZdeletedr·r¸Ú filter_defrrr ÚDeleteExtensionFileRecordsìs     r½cCsÚd}tr d}tj td|d¡}tj |¡s%sz%s is up to date.)Úis_debug_buildr§rwrNÚthis_dirr¨rdÚstatÚerrorÚST_SIZEÚST_MTIMErXÚshutilÚcopyfileÚcopystat)Údll_nameÚsuffixÚtemplateZsrc_statZ dest_statZsamerrr ÚCheckLoaderModuleús&   þ rËcGs,t||dƒ}|dur(||f|}||ŽdSr)rl)rµZ hook_nameriÚ extra_argsÚfuncÚargsrrr r‹s  r‹cCsRt|d|ƒ|jD]}t||ƒq|jD]}t||ƒq(t||ƒt|d|ƒdS)Nr‰rŠ)r‹rTrŽrSr­rº©r‡rir·r¼rrr ÚInstalls      rÐc Cs| ¡r dSztt||j|jƒƒ}WnNtjyr}z4t|ƒ}|tj krJ‚t dd|jƒd}WYd}~n d}~00|du�rz |  ¡Wn,t   ¡d}t dd|j|fƒYn0z0t|jƒ}| |j|j¡t dd|jfƒWn,t   ¡d}t dd|j|fƒYn0dS)Nrz#VirtualDirectory '%s' did not existrzAppUnLoad() for %s failed: %szDeleted Virtual Directory: %sz!Failed to remove directory %s: %s)r)rrkrrryrzr`r\r£rXZ AppUnLoadÚsysÚexc_infoZParentrƒZClass)r‡riZ directoryr}r±Zexc_valr'rrr ÚRemoveDirectory*s.      rÓcCs^| ¡\}}tt||j|ƒƒ}t|jƒ}tt|jƒD]}||vr4| |¡q4||_|  ¡dS)z?Remove script maps from the already installed virtual directoryN) r&rrkrÚlistr?ÚmaprEr°r†)Z vd_paramsrir'r(r�Zinstalled_mapsÚ_maprrr ÚRemoveScriptMapsFs   r×cCs|t|d|ƒt||ƒ|jD]8}t|d|ƒt||ƒ| ¡rHt||ƒt|d|ƒq|jD]}t||ƒq\t|d|ƒdS)Nr®r¯)r‹r½rTrÓr)r×rSr²rÏrrr Ú UninstallRs        rØcCsf|rtj |¡std|fƒ‚|jD]}|jdur$||_q$|jD] }|jD]}|jdurJ||_qJq@dS)Nú%s does not exist) r§rwr¨rdrSrrTr?rJ)r‡rÈZfile_must_existÚfÚdZsmrrr Ú_PatchParamsModuleis      rÜcCs¾ttdƒr\tj |¡\}}tj |¡\}}| d¡r@|dd…}tj tj ||d¡¡}n>tj |¡\}}tj |¡\}}tj tj |d|d¡¡}|dur®ttdƒ }|rºt |ƒ|S)NÚfrozenÚwrYr¾r ) ÚhasattrrÑr§rwÚsplitextr©ÚendswithÚabspathrNrË)Úmod_nameZ check_moduleÚbaser rwrÈrrr ÚGetLoaderModuleNamexs    råcGsdSrr©rÎrrr ÚšrrçcCsZttdƒs0tj |¡}tj |¡s0td|fƒ‚t|ƒ}t||ƒt ||ƒ|ddƒdS)zInstall the extensionrÝrÙrzInstallation complete.N) rßrÑr§rwrâr¨rdrårÜrЩÚconf_module_namer‡rirXZ loader_dllrrr Ú InstallModulešs     rêcGsdSrrrærrr rç§rcCs.t|dƒ}t||dƒt||ƒ|ddƒdS)zRemove the extensionFrzUninstallation complete.N)rårÜrØrèrrr ÚUninstallModule§s   rë)Úinstallr°cCs€dd„| ¡Dƒ}ttt| ¡ƒ|ƒƒ}d t| ¡ƒ¡}d|d}|d7}| ¡D]\}}|d||fd7}qV|dd …S) NcSsg|] }|j‘qSr)Ú__doc__)r Úhandlerrrr r ¶rzbuild_usage..ú|z%prog [options] [z] z commands: z %-10s: %sÚ rY)ÚvaluesÚdictÚzipÚiterÚkeysrNrO)Z handler_mapZ docstringsZall_argsÚ arg_namesZ usage_stringÚargr´rrr Ú build_usageµs røcCsdS)zv Take an options object generated by the command line and merge the values into the IISParameters object. Nr)rir‡rrr ÚMergeStandardOptionsÀsrùrìc CsÐddlm}|ptj}|sltjd}zt |¡}Wn8tjyj}ztdd||fƒWYd}~n d}~00|dur€|dd�}n|}| ¡s¬t   ¡} |   |¡|  t | ƒ¡|  d| d ¡|jd d d d ddd�|jdddd ddd�|jddddtfd�| |dd…¡\} } t| |ƒ| ja| �s2|g} z&| D]} | | } | ||| tƒ�q8Wnrttf�yª}z4| jdk�r‚t ¡td|jj|fƒWYd}~n*d}~0t�yÊ| d| ¡Yn0dS)a”Perform installation or removal of an ISAPI filter or extension. This module handles standard command-line options and configuration information, and installs, removes or updates the configuration of an ISAPI filter or extension. You must pass your configuration information in params - all other arguments are optional, and allow you to configure the installation process. r)Ú OptionParserrz+Couldn't determine the long name for %r: %sNrC)ÚusageZ uninstallr°z-qz--quietÚ store_falserUTz%don't print status messages to stdout)ÚactionÚdestÚdefaultÚhelpz-vz --verbosityÚcountrz)increase the verbosity of status messagesz--serverÚstorezCSpecifies the IIS server to install/uninstall on. Default is '%s/1')rýrz%s: %szInvalid arg '%s')ZoptparserúrÑÚargvÚwin32apiZGetLongPathNamerÂrXZ get_usageÚstandard_argumentsÚcopyrZ set_usagerøÚ setdefaultZ add_optionrqÚ parse_argsrùrUrcraÚ tracebackÚ print_excrVÚ __class__rÚKeyError)r‡rréZ default_argZ opt_parserZcustom_arg_handlersrúr|ÚparserZ all_handlersrirÎr÷rîr}rrr ÚHandleCommandLineÓst    þ  úúÿü  (r)N)r�)T)N)WríÚimpr§rÅrÁrÑr ryrr\Zwin32com.clientrrZwin32com.client.gencacherrZ _APP_INPROCZ _APP_OUTPROCZ _APP_POOLEDrqZ _IIS_SERVERZ _IIS_WEBDIRr.r¤r¦rRr,r*r0r2r4r6r8r:r<Z get_suffixesZ _extensionsr¿rwrâÚdirnameÚ__file__rÀrr$rArQrUrXr`Ú Exceptionrarcrdrkrtrxrvrhr&rˆrŽrŒr™ršr�ržr­r²r¶rºr»r½rËr‹rÐrÓr×rØrÜrårêrërrørùrrrrr Ús¦     2 )     "  þ ú