o
    "4g"                     @   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 dej j!_"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&e/dee fd'd(Z0dedefd)d*Z1d4defd+d,Z2defd-d.Z3dedefd/d0Z4G d1d2 d2Z5d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   k/var/www/html/authentication-server/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_state.   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>7   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_server2   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_registrationC   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_registrationY   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>   g   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_ids   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   )6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enabledr"   rB   r   r#   r%   r'   r0   r8   r   rE   rJ   r>   bytesrX   rY   r]   rf   ri   rj   r   r   r   r   <module>   sB    (




