U
    [en$                     @   st  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ	 d dlm
Z
mZmZ d dlZd dlmZ d dlmZ d dlZddlmZmZmZ dZd	Zed
ZG dd deZdd Zdd Zdd Zdd Zdd Z dd Z!dd Z"dd Z#dd Z$dd  Z%d!d" Z&d#d$ Zd%d& Z'd9d'd(Z(d:d)d*Z)d+d, Z*d-d. Z+d/d0 Z,d1d2 Z-d3d4 Z.d5d6 Z/G d7d8 d8Z0dS );    N)parse_qs)	urlencodeurlparse
urlunparse)HTTPAdapter)PoolManager   )AuthCanceledAuthForbiddenAuthUnreachableProviderZSOCIAL_AUTHZpartial_pipeline_tokenZsocialc                       s6   e Zd ZdZ fddZd	ddZedd Z  ZS )
SSLHttpAdapterz "
    Transport adapter that allows to use any SSL protocol. Based on:
    http://requests.rtfd.org/latest/user/advanced/#example-specific-ssl-version
    c                    s   || _ t   d S N)ssl_protocolsuper__init__)selfr   	__class__ S/var/www/html/services/stratfitenv/lib/python3.8/site-packages/social_core/utils.pyr   !   s    zSSLHttpAdapter.__init__Fc                 C   s   t |||| jd| _d S )N)	num_poolsmaxsizeblockssl_version)r   r   poolmanager)r   connectionsr   r   r   r   r   init_poolmanager%   s    zSSLHttpAdapter.init_poolmanagerc                 C   s   t  }|dt| |S )Nhttps://)requestsSessionmountr   )clsr   sessionr   r   r   ssl_adapter_session-   s    z"SSLHttpAdapter.ssl_adapter_session)F)	__name__
__module____qualname____doc__r   r   classmethodr#   __classcell__r   r   r   r   r      s
   
r   c                 C   s   t |  tj|  S r   )
__import__sysmodules)namer   r   r   import_module4   s    r.   c                 C   s"   |  dd\}}t|}t||S )N.r   )rsplitr.   getattr)r-   modmembermoduler   r   r   module_member9   s    r5   c                   C   s
   dt j S )z5Builds a simple User-Agent string to send in requestszsocial-auth-)social_core__version__r   r   r   r   
user_agent?   s    r8   c                 C   s>   |r:t t| }t|d }|| t||d< t|} | S )zEAdds parameters to URL, parameter will be repeated if already present   )listr   r   updater   r   )urlparams	fragmentsvaluer   r   r   url_add_parametersD   s    
r@   c                  G   s   d dd | D S )N_c                 S   s    g | ]}|r|  d dqS )-rA   )upperreplace).0r-   r   r   r   
<listcomp>P   s      z#to_setting_name.<locals>.<listcomp>)joinnamesr   r   r   to_setting_nameO   s    rJ   c                  G   s   t tf|   S r   )rJ   SETTING_PREFIXrH   r   r   r   setting_nameS   s    rL   c              	   C   s^   |rt |dr|drdS zt|d p0| d }W n ttfk
rL   Y nX || krZ|S dS )z
    Given a list of hostnames and an untrusted URL to redirect to,
    this method tests it to make sure it isn't garbage/harmful
    and returns it, else returns None, similar as how's it done
    on django.contrib.auth.views.
    
startswithz///Nr   r   )hasattrrM   r   	TypeErrorAttributeError)hostsZredirect_tonetlocr   r   r   sanitize_redirectW   s    	rS   c                 C   s<   | r*t | dr*t| jr"|  }q8| j}n| r4d}nd}|S )Nis_authenticatedTF)rN   callablerT   )userauthenticatedr   r   r   user_is_authenticatedp   s    

rX   c                 C   s:   | r(t | dr(t| jr |  n| j}n| r2d}nd}|S )N	is_activeTF)rN   rU   rY   )rV   rY   r   r   r   user_is_active}   s    rZ   c                 C   sB   t dt| ddd} tdd|   } tdd| S )zConverts to lowercase, removes non-word characters (alphanumerics
    and underscores) and converts spaces to hyphens. Also strips leading
    and trailing whitespace.ZNFKDasciiignorez[^\w\s-] z[-\s]+rB   )	unicodedata	normalizestrencodedecoderesubstriplowerr?   r   r   r   slugify   s     rh   c                 C   s   |D ]}| |r|  S qdS )z<Return the first item in the list for what func returns TrueNr   )funcitemsitemr   r   r   first   s    rl   c                 C   s   t t| S )z@Like urlparse.parse_qs but transform list values to single items)
drop_listsbattery_parse_qsrg   r   r   r   r      s    r   c                 C   sR   i }|   D ]@\}}|d }t|tr0t|d}t|trDt|d}|||< q|S )Nr   utf-8)rj   
isinstancebytesr`   )r?   outkeyvalr   r   r   rm      s    




rm   c                 O   s   | j  }| dd}|p0||p0| j td }|r| j |}d}|r|j| jkrd}| j	|kr|j
d}	|| j	}
|	|
krd}|r|r|d| |d| || |S | j | d S )NZPARTIAL_PIPELINE_TOKEN_NAMEpartial_tokenFTuidrV   request)strategyrequest_datasettinggetZsession_getPARTIAL_TOKEN_SESSION_NAMEZpartial_loadbackendr-   ZID_KEYkwargs
setdefaultZextend_kwargsZclean_partial_pipeline)r}   rV   ru   argsr~   ry   Zpartial_argument_namepartialZpartial_matches_requestZid_from_partialZid_from_requestr   r   r   partial_pipeline_data   s6    
 

r   c                 C   sH   |pd}| ds| dr |S | dr@| dr@|dd }| | S )z-Build absolute URI with given (optional) pathr]   http://r   /r   N)rM   endswith)Zhost_urlpathr   r   r   build_absolute_uri   s    r   c                 C   s4   t | tr| d} t |tr(|d}t| |S )zDCompare two values and prevent timing attacks for cryptographic use.ro   )rp   r`   ra   hmaccompare_digest)Zval1Zval2r   r   r   constant_time_compare   s
    



r   c                 C   s"   | o |  dp |  dp |  dS )Nr   r   r   )rM   rg   r   r   r   is_url   s    
r   c                 G   s8   |D ].}t |r|  S | |}t |r|  S qd S r   )r   rz   )r}   rI   r-   r?   r   r   r   setting_url   s    
r   c                    s   t   fdd}|S )Nc               
      s   z | |W S  t jk
r } zZ|jjdkr@t| d |jdn6|jjdkrZt| d n|jjdkrtt| d n W 5 d }~X Y nX d S )Ni  r   )responsei  i  )r   	HTTPErrorr   status_coder	   r
   r   )r   r~   errri   r   r   wrapper   s    z#handle_http_errors.<locals>.wrapper)	functoolswraps)ri   r   r   r   r   handle_http_errors   s    r   c                 C   s   | r|  ds|  d} | S )zMake sure we append a slash at the end of the URL otherwise we
    have issues with urljoin Example:
    >>> urlparse.urljoin('http://www.example.com/api/v3', 'user/1/')
    'http://www.example.com/api/user/1/'
    r   )r   )r<   r   r   r   append_slash  s    
r   c                 O   s    t | }t |}||f||S r   )r5   )rx   Zstorager   r~   ZStrategyZStorager   r   r   get_strategy  s    r   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	cachez
    Cache decorator that caches the return value of a method for a
    specified time.

    It maintains a cache per class, so subclasses have a different cache entry
    for the same cached method.

    Does not work for methods with arguments.
    c                 C   s   || _ i | _d S r   )ttlr   )r   r   r   r   r   r   '  s    zcache.__init__c                    s    fdd}j |_|S )Nc                    sz   t   }d }d }| jjkr,j| j \}}|r>|| jkrvz | }||fj| j< W n tk
rt   |sp Y nX |S r   )timer   r   r   	Exception)thisnowZlast_updatedZcached_valuefnr   r   r   wrapped,  s    zcache.__call__.<locals>.wrapped)_invalidateZ
invalidate)r   r   r   r   r   r   __call__+  s    zcache.__call__c                 C   s   | j   d S r   )r   clear)r   r   r   r   r   ?  s    zcache._invalidateN)r$   r%   r&   r'   r   r   r   r   r   r   r   r     s   
r   )NN)N)1r   r   loggingrc   r+   r   r^   urllib.parser   rn   r   r   r   r   Zrequests.adaptersr   Z%requests.packages.urllib3.poolmanagerr   r6   
exceptionsr	   r
   r   rK   r|   	getLoggerZsocial_loggerr   r.   r5   r8   r@   rJ   rL   rS   rX   rZ   rh   rl   rm   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sN   

'

	
