o
    aqeE	                     @   sP   d dl Z d dlZd dlmZ d dlmZmZmZ G dd dZG dd dZdS )    Ntime)DictOptionalUnionc                   @   s   e Zd ZedefddZdS )Clockreturnc                   C   s   t  S )Nr    r	   r	   Y/var/www/html/humari/django-venv/lib/python3.10/site-packages/slack/signature/verifier.pynow   s   z	Clock.nowN)__name__
__module____qualname__staticmethodfloatr   r	   r	   r	   r
   r      s    r   c                   @   s   e Zd Ze fdedefddZdeeef deeef de	fdd	Z
deeef d
edede	fddZd
edeeef dee fddZdS )SignatureVerifiersigning_secretclockc                 C   s   || _ || _dS )a?  Slack request signature verifier

        Slack signs its requests using a secret that's unique to your app.
        With the help of signing secrets, your app can more confidently verify
        whether requests from us are authentic.
        https://api.slack.com/authentication/verifying-requests-from-slack
        N)r   r   )selfr   r   r	   r	   r
   __init__   s   
zSignatureVerifier.__init__bodyheadersr   c                 C   s>   |du rdS dd |  D }| j||dd|dddS )(Verifies if the given signature is validNFc                 S   s   i | ]	\}}|  |qS r	   )lower).0kvr	   r	   r
   
<dictcomp>!   s    z6SignatureVerifier.is_valid_request.<locals>.<dictcomp>zx-slack-request-timestampzx-slack-signature)r   	timestamp	signature)itemsis_validget)r   r   r   normalized_headersr	   r	   r
   is_valid_request   s   

z"SignatureVerifier.is_valid_requestr   r   c                 C   sX   |du s|du r
dS t | j t| dkrdS | j||d}|du r&dS t||S )r   NFi,  )r   r   )absr   r   intgenerate_signaturehmaccompare_digest)r   r   r   r   calculated_signaturer	   r	   r
   r!   (   s   zSignatureVerifier.is_validc                C   sp   |du rdS |du rd}t |tr|d}td| d| }t| j}t||tj	
 }d| }|S )zGenerates a signatureN zutf-8zv0::zv0=)
isinstancebytesdecodestrencoder   r(   newhashlibsha256	hexdigest)r   r   r   
format_reqencoded_secretrequest_hashr*   r	   r	   r
   r'   :   s   


z$SignatureVerifier.generate_signatureN)r   r   r   r   r0   r   r   r.   r   boolr$   r!   r   r'   r	   r	   r	   r
   r      s2    





r   )	r3   r(   r   typingr   r   r   r   r   r	   r	   r	   r
   <module>   s    