U
    BQ¼YQ  ã                   @   sŽ   d dl Z zd dlmZ W n  ek
r8   d dlmZ Y nX d dlmZ d dl	m
Z
 d dlmZmZ d dlmZmZmZmZ G dd	„ d	eƒZdS )
é    N)Úcompare_digest)Úequals)ÚHashSignaturesBinder)Ú!MacaroonInvalidSignatureException)Ú FirstPartyCaveatVerifierDelegateÚ ThirdPartyCaveatVerifierDelegate)Úconvert_to_bytesÚconvert_to_stringÚgenerate_derived_keyÚhmac_digestc                   @   s`   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zdd
d„Zddd„Zdd„ Z	dd„ Z
dd„ Zdd„ Zd	S )ÚVerifierc                 C   s*   g | _ | jg| _d | _tƒ | _tƒ | _d S ©N)Ú
predicatesÚverify_exactÚ	callbacksÚcalculated_signaturer   Ú$first_party_caveat_verifier_delegater   Ú$third_party_caveat_verifier_delegate)Úself© r   ú6/usr/lib/python3/dist-packages/pymacaroons/verifier.pyÚ__init__   s    
ÿÿzVerifier.__init__c                 C   s$   |d krt dƒ‚| j t|ƒ¡ d S )NzPredicate cannot be none.)Ú	TypeErrorr   Úappendr	   ©r   Z	predicater   r   r   Úsatisfy_exact$   s    zVerifier.satisfy_exactc                 C   s"   t |dƒstdƒ‚| j |¡ d S )NÚ__call__z*General caveat verifiers must be callable.)Úhasattrr   r   r   )r   Úfuncr   r   r   Úsatisfy_general)   s    
zVerifier.satisfy_generalc                 C   s
   || j kS r   )r   r   r   r   r   r   .   s    zVerifier.verify_exactNc                 C   s   t t|ƒƒ}|  ||||¡S r   )r
   r   Úverify_discharge)r   ÚmacaroonÚkeyÚdischarge_macaroonsr   r   r   Úverify1   s    üzVerifier.verifyc                 C   s^   t ||jƒ}|  ||||¡}||kr>t t|ƒ t |¡¡¡}|  |j	t |¡¡sZt
dƒ‚dS )NzSignatures do not matchT)r   Zidentifier_bytesÚ_verify_caveatsÚbinasciiZ	unhexlifyr   Zbind_signatureZhexlifyÚ_signatures_matchZsignature_bytesr   )r   ÚrootZ	discharger"   r#   r   r   r   r   r    :   s,     ÿ   ÿÿÿþzVerifier.verify_dischargec                 C   s.   |j D ]"}|  |||||¡r|  ||¡}q|S r   )ZcaveatsÚ_caveat_metÚ_update_signature)r   r(   r!   r#   Ú	signatureÚcaveatr   r   r   r%   Q   s    
üzVerifier._verify_caveatsc                 C   s2   |  ¡ r| j | ||¡S | j | |||||¡S d S r   )Úfirst_partyr   Zverify_first_party_caveatr   Zverify_third_party_caveat)r   r(   r,   r!   r#   r+   r   r   r   r)   [   s       þÿ    üÿzVerifier._caveat_metc                 C   s(   |  ¡ r| j ||¡S | j ||¡S d S r   )r-   r   Zupdate_signaturer   )r   r,   r+   r   r   r   r*   m   s     þÿ þÿzVerifier._update_signaturec                 C   s   t t|ƒt|ƒƒS r   )Úconstant_time_comparer   )r   Zmacaroon_signatureZcomputed_signaturer   r   r   r'   {   s    þzVerifier._signatures_match)N)N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r$   r    r%   r)   r*   r'   r   r   r   r   r      s   
	

r   )r&   Zhmacr   r.   ÚImportErrorZpymacaroons.utilsr   Zpymacaroons.bindersr   Zpymacaroons.exceptionsr   Zpymacaroons.caveat_delegatesr   r   r   r	   r
   r   Úobjectr   r   r   r   r   Ú<module>   s   