
    !<i                        d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ ddl	m
Z
 ddl	mZ ddl	mZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ dZdZ G d d          Zd Zd ZdS )    N)	to_nativegenerate_token)extract_params   )prepare_form_encoded_body)prepare_headers)prepare_request_uri_query)SIGNATURE_HMAC_SHA1)SIGNATURE_PLAINTEXT)SIGNATURE_RSA_SHA1)SIGNATURE_TYPE_BODY)SIGNATURE_TYPE_HEADER)SIGNATURE_TYPE_QUERY)sign_hmac_sha1)sign_plaintext)sign_rsa_sha1)OAuth1Requestz!application/x-www-form-urlencodedzmultipart/form-datac            
       n    e Zd ZeeeeeeiZ	e
d             Zddddddeeddf
dZd Zd Zd Zd Zd	 ZdS )

ClientAuthc                     || j         |<   dS )a  Extend client signature methods.

        :param name: A string to represent signature method.
        :param sign: A function to generate signature.

        The ``sign`` method accept 2 parameters::

            def custom_sign_method(client, request):
                # client is the instance of Client.
                return "your-signed-string"


            Client.register_signature_method("custom-name", custom_sign_method)
        N)SIGNATURE_METHODS)clsnamesigns      /Users/kimhansen/Desktop/03 Workspace/ceo-agents/chl-effectiveness/mcp-servers/whoop/.venv/lib/python3.11/site-packages/authlib/oauth1/rfc5849/client_auth.pyregister_signature_methodz$ClientAuth.register_signature_method"   s      '+d###    NFc                     || _         || _        || _        || _        || _        || _        |	| _        || _        || _        |
| _	        || _
        d S N)	client_idclient_secrettokentoken_secretredirect_urisignature_methodsignature_typersa_keyverifierrealmforce_include_body)selfr!   r"   r#   r$   r%   r(   r)   r&   r'   r*   r+   s               r   __init__zClientAuth.__init__4   s]     #*
(( 0, 
"4r   c                     | j                             | j                  }|st          d          t	          ||||          } || |          S )ax  Get an OAuth signature to be used in signing a request.

        To satisfy `section 3.4.1.2`_ item 2, if the request argument's
        headers dict attribute contains a Host item, its value will
        replace any netloc part of the request argument's uri attribute
        value.

        .. _`section 3.4.1.2`: https://tools.ietf.org/html/rfc5849#section-3.4.1.2
        zInvalid signature method.)bodyheaders)r   getr&   
ValueErrorr   )r,   methodurir0   r/   r   requests          r   get_oauth_signaturezClientAuth.get_oauth_signatureN   s\     %))$*?@@ 	:8999$HHHtD'"""r   c                 
   d|fd|fdd| j         fd| j        fg}| j        r|                    d| j        f           | j        r|                    d| j        f           | j        r|                    d| j        f           |S )	Noauth_nonceoauth_timestamp)oauth_versionz1.0oauth_signature_methodoauth_consumer_keyoauth_tokenoauth_callbackoauth_verifier)r&   r!   r#   appendr%   r)   )r,   nonce	timestampoauth_paramss       r   get_oauth_paramszClientAuth.get_oauth_params_   s    E"	*$%t'<=!4>2
 : 	=
 ;<<< 	G!143D EFFF= 	C!14= ABBBr   c                 n   | j         t          k    rt          ||| j                  }n| j         t          k    rIt
          |                    dd          v r+t          |          pg }t          ||          }t
          |d<   n0| j         t          k    rt          ||          }nt          d          |||fS )N)r*   Content-Type z!Unknown signature type specified.)r'   r   r	   r*   r   CONTENT_TYPE_FORM_URLENCODEDr1   r   r   r   r
   r2   )r,   r4   r0   r/   rC   decoded_bodys         r   _renderzClientAuth._rendero   s    "777%lG4:NNNGG $777+w{{>2/N/NNN-d339r0|LL*F' $888+L#>>CC@AAAGT!!r   c                 p   t                      }t                      }|d}t          |          }|i }|                     ||          }|r|                    d          t
          k    rbt          j        t          j	        |          
                                          }|                    d|                    d          f           |                     ||||          \  }}}|                     ||||          }	|                    d|	f           |                     ||||          \  }}}|||fS )a5  Sign the HTTP request, add OAuth parameters and signature.

        :param method: HTTP method of the request.
        :param uri:  URI of the HTTP request.
        :param body: Body payload of the HTTP request.
        :param headers: Headers of the HTTP request.
        :return: uri, headers, body
        Nr   rF   oauth_body_hashzutf-8oauth_signature)generate_noncegenerate_timestampstrrD   r1   rH   base64	b64encodehashlibsha1digestr@   decoderJ   r6   )
r,   r3   r4   r0   r/   rA   rB   rC   rL   sigs
             r   r   zClientAuth.sign}   s<      &((	<D 	NN	?G,,UI>>  	VGKK//3OOO$.w|D/A/A/H/H/J/JKKO!2O4J4J74S4S TUUU!\\#wlKKWd&&vsGTBB.4555!\\#wlKKWdGT!!r   c                    t          |                    dd                    }| j        t          k    rt          }n|st          |          rt          }t          |v rPt          |d<   t          |t                    r|                                }| 	                    ||||          \  }}}nB| j
        r| 	                    ||||          \  }}}n| 	                    |||d          \  }}}d}|||fS )zAdd OAuth parameters to the request.

        Parameters may be included from the body if the content-type is
        urlencoded, if no content type is set, a guess is made.
        rF   rG   r   )r   r1   r'   r   rH   r   
isinstancebytesrV   r   r+   )r,   r3   r4   r0   r/   content_type_s          r   preparezClientAuth.prepare   s    !^R!@!@AA"5557LL 	8."6"6 	87L'<77&BGN#$&& %{{}}!%63!F!FC$$$ 	!%63!F!FC$$ #iiWcBBOC!DGT!!r   )__name__
__module____qualname__r   r   r   r   r   r   r   classmethodr   r   r-   r6   rD   rJ   r   r]    r   r   r   r      s        ^M^ + + [+( ,, 5 5 5 54# # #"   " " """ "" ""H" " " " "r   r   c                      t                      S r    r   rb   r   r   rN   rN      s    r   c                  \    t          t          t          j                                        S r    )rP   inttimerb   r   r   rO   rO      s    s49;;   r   )rQ   rS   rf   authlib.common.encodingr   authlib.common.securityr   authlib.common.urlsr   
parametersr   r	   r
   	signaturer   r   r   r   r   r   r   r   r   wrapperr   rH   CONTENT_TYPE_MULTI_PARTr   rN   rO   rb   r   r   <module>rn      s      - - - - - - 2 2 2 2 2 2 . . . . . . 1 1 1 1 1 1 ' ' ' ' ' ' 1 1 1 1 1 1 * * * * * * * * * * * * ) ) ) ) ) ) * * * * * * , , , , , , + + + + + + % % % % % % % % % % % % $ $ $ $ $ $ " " " " " "B / ^" ^" ^" ^" ^" ^" ^" ^"B  ! ! ! ! !r   