
    4Z0i2                        d dl Z d dlZd dlZd dlmZmZmZmZmZ dZ	de
fdZd ded	ed
ededeeef         f
dZded	edee
eef         fdZded	edefdZdedefdZdedefdZd!dededefdZdedefdZdedefdZdedefdZdedee         defdZdedefdZd!dededeeef         fdZdeeef         fdZdeeef         deeeeef         f         fdZdS )"    N)DictTupleListOptionalUniond   returnc                  .    t          j        d          duS )u.   Vérifie si 'dig' est disponible dans le PATH.digN)shutilwhich     /var/www/html/dns_checker.pydig_availabler      s    <d**r   @8.8.8.8   domainrecord_typeservertimeoutc                 \   d|| |dg}	 t          j        |dd|          }|j                                        }|j                                        }|j        dk    r|sdd|j         d| fS ||fS # t          $ r Y d	S t           j        $ r Y d
S t          $ r}dd| fcY d }~S d }~ww xY w)Nr   z+shortT)capture_outputtextr   r    z$Dig command failed with return code z
. Stderr: )r   z%ERROR: L'outil 'dig' est introuvable.)r   u+   ERROR: Timeout lors de l'exécution de dig.u.   ERROR: Exception lors de l'exécution de dig: )	
subprocessrunstdoutstripstderr
returncodeFileNotFoundErrorTimeoutExpired	Exception)	r   r   r   r   commandresultr   r    es	            r   run_digr(      s   k668<GH4QXYYY$$&&$$&&!!&!cf>Occ[accccv~ ; ; ;:::$ A A A@@@ H H HGAGGGGGGGGGHs0   A%A3 /A3 3
B+ B+	B+B& B+&B+c                     t          | |          \  }}|r	d|v rd|dfS t          |od|v          }|rdnd}|||r|ndfS )NintrouvableFN/ANXDOMAINu   Enregistrement trouvé.u/   Enregistrement non trouvé ou résultat ambigu.)r(   bool)r   r   outputerrorexistsdetails         r   check_record_existsr2       sr    FK00MFE #%''eU""&5Zv566F*0g&&6gF6V66666r   contentc                    | r| dk    r| S |dv r|                                  }|r|d                                         n|                                 }|                                }t          |          dk    r8|d         }t          |          dk    r|dd         d	z   |d
d         z   }| dS dS |dk    rt	          j        d|           }|rm|                    d                                                              dd          }t          |          dk    r|dd         d	z   |d
d         z   n|}| dS | S | S )up   Tronque les clés DKIM, DNSSEC, et DANE pour des raisons de confidentialité et les affiche de manière concise.r+   )DNSKEYTLSAr         N
   z...iu
    [MASQUÉ]u   [Clé masquée]DKIMz
p=([^;"]+)   "r      u    [MASQUÉE])
splitlinesr   splitlenresearchgroupreplace)	r3   r   lines
first_linepartskey_part
masked_keymkeys	            r   mask_record_contentrM   *   si    g&& (((""$$).CU1X^^%%%GMMOO
  ""u::??RyH8}}r!!%crc]U2Xcdd^C
$0000 !  fImW-- 	.''!**""$$,,S"55C9<SBSbSE)CI55CJ ----Nr   c                 0   t          | d          \  }}}d}g }|r|rd |                                D             }|D ]r}|                                }t          |          dk    rI|d                             d          r.|                    |d                             d                     st          |          dk    rd}dt          |           d	}nt          |          d
k    rd}d}|rd                    |          nd}	nd}	|dk    |||	|dS )NMXr   c                 ^    g | ]*}|                                 |                                 +S r   )r   .0ls     r   
<listcomp>z#check_mx_record.<locals>.<listcomp>V   s-    FFFqAGGIIFFFFr   r7   r8   .   u    Plusieurs serveurs MX trouvés (z). Redondance OK.r<      u.   Un seul serveur MX trouvé. Redondance faible.
r+   )statusr1   scorer3   mx_hosts)r2   r?   r@   rA   endswithappendrstripjoin)
r   r0   r1   r3   rZ   r[   rF   linerH   content_to_displays
             r   check_mx_recordrb   P   s>   1&$??FFGEH #' #FFG$6$6$8$8FFF 	7 	7DJJLLE5zzQ59#5#5c#:#:b	 0 0 5 5666x==AEXHXXXFF]]aEEF4<GTYYx000%"ai6EN`nvwwwr   c                 >   t          | d          \  }}}d}d}|rwd |                                D             }|rT|d         }t          j        d|          }|r0|                    d          }|dk    rd}d	}n|d
k    rd}d}nd}d}n
d}d}nd}nd}|dk    |||dS )NTXTr+   r   c                     g | ]@}d |                                 v |                                                    dd          AS )zv=spf1r=   r   )lowerr   rE   rQ   s     r   rT   z$check_spf_record.<locals>.<listcomp>o   sG    cccXYZY`Y`YbYbMbMb""3++MbMbMbr   z([-\~\?])allr<   -   u9   Enregistrement SPF trouvé avec mécanisme strict (-all).~r>   u1   Enregistrement SPF trouvé avec soft-fail (~all).   u%   Enregistrement SPF trouvé avec ?all.rV   u7   Enregistrement SPF trouvé mais sans mécanisme de fin.u9   Aucun enregistrement SPF ('v=spf1') trouvé dans les TXT.u!   Aucun enregistrement TXT trouvé.rY   r1   rZ   r3   )r2   r?   rB   rC   rD   )	r   r0   r1   r3   
spf_recordrZ   rF   rK   kinds	            r   check_spf_recordrn   i   s    1&%@@FFGJE 5ccW5G5G5I5Iccc 	QqJ	/:66A Swwqzz3;;EXFFS[[EPFFEDFFRPFF4ai6EjYYYr   defaultselectorc                 *   |pd}| d|  }t          |d          \  }}}d}d}d}|r\d |                                D             }	|	r3|	d                                         }d| d}d	}t          |d
          }nd| d}d}nd| d}|dk    |||dS )Nro   z._domainkey.rd   r+   r   c                 f    g | ].}d |v |                                                     dd          /S )zv=DKIM1r=   r   )r   rE   rQ   s     r   rT   z%check_dkim_record.<locals>.<listcomp>   s6    \\\YZ[^^""3++^^^r   u0   Enregistrement DKIM trouvé pour le sélecteur 'z'.r:   r;   u   TXT trouvé pour z mais pas de tag v=DKIM1.r7   u+   Aucun enregistrement DKIM TXT trouvé pour rU   rk   )r2   r?   r   rM   )
r   rp   dkim_domainr0   r1   r3   dkim_recordrZ   ra   rF   s
             r   check_dkim_recordru      s    $9H33633K1+uEEFFGKE N\\W5G5G5I5I\\\ 	(..**KTTTTFE!4[&!I!IOOOOFEEM{MMMqjFUOabbbr   c                    d|  }t          |d          \  }}}d}d}|r|                    dd                              dd                                          }t          j        d	|t          j        
          }|r|                    d                                          }t          j        d|t          j        
          }	|	rc|	                    d                                                                          }
|
dk    rd}d}n)|
dk    rd}d}n|
dk    rd}d}nd}d|
 d}n
d}d}nd}nd}|dk    |||dS )Nz_dmarc.rd   r+   r   rX    r=   r   z(.*v=DMARC1[^;]*;.*))flagsr<   z	p=([^;]+)rejectrh   u7   Politique DMARC reject trouvée. (Protection maximale).
quarantinerj   u9   Politique DMARC quarantine trouvée. (Protection active).nonerV   uR   Politique DMARC de monitoring (p=none) trouvée. (Non protectrice, mais présent).r7   u2   DMARC trouvé avec politique inconnue/invalide: p=rU   u@   DMARC trouvé, mais la politique (p=) est manquante ou invalide.u<   Aucun enregistrement DMARC ('v=DMARC1') trouvé dans _dmarc.z%Aucun enregistrement TXT pour _dmarc.rk   )	r2   rE   r   rB   match
IGNORECASErD   rC   rf   )r   dmarc_domainr0   r1   r3   dmarc_recordrZ   raw_content_cleanedm_dmarcm_policypolicys              r   check_dmarc_recordr      s|   %V%%L1,FFFFGLE 9%oodC88@@bIIOOQQ(24Gr}]]] 	T"==++1133Ly|2=QQQH \!**002288::X%%EVFF|++EXFFv%%EqFFE[RX[[[FF[SFF8ai6El[[[r   c                     t          | d          \  }}t          |od|v          }|rdnd}|rdnd}t          |d          }||||dS )Nr5   r,   r:   r   u    DNSSEC activé (DNSKEY trouvé).u)   DNSSEC non activé ou DS Record manquant.rk   )r(   r-   rM   )r   r.   r/   r0   rZ   r1   ra   s          r   check_dnssecr      sn    FH--MFE&5Zv566FBBaE39j//?jF,VX>>K]^^^r   c                 n    t          d| z   d          \  }}}|rd|v rdnd}|dk    rdnd}|dk    |||dS )	Nz	_mta-sts.rd   zv=STSv1r:   r   u'   MTA-STS TXT record (v=STSv1) détecté.u   MTA-STS non détecté.rk   r2   )r   r0   r1   r3   rZ   s        r   check_mta_stsr      s_    1+f2DeLLFFG8Y'11BBqE:?!))66IaFai6EgVVVr   r[   c                 z   g }t          d|  d          \  }}|rd|vr|                    d|  d|            |D ];}d| }t          |d          \  }}|rd|vr|                    d| d|            <t          |          }|rdnd	}	|rd
nd}
t          d                    |          d          }||
|	|dS )Nz
_443._tcp.r6   r,   zHTTPS (z): z	_25._tcp.zSMTP (r:   r   u.   DANE TLSA détecté (via HTTPS et/ou SMTP/MX).u8   DANE TLSA non détecté sur le domaine ou les hôtes MX.rX   rk   )r(   r]   r-   rM   r_   )r   r[   tlsa_recordsoutput_https_hosttlsa_domainoutput_smtpr0   rZ   r1   ra   s               r   check_dane_tlsr      s'   L3633V<<OL! A
,66?f????@@@ A A($(( f55Q 	A:[88 ? ? ?+ ? ?@@@,FBBaEAG  H==  NHF,TYY|-D-DfMMK]^^^r   c                 r    d|  }t          |d          \  }}}d}|r	d|v rd}d}n|rd}nd}|dk    |||d	S )
uJ   Vérifie l'enregistrement BIMI (TXT) dans le sous-domaine 'default._bimi'.zdefault._bimi.rd   r   zv=BIMI1rV   u&   Enregistrement BIMI (v=BIMI1) trouvé.u.   TXT trouvé pour BIMI mais pas de tag v=BIMI1.u2   Aucun enregistrement BIMI (default._bimi) trouvé.rk   r   )r   bimi_domainr0   r1   r3   rZ   s         r   check_bimi_recordr      sv     ,6++K1+uEEFFGE F)w&&9	 FAEai6EgVVVr   dkim_selectorc           
      t   t                      s	ddddddiS t          |           }|                    dg           }|t          |           t	          | |          t          |           t          |           t          |           t          | |          t          |           d}d|d	         v r	|d	         d= |S )
NFATAL_ERRORFzL'outil 'dig' est introuvable.r   r+   rk   r[   MX (Mail Base)zSPF (Security)r;   DMARCDNSSECzMTA-STSzDANE TLSBIMIr   )
r   rb   getrn   ru   r   r   r   r   r   )r   r   	mx_resultr[   resultss        r   check_all_dns_securityr     s    ?? |%;[fgtyzz{{''I}}Z,,H $*622!&-88#F++v&& (("6844!&))	 	G W-...$%j1Nr   c            	          dddddddddS )u@   Retourne la répartition des scores maximums (total 100 points).rV   rh   r:   r   r   r   r   r   get_max_score_breakdownr     s+     	 	 	r   r   c                 
   t                      }d}t          }|                                 D ]"\  }}||v r||                    dd          z  }#t	          dt          ||                    }d}|dk    rd}|dk    rd}|||dS )	u[   Calcule le score total sur 100 et la couleur associée. (Pas de normalisation nécessaire).r   rZ   red#   orangeF   green)rZ   	max_scorecolor)r   MAX_SCORE_TOTALitemsr   maxmin)r   
max_scorescurrent_scoremax_possible_scoreprotocoldatafinal_scorer   s           r   calculate_total_scorer   '  s    (**JM(!--// 2 2$z!!TXXgq111Ma],>??@@K ERb '  r   )r   r   )ro   )r   rB   r   typingr   r   r   r   r   r   r-   r   strintr(   r2   rM   rb   rn   ru   r   r   r   r   r   r   r   r   r   r   r   <module>r      s       				  5 5 5 5 5 5 5 5 5 5 5 5 5 5 +t + + + +H HC Hc H3 Hc HZ_`ceh`hZi H H H H 7 7# 7%c3:O 7 7 7 7! !3 !3 ! ! ! !LxC xD x x x x2ZS ZT Z Z Z Z>c cc cS c c c c c0&\s &\t &\ &\ &\ &\P	_ 	_ 	_ 	_ 	_ 	_W# W$ W W W W_3 _$s) _ _ _ _ _,Wc Wd W W W W& 3 s 4PSUYPY?    .c3h    4T	? tCsCx<P7Q      r   