o
    gf$                     @   sz   d Z ddlZddlZddlZddlmZmZ ddlmZ e	dej
ZG dd deZG dd	 d	eZG d
d deZdS )zModels mixins for Social Auth    N)datetime	timedeltaAssociationz[^\w.@+-_]+c                   @   s>  e Zd ZdZdZdd Zdd Zedd Zd8d	d
Z	dd Z
dd Zedd Zedd Zedd Zedd Zed9ddZedd Zedd Zedd Zed d! Zed"d# Zed$d% Zed&d' Zed(d) Zed*d+ Zed,d- Zed.d/ Zed0d1 Zed9d2d3Zed4d5 Zed6d7 Z dS ):UserSocialAuthMixin c                 C   s   dt | j| j f S )z-Return associated user unicode representationz%s - %s)unicodeuserprovidertitleself r   T/var/www/html/humari/django-venv/lib/python3.10/site-packages/social_auth/db/base.py__unicode__   s   zUserSocialAuthMixin.__unicode__c                 C   s   ddl m} | | jS )Nr   )get_backends)social_auth.backendsr   getr
   )r   r   r   r   r   get_backend   s   zUserSocialAuthMixin.get_backendc                 C   s   |   }|r|j| S i S )z0Return access_token stored in extra_data or None)r   AUTH_BACKENDtokens)r   backendr   r   r   r      s   zUserSocialAuthMixin.tokensTc                 C   sP   d| j v r"|  | j d | j}|r$|r&| jdd |   dS dS dS dS )z,Attempts to revoke permissions for provider.access_tokenN)r   r   revoke_tokenuid
extra_datapopsave)r   
drop_tokensuccessr   r   r   r   %   s   
z UserSocialAuthMixin.revoke_tokenc                 C   st   | j d}|r6|  }t|dr8||}|d}|sd S || j d< |d}|r0|| j d< |   d S d S d S )Nrefresh_tokenr   )r   r   r   hasattrr    r   )r   r    r   responsenew_access_tokennew_refresh_tokenr   r   r   r    0   s   





z!UserSocialAuthMixin.refresh_tokenc              	   C   sv   | j r7d| j v r9z	t| j d }W n ttfy   Y dS w t }|t| kr2t	|| S t
|dS dS dS )aN  Return provider session live seconds. Returns a timedelta ready to
        use with session.set_expiry().

        If provider returns a timestamp instead of session seconds to live, the
        timedelta is inferred from current time (using UTC timezone). None is
        returned if there's no value stored or it's invalid.
        expiresN)seconds)r   int
ValueError	TypeErrorr   utcnowtimemktime	timetuplefromtimestampr   )r   r%   nowr   r   r   expiration_datetimeB   s   
z'UserSocialAuthMixin.expiration_datetimec                 C      t dNzImplement in subclassNotImplementedErrorclsr   r   r   
user_modelZ      zUserSocialAuthMixin.user_modelc                 C   r1   r2   r3   r5   r   r   r   username_max_length^   r8   z'UserSocialAuthMixin.username_max_lengthc                 C   r1   r2   r3   r5   r   r   r   email_max_lengthb   r8   z$UserSocialAuthMixin.email_max_lengthc                 C   s   t d|S )Nr   )CLEAN_USERNAME_REGEXsub)r6   valuer   r   r   clean_usernamef   s   z"UserSocialAuthMixin.clean_usernameNc                 C   sZ   |d ur| j j|d}n| j j|d}|j|d}t|dr#| }nd}|p,| dkS )N)id)r
   )r	   has_usable_passwordTr   )objectsexcludefilterr!   r@   count)r6   r	   backend_nameassociation_idqsvalid_passwordr   r   r   allowed_to_disconnectj   s   

z)UserSocialAuthMixin.allowed_to_disconnectc                 C   s    t |dr	|j}nd}t||S NUSERNAME_FIELDusername)r!   rK   getattr)r6   r	   
field_namer   r   r   user_usernamey   s   

z!UserSocialAuthMixin.user_usernamec                 C   s&   |   }t|dr|d||j< |S rJ   )r7   r!   r   rK   )r6   valuesr7   r   r   r   username_field   s   
z"UserSocialAuthMixin.username_fieldc                 O   s(   |  |}|  jj|i | dkS )z
        Return True/False if a User instance exists with the given arguments.
        Arguments are directly passed to filter() manager method.
        TODO: consider how to ensure case-insensitive email matching
        r   )rQ   r7   rA   rC   rD   r6   argskwargsr   r   r   simple_user_exists   s   
z&UserSocialAuthMixin.simple_user_existsc                 O   s    |  |}|  jj|i |S N)rQ   r7   rA   create_userrR   r   r   r   rW      s   
zUserSocialAuthMixin.create_userc              	   C   s0   z
|   jj|dW S  |   jy   Y d S w N)pk)r7   rA   r   DoesNotExist)r6   rY   r   r   r   get_user   s
   zUserSocialAuthMixin.get_userc                 C   s   |   jj|dS )zCase insensitive search)email__iexact)r7   rA   r   )r6   emailr   r   r   get_user_by_email   s   z%UserSocialAuthMixin.get_user_by_emailc                 C   s$   t ||  r	|S |  jj|dS rX   )
isinstancer7   rA   r   )r6   
user_or_idr   r   r   resolve_user_or_id   s   z&UserSocialAuthMixin.resolve_user_or_idc                 C   s<   t |ts	t|}z	| jj||dW S  | jy   Y d S w )N)r
   r   )r_   
basestringstrrA   r   rZ   )r6   r
   r   r   r   r   get_social_auth   s   
z#UserSocialAuthMixin.get_social_authc                 C   s
   |j  S rV   )social_authall)r6   r	   r   r   r   get_social_auth_for_user   s   
z,UserSocialAuthMixin.get_social_auth_for_userc                 C   s$   t |ts	t|}| jj|||dS )N)r	   r   r
   )r_   rb   rc   rA   create)r6   r	   r   r
   r   r   r   create_social_auth   s   
z&UserSocialAuthMixin.create_social_authc                 C   s   ddl m} ||jd}z|jjdi |}W n |jy(   |di |}Y nw t|j|_|j	|_	|j
|_
|j|_|  d S )Nr   r   
server_urlhandler   )social_auth.modelsr   rl   rA   r   rZ   base64encodestringsecretissuedlifetime
assoc_typer   )r6   rk   associationr   rS   assocr   r   r   store_association   s   z%UserSocialAuthMixin.store_associationc                 C   sB   ddl m} t|jj||d}t|dk}|D ]}|  q|S )Nr   r   rj   )rm   r   listrA   rC   lendelete)r6   rk   rl   r   assocsassocs_existru   r   r   r   remove_association   s   
z&UserSocialAuthMixin.remove_associationc                 C   sN   ddl m} d|i}|d ur||d< tdd |jjdi |D dd d	d
S )Nr   r   rk   rl   c              	   S   s2   g | ]}|j t|jt|j|j|j|jfqS r   )	r?   OIDAssociationrl   rn   decodestringrp   rq   rr   rs   ).0ru   r   r   r   
<listcomp>   s    
z<UserSocialAuthMixin.get_oid_associations.<locals>.<listcomp>c                 S   s
   | d j S )N   )rq   )xr   r   r   <lambda>   s   
 z:UserSocialAuthMixin.get_oid_associations.<locals>.<lambda>T)keyreverser   )rm   r   sortedrA   rC   )r6   rk   rl   r   rS   r   r   r   get_oid_associations   s   z(UserSocialAuthMixin.get_oid_associationsc                 C   s"   ddl m} |jj|d  d S )Nr   r   )pk__in)rm   r   rA   rC   ry   )r6   ids_to_deleter   r   r   r   delete_associations   s   z'UserSocialAuthMixin.delete_associationsc                 C   s"   ddl m} |jj|||dd S )Nr   )Nonce)rk   	timestampsaltr   )rm   r   rA   get_or_create)r6   rk   r   r   r   r   r   r   	use_nonce   s   zUserSocialAuthMixin.use_nonce)TrV   )!__name__
__module____qualname__r	   r
   r   r   propertyr   r   r    r0   classmethodr7   r9   r:   r>   rI   rO   rQ   rU   rW   r[   r^   ra   rd   rg   ri   rv   r|   r   r   r   r   r   r   r   r      sd    






	










	
r   c                   @   s$   e Zd ZdZdZdZdZdd ZdS )
NonceMixinzOne use numbersr   r   c                 C   s   | j S )Unicode representation)rk   r   r   r   r   r      s   zNonceMixin.__unicode__N)r   r   r   __doc__rk   r   r   r   r   r   r   r   r      s    r   c                   @   s0   e Zd ZdZdZdZdZdZdZdZ	dd Z
dS )AssociationMixinzOpenId account associationr   r   c                 C   s   d| j | jf S )r   z%s %s)rl   rq   r   r   r   r   r     s   zAssociationMixin.__unicode__N)r   r   r   r   rk   rl   rp   rq   rr   rs   r   r   r   r   r   r     s    r   )r   rn   r+   rer   r   openid.associationr   r}   compileUNICODEr;   objectr   r   r   r   r   r   r   <module>   s     l