
    i9	                     j    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          Z G d d          ZdS )    Ntime)DictOptionalUnionc                   *    e Zd Zedefd            ZdS )Clockreturnc                      t                      S )Nr        S/root/projects/butler/venv/lib/python3.11/site-packages/slack/signature/verifier.pynowz	Clock.now   s    vvr   N)__name__
__module____qualname__staticmethodfloatr   r   r   r   r	   r	      s9            \  r   r	   c                       e Zd Z e            fdedefdZdeeef         deeef         de	fdZ
deeef         ded	ede	fd
Zdedeeef         dee         fdZdS )SignatureVerifiersigning_secretclockc                 "    || _         || _        dS )aA  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://docs.slack.dev/authentication/verifying-requests-from-slack/
        N)r   r   )selfr   r   s      r   __init__zSignatureVerifier.__init__   s     -


r   bodyheadersr
   c                     |dS d |                                 D             }|                     ||                    dd          |                    dd                    S )(Verifies if the given signature is validNFc                 >    i | ]\  }}|                                 |S r   )lower).0kvs      r   
<dictcomp>z6SignatureVerifier.is_valid_request.<locals>.<dictcomp>!   s&    GGGtq!aggiiGGGr   zx-slack-request-timestampzx-slack-signature)r   	timestamp	signature)itemsis_validget)r   r   r   normalized_headerss       r   is_valid_requestz"SignatureVerifier.is_valid_request   sp     ?5GGw}}GGG}}(,,-H$OO(,,-@$GG  
 
 	
r   r&   r'   c                     ||dS t          | j                                        t          |          z
            dk    rdS |                     ||          }|dS t          j        ||          S )r   NFi,  )r&   r   )absr   r   intgenerate_signaturehmaccompare_digest)r   r   r&   r'   calculated_signatures        r   r)   zSignatureVerifier.is_valid(   s|     	 15tz~~#i..011F::5#66QU6VV'5"#7CCCr   c                V   |dS |d}t          |t                    r|                    d          }t                              d| d|           }t                              | j                  }t          j        ||t          j	                  
                                }d| }|S )zGenerates a signatureN zutf-8zv0::zv0=)
isinstancebytesdecodestrencoder   r1   newhashlibsha256	hexdigest)r   r&   r   
format_reqencoded_secretrequest_hashr3   s          r   r0   z$SignatureVerifier.generate_signature:   s    4<DdE"" 	(;;w''DZZ 8i 8 8$ 8 899
D$788x
GNKKUUWW3\33##r   N)r   r   r   r	   r:   r   r   r8   r   boolr,   r)   r   r0   r   r   r   r   r      s	       ;@577 	 	s 	5 	 	 	 	
CJ
 c3h
 
	
 
 
 
DCJD D 	D
 
D D D D$$s $%U
:K $PXY\P] $ $ $ $ $ $r   r   )	r=   r1   r   typingr   r   r   r	   r   r   r   r   <module>rE      s            ( ( ( ( ( ( ( ( ( (       :$ :$ :$ :$ :$ :$ :$ :$ :$ :$r   