a ‚oeà,ã@sêddlZddlZddlZddlZddlZddlmZddlmZddlm Z ej dkrhddl Z dd„Z nddlZd d„Z ej d krŠejZnGd d „d ejƒZGd d„deƒZdZdd„Zdadd„Zdd„Zddd„Zdd„Zdd„ZdS)éNé)Ú__version_verifier_modules__)Ú ffiplatform)ÚVerificationError)ércCstjjdd…S©N)Ú importlibÚ machineryÚEXTENSION_SUFFIXES©r r ú.C:\Program Files\Certbot\pkgs\cffi\verifier.pyÚ_extension_suffixes sr cCsdd„t ¡DƒS)NcSs g|]\}}}|tjkr|‘qSr )ÚimpÚ C_EXTENSION)Ú.0ÚsuffixÚ_Útyper r r Ú s ÿz'_extension_suffixes..)rZ get_suffixesr r r r r s©rcseZdZ‡fdd„Z‡ZS)ÚNativeIOcs(t|tƒr| d¡}tt|ƒ |¡dS)NÚascii)Ú isinstanceZunicodeÚencodeÚsuperrÚwrite)ÚselfÚs©Ú __class__r r rs  zNativeIO.write)Ú__name__Ú __module__Ú __qualname__rÚ __classcell__r r rr rsrc@szeZdZddd„Zd dd„Zd d „Zd d „Zd d„Zdd„Zdd„Z dd„Z dd„Z dd„Z d!dd„Z dd„Zdd„ZdS)"ÚVerifierNÚFú.cc Ksz|jjrtd|jjfƒ‚||_||_|s4t | ¡} t||ƒ} | |ƒ|_|j  | ¡| |_ |  | | ¡|_ |rz|rxt dƒ‚n¦d dtjdd…t|| g|j¡}tjdkr´| d¡}tt |ddd…¡d @ƒ}| d ¡ d ¡}tt |d dd…¡d @ƒ}| d ¡ d ¡}d||jj||f}tƒd}|�p4tƒ|_tj |j||¡|_tj |j||¡|_ ||_!d|_"d|_#dS)NzKfeature not supported with ffi.verify(), but only with ffi.set_source(): %sz)can't specify both 'modulename' and 'tag'úz%d.%dérzutf-8rlÿÿÚ0xÚLrÚ0z_cffi_%s_%s%s%sF)$Z_parserZ_uses_new_featurerÚffiÚpreamblerZflattenÚ_locate_engine_classÚ_vengineZpatch_extension_kwdsÚflagsÚmake_relative_toÚkwdsÚ TypeErrorÚjoinÚsysÚ version_inforZ _cdefsourcesrÚhexÚbinasciiÚcrc32ÚlstripÚrstripZ _class_keyÚ_get_so_suffixesÚ_caller_dir_pycacheÚtmpdirÚosÚpathÚsourcefilenameÚmodulefilenameÚ ext_packageÚ _has_sourceÚ _has_module)rr,r-r>Z modulenamerCÚtagÚforce_generic_engineZsource_extensionr0Ú relative_tor2Zflattened_kwdsZ vengine_classÚkeyZk1Zk2rr r r Ú__init__ sPÿÿ     þý   ÿ zVerifier.__init__cCsL|jj�0|jr |dur tdƒ‚| |¡Wdƒn1s>0YdS)zkWrite the C source code. It is produced in 'self.sourcefilename', which can be tweaked beforehand.Nzsource code already written)r,Ú_lockrDrÚ _write_source©rÚfiler r r Ú write_sourceIs  ÿzVerifier.write_sourcecCsP|jj�4|jrtdƒ‚|js&| ¡| ¡Wdƒn1sB0YdS)z„Write the C source code (if not done already) and compile it. This produces a dynamic link library in 'self.modulefilename'.zmodule already compiledN)r,rKrErrDrLÚ_compile_module©rr r r Úcompile_moduleRs  zVerifier.compile_modulecCs^|jj�B|js4| ¡|js4|js,| ¡| ¡| ¡WdƒS1sP0YdS)a"Get a C module from this Verifier instance. Returns an instance of a FFILibrary class that behaves like the objects returned by ffi.dlopen(), but that delegates all operations to the C module. If necessary, the C code is written and compiled first. N)r,rKrEÚ_locate_modulerDrLrPÚ _load_libraryrQr r r Ú load_library\s zVerifier.load_librarycCsBtj |j¡}| dd¡d}| d¡r>ttdƒr>|dd…}|S)NÚ.rrZ_dZgettotalrefcountéþÿÿÿ)r?r@ÚbasenamerBÚsplitÚendswithÚhasattrr5)rrXr r r Úget_module_namels  zVerifier.get_module_namecCsf|js<|jj�|js| ¡Wdƒn1s20Yt |j¡}| ¡}tj||fi|j ¤ŽSr) rDr,rKrLrZmaybe_relative_pathrAr\Ú get_extensionr2)rZ sourcenameÚmodnamer r r r]ws & zVerifier.get_extensioncCs|jjSr)r/Z_gen_python_modulerQr r r Úgenerates_python_module€sz Verifier.generates_python_modulecsz|rvtj |¡rvtj |¡‰| ¡}tjD]J}||vr*||}t|ttfƒsZt d|fƒ‚‡fdd„|Dƒ}|||<q*|S)Nz&keyword '%s' should be a list or tuplecsg|]}tj ˆ|¡‘qSr )r?r@r4)rÚfn©Údirnamer r r�óz-Verifier.make_relative_to..) r?r@rbÚcopyrZLIST_OF_FILE_NAMESrÚlistÚtupler3)rr2rHrIZlstr rar r1ƒs  ÿ zVerifier.make_relative_tocCsˆtj |j¡st|jrHzt|jdddgƒ}Wnty>YdS0|j}nd}|j  |  ¡|t ƒ¡}|durndS||_|j  ¡d|_ dS)NÚ__doc__T)r?r@ÚisfilerBrCÚ __import__Ú ImportErrorÚ__path__r/Ú find_moduler\r<Z collect_typesrE)rÚpkgr@Úfilenamer r r rS“s  ÿ zVerifier._locate_modulecCs*||j_z|j ¡W|j`n|j`0dSr)r/Z_fZwrite_source_to_frMr r r Ú_write_source_to¦s zVerifier._write_source_tocCsÈ|dur| |¡n°tƒ}| |¡| ¡}tj |j¡rvt|jdƒ�}| ¡|k }Wdƒqz1sj0Ynd}|r¾t |jƒt|jdƒ�}|  |¡Wdƒn1s´0Yd|_ dS)NÚrTÚw) rorÚgetvaluer?r@ÚexistsrAÚopenÚreadÚ _ensure_dirrrD)rrNÚfZ source_dataÚfpZ needs_writtenr r r rL­s  . (zVerifier._write_sourcecCsntj |j¡}t || ¡¡}zt ||j¡}Wnt yFd}Yn0|sdt |jƒt   ||j¡d|_ dS)NFT)r?r@rbrArÚcompiler]ÚsamefilerBÚOSErrorrvÚshutilÚmoverE)rr>ZoutputfilenameZsamer r r rPÆs   zVerifier._compile_modulecCs0|js J‚|jdur"|j |j¡S|j ¡SdSr)rEr0r/rUrQr r r rTÓs  zVerifier._load_library)NNNr%Fr&NN)N)N)r r!r"rJrOrRrUr\r]r_r1rSrorLrPrTr r r r r$s þ )      r$FcCsztrd}|sNdtjvrd}n2z ddl}Wnty>d}Yn0|j|urNd}|rdddlm}|jSddlm }|j SdS)NTZ__pypy__rú?r)Ú vengine_gen)Ú vengine_cpy) Ú_FORCE_GENERIC_ENGINEr5Úbuiltin_module_namesÚ _cffi_backendrjZ_backendr%rZVGenericEnginer€ZVCPythonEngine)r,rGrƒrr€r r r r.Þs        r.cCsHtrtStj d¡}|r|St d¡jj}tj  tj  tj  |¡d¡¡S)NZ CFFI_TMPDIRr(Ú __pycache__) Ú_TMPDIRr?ÚenvironÚgetr5Ú _getframeÚf_codeÚ co_filenamer@Úabspathr4rb)Úresultrnr r r r=ös ÿr=cCs|adS)z:Set the temporary directory to use instead of __pycache__.N)r…rar r r Ú set_tmpdirsr�c Cs|ptƒ}zt |¡}Wnty,YdS0|r8d}ntƒd ¡}|D]Z}| ¡ d¡rJ| ¡ |¡sx| ¡ d¡rJzt tj   ||¡¡WqJty¢YqJ0qJtj   |d¡g}|D]^}zDt |¡D]4}tj   ||¡}tj   |¡rô|  |¡qÊt |¡qÊWqºt�yYqº0qºdS)z}Clean up the temporary directory by removing all files in it called `_cffi_*.{c,so}` as well as the `build` subdirectory.Nr&rZ_cffi_Úbuild) r=r?Úlistdirr{r<ÚlowerÚ startswithrZÚunlinkr@r4ÚisdirÚappend)r>Zkeep_soZfilelistrr`Z clean_dirÚdirr r r Úcleanup_tmpdirs8   ÿ ÿ   r–cCs&tƒ}|s"tjdkrdg}ndg}|S)NÚwin32z.pydz.so)r r5Úplatform)Úsuffixesr r r r<$s  r<cCs*tj |¡}|r&tj |¡s&t |¡dSr)r?r@rbr“Úmakedirs)rnrbr r r rv/s rv)NF)r5r?r8r|Úior%rrÚerrorrr6Úimportlib.machineryrr rÚStringIOrÚBytesIOÚobjectr$r�r.r…r=r�r–r<rvr r r r Ús*(      ?