3
BQ¼YQ  ã               @   sŽ   d dl Z y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jt|ƒƒ d S )NzPredicate cannot be none.)Ú	TypeErrorr   Úappendr	   )r   Ú	predicater   r   r   Úsatisfy_exact$   s    zVerifier.satisfy_exactc             C   s"   t |dƒstdƒ‚| j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 )N)r   )r   r   r   r   r   r   .   s    zVerifier.verify_exactNc             C   s   t t|ƒƒ}| j||||ƒS )N)r
   r   Úverify_discharge)r   ÚmacaroonÚkeyÚdischarge_macaroonsr   r   r   Úverify1   s    zVerifier.verifyc             C   s^   t ||jƒ}| j||||ƒ}||kr>tjt|ƒjtj|ƒƒƒ}| j|j	tj|ƒƒ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   s2   x,|j D ]"}| j|||||ƒr| j||ƒ}qW |S )N)ZcaveatsÚ_caveat_metÚ_update_signature)r   r'   r    r"   Ú	signatureÚcaveatr   r   r   r$   Q   s    zVerifier._verify_caveatsc             C   s2   |j ƒ r| jj| ||ƒS | jj| |||||ƒS d S )N)Ú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(   |j ƒ r| jj||ƒS | jj||ƒS d S )N)r,   r   Zupdate_signaturer   )r   r+   r*   r   r   r   r)   m   s
    zVerifier._update_signaturec             C   s   t t|ƒt|ƒƒS )N)Ú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   