Ajout de la fonctionnalité permettant l'import des données de la base précédemment exportés via la fonction idoine + correction du formatage des utilisateurs présents dans le fichier de provision SQL pour Docker + changement de formatage des entêtes de type de données pour la sauvegarde des données de la base

pull/7/head
ycharbi 3 years ago
parent cd42ba8d01
commit 820512ced7

@ -28,7 +28,5 @@ INSERT INTO postfix_liste_noire_expediteurs (courriel,code_retour,message,active
INSERT INTO postfix_liste_noire_expediteurs (courriel,code_retour,message,active) VALUES ("roland@tata.fr",554,"Parle à ma main, ma tête est malade.",1);
-- Listes utilisateurs
INSERT INTO postfix_utilisateurs (utilisateur,mot_de_passe,nom_complet,rep_perso,uid,gid,privilege,active) VALUES ("toto@exemple.fr","{SHA512-CRYPT}$6$xWfisyC6fLawFcBr$zLm4hfRfs6Pn0RKArnyWcgliBy6lpnRUkDHfHMkvskShfLiv4pRIU6XC5ry0ysd.DeKhoAiZUfnNdmwIai2k50","Toto
Dupont","exemple.fr/toto/",3000,3000,"administrateur",1);
INSERT INTO postfix_utilisateurs (utilisateur,mot_de_passe,nom_complet,rep_perso,uid,gid,privilege,prefixe,active) VALUES ("tata@exemple.fr","{SHA512-CRYPT}$6$xWfisyC6fLawFcBr$zLm4hfRfs6Pn0RKArnyWcgliBy6lpnRUkDHfHMkvskShfLiv4pRIU6XC5ry0ysd.DeKhoAiZUfnNdmwIai2k50","Toto
Dupont","exemple.fr/tata/",3000,3000,"utilisateur","ta.",1)
INSERT INTO postfix_utilisateurs (utilisateur,mot_de_passe,nom_complet,rep_perso,uid,gid,privilege,active) VALUES ("toto@exemple.fr","{SHA512-CRYPT}$6$xWfisyC6fLawFcBr$zLm4hfRfs6Pn0RKArnyWcgliBy6lpnRUkDHfHMkvskShfLiv4pRIU6XC5ry0ysd.DeKhoAiZUfnNdmwIai2k50","Toto Dupont","exemple.fr/toto/",3000,3000,"administrateur",1);
INSERT INTO postfix_utilisateurs (utilisateur,mot_de_passe,nom_complet,rep_perso,uid,gid,privilege,prefixe,active) VALUES ("tata@exemple.fr","{SHA512-CRYPT}$6$xWfisyC6fLawFcBr$zLm4hfRfs6Pn0RKArnyWcgliBy6lpnRUkDHfHMkvskShfLiv4pRIU6XC5ry0ysd.DeKhoAiZUfnNdmwIai2k50","Tata Dupuis","exemple.fr/tata/",3000,3000,"utilisateur","ta.",1);

@ -59,7 +59,7 @@ function exportDonneesMessagerie($pdo,$types_donnees_a_exporter) {
$liste_alias_virtuels = $sql->fetchAll(PDO::FETCH_ASSOC);
echo "#~// Alias vituels\n";
echo "#~// Alias_vituels\n";
foreach ($liste_alias_virtuels as $alias_virtuel => $champ_alias_virtuel) {
echo implode(":", $champ_alias_virtuel)."\n";
}
@ -83,7 +83,7 @@ function exportDonneesMessagerie($pdo,$types_donnees_a_exporter) {
$liste_liste_noire_destinataires = $sql->fetchAll(PDO::FETCH_ASSOC);
echo "#~// Liste noire destinataires\n";
echo "#~// Liste_noire_destinataires\n";
foreach ($liste_liste_noire_destinataires as $liste_noire_destinataire => $champ_liste_noire_destinataire) {
echo implode(":", $champ_liste_noire_destinataire)."\n";
}
@ -95,7 +95,7 @@ function exportDonneesMessagerie($pdo,$types_donnees_a_exporter) {
$liste_liste_noire_expediteurs = $sql->fetchAll(PDO::FETCH_ASSOC);
echo "#~// Liste noire expéditeur\n";
echo "#~// Liste_noire_expéditeur\n";
foreach ($liste_liste_noire_expediteurs as $liste_noire_expediteur => $champ_liste_noire_expediteur) {
echo implode(":", $champ_liste_noire_expediteur)."\n";
}
@ -167,5 +167,157 @@ function importAliasVirtuelsUtilisateur($pdo,$alias_virtuel,$utilisateur,$active
}
}
/**
* Fonction important les données sauvegardées dans un fichier CSV par un administrateur avec la fonction exportDonneesMessagerie().
*/
function importDonneesMessagerie($pdo,$type_donnees_csv,$donnees_csv) {
try {
switch ($type_donnees_csv) {
case "alias_virtuels":
$req = 'INSERT INTO postfix_alias_virtuels (courriel,destination,active) VALUES (:alias_virtuel,:destination,:active)';
$sql=$pdo->prepare($req);
$sql->bindValue(':alias_virtuel',htmlspecialchars($donnees_csv[1]));
$sql->bindValue(':destination',htmlspecialchars($donnees_csv[2]));
$sql->bindValue(':active',$donnees_csv[3]);
$sql->execute();
if ($sql->rowCount() == 1){
return true;
}
else {
return false;
}
break;
case "domaines":
$req = 'INSERT INTO postfix_domaines (domaine,defaut,active) VALUES (:domaine,:defaut,:active)';
$sql=$pdo->prepare($req);
$sql->bindValue(':domaine',htmlspecialchars($donnees_csv[1]));
$sql->bindValue(':defaut',htmlspecialchars($donnees_csv[2]));
$sql->bindValue(':active',$donnees_csv[3]);
$sql->execute();
if ($sql->rowCount() == 1){
return true;
}
else {
return false;
}
break;
case "liste_noire_destinataires":
$req = 'INSERT INTO postfix_liste_noire_destinataires (courriel,action,active) VALUES (:courriel,:action,:active)';
$sql=$pdo->prepare($req);
$sql->bindValue(':courriel',htmlspecialchars($donnees_csv[1]));
$sql->bindValue(':action',htmlspecialchars($donnees_csv[2]));
$sql->bindValue(':active',$donnees_csv[3]);
$sql->execute();
if ($sql->rowCount() == 1){
return true;
}
else {
return false;
}
break;
case "liste_noire_expediteurs":
$req = 'INSERT INTO postfix_liste_noire_expediteurs (courriel,code_retour,message,active) VALUES (:courriel,:code_retour,:message,:active)';
$sql=$pdo->prepare($req);
$sql->bindValue(':courriel',htmlspecialchars($donnees_csv[1]));
$sql->bindValue(':code_retour',htmlspecialchars($donnees_csv[2]));
$sql->bindValue(':message',htmlspecialchars($donnees_csv[3]));
$sql->bindValue(':active',$donnees_csv[4]);
$sql->execute();
if ($sql->rowCount() == 1){
return true;
}
else {
return false;
}
break;
case "utilisateurs":
$req = 'INSERT INTO postfix_utilisateurs (utilisateur,mot_de_passe,nom_complet,rep_perso,uid,gid,privilege,prefixe,active) VALUES (:utilisateur,:mot_de_passe,:nom_complet,:rep_perso,:uid,:gid,:privilege,:prefixe,:active)';
$sql=$pdo->prepare($req);
$sql->bindValue(':utilisateur',htmlspecialchars($donnees_csv[1]));
$sql->bindValue(':mot_de_passe',htmlspecialchars($donnees_csv[2]));
$sql->bindValue(':nom_complet',htmlspecialchars($donnees_csv[3]));
$sql->bindValue(':rep_perso',$donnees_csv[4]);
$sql->bindValue(':uid',$donnees_csv[5]);
$sql->bindValue(':gid',$donnees_csv[6]);
$sql->bindValue(':privilege',$donnees_csv[7]);
$sql->bindValue(':prefixe',$donnees_csv[8]);
$sql->bindValue(':active',$donnees_csv[9]);
$sql->execute();
if ($sql->rowCount() == 1){
return true;
}
else {
return false;
}
break;
}
}
catch (\Exception $e) {
die ("Erreur de requête d'export des données de la base en CSV : ".$e->getMessage());
}
}
/**
* Fonction de purge des tables permettant une importation fidèle des données contenues dans un ficher d'export CSV généré par la fonction exportDonneesMessagerie().
*/
function purgeTable($pdo,$table) {
try {
switch ($table) {
case "postfix_alias_virtuels":
$sql = $pdo->prepare('DELETE FROM postfix_alias_virtuels');
$sql->execute();
$sql = $pdo->prepare('UPDATE sqlite_sequence SET seq = 0 WHERE name = "postfix_alias_virtuels"');
$sql->execute();
$sql = $pdo->prepare('VACUUM');
$sql->execute();
break;
case "postfix_domaines":
$sql = $pdo->prepare('DELETE FROM postfix_domaines');
$sql->execute();
$sql = $pdo->prepare('UPDATE sqlite_sequence SET seq = 0 WHERE name = "postfix_domaines"');
$sql->execute();
$sql = $pdo->prepare('VACUUM');
$sql->execute();
break;
case "postfix_liste_noire_destinataires":
$sql = $pdo->prepare('DELETE FROM postfix_liste_noire_destinataires');
$sql->execute();
$sql = $pdo->prepare('UPDATE sqlite_sequence SET seq = 0 WHERE name = "postfix_liste_noire_destinataires"');
$sql->execute();
$sql = $pdo->prepare('VACUUM');
$sql->execute();
break;
case "postfix_liste_noire_expediteurs":
$sql = $pdo->prepare('DELETE FROM postfix_liste_noire_expediteurs');
$sql->execute();
$sql = $pdo->prepare('UPDATE sqlite_sequence SET seq = 0 WHERE name = "postfix_liste_noire_expediteurs"');
$sql->execute();
$sql = $pdo->prepare('VACUUM');
$sql->execute();
break;
case "postfix_utilisateurs":
$sql = $pdo->prepare('DELETE FROM postfix_utilisateurs');
$sql->execute();
$sql = $pdo->prepare('UPDATE sqlite_sequence SET seq = 0 WHERE name = "postfix_utilisateurs"');
$sql->execute();
$sql = $pdo->prepare('VACUUM');
$sql->execute();
break;
}
}
catch (\Exception $e) {
die ("Erreur de requête de purge d'une table : ".$e->getMessage());
}
}
?>

@ -58,7 +58,8 @@ function retourneMessage($type_message,$num_message) {
20 => "<div class=\"alert alert-danger\" role=\"alert\"><img src=\"/fichiers/svg/alert-triangle.svg\"/> L'ancien mot de passe renseigné est erroné.</div>",
21 => "<div class=\"alert alert-danger\" role=\"alert\"><img src=\"/fichiers/svg/alert-triangle.svg\"/> Le mot de passe de confimation n'est pas identique au nouveau mot de passe.</div>",
22 => "<div class=\"alert alert-danger\" role=\"alert\"><img src=\"/fichiers/svg/alert-triangle.svg\"/> Une erreur s'est produite lors de l'envoi du fichier. Il doit être de type CSV de moins de 2 Mo et avoir été généré par Courtail.</div>",
23 => "<div class=\"alert alert-danger\" role=\"alert\"><img src=\"/fichiers/svg/alert-triangle.svg\"/> Votre fichier d'import CSV est plus grand que 2 Mo.</div>"),
23 => "<div class=\"alert alert-danger\" role=\"alert\"><img src=\"/fichiers/svg/alert-triangle.svg\"/> Votre fichier d'import CSV est plus grand que 2 Mo.</div>",
24 => "<div class=\"alert alert-danger\" role=\"alert\"><img src=\"/fichiers/svg/alert-triangle.svg\"/> Auncun type de donnée n'a été spécifié pour l'importation.</div>"),
"messages" => array(
"bienvenue" => "<div class=\"alert alert-primary\" role=\"alert\"><img src=\"/fichiers/svg/info.svg\"/> Bienvenue ".$nom_utilisateur.". Vous êtes authentifié en tant qu'".$privilege_utilisateur.".</div>")
);

@ -120,6 +120,27 @@ echo <<<_HEREDOC_
</form>
_HEREDOC_;
if ($_SESSION['privilege_utilisateur']=="administrateur") {
echo <<<_HEREDOC_
<p>Restauration de la base de données</p>
<p>Attention, toutes les données non sauvegardés dans chaque section sélectionnée et présente dans votre fichier de restauration seront écrasées !</p>
<form action="/services/traitements/import_export/importDonneesBdd.php" method="post" enctype="multipart/form-data">
<input type="file" name="import_donnees_csv">
<label>Alias virtuels :</label>
<input type="checkbox" name="import_alias_virtuels">
<label>Domaines :</label>
<input type="checkbox" name="import_domaines">
<label>Liste noire destinataires :</label>
<input type="checkbox" name="import_liste_noire_destinataires">
<label>Liste noire expéditeurs :</label>
<input type="checkbox" name="import_liste_noire_expediteurs">
<label>Utilisateurs :</label>
<input type="checkbox" name="import_utilisateurs">
<button class="btn btn-primary bouton-ajout" type="submit"><img src="/fichiers/svg/plus.svg"/></button>
</form>
_HEREDOC_;
}
?>
<script src="/fichiers/js/filtre.js"></script>

@ -19,9 +19,7 @@ require_once ($_SERVER["DOCUMENT_ROOT"]."/services/fonctions/bdd/alias_virtuels.
$types_donnees_a_exporter=array();
if (isset($_FILES['import_alias_virtuels_csv']) && !empty($_FILES['import_alias_virtuels_csv']['name']) && $_FILES['import_alias_virtuels_csv']['type']=="text/csv" && $_FILES['import_alias_virtuels_csv']['error']===0) {
if ($_FILES['import_alias_virtuels_csv']['size']<2000000) {
if (file_exists($_FILES['import_alias_virtuels_csv']['tmp_name'])) {
echo "Le fichier ".$_FILES['import_alias_virtuels_csv']['tmp_name']." existe.\n";
if (($fichier_csv = fopen($_FILES['import_alias_virtuels_csv']['tmp_name'], "r")) !== FALSE) {
while (($donnees_csv = fgetcsv($fichier_csv, 1000, ":")) !== FALSE) {
// Vérification de la légitimité des alais virtuels importés
@ -30,7 +28,7 @@ if (isset($_FILES['import_alias_virtuels_csv']) && !empty($_FILES['import_alias_
// Vérification de l'existence du domaine de l'alias virtuel soumis
$domaine_alias_virtuel_csv=explode('@', $donnees_csv[1]);
if (in_array($domaine_alias_virtuel_csv[1],array_column($liste_domaines,'domaine'))) {
// Vérification de la coérence de l'état d'activation de l'alias virtuel soumis
// Vérification de la cohérence de l'état d'activation de l'alias virtuel soumis
if ($donnees_csv[3]==0 || $donnees_csv[3]==1) {
// Omission des doublons
$liste_alias_virtuels = listeAliasVirtuelsPostfix($pdo);

@ -0,0 +1,148 @@
<?php
/**
* Page de traitement permettant l'import des données dans la base de données.
* Elle est appelée par un bouton de la page des paramètres.
*/
session_start();
require_once ($_SERVER["DOCUMENT_ROOT"]."/services/fonctions/sessions/privileges.php");
if (testPrivileges()!="administrateur") {
header("Location: /pages/visiteurs/formulaire_accueil.php?erreur=18");
die();
}
require_once ($_SERVER["DOCUMENT_ROOT"]."/services/fonctions/bdd/import_export.php");
// Permet le contrôle du domaine des alias virtuels du CSV de l'utilisateur
require_once ($_SERVER["DOCUMENT_ROOT"]."/services/fonctions/bdd/domaines.php");
$liste_domaines = listeDomainesPostfix($pdo);
// Permet le contrôle des alias virtuels du CSV de l'utilisateur
require_once ($_SERVER["DOCUMENT_ROOT"]."/services/fonctions/bdd/alias_virtuels.php");
// Permet le contrôle des listes noires du CSV de l'utilisateur
require_once ($_SERVER["DOCUMENT_ROOT"]."/services/fonctions/bdd/listes_noires.php");
// Permet le contrôle des utilisateurs du CSV de l'utilisateur
require_once ($_SERVER["DOCUMENT_ROOT"]."/services/fonctions/bdd/utilisateurs.php");
$types_donnees_a_exporter=array();
// Si aucune case n'est coché pour l'importation, le script ne fait rien et renvoi l'utilisateur sur la page des paramètres
if (!isset($_POST) || empty($_POST)) {
header ("Location: /pages/gestion/administration.php?page=parametres&erreur=24");
die();
}
if (isset($_FILES['import_donnees_csv']) && !empty($_FILES['import_donnees_csv']['name']) && $_FILES['import_donnees_csv']['type']=="text/csv" && $_FILES['import_donnees_csv']['error']===0) {
if ($_FILES['import_donnees_csv']['size']<2000000) {
if (file_exists($_FILES['import_donnees_csv']['tmp_name'])) {
$ligne_fichier_csv=1;
$type_donnees_csv="";
if (($fichier_csv = fopen($_FILES['import_donnees_csv']['tmp_name'], "r")) !== FALSE) {
while (($donnees_csv = fgetcsv($fichier_csv, 1000, ":")) !== FALSE) {
$entete_type_donnees=FALSE;
if (strpos($donnees_csv[0], '#~// ') !== FALSE) {
$type_donnees_csv=explode('#~// ', $donnees_csv[0]);
$entete_type_donnees=TRUE;
}
if (!$entete_type_donnees) {
switch ($type_donnees_csv[1]) {
case "Alias_vituels":
if (isset($_POST['import_alias_virtuels'])) {
if (!isset($purge_table_alias_virtuels)) {
purgeTable($pdo,'postfix_alias_virtuels');
$purge_table_alias_virtuels="";
}
// Vérification de la cohérence des données de l'alias virtuel soumis
if (!empty($donnees_csv[1]) && !empty($donnees_csv[2]) && ($donnees_csv[3]==="0" || $donnees_csv[3]==="1")) {
// Omission des doublons
$liste_alias_virtuels = listeAliasVirtuelsPostfix($pdo);
if (!in_array($donnees_csv[1],array_column($liste_alias_virtuels,'courriel'))) {
importDonneesMessagerie($pdo,"alias_virtuels",$donnees_csv);
}
}
}
break;
case "Domaines":
if (isset($_POST['import_domaines'])) {
if (!isset($purge_table_domaines)) {
purgeTable($pdo,'postfix_domaines');
$purge_table_domaines="";
}
// Vérification de la cohérence des données du domaine soumis
if (!empty($donnees_csv[1]) && ($donnees_csv[2]==="0" || $donnees_csv[2]==="1") && ($donnees_csv[3]==="0" || $donnees_csv[3]==="1")) {
// Omission des doublons
$liste_domaines = listeDomainesPostfix($pdo);
if (!in_array($donnees_csv[1],array_column($liste_domaines,'domaine'))) {
importDonneesMessagerie($pdo,"domaines",$donnees_csv);
}
}
break;
}
case "Liste_noire_destinataires":
if (isset($_POST['import_liste_noire_destinataires'])) {
if (!isset($purge_table_postfix_liste_noire_destinataires)) {
purgeTable($pdo,'postfix_liste_noire_destinataires');
$purge_table_postfix_liste_noire_destinataires="";
}
// Vérification de la cohérence des données de la liste noire destinataire soumise
if (!empty($donnees_csv[1]) && ($donnees_csv[2]==="REJECT" || $donnees_csv[2]==="DEFER") && ($donnees_csv[3]==="0" || $donnees_csv[3]==="1")) {
// Omission des doublons
$liste_entrees_liste_noires_dst=listeEntreeListeNoireDstPostfix($pdo);
if (!in_array($donnees_csv[1],array_column($liste_entrees_liste_noires_dst,'courriel'))) {
importDonneesMessagerie($pdo,"liste_noire_destinataires",$donnees_csv);
}
}
break;
}
case "Liste_noire_expéditeur":
if (isset($_POST['import_liste_noire_expediteurs'])) {
if (!isset($purge_table_postfix_liste_noire_expediteurs)) {
purgeTable($pdo,'postfix_liste_noire_expediteurs');
$purge_table_postfix_liste_noire_expediteurs="";
}
// Vérification de la cohérence des données de la liste noire expediteur soumise
if (!empty($donnees_csv[1]) && ($donnees_csv[2]==="554") && !empty($donnees_csv[3]) && ($donnees_csv[4]==="0" || $donnees_csv[4]==="1")) {
// Omission des doublons
$liste_entrees_liste_noires_exp=listeEntreeListeNoireExpPostfix($pdo);
if (!in_array($donnees_csv[1],array_column($liste_entrees_liste_noires_exp,'courriel'))) {
importDonneesMessagerie($pdo,"liste_noire_expediteurs",$donnees_csv);
}
}
break;
}
case "Utilisateurs":
if (isset($_POST['import_utilisateurs'])) {
if (!isset($purge_table_postfix_utilisateurs)) {
purgeTable($pdo,'postfix_utilisateurs');
$purge_table_postfix_utilisateurs="";
}
// Vérification de la cohérence des données de l'utilisateur soumis
if (!empty($donnees_csv[1]) && !empty($donnees_csv[2]) && !empty($donnees_csv[4]) && !empty($donnees_csv[5]) && !empty($donnees_csv[6]) && !empty($donnees_csv[7]) && ($donnees_csv[9]==="0" || $donnees_csv[9]==="1")) {
// Omission des doublons
$liste_utilisateurs=listeUtilisateursPostfix($pdo);
if (!in_array($donnees_csv[1],array_column($liste_utilisateurs,'utilisateur'))) {
importDonneesMessagerie($pdo,"utilisateurs",$donnees_csv);
}
}
break;
}
}
}
}
fclose($fichier_csv);
header ("Location: /pages/gestion/administration.php?page=parametres&succes=18");
die();
}
}
}
else {
header ("Location: /pages/gestion/administration.php?page=parametres&erreur=23");
die();
}
}
header ("Location: /pages/gestion/administration.php?page=parametres&erreur=22");
die();
?>
Loading…
Cancel
Save