a
    ܿh0)                  
   @   s  d dl mZmZmZ d dlmZ d dlmZmZm	Z	 d dl
Z
d dlZd dlZd dlmZ d dlZd dlmZ d dlZd dlZd dlmZ d dlZd dlZd dlmZmZmZ d d	lmZ e ZeeZ ej!ej"d
d e#e$Z%eddgdZ&eddZ'edgdddZ(G dd deZ)d)ddZ*d*ddZ+d dlZd dl,m-Z- d dlmZ d dlZe#e$Z%dd Z.e&j/d ed!ed"d#d$Z0e&j1d ed!ed%ed%ed%ed%ed%ed%fee2e2e2e2e2e2d&d'd(Z3dS )+    )	APIRouterFormRequest)Jinja2Templates)	BaseModelEmailStrfield_validatorN)HTMLResponse)CryptContext)MIMEText)get_pingconf_vars
open_mysqlget_mysql_creds)contextmanagerz)%(asctime)s - %(levelname)s - %(message)s)levelformatz	/registerregister)prefixtags	templates)	directorybcryptauto2b)schemes
deprecatedZbcrypt__identc                   @   s   e Zd ZU eed< eed< eed< eed< eed< eed< ededd Zeded	d
 Z	ededd Z
ededd ZdS )RegistrationFormemailusernamepasswordconfirm_passwordcaptchacaptcha_codec                 C   s   t d|std|S )Nz%^[a-zA-Z0-9\s\-\_\'\+\?\!\@\.]{1,30}$zGUsername must be 1-30 characters, alphanumeric, space, or -_'+?!@. only)rematch
ValueErrorclsv r)   +/wd/v2025.freedom4um.com/routes/register.pyvalidate_username*   s    z"RegistrationForm.validate_usernamec                 C   s   t |dk rtd|S )N   z+Password must be at least 6 characters long)lenr%   r&   r)   r)   r*   validate_password1   s    z"RegistrationForm.validate_passwordc                 C   s$   d|j v r ||j d kr td|S )Nr   zPasswords do not matchdatar%   r'   r(   valuesr)   r)   r*   passwords_match8   s    z RegistrationForm.passwords_matchc                 C   s$   d|j v r ||j d kr td|S )Nr"   Incorrect CAPTCHA inputr/   r1   r)   r)   r*   validate_captcha?   s    z!RegistrationForm.validate_captchaN)__name__
__module____qualname__r   __annotations__strr   classmethodr+   r.   r3   r5   r)   r)   r)   r*   r   "   s$   
r   r,   c                    s(   t jt j  d fddt| D S )N c                 3   s   | ]}t  V  qd S Nrandomchoice.0_charsr)   r*   	<genexpr>H       z(generate_captcha_code.<locals>.<genexpr>stringascii_lettersdigitsjoinrangelengthr)   rD   r*   generate_captcha_codeF   s    rP      c                    s(   t jt j  d fddt| D S )Nr<   c                 3   s   | ]}t  V  qd S r=   r>   rA   rD   r)   r*   rF   L   rG   z(generate_confirm_code.<locals>.<genexpr>rH   rN   r)   rD   r*   generate_confirm_codeJ   s    rR   )MIMEMultipartc                 C   sv  dt d  d| d| }dt d  d| dt d  d	t d  d
	}dt d  dt d  d| dt d  dt d  d}td}t d  d|d< dt d  |d< | |d< t|d}t|d}|| || z^tt d d(}	|	|d | g|  W d    n1 s0    Y  t	d|   W n> t
yp }
 z$td|  d|
   W Y d }
~
n
d }
~
0 0 d S )Nzhttps://HomeURLDomainz/confirm?id=z&code=zThank you for registering at SiteNamezE!

Please confirm your registration by clicking the following link:

z+

If you did not sign up for an account at z, it is possible someone else mistyped their email address. If that is the case, please disregard this message.

We look forward to welcoming you to our community.

Best regards,
The z Team
a[  <!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"></head>
<body style="font-family: Arial, sans-serif; background-color: #f5f1e9; color: #193048; margin:0; padding:20px;">
  <div style="max-width:600px; margin:auto; padding:20px; background:#fff; border:3px solid #C6BBA3; border-radius:8px;">
    <h1 style="color:#7ed957;">Welcome to z3!</h1>
    <p>Thank you for registering at <strong>zn</strong>.</p>
    <p>Please confirm your registration by clicking the link below:</p>
    <p>
      <a href="z" style="color:#ffde59; font-weight:bold; text-decoration:none;">
        Confirm your account
      </a>
    </p>
    <hr style="border-color:#C6BBA3;">
    <p>If you did not sign up for an account at z, it might be that someone mistyped their email address. Please disregard this email in that case.</p>
    <p>We look forward to welcoming you to our community.</p>
    <p>Best regards,<br>The z# Team</p>
  </div>
</body>
</html>
alternativez Registration ConfirmationSubjectznoreply@FromToplainhtmlOutMailServer   zConfirmation email sent to zFailed to send email to z: )PingConfrS   r   attachsmtplibSMTPsendmail	as_stringloggerdebug	Exceptionerror)r   id_numconfirm_codeZconfirm_urltextr[   msgZpart1Zpart2serverer)   r)   r*   send_confirmation_emailU   sH    




8rn   /)response_class)requestc                    s<   t  }|| jd< td|  td| dddd|i dS )Nr"   zGenerated CAPTCHA code: register.htmlr<   rq   r   r   r   r    r"   errors)rP   sessionrd   re   r   TemplateResponse)rq   r"   r)   r)   r*   get_register   s    
rw   .)rq   r   r   r   r    r!   r"   c                    sp  i }||||dd}t d|  t d| jd  zt||||||d W nJ ty }	 z2|	 D ]}
|
d d }|
d	 ||< qlW Y d }	~	n
d }	~	0 0 | jd}|d u s||krd
|d< |r
t }|| jd< tj	d| |d |d |d |d ||dddS z6zzt
tZ}| }|d|f | rFd|d< |d|f | rfd|d< |rt }|| jd< tj	d| |d |d |d |d ||dddW  d    W W dt v r|  S |d|f |  |d|f | d }t d| d|  t }t|}|d|||||f |  t d| d|  t||| W d    n1 s~0    Y  W n tjjtfy* }	 z~t d |	  t|	|d!< t }|| jd< tj	d| |d |d |d |d ||dddW  Y d }	~	W dt v r |  S d }	~	0 0 W dt v rZ|  ndt v rX|  0 tj	d"| td#ddS )$Nr<   )r   r   r   r    r"   zReceived form data: zSession CAPTCHA: r"   )r   r   r   r    r!   r"   locr   rk   r4   r!   rr   r   r   r   r    rs      )status_codez#SELECT Name FROM ID WHERE Name = %szUsername already existsz*SELECT Email FROM Handles WHERE Email = %szEmail already existscursorz!INSERT INTO ID (Name) VALUES (%s)z$SELECT IDNum FROM ID WHERE Name = %szGenerated IDNum: z for username: z
                INSERT INTO Handles (HandleID, Handle, Email, Password, RegisterDate, StatusCode, ConfirmCode)
                VALUES (%s, %s, %s, %s, NOW(), 'U', %s)
                zUser z( registered successfully with HandleID: zError: databasezsuccess.html)rq   r^   )rd   re   ru   getr   r%   rt   rP   r   rv   r   mysql_credsr{   executefetchonelocalsclosecommitrR   pwd_contexthashrn   mysql	connectorErrorrf   rg   r:   r^   )rq   r   r   r   r    r!   r"   rt   	form_datarm   rg   fieldZstored_captchaZnew_captcha_codeconnr{   rh   ri   Zhashed_passwordr)   r)   r*   post_register   s    

$
	


	:
0
	

r   )r,   )rQ   )4fastapir   r   r   fastapi.templatingr   pydanticr   r   r   r#   r?   rI   starlette.responsesr	   mysql.connectorr   passlib.contextr
   configparserr`   email.mime.textr   loggingosutils.pingdatar   r   r   
contextlibr   r^   r~   basicConfigDEBUG	getLoggerr6   rd   routerr   r   r   rP   rR   Zemail.mime.multipartrS   rn   r}   rw   postr:   r   r)   r)   r)   r*   <module>   sh   

$


?