o
    &zh                     @   s  d dl mZmZmZmZ d dlmZ d dlZd dl	m
Z
 d dlmZ d dlmZmZmZmZmZmZmZ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dej j!_"W n	 e#yd   Y nw dZ$ddiZ%defddZ&dee fddZ'deddfddZ(d3ddZ)de
fddZ*dedefddZ+de,defdd Z-d!edefd"d#Z.dee fd$d%Z/d&e0dee fd'd(Z1dedefd)d*Z2d4defd+d,Z3defd-d.Z4dedefd/d0Z5G d1d2 d2Z6dS )5    )AnyDictListOptional)get_user_modelN)Fido2Server)websafe_decode)AttestedCredentialDataAuthenticationResponseAuthenticatorDataPublicKeyCredentialRpEntityPublicKeyCredentialUserEntityRegistrationResponseResidentKeyRequirementUserVerificationRequirement)url_str_to_user_pk)context)app_settings)get_adapter)AuthenticatorTzmfa.webauthn.state	credPropsreturnc                 C   s   t  | }tdi |S )N )r   %get_public_key_credential_user_entityr   )userkwargsr   r   ]/var/www/html/kangema/venv/lib/python3.10/site-packages/allauth/mfa/webauthn/internal/auth.pybuild_user_payload$   s   r   c                   C   s   t jjtS N)r   requestsessiongetSTATE_SESSION_KEYr   r   r   r   	get_state)   s   r#   statec                 C   s   | t jjt< d S r   )r   r   r    r"   )r$   r   r   r   	set_state-   s   r%   c                   C   s   t jjtd  d S r   )r   r   r    popr"   r   r   r   r   clear_state1   s   r'   c                  C   s:   t   } tdi | }d }tjrdd }t||d}|S )Nc                 S   s   dS )NTr   )or   r   r   <lambda>:   s    zget_server.<locals>.<lambda>)verify_originr   )r   #get_public_key_credential_rp_entityr   r   WEBAUTHN_ALLOW_INSECURE_ORIGINr   )	rp_kwargsrpr*   serverr   r   r   
get_server5   s   
r0   responsec                 C   s(   zt | W S  ty   t dw Nincorrect_code)r   	from_dict	TypeErrorr   validation_errorr1   r   r   r   parse_registration_response?   s
   r8   passwordlessc                 C   sR   t  }t| }|jt| ||rtjntj|rtjntjtd\}}t	| t
|S )N)r   credentialsresident_key_requirementuser_verification
extensions)r0   get_credentialsregister_beginr   r   REQUIREDDISCOURAGEDr   
EXTENSIONSr%   dict)r   r9   r/   r:   registration_datar$   r   r   r   begin_registrationF   s   
rE   
credentialc                 C   sR   t  }t }|st dz||| }W n ty#   t dw t  |S r2   )r0   r#   r   r6   register_complete
ValueErrorr'   )rF   r/   r$   bindingr   r   r   complete_registration\   s   rJ   c                 C   sH   g }t jj| t jjd}|D ]}| jj}|r!|| jj q|S N)r   type)	r   objectsfilterTypeWEBAUTHNwrapauthenticator_datacredential_dataappend)r   r:   authenticatorsauthenticatorrS   r   r   r   r>   j   s   r>   credential_idc                 C   s<   t jj| t jjd}|D ]}|| jjjkr|  S qd S rK   )	r   rM   rN   rO   rP   rQ   rR   rS   rW   )r   rW   rU   rV   r   r   r   "get_authenticator_by_credential_idv   s   rX   c              	   C   s,   zt | W S  ttfy   t dw r2   )r
   r4   r5   rH   r   r6   r7   r   r   r   parse_authentication_response   s
   rY   c                 C   s6   t  }|j| rt| ng tjd\}}t| t|S )N)r:   r<   )r0   authenticate_beginr>   r   	PREFERREDr%   rC   )r   r/   request_optionsr$   r   r   r   begin_authentication   s   
r]   c              
   C   sr   z|  di  d}tt|d}W n tttfy$   t dw t	 j
j|d }|s7t d|S )Nr1   
userHandleutf8r3   )pk)r!   r   r   decoderH   r5   KeyErrorr   r6   r   rM   rN   first)r1   user_handleuser_pkr   r   r   r   extract_user_from_response   s   rf   c              
   C   s   t | }t }t }|st dz	||||}W n ty. } zt d|d }~ww t  t| |j	}|s@t d|S r2   )
r>   r0   r#   r   r6   authenticate_completerH   r'   rX   rW   )r   r1   r:   r/   r$   rI   erV   r   r   r   complete_authentication   s    ri   c                   @   s|   e Zd Zdd Zedededd fddZedefdd	Z	e	j
defd
d	Z	edefddZedee fddZdS )WebAuthnc                 C   s
   || _ d S r   )instance)selfrk   r   r   r   __init__   s   
zWebAuthn.__init__namerF   r   c                 C   s(   t |t jj||dd}|  | |S )N)rn   rF   )r   rL   data)r   rO   rP   save)clsr   rn   rF   rk   r   r   r   add   s   zWebAuthn.addc                 C   s   | j jd S Nrn   rk   ro   rl   r   r   r   rn      s   zWebAuthn.namec                 C   s   || j jd< d S rs   rt   )rl   rn   r   r   r   rn      s   c                 C   s   t | jjd jjjS )NrF   )r8   rk   ro   r1   attestation_object	auth_dataru   r   r   r   rR      s
   
zWebAuthn.authenticator_datac                 C   s&   | j jdi di di dS )NrF   clientExtensionResultsr   rk)rk   ro   r!   ru   r   r   r   is_passwordless   s
   zWebAuthn.is_passwordlessN)__name__
__module____qualname__rm   classmethodstrrC   rr   propertyrn   setterr   rR   r   boolrz   r   r   r   r   rj      s    rj   )r   Nr   )7typingr   r   r   r   django.contrib.authr   fido2.featuresfido2fido2.serverr   fido2.utilsr   fido2.webauthnr	   r
   r   r   r   r   r   r   allauth.account.utilsr   allauth.corer   allauth.mfar   allauth.mfa.adapterr   allauth.mfa.modelsr   featureswebauthn_json_mappingenabledAttributeErrorr"   rB   r   r#   r%   r'   r0   r8   r   rE   rJ   r>   bytesrX   rY   r]   rf   ri   rj   r   r   r   r   <module>   sJ    (



