
    [ig                        d dl mZmZmZmZmZ d dlZd dlZ ej        e	          Z
i dh ddh ddh dd	d
dhdh ddh ddh ddh ddh ddh ddh ddh ddh ddh ddh dd h d!d"d
dhh d#d
dhdd$Zefd%eeef         d&ed'ed(ed)ef
d*Zd+Zd,Zd-Zd.Zd/Zd-Zd0Zd1Zd2Zd2Zd1Zd-Zd3Zd0Zd0Zd0Zd,Zi d4ed5ed6ed7ed8ed9ed:ed;ed<ed=ed>ed?ed@edAedBedCedDeZ dEeeef         dFeeef         d)eeeef                  fdGZ!dEeeef         d)eeee"         f         fdHZ#dIeeef         d)ee"eeef         f         fdJZ$dS )K    )DictAnyListTupleOptionalNq_2fa>   n_anonouiq_filtrage_mail>   aucunmicrosoft_baseoutil_specialiseq_edr>   edrr   	antivirusq_gestionnaire_mdpr   r
   q_sauvegarde_types>   nasusbbandecloudaucuneediteur_specialiseq_architecture_editeur>   hybride
full_cloudmulti_sitesq_sauvegarde_solution>   r   r   r   lto_rdx
specialisedisque_localserveur_dedieq_3211>   r
   r   partielq_frequence>   r   	mensuellejournalierehebdomadaireq_cloud_rgpd>   r
   r   
sans_cloudq_os_postes>   recentobsoleteunsupported_soonq_os_serveursq_hyperviseur	q_parefeu>   r   	ngfw_gererouteur_baseq_vpn>   r   vpn_gere
rdp_ouvert
q_phishing>   annueljamaistrimestrielq_formation>   testeexiste
inexistant)	q_pra_pcaq_audit
volumetriedatakeydefaultexpected_typereturnc                    |                      ||          }|t          k    rG	 t          |          }t          dt          |d                    S # t          t
          f$ r |cY S w xY w|t          k    rht          |t                    st          |t                    r|r|g}n|S |t          v r#t          |         fd|D             }|r|n|S |dd         S |t          k    rt          |t                    s|t          |          n|}|t          v r5t          |         &|vr"t                              d| d|            |S |r
|dd         n|}|rt          j        |          n|S |S )	uN   
    Extrait une valeur de manière sécurisée avec validation whitelist
    r   i'  Nc                     g | ]}|v |	S  rJ   ).0valloweds     ;/var/www/html/MCyber-Diagnostic/services/scoring_service.py
<listcomp>z#_get_safe_value.<locals>.<listcomp>N   s    >>>1gQ    
   u   Valeur non autorisée pour z:    )getintmaxmin
ValueError	TypeErrorlist
isinstancestrALLOWED_VALUESloggerwarninghtmlescape)rC   rD   rE   rF   valueval	validatedrM   s          @rN   _get_safe_valuerd   3   s    HHS'""E 	e**Cq#c4..)))I& 	 	 	NNN	 %&& 	%%% %  .  $S)G">>>>>>>	$-:yy7:SbSz %%% 	A"'"3CJJJE .  $S)G"''NN#O#O#O#O#OPPP"N  %1dsd'%*7t{5!!!7Ls   ,A A'&A'rQ                           
points_2fapoints_filtrage
points_edrpoints_gestionnaire_mdppoints_sauvegarde_typespoints_3211points_frequencepoints_cloudpoints_os_postespoints_os_serveurspoints_hyperviseurpoints_parefeu
points_vpnpoints_phishingpoints_formationpoints_pra_pcapoints_auditreponsesscoresc           
      	   g }t          | ddt                    t          | ddt                    z   }t          | ddt                    }|d         ,|d         t          k     r|                    dd	d
ddd           |d         M|d         t
          k     r<|d         dk    rdnd}|                    ddd
|dt          |           dd           |d         ,|d         t          k     r|                    ddd
ddd           |d         ,|d         t          k     r|                    ddd
ddd           |d         |d         t          k     rt          | dg t                    }d|v s|s |                    d d	d!dd"| d#d           nd$|vr|                    d%d&d!dd'd           d(|vr#d|vrd$|vr|                    d)d*d!dd+d           |d,         ,|d,         t          k     r|                    d-d&d!dd.d           |d/         G|d/         t          k     r6t          | d0g t                    }d1|vr|                    d2d*d!dd3d           |d4         ,|d4         t          k     r|                    d5d6d!dd7d           |d8         [|d8         t          k     rJt          | d9g t                    }d:|v sd;|v r+d:|v rdnd}|                    d<|dk    rd&nd*d=|d>d           |d?         K|d?         t          k     r:t          | d@g t                    }	d:|	v sd;|	v r|                    dAdd=ddBd           |dC         ,|dC         t          k     r|                    dDd6d=ddEd           |dF         ,|dF         t           k     r|                    dGd&dHddId           |dJ         ,|dJ         t"          k     r|                    dKd	dHddLd           |dM         ,|dM         t$          k     r|                    dNddOddPd           |dQ         ,|dQ         t&          k     r|                    dRddOddSd           |dT         ,|dT         t(          k     r|                    dUd&dOddVd           |dW         ,|dW         t*          k     r|                    dXddOdYdZd           t-          |d[ \          S )]u3   Génère les préconisations basées sur les scoresnb_postes_fixesr   nb_postes_portablesrB   u   Non spécifiéerm   Nz.Activer l'Authentification Multi-Facteur (MFA)   
ProtectionCritiqueuc   L'absence de MFA est la porte d'entrée n°1 des pirates. Activez-la sur tous les accès sensibles.)titrepriorite	categoriegravitedetailsro   u   Élevéeu%   Déployer une protection EDR avancéeg      ?u   Protégez vos z5 postes contre les ransomwares avec une solution EDR.rn   z Renforcer le filtrage des emailsrg   uB   Installez une solution dédiée pour bloquer les menaces par mail.rp   z(Adopter un gestionnaire de mots de passere   Moyenneu<   Sécurisez vos mots de passe avec un coffre-fort numérique.rq   r   r   u,   🚨 URGENT : Mettre en place une sauvegarde
Sauvegardeu%   Risque de perte totale des données (u9   ). Installez une solution professionnelle immédiatement.r   u=   Professionnaliser la sauvegarde avec un éditeur spécialisérj   u;   Adoptez une solution dédiée pour une protection optimale.r   z(Ajouter une sauvegarde Cloud (hors site)g      @ue   Une sauvegarde hors site (cloud) protège contre les sinistres physiques (incendie, vol, ransomware).rr   u   Respecter la règle 3-2-1-1uX   3 copies des données, 2 types de supports, 1 copie hors site, 1 copie offline/immuable.rs   r&   r(   u'   Augmenter la fréquence des sauvegardesu[   Passez à une fréquence quotidienne pour minimiser la perte de données en cas d'incident.rt   u(   Conformité RGPD de l'hébergement Cloudg      @uO   Vérifiez que vos données cloud sont hébergées en UE pour respecter le RGPD.ru   r,   r.   r/   u    Mettre à jour les OS des postesu	   Systèmesue   Remplacez ou mettez à jour les postes avec des OS obsolètes pour éviter les failles de sécurité.rv   r0   u   Migrer les serveurs obsolèteszgLes serveurs en fin de vie sont des cibles prioritaires pour les attaquants. Migration urgente requise.rw   u   Mettre à jour l'hyperviseuruU   Un hyperviseur non à jour compromet la sécurité de toutes les machines virtuelles.rx   zInstaller un pare-feu NGFWu   RéseauuP   Remplacez la box opérateur par un pare-feu professionnel nouvelle génération.ry   u.   🚨 CRITIQUE : Sécuriser les accès distantsuY   Fermez les ports RDP ouverts sur Internet et imposez un VPN pour tout accès à distance.rz   z Lancer des campagnes de PhishingHumainuH   Testez et entraînez vos utilisateurs avec des simulations régulières.r{   u-   Former les utilisateurs à la cybersécuritéuO   La sensibilisation annuelle est indispensable face à l'évolution des menaces.r|   zFormaliser et tester un PRA/PCAuU   Préparez votre entreprise à survivre et se relever rapidement d'un sinistre majeur.r}   u(   Réaliser un audit de sécurité externeFaibleuG   Faites valider votre niveau de sécurité par un auditeur indépendant.c                     | d         S )Nr   rJ   )xs    rN   <lambda>z)_generer_preconisations.<locals>.<lambda>@  s
    * rP   )rD   )rd   rT   r[   MAX_SCORE_2FAappendMAX_SCORE_EDRMAX_SCORE_FILTRAGE_MAILMAX_SCORE_GESTIONNAIRE_MDPMAX_SCORE_SAUVEGARDE_TYPESrY   MAX_SCORE_3211MAX_SCORE_FREQUENCEMAX_SCORE_CLOUD_RGPDMAX_SCORE_OS_POSTESMAX_SCORE_OS_SERVEURSMAX_SCORE_HYPERVISEURMAX_SCORE_PAREFEUMAX_SCORE_VPNMAX_SCORE_PHISHINGMAX_SCORE_FORMATIONMAX_SCORE_PRA_PCAMAX_SCORE_AUDITsorted)
r~   r   preconisationstotal_postesrB   r   sauvegarde_types
frequences	os_postesos_serveurss
             rN   _generer_preconisationsr      s%   N #8->3GG"8-BAsKKLL <9JCPPJ l'F<,@=,P,PE|
 
 	 	 	 l'F<,@=,P,P &| 4 9 9**z<,7pL(9(9ppp
 
 	 	 	  ,8I1JMd1d1d7[
 
 	 	 	 '(4@Y9Z]w9w9w?U
 
 	 	 	 '(4@Y9Z]w9w9w*85I2tTT'''/?'!!GLZ I:  I  I  I# #    
 ")999!!XLZX# #    ***x?O/O/OTh  qA  UA  UA!!Clz C# #    m(VM-B^-S-S2q
 
 	 	 	  !-&9K2LOb2b2b$X}b$GG

**!!Blyx# #    n)f^.DG[.[.[?,9h
 
 	 	 	  !-&9K2LOb2b2b#HmRFF	""&8I&E&E$.)$;$;jjG!!;!(J!6!6AAC(W C	# #    "#/F;O4PSh4h4h%hTJJ$$(:k(I(I!!9kj E# #    "#/F;O4PSh4h4h3+)n
 
 	 	 	 +7G0HK\0\0\1	ji
 
 	 	 	 l'F<,@=,P,PE	jr
 
 	 	 	  ,8I1JM_1_1_7Za
 
 	 	 	  !-&9K2LOb2b2bDZh
 
 	 	 	 +7G0HK\0\0\6Zn
 
 	 	 	 n)f^.D.V.V?X`
 
 	 	 	 .&=&=>>>>rP   c                 	   i }t          | dd          dk    rt          nd|d<   t          | dd          dk    rt          nd|d<   t          | d	d          }|d
k    rt          n|dk    r
t          dz  nd|d<   t          | dd          dk    rt          nd|d<   t          | dg t
                    }|s9t          | ddt                    }|r ddddddd}|                    ||          g}d}d|v s|sd}nQd|v rd}nJd|v }d|v }d|v }	d|v }
|r|r|	rd}n1|r|rd}n*|r|	rd}n#|r|
rd}n|rd}n|r|	s|
rd}n|rd}n	|	rd}n|
rd}||d<   t          | dd          }|dk    rt          n|dk    r
t          dz  nd|d <   t          | d!g t
                    }|rt          |t
                    st          | d!dt                    }|r|g}d}d|vr|rd"|v rd}nd#|v rd$}nd%|v rd&}||d'<   t          | d(d          }|d)k    rd*|d+<   n|dk    rt          nd|d+<   t          | d,g t
                    }t          | d-dt                    t          | d.dt                    z   }|dk    rd*|d/<   nl|rt          |t
                    st          | d,dt                    }|r|g}d}|r0d0|v rt          |          d&k    rt          }nd0|v rd1}n
d2|v rd3|vrd}||d/<   t          | d4g t
                    }t          | d5dt                    t          | d6dt                    z   }|dk    rd*|d7<   nl|rt          |t
                    st          | d4dt                    }|r|g}d}|r0d0|v rt          |          d&k    rt          }nd0|v rd1}n
d2|v rd3|vrd}||d7<   t          | d8d          }|dk    rd*|d9<   n|d:k    rd*|d9<   n|dk    rt          nd|d9<   t          | d;d          }|d<k    rt           n|d=k    r
t           dz  nd|d><   t          | d?d          }|d@k    rd*|dA<   n|dBk    rt"          nd|dA<   t          | dCd          }|dDk    rt$          n|dEk    r
t$          dz  nd|dF<   t          | dGd          dk    rt&          nd|dH<   t          | dId          }|dJk    rt(          n|dKk    r
t(          dz  nd|dL<   t          | dMd          dk    rt*          nd|dN<   |S )OuO   Calcule les points pour chaque catégorie. Retourne None pour les sections N/A.r    r   r   rm   r   r   rn   r   r   r   rj   ro   r   rp   r   r   r   r   r   r   r   r   )r!   r   r   r    r"   r   rh   rf   rk   ri   rq   r$   r%   rr   r&   r(   r)   rg   r'   r   rs   r*   r+   Nrt   r,   r   r   ru   r-   re   r/   r.   r0   nb_serveurs_physiquesnb_serveurs_virtuelsrv   r1   rw   r	   r2   r3   r4   rx   r5   r   ry   r6   r8   r;   r9   rz   r<   r{   r@   r=   r>   r|   rA   r}   )rd   r   r   r   r   rY   r[   rS   r   rZ   r   rT   lenr   r   r   r   r   r   r   r   r   )r~   r   r   r   ancien_formatmappingscore_sauvegarde	has_cloudhas_nas	has_bandehas_usbr321r   ancien_freqscore_frequence
cloud_rgpdr   	nb_postesancien_os_pscore_os_postesr   nb_serveursancien_os_sscore_os_serveurshypfwvpnphishpras                                rN   _calculer_pointsr   F  s   F -<Hgr,R,RV[,[,[==abF<;J8Ufhj;k;k  pB  <B  <B 7 7  HIF
(GR
0
0C,/5LL==TW[fTfTf}q?P?PlmF<FUV^`tvxFyFy  ~C  GC  GC(B(B  IJF$% 'x1Er4PP  K'2I2sSS 		K2 " %! G !(M= I IJ ###+;#	!1	1	1 //	++//	++  	! 	!Y 	!  	!7 	!  	!9 	!  	!7 	!  	!   	!) 	!w 	!  	!  	!  	! (8F$% 8Xr22D.2emmNNX\`iXiXi.STBTBTopF= !="dCCJ  'Z
D99 '%hr3GG 	'%JOz!!j!J&&OOz))OOJ&&O!0F !>2>>J\!!!%~9Cu9L9L!5!5RS~  -TBBI  *;QDD*?CHHII A~~%)!""  	*
9d ; ; 	*)(M2sKKK *(M	 	$9$$Y1)<)<"5Y&&"##y00Zy5P5P"# &5!" "(ORFFK "(,CQLL!(,BAsKKLK a'+#$$  	,*[$"?"? 	,)(ORMMK ,*m 	&;&&3{+;+;q+@+@$9!![(($%!!#{22z7T7T$%! (9#$ (OR
8
8C a'+#$$	'+#$$@Cu'<'<RS#$ 
;	3	3B46+4E4E00egkyeyeyL]`aLaLa  @AF (GR
0
0C
g~~#|03z0A0A}}q| HlB77E6;}6L6L 2 2mrv~m~m~SehiSiSi  EFF8GR_ac8d8dhm8m8m!4!4stF
(K
4
4C477NN00beiqbqbqIZ]^I^I^wxF0?)UW0X0X\a0a0a__ghF>MrP   	form_datac           	         t          | t                    st          d          t          |           dk    rt          d          t	          |           }d}d}|                                D ]]\  }}t                              |d          }|||z  }n0||k    r%t          	                    d| d| d|            |}||z  }||z  }^|dk    rt          ||z  dz            }nd}t          dt          d|                    }t          | |          }d	}	t          |          |	k    r
|d|	         }t                              d
|||t          |          d           |||d}
||
fS )uL   Calcule le score total. Les N/A sont traités comme Neutres (Points acquis).u$   form_data doit être un dictionnaired   u#   Trop de données dans le formulairer   NzScore u    dépasse le max: z > 2   u-   Calcul scoring terminé (Mode Final Corrigé))score_finalpoints_obtenuspoints_possiblesnb_preconisations)extra)score_totaldetail_scorespreconisations_detail)rZ   dictrW   r   r   itemsSCORE_MAP_CONFIGrS   r]   r^   rT   rU   rV   r   info)r   r   total_points_obtenustotal_points_possiblesrD   valeurmax_theoriquescore_final_sur_100r   MAX_PRECONISATIONSrapport_complets              rN   calculer_cybernote_et_rapportr     s    i&& A?@@@
9~~>??? i((F ||~~ 0 0V(,,S!44 > M1   %%YYYvYY-YYZZZ& F*  	-/ !!!#7:P#PTW"WXX aS*=!>!>?? -Y??N 
>///'(;);(;< KK7.2 6!$^!4!4	
 
     +!/ O //rP   )%typingr   r   r   r   r   r_   logging	getLogger__name__r]   r\   r[   typerd   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rT   r   r   rJ   rP   rN   <module>r      s5   4 3 3 3 3 3 3 3 3 3 3 3 3 3  		8	$	$ """ FFF  ***  5%.	  ZZZ  FFF  ppp  '''   III! $ 000% * ===+ , ???- 0 ***1 2 7773 4 0005 6 5557 8 E5>9 : 322u~?     L Y\ 1 1$sCx. 1s 1S 1QU 1`c 1 1 1 1p                   -. - 9	
 9 > + ( + / / ' - ) +  '!" O# 0_?d38n _?d38n _?QUVZ[^`c[cVdQe _? _? _? _?JPtCH~ P$sHSM7I2J P P P PlC0T#s(^ C0c4PSUXPX>FY@Z C0 C0 C0 C0 C0 C0rP   