o
    gfu"                     @   s<  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	 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 ze ZdZW n eya   dZY nw zd dlmZ W n eyz   		d<ddZY nw zd dlmZ  W n ey   dd Z Y nw z
d dlm!Z! e! W n ey   dZ!Y nw eZe Ze"eddZ#de#fddZ$dd Z%dd fddZ&d=d d!Z'd=d"d#Z(dZ)e)se*d$Z)e)+ej, d%d& Z-d'd( Z.d)d* Z/d+d, Z0d-d. Z1G d/d0 d0eZ2d1d2 Z3d3d4 Z4d5d6 Z5d7d8 Z6d9d: Z7e8d;krd dl9Z9e9:  dS dS )>    N)urlopen)	parse_qsl)defaultdict)settings)Model)	get_model)ContentType)SimpleLazyObject)import_moduleTF)get_random_string   >abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789c                    sH   t sttdt t tjf 	  d
 fddt| D S )Nz%s%s%s c                    s   g | ]}t  qS  )randomchoice).0iallowed_charsr   R/var/www/html/humari/django-venv/lib/python3.10/site-packages/social_auth/utils.py
<listcomp>'   s    z!random_string.<locals>.<listcomp>)using_sysrandomr   seedhashlibsha256getstatetimer   
SECRET_KEYdigestjoinrange)lengthr   r   r   r   random_string   s   r#   )constant_time_comparec                 C   sH   t | t |kr
dS d}t| |D ]\}}|t|t|A O }q|dkS )NFr   )lenzipord)val1val2resultxyr   r   r   
ct_compare-   s   r-   )empty$SOCIAL_AUTH_LOG_SANITIZE_LEAVE_CHARS   c                 C   s0   | d| t | | d  }|r|| |S |S )a=  
    Clean private/secret data from log statements and other data.

    Assumes data and secret are strings. Replaces all but the first
    `leave_characters` of `secret`, as found in `data`, with '*'.

    If no data is given, all but the first `leave_characters` of secret
    are simply replaced and returned.
    N*)r%   replace)secretdataleave_charactersreplace_secretr   r   r   sanitize_log_dataC   s   

r7   c                 C   sD   |sdS z	t  |d }W n
 ty   Y dS w |r || kr dS |S )a  
    Given the hostname 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.

    >>> print sanitize_redirect('myapp.com', None)
    None
    >>> print sanitize_redirect('myapp.com', '')
    None
    >>> print sanitize_redirect('myapp.com', {})
    None
    >>> print sanitize_redirect('myapp.com', 'http://notmyapp.com/path/')
    None
    >>> print sanitize_redirect('myapp.com', 'http://myapp.com/path/')
    http://myapp.com/path/
    >>> print sanitize_redirect('myapp.com', '/path/')
    /path/
    N   )urlparse	TypeError)hostredirect_tonetlocr   r   r   sanitize_redirectV   s   r>   c                 C   s   | S Nr   )r+   r   r   r   <lambda>z   s    r@   c           
      C   s   ddl m}m}m}m} tt}| }| D ].}||| }	t|	|r*|d | qt|	|r7|d | qt|	|rC|d | qt	|S )zGroup items by backend type.r   )get_backends
OpenIdAuth	BaseOAuth
BaseOAuth2openidoauth2oauth)
social_auth.backendsrA   rB   rC   rD   r   list
issubclassappenddict)
itemskeyrA   rB   rC   rD   r*   backendsitembackendr   r   r   group_backend_by_typez   s   


rR   c                 C   s   t t| |S )z5Return setting value for given name or default value.)getattrr   )namedefaultr   r   r   setting   s   rV   c                 C   sH   t | }d| dd|f }tt|rt|S tt|r"t|S |S )z
    Looks for setting value following these rules:
        1. Search for <backend_name> prefixed setting
        2. Search for setting given by name
        3. Return default
    z%s_%s-_)get_backend_nameupperr2   hasattrr   rV   )rQ   rT   rU   backend_namesetting_namer   r   r   backend_setting   s   

r^   
SocialAuthc                 O   s(   t jt jt jt jd|  |i | dS )z&Small wrapper around logger functions.)debugerror	exceptionwarnN)loggerr`   ra   rb   rc   )levelargskwargsr   r   r   log   s   
rh   c                 C   s$   t | tr| jtj| jd} | S )z{Converts values that are instance of Model to a dictionary
    with enough information to retrieve the instance back later.)pkctype)
isinstancer   ri   r   objectsget_for_model)valr   r   r   model_to_ctype   s
   
ro   c                 C   sH   t | tr"d| v r"d| v r"tj| d }| }|jj| d d} | S )z<Converts back the instance saved by model_to_ctype function.ri   rj   )ri   )rk   rL   r   rl   
get_for_idmodel_classget)rn   rj   
ModelClassr   r   r   ctype_to_model   s
   rt   c                 C   s*   t dd}|| jv r| j|d dS dS )z%Cleans any data for partial pipeline. SOCIAL_AUTH_PARTIAL_PIPELINE_KEYpartial_pipelineN)rV   sessionpop)requestrT   r   r   r   clean_partial_pipeline   s   

rz   c                 C   s>   |rt t| }tt|d |  |d< t|} | S )zEAdds parameters to URL, parameter will be repeated if already presentr0   )rI   r9   urllib	urlencoder   rM   
urlunparse)urlparams	fragmentsr   r   r   url_add_parameters   s   

r   c                   @   s    e Zd ZdZdd Zdd ZdS )LazyDictzLazy dict initialization.c                 C   s   | j tu r	|   | j | S r?   _wrappedr.   _setup)selfrT   r   r   r   __getitem__   s   

zLazyDict.__getitem__c                 C   s    | j tu r	|   || j |< d S r?   r   )r   rT   valuer   r   r   __setitem__   s   
zLazyDict.__setitem__N)__name__
__module____qualname____doc__r   r   r   r   r   r   r      s    r   c                  O   s*   t d}|rd|vr||d< t| i |S )zLike urllib2.urlopen but sets a timeout defined by
    SOCIAL_AUTH_URLOPEN_TIMEOUT setting if defined (and not already in
    kwargs).SOCIAL_AUTH_URLOPEN_TIMEOUTtimeout)rV   r   )rf   rg   r   r   r   r   dsa_urlopen   s   r   c                 C   s   t t | d| dd S )NAUTH_BACKENDrT   )rS   )rQ   r   r   r   rY      s   rY   c                  C   s>   t tdd pt tdd pd} | dkrt| d jjrd} | S )NSOCIAL_AUTH_USER_MODELAUTH_USER_MODEL	auth.User.)rS   r   r   split_metaproxy)
user_modelr   r   r   $get_custom_user_model_for_migrations   s   
r   c           	      C   s   t tdd}| dkrDddlm} ddlm} ddlm} | d\}} z||}W n |y7   ||}Y |S w |	|}|
 j}|S i }|S )	NINITIAL_CUSTOM_USER_MIGRATIONz0001_initial.pyr   r   )
Migrations)NoMigrations)freeze_appsr   )rS   r   south.migration.baser   south.exceptionsr   south.creator.freezerr   r   	migrationmigration_classmodels)	r   migration_namer   r   r   user_appuser_migrationsextra_modelinitial_user_migrationr   r   r   custom_user_frozen_models   s&   


r   c                 C   s"   |  dd\}}t|}t||S )Nr   r8   )rsplitr
   rS   )rT   modmembermoduler   r   r   module_member  s   
r   __main__)r   r   r?   );r   r   r   r9   r{   loggingurllib2r   cgir   collectionsr   django.confr   django.db.modelsr   django.db.models.loadingr   "django.contrib.contenttypes.modelsr   django.utils.functionalr	   django.utils.importlibr
   SystemRandomr   NotImplementedErrordjango.utils.cryptor   r#   ImportErrorr$   r-   r.   rS   LEAVE_CHARSr7   r>   rR   rV   r^   rd   	getLoggersetLevelDEBUGrh   ro   rt   rz   r   r   r   rY   r   r   r   r   doctesttestmodr   r   r   r   <module>   s    
$


	


