Browse Source

Alerte 2auth, Class Calloud, class Html

stany.ferer 1 year ago
parent
commit
a8542ad988

+ 3 - 0
conf.inc.php

@@ -100,3 +100,6 @@ define("EMAIL_SMTP_SECURE", "ssl"); // TLS par défaut en port 587, pour SSL uti
 
 define("EMAIL_FROM_EMAIL", "cms@cse-invent.com");
 define("EMAIL_FROM_NAME", "CMS CSE Invent");
+
+// Sécurité
+define("NB_ALERT_AUTHENTICATOR", 3);

+ 60 - 0
core/class/callout.class.php

@@ -0,0 +1,60 @@
+<?php 
+/**
+ * Class callout
+ *
+ * Cette classe génère des callouts Bootstrap personnalisés.
+ * Un callout est un composant d'interface qui permet de mettre en avant des informations importantes.
+ *
+ * @method static string get(array $_array) Renvoie le HTML du callout.
+ * @method static void print(array $_array) Affiche le callout directement.
+ */
+
+class callout {
+
+    /**
+     * Construit le HTML d'un callout en fonction des paramètres fournis.
+     *
+     * @param array $_array Les paramètres du callout (type, class, h4, p).
+     * @return string Le HTML du callout.
+     */
+    static private function construct(array $_array) {
+        $type = $_array['type'] ?? 'default';
+        $allowedTypes = ['success', 'primary', 'danger', 'warning', 'info'];
+        $type = !in_array($type, $allowedTypes) ? 'default' : $type;
+
+        $size = $_array['size'] ?? '';
+        $allowedSizes = ['tiny'];
+        $size = in_array($size, $allowedSizes) ? "bd-callout-" . $size : NULL;
+
+        $class = $_array['class'] ?? '';
+        $style = $_array['style'] ?? '';
+        $h4 = $_array['h4'] ?? '';
+        $p = $_array['p'] ?? '';
+
+        return  '<div class="bd-callout bd-callout-' . $type . ($size ? ' ' . $size : '') . ($class ? ' ' . $class : '') . '"' . ($style ? ' style="' . $style . '"' : '') . '>' .
+                ($h4 ? '<h4>' . $h4 . '</h4>' : '') .
+                ($p ? '<p>' . $p . '</p>' : '') .
+                '</div>';
+    }
+
+    /**
+     * Renvoie le HTML d'un callout.
+     *
+     * @param array $_array Les paramètres du callout.
+     * @return string Le HTML du callout.
+     */
+    static public function get(array $_array) {
+        return self::construct($_array);
+    }
+
+    /**
+     * Affiche directement le callout.
+     *
+     * @param array $_array Les paramètres du callout.
+     * @return void
+     */
+    static public function print(array $_array) {
+        echo self::construct($_array);
+    }
+
+}

+ 88 - 0
core/class/html.class.php

@@ -0,0 +1,88 @@
+<?php
+
+class html {
+
+    /**
+     * Construit le HTML d'un élément <select>.
+     *
+     * @param string $config  Attributs HTML du <select> sous forme de chaîne.
+     * @param array  $options Tableau associatif des options du <select> (clé = valeur de l'option, valeur = label affiché).
+     * @param mixed  $value   Valeur sélectionnée par défaut (facultatif).
+     * 
+     * @return string Le HTML généré pour l'élément <select>.
+     */
+    private static function constructSelect(string $_config, array $_options, $_value = null): string {
+        $selectHtml = '<select ' . $_config . '>';
+        foreach ($_options as $optionValue => $label) {
+            $selected = ($_value !== null && $_value == $optionValue) ? ' selected' : '';
+            $selectHtml .= sprintf('<option value="%s"%s>%s</option>', htmlspecialchars($optionValue), $selected, htmlspecialchars($label));
+        }
+        $selectHtml .= '</select>';
+        return $selectHtml;
+    }
+
+    /**
+     * Renvoie le HTML d'un élément <select> sous forme de chaîne.
+     *
+     * @param string $config  Attributs HTML du <select> sous forme de chaîne.
+     * @param array  $options Tableau associatif des options du <select> (clé = valeur de l'option, valeur = label affiché).
+     * @param mixed  $value   Valeur sélectionnée par défaut (facultatif).
+     * 
+     * @return string Le HTML généré pour l'élément <select>.
+     */
+    public static function getSelect(string $_config, array $_options, $_value = null): string {
+        return self::constructSelect($_config, $_options, $_value);
+    }
+
+    /**
+     * Affiche directement le HTML d'un élément <select>.
+     *
+     * @param string $config  Attributs HTML du <select> sous forme de chaîne.
+     * @param array  $options Tableau associatif des options du <select> (clé = valeur de l'option, valeur = label affiché).
+     * @param mixed  $value   Valeur sélectionnée par défaut (facultatif).
+     * 
+     * @return void
+     */
+    public static function printSelect(string $_config, array $_options, $_value = null): void {
+        echo self::constructSelect($_config, $_options, $_value);
+    }
+
+    /**
+     * Construit le HTML d'un élément <input> de type texte.
+     *
+     * @param string $config Attributs HTML de l'élément <input> sous forme de chaîne.
+     * @param mixed  $value  Valeur par défaut de l'élément <input> (facultatif).
+     * 
+     * @return string Le HTML généré pour l'élément <input>.
+     */
+    private static function constructInput(string $_config, $_value = null): string {
+        $value = $_value !== null ? htmlspecialchars((string) $_value) : '';
+        $inputHtml = sprintf('<input value="%s" %s />', htmlspecialchars($value), $_config);
+        return $inputHtml;
+    }
+
+    /**
+     * Renvoie le HTML d'un élément <input> de type texte sous forme de chaîne.
+     *
+     * @param string $config Attributs HTML de l'élément <input> sous forme de chaîne.
+     * @param mixed  $value  Valeur par défaut de l'élément <input> (facultatif).
+     * 
+     * @return string Le HTML généré pour l'élément <input>.
+     */
+    public static function getInput(string $_config, $_value = null): string {
+        return self::constructInput($_config, $_value);
+    }
+
+    /**
+     * Affiche directement le HTML d'un élément <input> de type texte.
+     *
+     * @param string $config Attributs HTML de l'élément <input> sous forme de chaîne.
+     * @param mixed  $value  Valeur par défaut de l'élément <input> (facultatif).
+     * 
+     * @return void
+     */
+    public static function printInput(string $_config, $_value = null): void {
+        echo self::constructInput($_config, $_value);
+    }
+
+}

+ 21 - 0
core/class/user.class.php

@@ -313,4 +313,25 @@ class user {
         }
     }
 
+    static public function checkSecur(){
+        db::query("SELECT googleAuthenticator FROM " . DB_T_USER . " WHERE id = :id");
+        db::bind(':id', session::getId());
+        return db::single()["googleAuthenticator"] == 1 ? TRUE : FALSE;
+    }
+
+    static public function printIsSecur(){
+        if(ALERT_AUTHENTICATOR == TRUE){
+            $_SESSION["CALLOUT"] ??= 0;
+            if(self::checkSecur() == FALSE AND $_SESSION["CALLOUT"] < NB_ALERT_AUTHENTICATOR){
+                $callout = [
+                    "type" => "danger",
+                    "size" => "tiny",
+                    "p" => "Pour sécuriser l'accès au CMS, il est fortement recommandé d'activer la double authentification (Google Authenticator) sur votre profil. Pour l'activer sur votre profil en <a href=\"/user.html\">cliquant ici</a>.",
+                ];
+                callout::print($callout);
+                $_SESSION["CALLOUT"]++;
+            }
+        }
+    }
+
 }

+ 4 - 1
core/views/_cms.head.php

@@ -57,4 +57,7 @@
                     require_once DIR_PHP_VIEWS."_cms.menu.php";
                 ?>
 
-                <main class="col-md-9 ms-sm-auto col-lg-10 px-md-4">
+                <main class="col-md-9 ms-sm-auto col-lg-10 px-md-4">
+    <?php   
+        user::printIsSecur();
+    ?>

+ 8 - 4
core/views/pages/cms.alertes-emails.php

@@ -28,10 +28,14 @@ echo core::filAriane(array(
     }
 </style>
 
-<div class="bd-callout bd-callout-info">
-    <h4>Description</h4>
-    <p>Cet espace permet de sélectionner les moments ou vous voulez générer et recevoir les alertes emails provenant du CMS. A ce jour cela ne concerne que les <a href="/documents-my-assign.html">documents à traiter</a>.</p>
-</div>
+<?php
+    $callout = [
+        "type" => "info",
+        "h4" => "Description",
+        "p" => "Cet espace permet de sélectionner les moments ou vous voulez générer et recevoir les alertes emails provenant du CMS. A ce jour cela ne concerne que les <a href=\"/documents-my-assign.html\">documents à traiter</a>.",
+    ];
+    callout::print($callout);
+?>
 
 <div class="tab-content">
     <div class="form-group">

+ 7 - 5
core/views/pages/cms.compte.php

@@ -24,12 +24,14 @@
                 "Comptes bancaires" => NULL,
                 $banque["label"] => "/compte-". core::getGet("id") .".html")
         )); 
-?>
 
-<div class="bd-callout bd-callout-info">
-    <h4>Note</h4>
-    <p>La dernier import des données du compte a été réalisée le <span class="fw-bold"><?php echo core::convertDate(banque::lastRecord(core::getGet("id"))) ?></span> et à cette même date le solde était de <span class="fw-bold"><?php echo banque::getEuro($etatCompte["solde"]) ?></span></p>
-</div>
+    $callout = [
+        "type" => "info",
+        "h4" => "Note",
+        "p" => "La dernier import des données du compte a été réalisée le <span class=\"fw-bold\">" . core::convertDate(banque::lastRecord(core::getGet("id"))) . "</span> et à cette même date le solde était de <span class=\"fw-bold\">" . banque::getEuro($etatCompte["solde"]) . "</span>",
+    ];
+    callout::print($callout);
+?>
 
 <div>
     <table

+ 7 - 5
core/views/pages/cms.documents-my-assign.php

@@ -17,12 +17,14 @@
                 "Vos assignations" => NULL,
                 "Listes des documents à traiter" => "/documents-my-assign.html")
         )); 
-?>
 
-<div class="bd-callout bd-callout-success">
-    <h4>Astuce</h4>
-    <p>Vous avez la possibilité de paramètrer vos alertes en <a href="/alertes-emails.html">cliquant ici</a> et ainsi recevoir cette liste par email quand vous le souhaitez. </p>
-</div>
+    $callout = [
+        "type" => "success",
+        "h4" => "Astuce",
+        "p" => "Vous avez la possibilité de paramètrer vos alertes en <a href=\"/alertes-emails.html\">cliquant ici</a> et ainsi recevoir cette liste par email quand vous le souhaitez.",
+    ];
+    callout::print($callout);
+?>
 
 <div>
     <table

+ 80 - 59
core/views/pages/cms.user.php

@@ -42,18 +42,21 @@ if(core::ifGet("add") AND access::ifAccesss("add-user")) {
 <header class="d-flex flex-column flex-md-row align-items-md-center p-3 bg-light row">
     <div class="col-11">
         <h2 class="bd-title" id="content">
-            <span><?php echo $titre; if(isset($user["last_connect"])){ echo '<span style="margin-left: 15px; font-size: .875rem;">Dernière connexion : ' . $user["last_connect"] ."</span>"; } ?></span>
+            <span><?= $titre ?></span>
         </h2>        
-        <?php if(isset($user["id"]) AND session::getId() != $user["id"] AND $protect != 2){ ?>
+        <?php if (isset($user["id"]) && session::getId() != $user["id"] && $protect != 2): ?>
             <div class="fix-container-button-nav">
-                <a href="/submit.php?from=user-delete&id=<?php echo $user["id"] ?>" onclick="return confirm('Voulez-vous supprimer le compte de <?php echo $user["prenom"] . " " . $user["nom"]; ?> ?')"><button type="submit" class="btn btn-outline-danger btn-sm"><?php icon::getFont(["icon" => "bi-trash-fill"]) ?></i> Supprimer</button></a>
+                <a href="/submit.php?from=user-delete&id=<?= $user['id']; ?>" onclick="return confirm('Voulez-vous supprimer le compte de <?= $user["prenom"] . " " . $user["nom"]; ?> ?')">
+                    <button type="submit" class="btn btn-outline-danger btn-sm"><?= icon::getFont(["icon" => "bi-trash-fill"]); ?> Supprimer</button>
+                </a>
             </div>
-        <?php } elseif($protect == 2){ ?>
+        <?php elseif ($protect == 2): ?>
             <div class="fix-container-button-nav">
-                <a href="/submit.php?from=user-restore&id=<?php echo $user["id"] ?>" onclick="return confirm('Voulez-vous restaurer le compte de <?php echo $user["prenom"] . " " . $user["nom"]; ?> ?')"><button type="submit" class="btn btn-outline-danger btn-sm"><?php echo icon::getFont(["icon" => "bi bi-box2-fill"]) ?> Restaurer</button></a>
+                <a href="/submit.php?from=user-restore&id=<?= $user['id']; ?>" onclick="return confirm('Voulez-vous restaurer le compte de <?= $user["prenom"] . " " . $user["nom"]; ?> ?')">
+                    <button type="submit" class="btn btn-outline-danger btn-sm"><?= icon::getFont(["icon" => "bi bi-box2-fill"]); ?> Restaurer</button>
+                </a>
             </div>
-        <?php } ?>
-        
+        <?php endif; ?>
     </div>
 </header>
 <?php   
@@ -67,6 +70,14 @@ if(core::ifGet("add") AND access::ifAccesss("add-user")) {
         ));
     }
         ?>
+        <?php if (isset($user["last_connect"])): ?>
+        <?php callout::print([
+            "type" => "info",
+            "size" => "tiny",
+            "style" => "margin:-5px 0;",
+            "p" => "Dernière connexion le " . core::convertDate($user["last_connect"]),
+        ]); ?>
+    <?php endif; ?>
 <br />
 <?php if($protect != 2): ?>
     
@@ -81,27 +92,27 @@ if(core::ifGet("add") AND access::ifAccesss("add-user")) {
     
     <div class="form-group">
         <label>Type de compte</label>
+        <?php
+            $id_type = [
+                2 => "Contrôleur QRCode (émargement)",
+                3 => "Assistance sociale",
+                4 => "Modérateur du CMS",
+                5 => "Membre du Bureau du CSE",
+                6 => "Elu du CSE",
+                7 => "Comptable",
+                1 => "Administrateur"
+            ];
+        ?>
         <?php if($protect == 0): ?>
-            <select name="id_type" class="form-select">
-                <option value="2"<?php if(isset($user["id_type"]) AND $user["id_type"] == 2){ echo " selected"; } ?>>Contrôleur QRCode (émargement)</option>
-                <option value="3"<?php if(isset($user["id_type"]) AND $user["id_type"] == 3){ echo " selected"; } ?>>Assistance sociale</option>
-                <option value="4"<?php if(isset($user["id_type"]) AND $user["id_type"] == 4){ echo " selected"; } ?>>Modérateur du CMS</option>
-                <option value="5"<?php if(isset($user["id_type"]) AND $user["id_type"] == 5){ echo " selected"; } ?>>Membre du Bureau du CSE</option>
-                <option value="6"<?php if(isset($user["id_type"]) AND $user["id_type"] == 6){ echo " selected"; } ?>>Elu du CSE</option>
-                <option value="7"<?php if(isset($user["id_type"]) AND $user["id_type"] == 7){ echo " selected"; } ?>>Comptable</option>
-                <option value="1"<?php if(isset($user["id_type"]) AND $user["id_type"] == 1){ echo " selected"; } ?>>Administrateur</option>
-            </select>
+            <?php
+                html::printSelect('name="id_type" class="form-select"', $id_type, $user["id_type"]);
+            ?>
         <?php endif; ?>
         <?php if($protect == 1 OR $protect == 2): ?>
-            <input type="text" class="form-control" value="<?php 
-                if($user["id_type"] == 1){ echo "Administrateur"; }  
-                elseif($user["id_type"] == 2){ echo "Contrôleur QRCode (émargement)"; } 
-                elseif($user["id_type"] == 3){ echo "Assistance sociale"; } 
-                elseif($user["id_type"] == 4){ echo "Modérateur du CMS"; }
-                elseif($user["id_type"] == 5){ echo "Membre du Bureau du CSE"; } 
-                elseif($user["id_type"] == 6){ echo "Elu du CSE"; } 
-                ?>" readonly="readonly" />
-            <input type="hidden" name="id_type" value="<?php echo $user["id_type"] ?>">
+            <?php 
+                html::printSelect('class="form-control" disabled', $id_type, $user["id_type"]);
+                html::printInput('type="hidden" name="id_type"', $user["id_type"]);
+            ?>
         <?php endif; ?>
     </div>
     <br />
@@ -110,53 +121,49 @@ if(core::ifGet("add") AND access::ifAccesss("add-user")) {
         if(access::ifAccesss("add-user") AND core::ifGet("id")) { ?>
             <div class="form-group">
                 <label>Rôles aditionnels</label>
-                <input type="text" value="<?php
-                if (isset($user["tags"])) {
-                    echo $user["tags"];
-                }
-                ?>" id="tags" name="tags" />
+                <?= html::printInput('type="text" name="tags" id="tags"', $user["tags"]) ?>
             </div>
             <br />
     <?php 
         } elseif(isset($user["tags"])) { ?>
         <div class="form-group">
-        <label>Rôles aditionnels</label>
-            <input type="text" class="form-control" name="tags" value="<?php echo $user["tags"] ?>" readonly="readonly" />
+            <label>Rôles aditionnels</label>
+            <?= html::printInput('type="text" class="form-control" name="tags" readonly="readonly"', $user["tags"]) ?>
         </div>
         <br />
     <?php 
         } else {
-            echo '<input type="hidden" name="tags" value="" />';
+            html::printInput('type="hidden" name="tags"');
         }
     ?>
 
     <div class="form-group">
         <label>Prénom</label>
-        <input type="text" class="form-control" value="<?php
-        if (isset($user["prenom"])) {
-            echo $user["prenom"];
-        }
-        ?>" name="prenom" placeholder="" <?php if($protect == 2){ echo 'readonly="readonly"'; } else { echo 'required'; } ?>>
+        <?php
+            $confPrenom = 'type="text" name="prenom" class="form-control" ';
+            $confPrenom .= $protect == 2 ? 'readonly="readonly"' : 'required';
+            html::printInput($confPrenom, $user["prenom"]);
+        ?>
     </div>
     <br />
     
     <div class="form-group">
         <label>nom</label>
-        <input type="text" class="form-control" value="<?php
-        if (isset($user["nom"])) {
-            echo $user["nom"];
-        }
-        ?>" name="nom" placeholder="" <?php if($protect == 2){ echo 'readonly="readonly"'; } else { echo 'required'; } ?>>
+        <?php
+            $confNom = 'type="text" name="nom" class="form-control" ';
+            $confNom .= $protect == 2 ? 'readonly="readonly"' : 'required';
+            html::printInput($confNom, $user["nom"]);
+        ?>
     </div>
     <br />
     
     <div class="form-group">
         <label>Email</label>
-        <input type="email" class="form-control" value="<?php
-        if (isset($user["email"])) {
-            echo $user["email"];
-        }
-        ?>" name="email" placeholder="" <?php if($protect == 2){ echo 'readonly="readonly"'; } else { echo 'required'; } ?>>
+        <?php
+            $confEmail = 'type="text" name="email" class="form-control" ';
+            $confEmail .= $protect == 2 ? 'readonly="readonly"' : 'required';
+            html::printInput($confEmail, $user["email"]);
+        ?>
     </div>
     <br />
     
@@ -164,22 +171,33 @@ if(core::ifGet("add") AND access::ifAccesss("add-user")) {
 
     <div class="form-group">
         <label>Mot de passe</label>
-        <input type="password" class="form-control" minlength="8" maxlength="25" value="" name="password" placeholder="" <?php if(core::ifGet("add")){ echo "required"; } ?>>
+        <?php
+            $confPassword = 'type="password" class="form-control" minlength="8" maxlength="25" name="password" ';
+            $confPassword .= core::ifGet("add") ? 'required"' : NULL;
+            html::printInput($confPassword);
+        ?>
     </div>
     <br />
     
     <div class="form-group">
         <label>Confirmation du mot de passe</label>
-        <input type="password" class="form-control" value="" name="password2" placeholder="" <?php if(core::ifGet("add")){ echo "required"; } ?>>
+        <?php
+            $confPassword2 = 'type="password" class="form-control" minlength="8" maxlength="25" name="password2" ';
+            $confPassword2 .= core::ifGet("add") ? 'required"' : NULL;
+            html::printInput($confPassword2);
+        ?>
     </div>
     <br />
 
     <div class="form-group">
         <label>Google Authenticator</label>
-        <select name="googleAuthenticator" class="form-select">
-            <option value="0"<?php if(isset($user["googleAuthenticator"]) AND $user["googleAuthenticator"] == 0){ echo " selected"; } ?>>Désactivée</option>
-            <option value="1"<?php if(isset($user["googleAuthenticator"]) AND $user["googleAuthenticator"] == 1){ echo " selected"; } ?>>Activée</option>
-        </select>
+        <?php
+            $googleAuthenticator = [
+                    0 => "Désactivé",
+                    1 => "Activé",
+                ];
+            html::printSelect('name="googleAuthenticator" class="form-select"', $googleAuthenticator, $user["googleAuthenticator"]);
+        ?>
     </div>
     <br />
 
@@ -202,16 +220,19 @@ if(core::ifGet("add") AND access::ifAccesss("add-user")) {
     <?php if($protect == 0): ?>
     <div class="form-group">
         <label>Etat du compte</label>
-        <select name="actif" class="form-select">
-            <option value="0"<?php if(isset($user["actif"]) AND $user["actif"] == 0){ echo " selected"; } ?>>Compte désactivé</option>
-            <option value="1"<?php if(isset($user["actif"]) AND $user["actif"] == 1){ echo " selected"; } ?>>Compte activé</option>
-        </select>
+        <?php
+            $actif = [
+                    0 => "Compte désactivé",
+                    1 => "Compte activé",
+                ];
+            html::printSelect('name="actif" class="form-select"', $actif, $user["actif"]);
+        ?>
     </div>
     <br />
     <?php endif; ?>
 
     <?php if($protect == 1): ?>
-        <input type="hidden" name="actif" value="<?php echo $user["actif"] ?>">
+        <?= html::printInput('type="hidden" name="actif"', $user["actif"]); ?>
     <?php endif; ?>
 
     <input class="btn btn-primary btn-lg" style="width: 100%; margin-bottom:20px;" type="submit" value="<?php echo $submit ?>">

+ 4 - 0
public-cms/css/cms.css

@@ -25,6 +25,10 @@
     border-radius: .25rem
 }
 
+.bd-callout-tiny {
+    padding: .6rem .4rem .4rem .4rem;
+}
+
 .bd-callout h4 {
     margin-top: 0;
     margin-bottom: .25rem;