a oea @sldZddlZddlZddlZddlZddlZddlZdZejfddZ ejfddZ ejfdd Z ejfd d Z ejfd d Z ddZddZddZdddddddgiddddf ddZd,ddZd-ddZddZd.ddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zejshzeejd+eWn8ejyfz eWnejy`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|0dSN)win32apiZ RegCreateKeyitemsZ RegSetValueExwin32conREG_SZ RegCloseKey)ZkeyNameZ valueDictbasehkeykeyvaluer 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 RegQueryValueerror)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 RegDeleteKeyrargswinerrorERROR_FILE_NOT_FOUND)rrZxxx_todo_changeme1codefnmsgr r r _remove_key,s   rc Cszt||}WnJtjyZ}z0|j\}}}|tjkrFt|||WYd}~nd}~00zzt|d}WnVtjy}z<|j\}}}|tjkrt|||WYd}~qWYd}~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_ITEMSrecurse_delete_keyrr) rrhZxxx_todo_changeme2rrrZ subkeynameZxxx_todo_changemer r r r7s"  $  " rcCsttjdtjtjSr) pythoncomZCoCreateInstanceZCLSID_StdComponentCategoriesMgrCLSCTX_INPROC_SERVERZIID_ICatRegisterr r r r _cat_registrarWs r c CstjdstjStjddkr(d}nd}tj tj tjd|}tj |sdtj tj |}tj |sdtj vrtj tj dd|}ntj tj d|}tj |sz*d tj}ttj|}tj ||}WnttjfyYn0tj |s|rtd |dS|S) Nwin32_drz pythonw.exez pythonw_d.exez64 bitZPCbuildZamd64z)SOFTWARE\Python\PythonCore\%s\InstallPathzCan not locate the program '%s')sysplatform startswith executabler__file__findosrjoinsplitexistsprefixversionwinverrrrHKEY_LOCAL_MACHINEAttributeErrorr RuntimeError)ZmustfindZ exeBaseNameexeNamer rr r r _find_localserver_exe`s0       r4c Csddl}|jjd}d}tj||d}zt|WnZtjyd}tj|||}zt|Wn tjytd|Yn0Yn0|S)NrZ localserverz.pyz.pycz5Can not locate the Python module 'win32com.server.%s') Zwin32com.serverZserver__path__r)rr*statrr2)Zwin32comrZbaseNamepyfileextr r r _find_localserver_modules  r9bothcCsB|s|stddt|}t||td||| sDtjtjB} tjrxtjsXJdtjdkrn| tj@} n | tj@} | tj@rtjrttdrt tj }nt dn\t jtj}dtjvrdnd }t j|d tjd tjd |f}t j|r|ntj}t|d ||dn t|d | tj@rtjrVt tj}d|f}n*td }t |}t}d||t|f}t|d|n t|d|rt|d|n t|d|rt|d|n t|d| rt|d| n t|d|rt|d|n t|d| r:t|d| n t|d| durZtjd k} | rj|tg}|rt}|||| r| D]\}}t|d||q|r>|rt|d|nt|d||rt||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\%sAppID\%szHpythoncom is frozen, but sys.frozen is not set - don't know the context!Zdllfrozendllhandlez?We appear to have a frozen DLL, but I don't know the DLL to user"zpythoncomloader%d%d%s.dllrz\InprocServer32)NZThreadingModelz %s /Automatez %s "%s" %sz\LocalServer32z \PythonCOMz\PythonCOMPolicyz\PythonCOMDispatcherz \DefaultIconz\PythonCOMPathNrz\ProgIDz\CLSIDz\CurVerz\VersionIndependentProgID) TypeErrorstrrrrZCLSCTX_LOCAL_SERVERfrozenr#hasattrrZGetModuleFileNamer=r2r)rdirnamer'r* version_infoisfilerrGetShortPathNamer&r4r9CATID_PythonCOMServerr ZRegisterClassImplCategoriesr)clsidZpythonInstStringdescprogID verProgIDdefIconthreadingModelZpolicycatidsother addPyComCat dispatcherclsctxaddnPath keyNameRootZdllNameZ pythoncom_dirsuffixZ loadernamer3Zcommandr7regCatr r r r r RegisterServers*                         rXcCsddt|tjfg}|r(||tjf|r<||tjf|dt|tjf|r`||}|S)zGiven a server, return a list of of ("key", root), which are keys recursively and uncondtionally deleted at unregister or uninstall time. r;r<)rArHKEY_CLASSES_ROOTappend)rIrKrL customKeysretr 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)obattrdefaultbasesrvalr 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}|rt|d}|durd}d}d| d<nt|d}d}d| d<|dur|j}|dkrbz(tjt t j dddd}Wn"t tj fy`tdYn0|d|j}tjstjt j dd}|sd}t|}t||||| | | || | |||||std|p|||r$tj|}t|}t|||s$td|q$|d}|r(|dS) Nquietdebug _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)rsplitextrZ FindFilesr#argv IndexErrorrr@__name__r+ZGetFullPathNamerXprintabspathZ LoadTypeLibZRegisterTypeLibget)classesflagsrhZ debuggingclsrIrKrJspecrLrMrNrOoptionsZ policySpecrSZ tlb_filenamerQrTZdispatcherSpecZ debuggingDescZ moduleNameZ scriptDirZtypelibextrar r r RegisterClassess                        rc Osd|vo|d}|D]}|j}t|d}t|d}t|d}t|ddu}t|||||sntd|pjt||rt|d} | durtdqt|d d \} } t|d d } z t| | | | |std WqtjyYq0q|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_guidmajorminorZlcidrr r r UnregisterClassess2        rcOsHg}|D]:}|j}t|d}t|d}t|d}|t||||}q|S)Nrjrkr)rrrbr])r{r|r\r}rIrKrLr[r r r UnregisterInfoClasses s   rcCsddl}ddl}ddl}ddl}ddlm}ddlm}|dsHtdd ddt j D}|d sn|d 7}| d d}|durz | }Wn|jyd}Yn0|d } | d } | d} tjt jd} d} | dkrtj t jd} n| dkrtj t jd} | r$tj| s*t j} zt| d}zt}td|dtdtj dd|dttj|d|dtdt|dtdt| || f|dW|n |0tj dd}|||jd|d| tj d }|d!}|!||j"|#|}t| }z|$}W|n |0|rJtd"|t|dd#W| | fD]N}zt%|Wn8tjy}ztd$||fWYd}~n d}~00q`nZ| | fD]N}zt%|Wn8tjy}ztd$||fWYd}~n d}~00q0dS)%Nr)shellcon)ShellExecuteExrhz$Requesting elevation and retrying... cSsg|]}d|dqS)"r ).0ar r r $z%ReExecuteElevated.. unattendedz --unattendedhwndZpycomserverregz.outz.batr?z pythonwin.exez python.exezpythonwin_d.exez python_d.exewz @echo off)filezset PYTHONPATH=%sZ PYTHONPATHr>zcd "%s"z%s %s > "%s" 2>&1ZCOMSPECzcmd.exeZrunasz/C "%s")rZfMaskZlpVerbZlpFileZ lpParametersZnShowZhProcessz*Error: registration failed (exit code %s).)endz"Failed to remove tempfile '%s': %s)&tempfile win32event win32processwinxpguiZwin32com.shellrZwin32com.shell.shellrrxr*r#rurzZGetConsoleWindowrZmktempr)rr+r&lowerr-r,opengetcwdenviron splitdriverrGcloseZSEE_MASK_NOCLOSEPROCESSrZSW_SHOWZWaitForSingleObjectZINFINITEZGetExitCodeProcessreadunlink)r|rrrrrr new_paramsrZtempbaseZoutfileZbatfileZ current_exeZ exe_to_runZbatfcwdr&rcZhprocZ exit_codeZoutfoutputfexcr r r ReExecuteElevateds             , rc Osdtjv}dtjv}|ddp(dtjv|d<|ddpBdtjv|d<|ddp\d tjv|d<|rtt|i|Sz&|rt|i|nt|i|WnTtjy}z:|ds|jtj kst dd kr҂t |WYd}~n d}~00dS) Nz--unregister_infoz --unregisterrhrz--quietriz--debugrz --unattended) r#rurzrrrrrrZERROR_ACCESS_DENIEDgetwindowsversionr)r{r|ZunregisterInfoZ unregisterrr r r UseCommandLinevs(   rcCst}|tddfgdS)z2Register the Python COM Server component category.i zPython COM ServerN)r ZRegisterCategoriesrH)rWr r r RegisterPyComCategorysrzComponent Categories\%s)NNN)NNN)N)__doc__r)r#rrrrrHrYrrrrrr r4r9rXr]r^r_rbrrrrrrrBrrr r r r sf     ! :   V% ]