o
    Hý¤h×  ã                   @  s|   d Z ddlmZ ddlZddlmZ ddlmZ d!d	d
„Zd"dd„Z	dddddœd#dd„Z
ddddœd$dd„Zd%dd „ZdS )&aæ  
audit.py

Purpose:
  Centralized audit logging for authentication events and administrative
  actions. This module provides small, focused helpers to record security-
  relevant events into the SQLite database, so operators have traceability for
  incident response.

How it works:
  - Lazily ensures minimal schemas for two tables: `auth_log` and
    `admin_audit`.
  - Exposes `log_auth_event(...)` and `log_admin_action(...)` with simple
    parameters to record events. Timestamps are stored as UNIX epoch seconds.
  - Keeps the code path lightweight; failures to log never break requests.

Data model:
  - auth_log(id, ts, ip, user_id, username, event, detail)
  - admin_audit(id, ts, ip, admin_user_id, target_user_id, action, detail)
é    )ÚannotationsN)ÚOptionalé   )Úget_dbÚreturnÚintc                   C  s   t t ¡ ƒS )N)r   Útime© r	   r	   ú"/var/www/html/app_modules/audit.pyÚ_now   s   r   ÚNonec                  C  s&   t ƒ } |  d¡ |  d¡ |  ¡  d S )Na  
        CREATE TABLE IF NOT EXISTS auth_log (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            ts INTEGER NOT NULL,
            ip TEXT,
            user_id INTEGER,
            username TEXT,
            event TEXT NOT NULL,
            detail TEXT
        )
        a6  
        CREATE TABLE IF NOT EXISTS admin_audit (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            ts INTEGER NOT NULL,
            ip TEXT,
            admin_user_id INTEGER NOT NULL,
            target_user_id INTEGER,
            action TEXT NOT NULL,
            detail TEXT
        )
        )r   ÚexecuteÚcommit)Údbr	   r	   r
   Ú_ensure_schema"   s   ÿÿr   )ÚusernameÚuser_idÚipÚdetailÚeventÚstrr   úOptional[str]r   úOptional[int]r   r   c             	   C  sJ   zt ƒ  tƒ }| dtƒ |||| |f¡ | ¡  W d S  ty$   Y d S w )NzYINSERT INTO auth_log (ts, ip, user_id, username, event, detail) VALUES (?, ?, ?, ?, ?, ?)©r   r   r   r   r   Ú	Exception)r   r   r   r   r   r   r	   r	   r
   Úlog_auth_eventA   s   þþr   )Útarget_user_idr   r   ÚactionÚadmin_user_idr   c             	   C  sJ   zt ƒ  tƒ }| dtƒ |||| |f¡ | ¡  W d S  ty$   Y d S w )NziINSERT INTO admin_audit (ts, ip, admin_user_id, target_user_id, action, detail) VALUES (?, ?, ?, ?, ?, ?)r   )r   r   r   r   r   r   r	   r	   r
   Úlog_admin_actionP   s   þÿr   c                 C  s@   z| j  d¡pd d¡d  ¡ }|p| jW S  ty   Y d S w )NzX-Forwarded-ForÚ ú,r   )ÚheadersÚgetÚsplitÚstripÚremote_addrr   )ÚrequestÚfwdr	   r	   r
   Úget_request_ip^   s   ÿr)   )r   r   )r   r   )r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   )r   r   )Ú__doc__Ú
__future__r   r   Útypingr   r   r   r   r   r   r   r)   r	   r	   r	   r
   Ú<module>   s    

ÿÿ