o
    i                     @  s   d dl mZ d dlZd dlZd dlZd dlmZmZmZ d.ddZd/d	d
Z	d0ddZ
d1ddZd2ddZd2ddZd3ddZd4ddZd5ddZ	d6d7d%d&Zd8d)d*Zd9d,d-ZdS ):    )annotationsN)datetimetimezone	timedeltareturnstrc                   C  s   t jddS )NTWM_AUTH_DB_PATHz./home/cpsweather/theweathermonitor.com/auth.db)osenvironget r   r   auth_app/auth_repo.py_db_path
   s   r   sqlite3.Connectionc                  C  s   t jt dd} t j| _| S )Ng      @)timeout)sqlite3connectr   Rowrow_factory)cxr   r   r   _connect   s   r   r   c                   C  s   t tjS N)r   nowr   utcr   r   r   r   _utc_now   s   r   valuec                 C  sL   | pd  }|dr|d d d }t|}|jd u r$|jtjd}|S )N Zz+00:00)tzinfo)stripendswithr   fromisoformatr   replacer   r   )r   sdtr   r   r   _parse_iso_utc   s   


r&   tokenc                 C  @   d}t  }||| f W  d    S 1 sw   Y  d S NaZ  
    SELECT
        apt.id,
        apt.admin_account_id,
        apt.token,
        apt.purpose,
        apt.expires_ts,
        apt.used_ts,
        apt.created_by_user_id,
        apt.created_ts,

        aa.user_id,
        aa.username,
        aa.is_enabled,

        au.full_name,
        au.first_name,
        au.last_name,
        au.role,
        au.is_active,
        au.email,
        au.home_site

    FROM admin_password_tokens apt
    JOIN admin_accounts aa
      ON aa.id = apt.admin_account_id
    JOIN auth_users au
      ON au.id = aa.user_id
    WHERE apt.token = ?
    LIMIT 1
    r   executefetchoner'   sqlr   r   r   r   get_setup_token_row%      $r/   c                 C  r(   r)   r*   r-   r   r   r   get_password_token_rowI   r0   r1   expected_purposetuple[bool, str]c                 C  s   | sdS t | d p
d |krdS t | d pd rdS t | d p$d }|s,dS zt|}W n
 ty<   Y d	S w |t krDd
S t| d pJddkrPdS t| d pVddkr\dS t | d pbd }|dvrldS dS )N)Finvalid_tokenpurposer   )Fwrong_purposeused_ts)Ftoken_already_used
expires_ts)Ftoken_missing_expiry)Ftoken_expiry_invalid)Ftoken_expired
is_enabledr      )Fadmin_account_disabled	is_active)Flinked_user_inactiverole>   admin
super_user)Frole_not_allowed)Tok)r   r    r&   	Exceptionr   int)	token_rowr2   r9   
expires_dtrB   r   r   r   is_password_token_usablem   s0   
rK   c                 C  s
   t | dS )Nsetup)rK   )rI   r   r   r   is_setup_token_usable   s   
rM   usernamec                 C  r(   )Na  
    SELECT
        aa.id,
        aa.user_id,
        aa.username,
        aa.password_hash,
        aa.is_enabled,
        aa.last_login_ts,
        aa.created_ts,
        aa.updated_ts,

        au.full_name,
        au.first_name,
        au.last_name,
        au.role,
        au.is_active,
        au.email,
        au.home_site

    FROM admin_accounts aa
    JOIN auth_users au
      ON au.id = aa.user_id
    WHERE lower(aa.username) = lower(?)
    LIMIT 1
    r*   )rN   r.   r   r   r   r   get_admin_account_by_username   s   $rO   admin_account_idrH   r5   expires_hourscreated_by_user_id
int | Nonec              	   C  sn   t d}t t|d d}d}t }||| ||||f |  W d    |S 1 s0w   Y  |S )N    )hoursz%Y-%m-%dT%H:%M:%S.%fZz
    INSERT INTO admin_password_tokens(
        admin_account_id,
        token,
        purpose,
        expires_ts,
        created_by_user_id,
        created_ts
    )
    VALUES (?, ?, ?, ?, ?, strftime('%Y-%m-%dT%H:%M:%fZ','now'))
    )secretstoken_urlsafer   r   strftimer   r+   commit)rP   r5   rQ   rR   r'   r9   r.   r   r   r   r   create_password_token   s   


rZ   password_hashNonec                 C  sH   d}t  }|||| f |  W d    d S 1 sw   Y  d S )Nz
    UPDATE admin_accounts
       SET password_hash = ?,
           updated_ts = strftime('%Y-%m-%dT%H:%M:%fZ','now')
     WHERE id = ?
    r   r+   rY   )rP   r[   r.   r   r   r   r   update_admin_password   s
   
"r^   token_idc                 C  sF   d}t  }||| f |  W d    d S 1 sw   Y  d S )Nzr
    UPDATE admin_password_tokens
       SET used_ts = strftime('%Y-%m-%dT%H:%M:%fZ','now')
     WHERE id = ?
    r]   )r_   r.   r   r   r   r   mark_token_used   s
   
"r`   )r   r   )r   r   )r   r   )r   r   r   r   )r'   r   )r2   r   r   r3   )r   r3   )rN   r   r   )
rP   rH   r5   r   rQ   rH   rR   rS   r   r   )rP   rH   r[   r   r   r\   )r_   rH   r   r\   )
__future__r   r	   r   rV   r   r   r   r   r   r   r&   r/   r1   rK   rM   rO   rZ   r^   r`   r   r   r   r   <module>   s$   






$
$
#
"
