a oek@sdZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl m Z m Z ddl mZmZdZdZdZdZdZd Zd Zd Zd Zd ZdZeZdZdZdZdZdZ dZ!dZ"dde#DZ$de$vZ%ej&'ej&(e)Z*GdddZ+GdddZ,GdddZ-GdddZ.da/ddZ0ddZ1Gd d!d!e2Z3Gd"d#d#e3Z4Gd$d%d%e3Z5d&d'Z6d(d)Z7dld*d+Z8d,d-Z9d.d/Z:d0d1Z;d2d3Zd9d:Z?d;d<Z@d=d>ZAd?d@ZBdAdBZCdCdDZDdEdFZEdGdHZFdIdJZGdKdLZHdMdNZIdOdPZJdQdRZKdSdTZLdUdVZMdWdXZNdndYdZZOdod[d\ZPd]d^fd_d`ZQdad^fdbdcZReQeRddZSdedfZTdgdhZUdddidifdjdkZVdS)pz?Installation utilities for Python ISAPI filters and extensions.N)Dispatch GetObject)EnsureDispatch EnsureModulezIIS://LocalHost/W3SVCZ IIsWebServerZIIsWebDirectoryZIIsWebVirtualDirZ IIsFiltersZ IIsFilterzDefault Web SitezX-Powered-By: PythonTFcCsg|]\}}}|qSr).0ext_rr.C:\Program Files\Certbot\pkgs\isapi\install.py *r z_d.pydc@s8eZdZdZdZdZdZdZdZdZ dZ dZ ddZ dS)FilterParametersNTcKs|j|dSN__dict__updateselfkwrrr __init__<szFilterParameters.__init__) __name__ __module__ __qualname__Name DescriptionPathServerAddExtensionFileAddExtensionFile_EnabledAddExtensionFile_GroupIDAddExtensionFile_CanDeleteAddExtensionFile_Descriptionrrrrr r0src@sheZdZdZdZeZeZdZ e Z e Z eZeZeZeZeZeZdZgZdZdZddZddZddZ dS) VirtualDirParametersNendcKs|j|dSrrrrrr rSszVirtualDirParameters.__init__cCs|\}}| o| S)zGThis virtual directory is a root directory if parent and name are blank) split_path)rparentnamerrr is_rootVs zVirtualDirParameters.is_rootcCs t|jSr)r&r)rrrr r&[szVirtualDirParameters.split_path)!rrrrr_DEFAULT_PROTECTION AppProtection_DEFAULT_HEADERSHeadersr_IIS_WEBVIRTUALDIRType_DEFAULT_ACCESS_EXECUTE AccessExecute_DEFAULT_ACCESS_READ AccessRead_DEFAULT_ACCESS_WRITE AccessWrite_DEFAULT_ACCESS_SCRIPT AccessScript_DEFAULT_CONTENT_INDEXEDContentIndexed_DEFAULT_ENABLE_DIR_BROWSINGEnableDirBrowsing_DEFAULT_ENABLE_DEFAULT_DOCEnableDefaultDoc DefaultDoc ScriptMapsScriptMapUpdaterrr)r&rrrr r$@s(r$c@s@eZdZdZdZdZdZdZdZdZ dZ dZ ddZ ddZ dS) ScriptMapParamsNTcKs|j|dSrrrrrr rkszScriptMapParams.__init__cCs:|j|j|jg}|jr"||jdd|D}d|S)z&Format this parameter suitable for IIScSsg|] }t|qSrstrr itemrrr r trz+ScriptMapParams.__str__..,) ExtensionModuleFlagsVerbsappendjoin)ritemsrrr __str__ns  zScriptMapParams.__str__)rrrrIrJrKrLrr r!r"r#rrPrrrr rA_srAc@s eZdZeZgZgZddZdS)ISAPIParameterscKs|j|dSrrrrrr r~szISAPIParameters.__init__N)rrr_DEFAULT_SERVER_NAMEZ ServerNameFilters VirtualDirsrrrrr rQxsrQcCst|krt|dSr)verboseprint)levelZwhatrrr logsrXcCs2|j}|jr|jd}t|tjkr(t|S)N)hresult excepinfowinerrorHRESULT_FACILITYFACILITY_WIN32Z SCODE_CODE)Zcom_exchrrrr _GetWin32ErrorCodes  r`c@s eZdZdS)InstallationErrorNrrrrrrr rasrac@s eZdZdS) ItemNotFoundNrbrrrr rcsrcc@s eZdZdS)ConfigurationErrorNrbrrrr rdsrdcCs@|dr|S|r*|ddkr*d|}t||d|SdS)Nziis://r/z/ROOT)lower startswith FindWebServer)optionsserverr(rrr FindPaths rkcsjt|dksJdtt}|}|D](fdddD}||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|dqS)rC)getattrrfstrip)r attrZsiterr r sz'LocateWebServerPath..)rZ ServerCommentz'No web sites match the description '%s'N)lenr _IIS_OBJECTrfrmZAdsPathrc) descriptionZiisZsite_attributesmsgrror LocateWebServerPaths    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)rrpathrjrrr GetWebServersrxc Cslz t|}WnZtjyf}z@|j}tjr>tjdr>tjd}d||f}t|WYd}~n d}~00|S)NrzWebServer %s: %s)r pythoncom com_errorstrerrorexcr[rc)rwrjdetailsrsrrr rvs   rvcCs0|jp|}|r"t|ts"|d}t|}|jS)z Legacy function to allow options to define a .server property to override the other parameter. Use GetWebServer instead. mbcs)rj isinstancerEdecoderxZadsPath)riZ server_descrjrrr rhs   rhcCs|dsd|}|ddS)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)rgrsplit)rwrrr r&s r&cCs"z2|dsJd|d|tdd|fWntjyFYn0||j|}tdd||jf|jpt|j}||_ z|j p|j }||_ Wnt yYn0| |j |jr|j|_tdd|j|_|j|_|j|_|j|_|j|_|j|_|j|_|jdur|j|_||S)Nremustn't delete the root!rCrzDeleted old directory '%s'z$Creating new directory '%s' in %s...zSetting directory options...)rmDeleterXryrzCreater/rrZAppFriendlyNamerAttributeErrorZ AppCreate2r+r-ZHttpCustomHeadersr1r3r5r7r9r;r=r>SetInfo)Ziis_dirr(paramsZnewDirZfriendlyrwrrr _CreateDirectory s<        rcCst|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)rAssignScriptMapsr?r@rX)rrir'r( target_dirrrr CreateDirectory<s   rreplacecCs`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) capitalizeeval NameErrorrdr) script_mapstargetrZscript_map_funcrsrrr rMs    rcstfdd|DS)z:Return items in sequence that can't be found in reference.csg|]}|vr|qSrrrF referencerr r grz$get_unique_items..)tuple)Zsequencerrrr get_unique_itemsesrcCs ||_dSr)r?)rrrrr _AssignScriptMapsReplacejsrcCst||j}|j||_dSrrr?rrZunique_new_mapsrrr _AssignScriptMapsEndns rcCst||j}||j|_dSrrrrrr _AssignScriptMapsStartss rc Cst||j}t|d|zt|d}Wnntjy}zTt|jtj ks^t |jtj kr`t|}| t d}d|_|WYd}~n d}~00|jdsJdz$|t|jtdd|jfWntjyYn0| t|j}tdd tj|jsJ|j|_|j|_|d d |jd D}|j|vrl||jd ||_|t|d ||tdd|jf|S)Nr/FiltersrSrCrerrzDeleted old filter '%s'zCreated new ISAPI filter...cSsg|]}|r|qSrrmr brrr r rz%CreateISAPIFilter..rHrrzConfigured Filter: %s)rhrrrryrzr\r]rZr^Z HRESULT_CODEERROR_PATH_NOT_FOUNDr _IIS_FILTERSFilterLoadOrderrrrmr _IIS_FILTERrXosrwisfilerZ FilterPathrZFilterDescriptionsplitrMrN) filterParamsrirjfiltersr|Z server_obZ newFilter load_orderrrr CreateISAPIFilterxsD       rc CsPt|d|t||j}|d}z t|}Wn8tjyd}ztdd|fWYd}~dSd}~00z8|jds|Jd| t |jtdd|jfWnLtjy}z2t |}|t j krĂtdd|jfWYd}~n d}~00d d |jd D}|j|vr.||jd ||_|t|d |td d|jfdS)N PreRemoverrz%ISAPI filter path '%s' did not exist.rerzDeleted ISAPI filter '%s'z ISAPI filter '%s' did not exist.cSsg|]}|r|qSrrrrrr r rz%DeleteISAPIFilter..rH PostRemoverzDeleted Filter: %s)rrhrrryrzrXrrmrrr`r\rrrremoverNr)rrirjZob_pathrr}rcrrrr DeleteISAPIFilters0    (    rc Cs|jp|}|jp|}z4tt}|||j||j|tdd||fWn<tj t fy}ztdd||fWYd}~n d}~00dS)NrzAdded extension file '%s' (%s)z%Failed to add extension file '%s': %s) r!r#rrqrr r"rXryrzr) moduleZ def_groupidZdef_descrriZgroup_iddescobr}rrr _AddExtensionFiles  rcCsi}|jD]@}|jD]4}|j|vr|jrt|j|j|j||d||j<qq |jD]4}|j|vrR|jrRt|j|j|j||d||j<qRdS)zRegister the modules used by the filters/extensions as a trusted 'extension module' - required by the default IIS6 security settings.TN) rTr?rJrrrrrSr)rriZaddedvdsmpfdrrr AddExtensionFiless   rc Csfz$tt}||tdd|Wn<tjtfy`}ztdd||fWYd}~n d}~00dS)Nrz&Deleted extension file record for '%s'z(Failed to remove extension file '%s': %s)rrqZDeleteExtensionFileRecordrXryrzr)rrirr}rrr _DeleteExtensionFileRecords  rcCsxi}|jD]6}|jD]*}|j|vr|jrt|j|d||j<qq |jD]*}|j|vrH|jrHt|j|d||j<qHdS)NT)rTr?rJrrrSr)rriZdeletedrr filter_defrrr DeleteExtensionFileRecordss     rcCsd}tr d}tjtd|d}tj|s%sz%s is up to date.)is_debug_buildrrwrNthis_dirrrdstaterrorST_SIZEST_MTIMErXshutilcopyfilecopystat)dll_namesuffixtemplateZsrc_statZ dest_statZsamerrr CheckLoaderModules&    rcGs,t||d}|dur(||f|}||dSr)rl)rZ hook_nameri extra_argsfuncargsrrr rs  rcCsRt|d||jD]}t||q|jD]}t||q(t||t|d|dS)Nrr)rrTrrSrrrrirrrrr Installs      rc Cs|r dSztt||j|j}WnNtjyr}z4t|}|tj krJt dd|jd}WYd}~n d}~00|durz | Wn,t d}t dd|j|fYn0z0t|j}||j|jt dd|jfWn,t d}t dd|j|fYn0dS)Nrz#VirtualDirectory '%s' did not existrzAppUnLoad() for %s failed: %szDeleted Virtual Directory: %sz!Failed to remove directory %s: %s)r)rrkrrryrzr`r\rrXZ AppUnLoadsysexc_infoZParentrZClass)rriZ directoryr}rZexc_valr'rrr RemoveDirectory*s.      rcCs^|\}}tt||j|}t|j}tt|jD]}||vr4||q4||_| dS)z?Remove script maps from the already installed virtual directoryN) r&rrkrlistr?maprErr)Z vd_paramsrir'r(rZinstalled_maps_maprrr RemoveScriptMapsFs   rcCs|t|d|t|||jD]8}t|d|t|||rHt||t|d|q|jD]}t||q\t|d|dS)Nrr)rrrTrr)rrSrrrrr UninstallRs        rcCsf|rtj|std|f|jD]}|jdur$||_q$|jD] }|jD]}|jdurJ||_qJq@dS)N%s does not exist) rrwrrdrSrrTr?rJ)rrZfile_must_existfdZsmrrr _PatchParamsModuleis      rcCsttdr\tj|\}}tj|\}}|dr@|dd}tjtj||d}n>tj|\}}tj|\}}tjtj|d|d}|durttd }|rt ||S)NfrozenwrYrr ) hasattrrrrwsplitextrendswithabspathrNr)mod_nameZ check_modulebaser rwrrrr GetLoaderModuleNamexs    rcGsdSrrrrrr rrcCsZttds0tj|}tj|s0td|ft|}t||t |||dddS)zInstall the extensionrrrzInstallation complete.N) rrrrwrrrdrrrconf_module_namerrirXZ loader_dllrrr InstallModules     rcGsdSrrrrrr rrcCs.t|d}t||dt|||dddS)zRemove the extensionFrzUninstallation complete.N)rrrrrrr UninstallModules   r)installrcCsdd|D}ttt||}dt|}d|d}|d7}|D]\}}|d||fd7}qV|dd S) NcSsg|] }|jqSr)__doc__)r handlerrrr r rzbuild_usage..|z%prog [options] [z] z commands: z %-10s: %s rY)valuesdictzipiterkeysrNrO)Z handler_mapZ docstringsZall_args arg_namesZ usage_stringargrrrr build_usages rcCsdS)zv Take an options object generated by the command line and merge the values into the IISParameters object. Nr)rirrrr MergeStandardOptionssrrc Csddlm}|ptj}|sltjd}zt|}Wn8tjyj}ztdd||fWYd}~n d}~00|dur|dd}n|}|st } | || t | | d| d |jd d d d ddd|jdddd ddd|jddddtfd||dd\} } t| || ja| s2|g} z&| D]} | | } | ||| tq8Wnrttfy}z4| jdkrttd|jj|fWYd}~n*d}~0ty|d| Yn0dS)aPerform 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 uninstallrz-qz--quiet store_falserUTz%don't print status messages to stdout)actiondestdefaulthelpz-vz --verbositycountrz)increase the verbosity of status messagesz--serverstorezCSpecifies the IIS server to install/uninstall on. Default is '%s/1')rrz%s: %szInvalid arg '%s')Zoptparserrargvwin32apiZGetLongPathNamerrXZ get_usagestandard_argumentscopyrZ set_usager setdefaultZ add_optionrq parse_argsrrUrcra traceback print_excrV __class__rKeyError)rrrZ default_argZ opt_parserZcustom_arg_handlersrr|parserZ all_handlersrirrrr}rrr HandleCommandLinest        (r)N)r)T)N)Wrimprrrrr ryrr\Zwin32com.clientrrZwin32com.client.gencacherrZ _APP_INPROCZ _APP_OUTPROCZ _APP_POOLEDrqZ _IIS_SERVERZ _IIS_WEBDIRr.rrrRr,r*r0r2r4r6r8r:r<Z get_suffixesZ _extensionsrrwrdirname__file__rrr$rArQrUrXr` Exceptionrarcrdrkrtrxrvrhr&rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr s     2 )     "