U
    ÓZjr!  ã                   @   sp  d Z ddlmZ ddlZ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
mZmZmZ ddlmZmZmZmZmZ ddlmZ d3dd	„Zer’endZeržend
Zd4dd„Zd5d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"„ Z#e $¡ a%da&e '¡ a(d#d$„ Z)e
fd%d&„Z*G d'd(„ d(e+ƒZ,e,ƒ Z-d)d*„ Z.d+d,„ Z/d-d.„ Z0G d/d0„ d0e+ƒZ1d1d2„ Z2dS )6z0
Useful functions used by the rest of paramiko.
é    )Ú
generatorsN)ÚDEBUGÚ	zero_byteÚ	xffffffffÚmax_byte)ÚPY2ÚlongÚbyte_chrÚbyte_ordÚb)Ú	SSHConfigFc              	   C   sº   t dƒ}d}|s0t| ƒdkr0t| d ƒdkr0d}t| ƒd r`t}|rHt}|dt| ƒd   |  } tdt| ƒdƒD ](}|d> t d| ||d … ¡d  }qp|r¶|t dƒdt| ƒ > 8 }|S )zTturns a normalized byte string into a long-int
    (adapted from Crypto.Util.number)r   é€   é   é   é    ú>Ié   )r   Úlenr
   r   r   ÚrangeÚstructÚunpack)ÚsZalways_positiveÚoutÚnegativeZfillerÚi© r   úP/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/paramiko/util.pyÚinflate_long%   s     &r   éÿ   Tc                 C   sè   t ƒ }t| ƒ} | dkr<| dkr<t d| t@ ¡| }| dL } qt|ƒD ]4}| dkr`|d tkr` q�| dkrD|d tkrD q�qDd}| dkrŒt}nt	}||d d… }|rä| dkrÄt
|d ƒdkrÄt| }| dkrät
|d ƒdk rät	| }|S )	zTturns a long-int into a normalized byte string
    (adapted from Crypto.Util.number)r   éÿÿÿÿr   r   r   )r   Nr   )Úbytesr   r   Úpackr   Ú	enumerateÚdeflate_zeroÚ
deflate_ffr   r   r
   )ÚnZadd_sign_paddingr   r   r   r   r   Údeflate_long>   s*    
r&   Ú c                    sp   d}g }t | ƒ|d kr<| t| ||d … ƒ¡ |d7 }q|t | ƒk r^| t| |d … ƒ¡ ‡ fdd„|D ƒS )Nr   é   c                    s   g | ]}ˆ | ‘qS r   r   )Ú.0Úline©Úprefixr   r   Ú
<listcomp>e   s     z!format_binary.<locals>.<listcomp>)r   ÚappendÚformat_binary_line)Údatar,   Úxr   r   r+   r   Úformat_binary]   s    
r2   c                 C   s4   d  dd„ | D ƒ¡}d  dd„ | D ƒ¡}d ||¡S )Nú c                 S   s   g | ]}d   t|ƒ¡‘qS )z{:02X}©Úformatr
   ©r)   Úcr   r   r   r-   i   s     z&format_binary_line.<locals>.<listcomp>r'   c                 S   s*   g | ]"}d   t|ƒ¡t|ƒd d  ‘qS )z.{:c}..é?   é_   r4   r6   r   r   r   r-   k   s     z	{:50s} {})Újoinr5   )r0   ÚleftÚrightr   r   r   r/   h   s
    ÿr/   c                 C   sR   d}| D ]D}t |ƒ}d|  kr(dkr:n n|t|ƒ7 }q|td |¡ƒ7 }q|S )Nó    r   é   z%{:02X})r
   r	   r   r5   )r   r   r7   r   r   r   r   Úsafe_stringp   s    r?   c                 C   sr   z
|   ¡ W S  tk
rl   t| dƒ}t|d ƒ}|dkr>Y dS t|ƒd }|d@ sd|dK }|d8 }qJ| Y S X d S )NFr   r   r   r   )Ú
bit_lengthÚAttributeErrorr&   r
   r   )r%   ZnormZhbyteZbitlenr   r   r   r@   {   s    


r@   c                   C   s   d  tjt ¡ Ž ¡ d¡S )Nr'   Ú
)r:   Ú	tracebackÚformat_exceptionÚsysÚexc_infoÚsplitr   r   r   r   Ú
tb_stringsŠ   s    rH   c                 C   s”   t ƒ }t ƒ }t|ƒdkr$|dd… }|dkr�| ƒ }t|ƒdkrH| |¡ | t|ƒ¡ | |¡ | ¡ }t|t|ƒƒ}||d|… 7 }||8 }q$|S )a  
    Given a password, passphrase, or other human-source key, scramble it
    through a secure hash into some keyworthy bytes.  This specific algorithm
    is used for encrypting/decrypting private key files.

    :param function hash_alg: A function which creates a new hash object, such
        as ``hashlib.sha256``.
    :param salt: data to salt the hash with.
    :type salt: byte string
    :param str key: human-entered password or passphrase.
    :param int nbytes: number of bytes to generate.
    :return: Key data `str`
    r   Nr   )r    r   Úupdater   ÚdigestÚmin)Zhash_algÚsaltÚkeyÚnbytesZkeydatarJ   Zhash_objÚsizer   r   r   Úgenerate_key_bytesŽ   s    


rP   c                 C   s   ddl m} || ƒS )aŽ  
    Read a file of known SSH host keys, in the format used by openssh, and
    return a compound dict of ``hostname -> keytype ->`` `PKey
    <paramiko.pkey.PKey>`. The hostname may be an IP address or DNS name.  The
    keytype will be either ``"ssh-rsa"`` or ``"ssh-dss"``.

    This type of file unfortunately doesn't exist on Windows, but on posix,
    it will usually be stored in ``os.path.expanduser("~/.ssh/known_hosts")``.

    Since 1.5.3, this is just a wrapper around `.HostKeys`.

    :param str filename: name of the file to read host keys from
    :return:
        nested dict of `.PKey` objects, indexed by hostname and then keytype
    r   )ÚHostKeys)Zparamiko.hostkeysrQ   )ÚfilenamerQ   r   r   r   Úload_host_keys­   s    rS   c                 C   s   t ƒ }| | ¡ |S )z‘
    Provided only as a backward-compatible wrapper around `.SSHConfig`.

    .. deprecated:: 2.7
        Use `SSHConfig.from_file` instead.
    )r   Úparse)Zfile_objÚconfigr   r   r   Úparse_ssh_configÂ   s    
rV   c                 C   s
   |  | ¡S )zM
    Provided only as a backward-compatible wrapper around `.SSHConfig`.
    )Úlookup)ÚhostnamerU   r   r   r   Úlookup_ssh_host_configÎ   s    rY   c           	      C   s|   dd|  }}}dd|   }}}|dkrh|| }||||   }}||||   }}||||   }}q |dk rx||7 }|S )Nr   r   r   )	r1   ÚmÚu1Úu2Úu3Zv1Zv2Zv3Úqr   r   r   Úmod_inverseÕ   s    r_   c                   C   sF   zt jW S  tk
r@   t� td7 att _W 5 Q R X t j Y S X d S )Nr   )Ú_g_thread_dataÚidrA   Ú_g_thread_lockÚ_g_thread_counterr   r   r   r   Úget_thread_idé   s    rd   c                 C   sf   t  d¡}t|jƒdkrdS | |¡ t| dƒ}t  |¡}d}|d7 }| t  |d¡¡ | 	|¡ dS )zKsend paramiko logs to a logfile,
    if they're not already going somewhereZparamikor   NÚaz>%(levelname)-.3s [%(asctime)s.%(msecs)03d] thr=%(_threadid)-3dz %(name)s: %(message)sz%Y%m%d-%H:%M:%S)
ÚloggingÚ	getLoggerr   ÚhandlersÚsetLevelÚopenÚStreamHandlerÚsetFormatterÚ	FormatterÚ
addHandler)rR   ÚlevelÚloggerÚfÚhandlerZfrmr   r   r   Úlog_to_fileô   s    



rs   c                   @   s   e Zd Zdd„ ZdS )ÚPFilterc                 C   s   t ƒ |_dS )NT)rd   Z	_threadid)ÚselfÚrecordr   r   r   Úfilter  s    zPFilter.filterN)Ú__name__Ú
__module__Ú__qualname__rw   r   r   r   r   rt     s   rt   c                 C   s   t  | ¡}| t¡ |S ©N)rf   rg   Ú	addFilterÚ_pfilter)Únamerp   r   r   r   Ú
get_logger  s    

r   c              
   C   s@   z| ƒ W S  t k
r8 } z|jtjkr(‚ W 5 d}~X Y q X q dS )z6Retries function until it doesn't raise an EINTR errorN)ÚEnvironmentErrorÚerrnoZEINTR)ÚfunctionÚer   r   r   Úretry_on_signal  s
    r„   c                 C   sV   t | ƒt |ƒkrdS d}tr tntt | ƒƒD ] }|t| | ƒt|| ƒA O }q,|dkS )NFr   )r   r   Úxranger   r
   )re   r   Úresr   r   r   r   Úconstant_time_bytes_eq  s    r‡   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚClosingContextManagerc                 C   s   | S r{   r   )ru   r   r   r   Ú	__enter__(  s    zClosingContextManager.__enter__c                 C   s   |   ¡  d S r{   )Úclose)ru   ÚtypeÚvaluerC   r   r   r   Ú__exit__+  s    zClosingContextManager.__exit__N)rx   ry   rz   r‰   r�   r   r   r   r   rˆ   '  s   rˆ   c                 C   s   t | t||ƒƒS r{   )ÚmaxrK   )ÚminimumÚvalÚmaximumr   r   r   Úclamp_value/  s    r’   )F)T)r'   )3Ú__doc__Ú
__future__r   r�   rE   r   rC   Ú	threadingrf   Zparamiko.commonr   r   r   r   Zparamiko.py3compatr   r   r	   r
   r   Zparamiko.configr   r   r#   r$   r&   r2   r/   r?   r@   rH   rP   rS   rV   rY   r_   Úlocalr`   rc   ÚLockrb   rd   rs   Úobjectrt   r}   r   r„   r‡   rˆ   r’   r   r   r   r   Ú<module>   sH   




