
    _i(                        d dl Z d dlZd dlZd dlmZmZ d dlmZ d dlmZm	Z	m
Z
mZ d dlmZ d dlmZ d dlmZ e j                            e j                            e                    Zeej        vrej                            e           d dlmZ d d	l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 dl0m1Z2  e             efdZ3dS )    N)datetime	timedelta)RotatingFileHandler)Flaskredirecturl_forrender_template)current_user)load_dotenv)Migrate)Config)dbbcryptlogin_managermailtalismancsrflimiter)User)auth)main)audit)admin)managerc                 t   t          t                    t          j                            d          dk    r2	 ddlm}  |j        dddd          _        n# t          $ r Y nw xY wj	        
                    |            t          j	        d                   j	        d<   t          d	          j	        d
<   t          j                   t          j                   t!          t                    }t#          j                   dt"          _        dt"          _        dt"          _        dt"          _        t-          j                   t/          j                   t1          j                   j	                            d          dk    rPdgg dg dg dg ddgdgdgd}t3          j        |dddddddd
  
         j                            d           n1t3          j        dd           j                            d           j        sj        st          j                             d           s&	 t          j!        d            n# tD          $ r Y nw xY wt          j                             d           rt          j#        d t          j$                  rrtK          d!d"d#$          }|&                    tO          j(        d%                     |)                    tN          j*                   j        +                    |           tO          j,                    }|)                    tN          j*                   j        +                    |           j        )                    tN          j*                   j                            d&           -                    d'          d(             }-                    d)          d*             }-                    d+          fd,            }-                    d-          d.             }	j.        fd/            }
t"          j/        d0             }0                                5  j	                            d          dk    rzt          j        1                    td          d1          }t          j                             |          sj                            d2           n5j                            d3           nj                            d4           j	                            d5          }j	                            d6          }|r=|r:	 tf          j4        5                    |7          6                                }|t          j7        |          8                    d8          }tg          ||d9d:          }t          j9        :                    |           t          j9        ;                                 j                            d;|            nj                            d<|            nR# tx          $ rE}j        =                    d=|            t          j9        >                                 Y d}~nd}~ww xY wddd           n# 1 swxY w Y   dd>l?m9 j@        fd?            }A                    t                     A                    t                     A                    t                     A                    t                     A                    t                     S )@uk   
    Fonction usine (Application Factory) pour créer et configurer l'instance de l'application Flask.
    	FLASK_ENV
productionr   )ProxyFix   )x_forx_protox_hostx_prefix
SECRET_KEY   )hoursPERMANENT_SESSION_LIFETIMEz
auth.loginu4   Veuillez vous connecter pour accéder à cette page.infostrong'self')r*   'unsafe-inline'z'unsafe-eval'https://cdn.tailwindcss.comzhttps://cdn.jsdelivr.netzhttps://unpkg.comzhttps://cdnjs.cloudflare.com)r*   r+   r,   zhttps://fonts.googleapis.com)r*   zhttps://fonts.gstatic.comdata:)r*   r-   zhttps:z'none')zdefault-srcz
script-srcz	style-srczfont-srczimg-srczconnect-srcz
object-srczframe-ancestorsTi3Laxzstrict-origin-when-cross-origin)	content_security_policyforce_httpsstrict_transport_security!strict_transport_security_max_agesession_cookie_securesession_cookie_samesitex_content_type_optionsx_xss_protectionreferrer_policyu'   🔒 Talisman activé (mode production)NF)r/   r0   u%   ⚠️  Mode DEV : Talisman permissiflogszlogs/mcyber.logi @ 
   )maxBytesbackupCountzC%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]zMCyber Audit startup  c                 $    t          d          dfS )Nzerrors/404.htmlr<   r	   es    &/var/www/html/MCyber-Diagnostic/app.pypage_not_foundz"create_app.<locals>.page_not_found       011366      c                 $    t          d          dfS )Nzerrors/403.htmlrE   r>   r?   s    rA   	forbiddenzcreate_app.<locals>.forbidden   rC   rD     c                     t           j                                         j                            d|             t          d          dfS )NzErreur 500: zerrors/500.htmlrH   )r   sessionrollbackloggererrorr	   )r@   apps    rA   internal_errorz"create_app.<locals>.internal_error   sJ    


+++,,,011366rD     c                 $    t          d          dfS )Nzerrors/429.htmlrP   r>   r?   s    rA   ratelimit_handlerz%create_app.<locals>.ratelimit_handler   rC   rD   c                     dt           i} t          j        rt          j        dk    rddlm} 	 |j                            |j        	                    ddg          |j
        dk                                              }|| d<   n># t          $ r,}j                            d	|            d| d<   Y d
}~nd
}~ww xY wd| d<   | S )z6Injecte des variables globales dans tous les templatesr   r   r   )AuditLogERRORCRITICALFunresolved_errors_countu'   Erreur comptage erreurs non résolues: N)r   r
   is_authenticatedrolemodelsrT   queryfilterlevelin_resolvedcount	ExceptionrL   rM   )contextrT   unresolved_countr@   rN   s       rA   inject_global_variablesz+create_app.<locals>.inject_global_variables   s    x( ( 	3\->'-I-I''''''7#+>#8#8N&&'<==%.$ $ %'' ! 6F122 7 7 7
  !N1!N!NOOO5612222227 23G-.s   AB 
B:"B55B:c                 H    | t           j                            |           S dS )z5Charge un utilisateur depuis son ID pour Flask-Login.N)r   r[   get)user_ids    rA   	load_userzcreate_app.<locals>.load_user   s#     :>>'***trD   
migrationsuU   ⚠️  Aucune migration détectée. Utilisez 'flask db init' puis 'flask db migrate'uM   📦 Migrations détectées. Utilisez 'flask db upgrade' pour mettre à jour.uM   📦 Production : Utilisez 'flask db upgrade' pour gérer la base de donnéesADMIN_EMAILADMIN_PASSWORD)emailzutf-8r   )rl   passwordrY   is_active_accountu   ✅ Admin par défaut créé : u    ℹ️  Admin déjà existant : u   ❌ Erreur création admin : rJ   c                  @    t           j        rd _        d _        dS dS )uC   Renouvelle la session à chaque requête pour éviter l'expiration.TN)r
   rX   	permanentmodifiedro   s   rA   refresh_sessionz#create_app.<locals>.refresh_session   s0     ( 	$ $G#G	$ 	$rD   )Gr   __name__osenvironrf   werkzeug.middleware.proxy_fixr   wsgi_appImportErrorconfigfrom_objectstrr   r   init_appr   r   r   
login_viewlogin_messagelogin_message_categorysession_protectionr   r   r   r   rL   r(   warningdebugtestingpathexistsmkdirOSErroraccessW_OKr   setFormatterlogging	FormattersetLevelINFO
addHandlerStreamHandlererrorhandlercontext_processoruser_loaderapp_contextjoinproject_rootr   r[   	filter_byfirstgenerate_password_hashdecoderJ   addcommitra   rM   rK   flaskbefore_requestregister_blueprintauth_bpmain_bpaudit_bpadmin_bp
manager_bp)config_classr   migratecspfile_handlerstream_handlerrB   rG   rO   rR   rd   rh   migrations_diradmin_emailadmin_password_rawexisting_adminhashed_password
admin_userr@   rs   rN   rJ   s                       @@rA   
create_appr       s    //C 
z~~k""l22	>>>>>>#8CL1QYZ[[[CLL 	 	 	D	 J<(((  #3:l#;<<CJ| 09q/A/A/ACJ+,
 K
OC c2G 3+M"XM+1M('/M$M#M#S
 z~~k""l22$:     IHH444$:#* (z+
 
0 	$'&*.6"&$)#'!=	
 	
 	
 	
 	
ABBBB#tOOOO
BCCC
 9 0S[ 0w~~f%% 	        7>>&!! 	0bi&@&@ 	0.!H"  L %%g&7U' '    !!',///J!!,/// .00---
n---
GL)))
.///
 	c7 7 7 	c7 7 7 	c7 7 7 7 7
 	c7 7 7 	    0    
		 !& !&:>>+&&,66W\\,EEN7>>.11 q
""#z{{{{
 oppppJOOklll jnn]33 Z^^,<== 	&- 	&&!%!5!5K!5!H!H!N!N!P!P!)&,&CDV&W&W&^&^_f&g&gO!%)!0$*.	" " "J JNN:...J%%'''JOO$Sk$S$STTTTJOO$T{$T$TUUU & & &
  !D!D!DEEE
##%%%%%%%%&?!& !& !& !& !& !& !& !& !& !& !& !& !& !& !&N $ $ $ $ $ 7###7###8$$$8$$$:&&&Jsa    A 
A)(A)I! !
I.-I. C-ZC&X54Z5
Z?;Y?:Z?ZZZZ)4ru   sysr   r   r   logging.handlersr   r   r   r   r   r	   flask_loginr
   dotenvr   flask_migrater   r   abspathdirname__file__r   appendrz   r   
extensionsr   r   r   r   r   r   r   rZ   r   blueprints.authr   r   blueprints.mainr   r   blueprints.auditr   r   blueprints.adminr   r   blueprints.managerr   r   r    rD   rA   <module>r      s   				 



  ( ( ( ( ( ( ( ( 0 0 0 0 0 0 ; ; ; ; ; ; ; ; ; ; ; ; $ $ $ $ $ $       ! ! ! ! ! ! wrwx8899sxHOOL!!!       O O O O O O O O O O O O O O O O O O       , + + + + + + + + + + + . . . . . . . . . . . . 4 4 4 4 4 4 " e e e e e erD   