o
    
c+                     @   s   d dl Z d dlZd dlZd dlZd dlZddlmZ ddlmZ ddlm	Z	 e j
dkr4d dlZdd Znd dlZd	d Ze j
d
krEejZn	G dd dejZG dd deZdZdd Zdadd Zdd ZdddZdd Zdd ZdS )    N   )__version_verifier_modules__)ffiplatform)VerificationError)   r   c                   C   s   t jjd d  S N)	importlib	machineryEXTENSION_SUFFIXES r   r   :/opt/certbot/lib/python3.10/site-packages/cffi/verifier.py_extension_suffixes   s   r   c                   C   s   dd t  D S )Nc                 S   s    g | ]\}}}|t jkr|qS r   )impC_EXTENSION).0suffix_typer   r   r   
<listcomp>   s    
z'_extension_suffixes.<locals>.<listcomp>)r   get_suffixesr   r   r   r   r      s   r   c                       s   e Zd Z fddZ  ZS )NativeIOc                    s(   t |tr
|d}tt| | d S )Nascii)
isinstanceunicodeencodesuperr   write)selfs	__class__r   r   r      s   

zNativeIO.write)__name__
__module____qualname__r   __classcell__r   r   r    r   r      s    r   c                   @   s   e Zd Z			dddZd ddZd	d
 Zdd Zdd Zdd Zdd Z	dd Z
dd Zdd Zd ddZdd Zdd ZdS )!VerifierN F.cc                 K   sx  |j jrtd|j jf || _|| _|st|}t||}|| | _| j	| |	| _
| ||
| _|r=|r<tdnSddtjd d  t||g|j }tjdkrZ|d}tt|dd d d	@ }|d
d}tt|dd d d	@ }|dd}d|| jj||f }t d }|pt | _tj| j|| | _tj| j|| | _ || _!d| _"d| _#d S )NzKfeature not supported with ffi.verify(), but only with ffi.set_source(): %sz)can't specify both 'modulename' and 'tag' z%d.%d   r   zutf-8r   l    0xLr   0z_cffi_%s_%s%s%sF)$_parser_uses_new_featurer   ffipreambler   flatten_locate_engine_class_venginepatch_extension_kwdsflagsmake_relative_tokwds	TypeErrorjoinsysversion_infor   _cdefsourcesr   hexbinasciicrc32lstriprstrip
_class_key_get_so_suffixes_caller_dir_pycachetmpdirospathsourcefilenamemodulefilenameext_package_has_source_has_module)r   r0   r1   rF   
modulenamerK   tagforce_generic_enginesource_extensionr6   relative_tor8   flattened_kwdsvengine_classkeyk1k2r   r   r   r   __init__    sR   







zVerifier.__init__c                 C   sN   | j j | jr|du rtd| | W d   dS 1 s w   Y  dS )zkWrite the C source code.  It is produced in 'self.sourcefilename',
        which can be tweaked beforehand.Nzsource code already written)r0   _lockrL   r   _write_sourcer   filer   r   r   write_sourceI   s   
"zVerifier.write_sourcec                 C   sR   | j j | jrtd| js|   |   W d   dS 1 s"w   Y  dS )zWrite the C source code (if not done already) and compile it.
        This produces a dynamic link library in 'self.modulefilename'.zmodule already compiledN)r0   rY   rM   r   rL   rZ   _compile_moduler   r   r   r   compile_moduleR   s   

"zVerifier.compile_modulec                 C   s^   | j j! | js|   | js| js|   |   |  W  d   S 1 s(w   Y  dS )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)r0   rY   rM   _locate_modulerL   rZ   r^   _load_libraryr_   r   r   r   load_library\   s   
$zVerifier.load_libraryc                 C   sB   t j| j}|ddd }|drttdr|d d }|S )N.r   r   _dgettotalrefcount)rG   rH   basenamerJ   splitendswithhasattrr;   )r   rh   r   r   r   get_module_namel   s
   zVerifier.get_module_namec                 C   sn   t   | js"| jj | js|   W d    n1 sw   Y  t | j}|  }t j	||fi | j
S r   )r   _hack_at_distutilsrL   r0   rY   rZ   maybe_relative_pathrI   rl   get_extensionr8   )r   
sourcenamemodnamer   r   r   ro   w   s   
zVerifier.get_extensionc                 C   s   | j jS r   )r4   _gen_python_moduler_   r   r   r   generates_python_module   s   z Verifier.generates_python_modulec                    sz   |r;t j|r;t j| | }tjD ]%}||v r:|| }t|ttfs-t	d|f  fdd|D }|||< q|S )Nz&keyword '%s' should be a list or tuplec                    s   g | ]	}t j |qS r   )rG   rH   r:   )r   fndirnamer   r   r      s    z-Verifier.make_relative_to.<locals>.<listcomp>)
rG   rH   rv   copyr   LIST_OF_FILE_NAMESr   listtupler9   )r   r8   rR   rU   lstr   ru   r   r7      s   
zVerifier.make_relative_toc                 C   s   t j| js:| jr$zt| jd d dg}W n
 ty   Y d S w |j}nd }| j	| 
 |t }|d u r7d S || _| j  d| _d S )N__doc__T)rG   rH   isfilerJ   rK   
__import__ImportError__path__r4   find_modulerl   rD   collect_typesrM   )r   pkgrH   filenamer   r   r   ra      s"   

zVerifier._locate_modulec                 C   s(   || j _z| j   W | j `d S | j `w r   )r4   _fwrite_source_to_fr[   r   r   r   _write_source_to   s   zVerifier._write_source_toc                 C   s   |d ur|  | d S t }|  | | }tj| jr<t| jd}| |k }W d    n1 s6w   Y  nd}|r`t	| j t| jd}|
| W d    n1 s[w   Y  d| _d S )NrTw)r   r   getvaluerG   rH   existsrI   openread_ensure_dirr   rL   )r   r\   fsource_datafpneeds_writtenr   r   r   rZ      s"   


zVerifier._write_sourcec                 C   sn   t j| j}t||  }z	t|| j}W n t	y#   d}Y nw |s2t
| j t|| j d| _d S )NFT)rG   rH   rv   rI   r   compilero   samefilerJ   OSErrorr   shutilmoverM   )r   rF   outputfilenamesamer   r   r   r^      s   

zVerifier._compile_modulec                 C   s,   | j sJ | jd ur| j| jS | j S r   )rM   r6   r4   rc   r_   r   r   r   rb      s   


zVerifier._load_library)NNNr'   Fr(   NNr   )r"   r#   r$   rX   r]   r`   rc   rl   ro   rs   r7   ra   r   rZ   r^   rb   r   r   r   r   r&      s"    

)	


r&   Fc                 C   sv   t rd}|s'dtjv rd}nzdd l}W n ty   d}Y nw | j|ur'd}|r2ddlm} |jS ddlm	} |j
S )NT__pypy__r   ?r   )vengine_gen)vengine_cpy)_FORCE_GENERIC_ENGINEr;   builtin_module_names_cffi_backendr   _backendr'   r   VGenericEnginer   VCPythonEngine)r0   rP   r   r   r   r   r   r   r3      s"   

r3   c                  C   sH   t rt S tjd} | r| S tdjj}tj	tj
tj|dS )NCFFI_TMPDIRr*   __pycache__)_TMPDIRrG   environgetr;   	_getframef_codeco_filenamerH   abspathr:   rv   )resultr   r   r   r   rE      s   rE   c                 C   s   | a dS )z:Set the temporary directory to use instead of __pycache__.N)r   ru   r   r   r   
set_tmpdir  s   r   c              	   C   s  | pt  } zt| }W n
 ty   Y dS w |rd}nt d  }|D ]-}| drR| |s<| drRzttj	
| | W q% tyQ   Y q%w q%tj	
| dg}|D ]-}z"t|D ]}tj	
||}tj	|rz|| qet| qeW q] ty   Y q]w dS )z}Clean up the temporary directory by removing all files in it
    called `_cffi_*.{c,so}` as well as the `build` subdirectory.Nr(   r   _cffi_build)rE   rG   listdirr   rD   lower
startswithrj   unlinkrH   r:   isdirappend)rF   keep_sofilelistr   rt   	clean_dirdirr   r   r   cleanup_tmpdir  sD   
r   c                  C   s(   t  } | stjdkrdg} | S dg} | S )Nwin32z.pydz.so)r   r;   platform)suffixesr   r   r   rD   %  s   
rD   c                 C   s2   t j| }|rt j|st | d S d S d S r   )rG   rH   rv   r   makedirs)r   rv   r   r   r   r   0  s   r   )NF)r;   rG   r?   r   ior'   r   r   errorr   r<   importlib.machineryr   r   r   StringIOr   BytesIOobjectr&   r   r3   r   rE   r   r   rD   r   r   r   r   r   <module>   s,   (


 @

