o
    I@h                     @   s  d dl Z d dlZd dl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 dlmZmZ d dlmZ d d	lmZ d d
lmZ e Ze Ze Zdd Zdd Zdd Ze Ze Ze Zee
dgdZde_ de_!dd Z"G dd deZ#ej$de%fddZ&dS )    N)Talisman)Session)Limiter)get_remote_address)CSRFProtect)LoginManager	UserMixin)get_db_connection)
SQLAlchemy)APSchedulerc                 C   s(   t |  t   t| | jd d d S )NZTALISMAN_CSP)Zcontent_security_policy)	schedulerinit_appstartr   configapp r   /var/www/html/app/extensions.pyinit_extensions   s   
r   c                 C   sZ   t jt jtdd}t j|st | tjt j|dtj	dd | j
d dS )u*   Инициализация логгера.z..Zlogsz
errors.logz&%(asctime)s %(levelname)s: %(message)s)filenamelevelformatzLogger initializedN)ospathjoindirname__file__existsmakedirsloggingZbasicConfigZDEBUGZloggerinfo)r   Zlog_pathr   r   r   logger_init   s   
r!   c                 C   s@   t |  |   t   W d    d S 1 sw   Y  d S )N)dbr   app_contextZ
create_allr   r   r   r   db_init%   s   


"r$   z300 per day)Zkey_funcZdefault_limitszauth_bp.loginZstrongc                 C   st   | j ddkr| j d}|rt|| j d< t|  | j dd}|| j d< t|  t|  t|  dS )u   
    Подключаем все расширения к приложению + Redis-бекенды для сессий и rate limits.
    ZSESSION_TYPEredisZSESSION_REDIS_URLZSESSION_REDISz	memory://ZRATELIMIT_STORAGE_URIN)	r   getr%   Zfrom_urlsessr   limitercsrfloginmgr)r   ZurlZstorage_urir   r   r   ext_init5   s   



r+   c                   @   s0   e Zd ZdZdefddZedefddZdS )	DBUseruO   Обёртка-псевдомодель для Flask-Login (без SQLAlchemy).rowc                 C   s(   |d | _ |d | _|d | _|| _d S )Nidusernamerole)r.   r/   r0   Z_row)selfr-   r   r   r   __init__N   s   



zDBUser.__init__returnc                 C   s
   | j dkS )NZadmin)r0   )r1   r   r   r   is_adminT   s   
zDBUser.is_adminN)	__name__
__module____qualname____doc__dictr2   propertyboolr4   r   r   r   r   r,   L   s
    r,   user_idc                 C   s\   t  }| }|d| f | }W d   n1 sw   Y  |  |r,t|S dS )uZ   Каждый запрос → дотащить пользователя из БД по id.zSELECT * FROM users WHERE id=%sN)r	   ZcursorZexecuteZfetchonecloser,   )r<   ZconnZcurr-   r   r   r   	load_userX   s   

r>   )'r   r   r%   Zflask_talismanr   Zflask_sessionr   Zflask_limiterr   Zflask_limiter.utilr   Z	flask_wtfr   Zflask_loginr   r   Zapp.databaser	   Zflask_sqlalchemyr
   Zflask_apschedulerr   Ztalismanr"   r   r   r!   r$   r)   r'   r*   r(   Z
login_viewZsession_protectionr+   r,   Zuser_loaderstrr>   r   r   r   r   <module>   s8   