a „oeôaã @sldZddlZddlZddlZddlZddlZddlZdZejfdd„Z ejfdd„Z ejfdd „Z ejfd d „Z ejfd d „Z dd„Zdd„Zdd„Zdddddddgiddddf dd„Zd,dd„Zd-dd„Zdd„Zd.dd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd)d*„Zej�shze ejd+e¡Wn8ej�yfz eƒWnej�y`Yn0Yn0dS)/aBUtilities for registering objects. This module contains utility functions to register Python objects as valid COM Servers. The RegisterServer function provides all information necessary to allow the COM framework to respond to a request for a COM object, construct the necessary Python object, and dispatch COM events. éNz&{B3EF80D0-68E2-11D0-A689-00C04FD658FF}c CsRt ||¡}z4| ¡D]\}}t ||dtj|¡qWt |¡n t |¡0dS©N)Úwin32apiZ RegCreateKeyÚitemsZ RegSetValueExÚwin32conÚREG_SZÚ RegCloseKey)ZkeyNameZ valueDictÚbaseÚhkeyÚkeyÚvalue©r ú9C:\Program Files\Certbot\pkgs\win32com\server\register.pyÚ _set_subkeyss  rcCst ||tj|¡dS)z#Set a string value in the registry.N)rZ RegSetValuerr)Úpathr rr r r Ú _set_stringsrcCs*zt ||¡WStjy$YdS0dS)z%Get a string value from the registry.N)rÚ RegQueryValueÚerror)rrr r r Ú _get_string#src Cs`zt ||¡WnJtjyZ}z0|j\}}}|tjkrFt |||¡‚WYd}~n d}~00dS)z"Remove a string from the registry.N)rZ RegDeleteKeyrÚargsÚwinerrorÚERROR_FILE_NOT_FOUND)rrZxxx_todo_changeme1ÚcodeÚfnÚmsgr r r Ú _remove_key,s   rc Cszt ||¡}WnJtjyZ}z0|j\}}}|tjkrFt |||¡‚WYd}~n¬d}~00z”zt |d¡}WnVtjyÄ}z<|j\}}}|tjkr¤t |||¡‚WYd}~qÚWYd}~n d}~00t|d||ƒq^t ||ƒWt  |¡n t  |¡0dS)zjRecursively delete registry keys. This is needed since you can't blast a key when subkeys exist. Nrú\) rZ RegOpenKeyrrrrZ RegEnumKeyZERROR_NO_MORE_ITEMSÚrecurse_delete_keyrr) rrÚhZxxx_todo_changeme2rrrZ subkeynameZxxx_todo_changemer r r r7s"  $  " rcCst tjdtjtj¡Sr)Ú pythoncomZCoCreateInstanceZCLSID_StdComponentCategoriesMgrÚCLSCTX_INPROC_SERVERZIID_ICatRegisterr r r r Ú_cat_registrarWs ür c Cstj d¡stjStj d¡dkr(d}nd}tj  tj  tj¡d|¡}tj  |¡sdtj  tj |¡}tj  |¡s¢dtj vr�tj  tj dd|¡}ntj  tj d|¡}tj  |¡sòz*d tj}t tj|¡}tj  ||¡}WnttjfyðYn0tj  |¡�s|�rtd |ƒ‚dS|S) NÚwin32Ú_drz pythonw.exez pythonw_d.exez64 bitZPCbuildZamd64z)SOFTWARE\Python\PythonCore\%s\InstallPathzCan not locate the program '%s')ÚsysÚplatformÚ startswithÚ executablerÚ__file__ÚfindÚosrÚjoinÚsplitÚexistsÚprefixÚversionÚwinverrrrÚHKEY_LOCAL_MACHINEÚAttributeErrorrÚ RuntimeError)ZmustfindZ exeBaseNameÚexeNamer rr r r Ú_find_localserver_exe`s0       r4c Cs˜ddl}|jjd}d}tj ||d¡}zt |¡WnZtjy’d}tj |||¡}zt |¡Wn tjyŒtd|ƒ‚Yn0Yn0|S)NrZ localserverz.pyz.pycz5Can not locate the Python module 'win32com.server.%s') Zwin32com.serverZserverÚ__path__r)rr*Ústatrr2)Zwin32comrZbaseNameÚpyfileÚextr r r Ú_find_localserver_module�s  ÿr9ÚbothcCsB|s|stdƒ‚dt|ƒ}t||ƒtd||ƒ| sDtjtjB} tjrxtjsXJdƒ‚tjdkrn| tj@} n | tj@} | tj@�rtjr¬ttdƒr¢t   tj ¡}nt dƒ‚n\t j tj¡}dtjvrÈdnd }t j |d tjd tjd |f¡}t j |¡�r|ntj}t|d ||dœƒn t|d ƒ| tj@�r�tj�rVt  tj¡}d|f}n*td ƒ}t  |¡}tƒ}d||t|ƒf}t|d|ƒn t|dƒ|�r²t|d|ƒn t|dƒ|�rÔt|d|ƒn t|dƒ| �röt|d| ƒn t|dƒ|�rt|d|ƒn t|dƒ| �r:t|d| ƒn t|dƒ| du�rZtjd k} | �rj|tg}|�r‚tƒ}| ||¡| �r®|  ¡D]\}}t|d||ƒ�q�|�r>|�rÊt|d|ƒnt|d|ƒ|�rèt||ƒt|dt|ƒƒ|�r>t|d|ƒt|d|ƒ|�r,t||ƒt|dt|ƒƒdS)aTRegisters a Python object as a COM Server. This enters almost all necessary information in the system registry, allowing COM to use the object. clsid -- The (unique) CLSID of the server. pythonInstString -- A string holding the instance name that will be created whenever COM requests a new object. desc -- The description of the COM object. progID -- The user name of this object (eg, Word.Document) verProgId -- The user name of this version's implementation (eg Word.6.Document) defIcon -- The default icon for the object. threadingModel -- The threading model this object supports. policy -- The policy to use when creating this object. catids -- A list of category ID's this object belongs in. other -- A dictionary of extra items to be registered. addPyComCat -- A flag indicating if the object should be added to the list of Python servers installed on the machine. If None (the default) then it will be registered when running from python source, but not registered if running in a frozen environment. dispatcher -- The dispatcher to use when creating this object. clsctx -- One of the CLSCTX_* constants. addnPath -- An additional path the COM framework will add to sys.path before attempting to create the object. zYYou must specify either the Python Class or Python Policy which implement the COM object.úCLSID\%súAppID\%szHpythoncom is frozen, but sys.frozen is not set - don't know the context!ZdllÚfrozendllhandlez?We appear to have a frozen DLL, but I don't know the DLL to user"Úzpythoncomloader%d%d%s.dllréz\InprocServer32)NZThreadingModelz %s /Automatez %s "%s" %sz\LocalServer32z \PythonCOMz\PythonCOMPolicyz\PythonCOMDispatcherz \DefaultIconz\PythonCOMPathNrz\ProgIDz\CLSIDz\CurVerz\VersionIndependentProgID)Ú TypeErrorÚstrrrrZCLSCTX_LOCAL_SERVERÚfrozenr#ÚhasattrrZGetModuleFileNamer=r2r)rÚdirnamer'r*Ú version_infoÚisfilerrÚGetShortPathNamer&r4r9ÚCATID_PythonCOMServerr ZRegisterClassImplCategoriesr)ÚclsidZpythonInstStringÚdescÚprogIDÚ verProgIDÚdefIconÚthreadingModelZpolicyÚcatidsÚotherÚ addPyComCatÚ dispatcherÚclsctxÚaddnPathÚ keyNameRootZdllNameZ pythoncom_dirÚsuffixZ loadernamer3Zcommandr7ÚregCatr r r r r ÚRegisterServer™s°*ÿ   ÿþ     ÿÿþþþ                 rXcCsddt|ƒtjfg}|r(| |tjf¡|r<| |tjf¡| dt|ƒtjf¡|r`||}|S)z’Given a server, return a list of of ("key", root), which are keys recursively and uncondtionally deleted at unregister or uninstall time. r;r<)rArÚHKEY_CLASSES_ROOTÚappend)rIrKrLÚ customKeysÚretr r r ÚGetUnregisterServerKeysRsr]cCs t||||ƒD] }t|ŽqdS)z Unregisters a Python COM server.N)r]r)rIrKrLr[rr r r ÚUnregisterServerisr^cCsdt|ƒt|ƒf}t|ƒS)zCGiven a CLSID for a server and option name, return the option valuez CLSID\%s\%s)rAr)rIZ optionNamerUr r r ÚGetRegisteredServerOptionysr_cCslz t||ƒWStyYn0z |j}Wnty@|YS0|D] }t||dƒ}|durF|SqF|Sr)Úgetattrr1Ú __bases__Ú_get)ÚobÚattrÚdefaultÚbasesrÚvalr r r rbs       rbcOs,d|vo|d}d|vo|d}|D�]ê}|j}t|dƒ}t|d|ƒ}t|dƒ}t|dƒ} t|dƒ} t|dd ƒ} t|d gƒ} t|d iƒ} t|d ƒ}t|d ƒ}t|dƒ}t|dtjdkƒ }d}|ræt|dƒ}|durØd}d}d| d<nt|dƒ}d}d| d<|du�r¢|j}|dk�rbz(tj t  t j d¡dd¡d}Wn"t tj f�y`tdƒ‚Yn0|d|j}tj�s¢tj t j d¡d}|�s˜d}t |¡}t||||| | | || | ||||ƒ|�sÜtd|�pÖ||ƒ|r$tj |¡}t |¡}t ||¡|s$td|ƒq$| d¡}|�r(|ƒdS) NÚquietÚdebugÚ _reg_progid_Z _reg_desc_Z_reg_class_spec_Ú_reg_verprogid_Z _reg_icon_Z_reg_threading_r:Z _reg_catids_Z _reg_options_Z_reg_policy_spec_Z _reg_clsctx_Ú_reg_typelib_filename_Z_reg_disable_pycomcat_rZ_reg_debug_dispatcher_spec_z1win32com.server.dispatcher.DefaultDebugDispatcherz(for debugging)Ú1Z DebuggingZ_reg_dispatcher_spec_r>Ú0Ú__main__éz[Can't locate the script hosting the COM object - please set _reg_class_spec_ in your objectÚ.z Registered:zRegistered type library:Zfinalize_register)Ú _reg_clsid_rbrrBÚ __module__r)rÚsplitextrZ FindFilesr#ÚargvÚ IndexErrorrr@Ú__name__r+ZGetFullPathNamerXÚprintÚabspathZ LoadTypeLibZRegisterTypeLibÚget)ÚclassesÚflagsrhZ debuggingÚclsrIrKrJÚspecrLrMrNrOÚoptionsZ policySpecrSZ tlb_filenamerQrTZdispatcherSpecZ debuggingDescZ moduleNameZ scriptDirZtypelibÚextrar r r ÚRegisterClasses‘s�                 ÿþÿ  ò     r�c Osúd|vo|d}|D]Ì}|j}t|dƒ}t|dƒ}t|dƒ}t|dƒdu}t||||ƒ|sntd|pjt|ƒƒ|rt|dƒ} | durŽtdƒqt|d d ƒ\} } t|d d ƒ} z t | | | | ¡|sÈtd ƒWqtjyÞYq0q| d¡} | rö| ƒdS)NrhrjrkÚ_reg_remove_keys_rlz Unregistered:Z_typelib_guid_z5Have typelib filename, but no GUID - can't unregisterZ_typelib_version_)r?rZ_typelib_lcid_rzUnregistered type libraryZfinalize_unregister) rrrbr^rxrArZUnRegisterTypeLibZ com_errorrz)r{r|rhr}rIrKrLr[Zunregister_typelibZtlb_guidÚmajorÚminorZlcidr€r r r ÚUnregisterClassesçs2        r…cOsHg}|D]:}|j}t|dƒ}t|dƒ}t|dƒ}|t||||ƒ}q|S)Nrjrkr‚)rrrbr])r{r|r\r}rIrKrLr[r r r ÚUnregisterInfoClasses s   r†cCsddl}ddl}ddl}ddl}ddlm}ddlm}|dsHtdƒd  dd„t j Dƒ¡}|d sn|d 7}|  d d¡}|dur¨z |  ¡}Wn|jy¦d}Yn0| d ¡} | d } | d} tj t j¡d ¡} d} | dkrötj  t jd¡} n| dk�rtj  t jd¡} | �r$tj | ¡�s*t j} �z„t| dƒ}z‚t ¡}td|d�tdtj  dd¡|d�ttj |¡d|d�tdt ¡|d�tdt | ¡|| f|d�W| ¡n | ¡0tj  dd¡}|||jd|d| tj d �}|d!}| !||j"¡| #|¡}t| ƒ}z| $¡}W| ¡n | ¡0|�rJtd"|ƒt|dd#�W| | fD]N}zt %|¡Wn8tj�yª}ztd$||fƒWYd}~n d}~00�q`nZ| | fD]N}zt %|¡Wn8tj�y}ztd$||fƒWYd}~n d}~00�qº0dS)%Nr)Úshellcon)ÚShellExecuteExrhz$Requesting elevation and retrying...ú cSsg|]}d|d‘qS)ú"r )Ú.0Úar r r Ú $óz%ReExecuteElevated..Ú unattendedz --unattendedÚhwndZpycomserverregz.outz.batr?z pythonwin.exez python.exezpythonwin_d.exez python_d.exeÚwz @echo off)Úfilezset PYTHONPATH=%sZ PYTHONPATHr>zcd "%s"z%s %s > "%s" 2>&1ZCOMSPECzcmd.exeZrunasz/C "%s")r�ZfMaskZlpVerbZlpFileZ lpParametersZnShowZhProcessz*Error: registration failed (exit code %s).)Úendz"Failed to remove tempfile '%s': %s)&ÚtempfileÚ win32eventÚ win32processÚwinxpguiZwin32com.shellr‡Zwin32com.shell.shellrˆrxr*r#rurzZGetConsoleWindowrZmktempr)rr+r&Úlowerr-r,ÚopenÚgetcwdÚenvironÚ splitdriverrGÚcloseZSEE_MASK_NOCLOSEPROCESSrZSW_SHOWZWaitForSingleObjectZINFINITEZGetExitCodeProcessÚreadÚunlink)r|r”r•r–r—r‡rˆÚ new_paramsr�ZtempbaseZoutfileZbatfileZ current_exeZ exe_to_runZbatfÚcwdr&ÚrcZhprocZ exit_codeZoutfÚoutputÚfÚexcr r r ÚReExecuteElevateds�         ÿýú    ,ü r¦c Osôdtjv}dtjv}| dd¡p(dtjv|d<| dd¡pBdtjv|d<| dd¡p\d tjv|d<|rtt|i|¤ŽSz&|rŠt|i|¤Žnt|i|¤ŽWnTtjyî}z:|dsÐ|jtj ksÐt  ¡dd krÒ‚t |ƒWYd}~n d}~00dS) Nz--unregister_infoz --unregisterrhrz--quietriz--debugr�z --unattendedé) r#rurzr†r…r�rrrZERROR_ACCESS_DENIEDÚgetwindowsversionr¦)r{r|ZunregisterInfoZ unregisterr¥r r r ÚUseCommandLinevs(  ÿ þýr©cCstƒ}| tddfg¡dS)z2Register the Python COM Server component category.i zPython COM ServerN)r ZRegisterCategoriesrH)rWr r r ÚRegisterPyComCategory�srªzComponent Categories\%s)NNN)NNN)N)Ú__doc__r)r#rrrrrHrYrrrrrr r4r9rXr]r^r_rbr�r…r†r¦r©rªrBrrr r r r Úsf     !ò :   V% ]þ