Commit fafe8ac2 authored by Kylian ou Nathan's avatar Kylian ou Nathan
Browse files

Up

parent 4dd60ce1
......@@ -12,26 +12,45 @@ class API extends CI_Controller{
}
// Controlleur pour l'API
public function init() {
$ip = $this->uri->segment(2);
$type = $this->uri->segment(3);
// On récupère les segments dans l'URL
// Format de l'url : http://[IP_RPI]/api/[IP_CAPTEUR]/[TYPE_DE_LOG]
// IP_RPI = Ip du serveur de l'application web
// IP_CAPTEUR = Ip du capteurs ( le capteur doit en premier être ajouté via l'interface )
// TYPE_DE_LOG = Type du log envoyé par le capteur
$ip = $this->uri->segment(2); // Permet de récupérer l'ip du capteur
$type = $this->uri->segment(3); // Permet de récupérer le type de log
// On récupère les informations du capteur grace a son ip
$capteur = $this->CapteurModele->getWithIP($ip);
// Si le capteur n'existe pas on affiche un message d'erreur
if($capteur === false){
echo "Capteur inexistant";
} else {
// Sinon on va ajouter le log dans la base de donnée
// On définit le type d'action possible
// intrusion = Une intrusion a été détecté
// batterie = Un capteur avec une batterie pourrait tomber en panne de batterie donc il peut emmettre ce type de log pour avertir les utilisateurs
$actionDisponible = array("intrusion", "batterie");
// On vérifie que notre type de log envoyé par le capteur est correct
if(in_array($type, $actionDisponible)) {
// On récupère le profil actif
$profil = $this->ProfilModele->getActive();
// On récupere la date de début et de fin
$debut = explode(":", $profil->debut);
$fin = explode(":", $profil->fin);
// On convertit les heures en milliseconde
$now = mktime(date("H"), date("i"), 0, 0,0,0);
$debut = mktime($debut[0], $debut[1], 0, 0,0,0);
$fin = mktime($fin[0], $fin[1], 0, 0,0,0);
......
......@@ -14,6 +14,7 @@ class Accueil extends CI_Controller
$this->load->helper("url_helper");
}
// Controlleur pour la page "Accueil"
public function home()
{
......@@ -24,31 +25,29 @@ class Accueil extends CI_Controller
}
if ($this->input->server('REQUEST_METHOD') == 'POST') {
} else {
$data = $this->AccueilModele->get();
$data->capteur_log = $this->LogCapteurModele->getIntrusionForToday();
if( $data->capteur_log != false ) {
$data->capteur_log->date = DateTime::createFromFormat("Y-m-d H:i:s", $data->capteur_log->date);
}
// On récupère les informations de la table Maison
$data = $this->AccueilModele->get();
// LISTER LES PROFILS EXISTANT
$data->listes_profils = $this->ProfilModele->getAll();
// On récupère les logs des capteurs pour ce jour
$data->capteur_log = $this->LogCapteurModele->getIntrusionForToday();
// CONNAITRE LE PROFIL ACTUEL
$data->profil_actif = $this->ProfilModele->getActive();
// On récupère la listes des profils existants
$data->listes_profils = $this->ProfilModele->getAll();
// On récupère le profil actif
$data->profil_actif = $this->ProfilModele->getActive();
$this->load->view('accueil/accueil', $data);
}
// TODO : Récupérer les capteurs
// TODO : Récupérer les capteurs désactivé
// On affiche la vue avec toutes les informations
$this->load->view('accueil/accueil', $data);
}
// Controlleur pour la page "Modifier les paramètres de la maison"
public function edit()
{
......@@ -63,48 +62,62 @@ class Accueil extends CI_Controller
if ($this->input->server('REQUEST_METHOD') == 'POST') {
//REQUETE HTTP POST
// Si toutes les données sont correctement remplis
if ($this->input->post('nom') != null &&
$this->input->post('adresse') != null) {
$nom = $this->input->post('nom');
$adresse = $this->input->post('adresse');
// On met a jour le capteur
// On met a jour les paramètres de la maison
$this->AccueilModele->edit($nom, $adresse);
}
// Si une image est envoyé
if ($_FILES["image"]) {
// On définit ou elle sera stocké
$target_file = "./static/ressources/background.jpg";
$imageFileType = strtolower(pathinfo(basename($_FILES["image"]["name"]), PATHINFO_EXTENSION));
// On vérifie que c'est bien une image
$check = getimagesize($_FILES["image"]["tmp_name"]);
// Si c'est bien une image et que la taille est inférieur à 500Ko et que c'est un type jpg
if ($check !== false && $_FILES["image"]["size"] < 500000 && ($imageFileType == "jpg" || $imageFileType == "jpeg")) {
//On remplace le fichier statique par notre image
move_uploaded_file($_FILES["image"]["tmp_name"], $target_file);
}
}
redirect("/", "refresh");
// On redirige vers l'accueil
redirect("/", "refresh");
} else {
//REQUETE HTTP GET OU AUTRE
// On récupère les paramètres
$data = $this->AccueilModele->get();
// On affiche la vue
$this->load->view('accueil/edit', $data);
}
}
// Permet de mettre a jour le profil depuis la page d'accueil
//
// Controlleur pour la page "Accueil" -> "Modifier le profil actif"
public function edit_profil(){
// On vérifie que c'est bien une requete de type post et que la valeur du nouveau profil actif n'est pas vide
if ($this->input->server('REQUEST_METHOD') == 'POST' && $this->input->post('profilActif') != null) {
// On met a jour le profil
$this->ProfilModele->setActive($this->input->post('profilActif'));
}
// On redirige vers l'accueil
redirect("/", "refresh");
}
......
......@@ -116,7 +116,7 @@ class Authentification extends CI_Controller {
if($mdpoublie == true){
$token = uniqid();
//If there is a token, we delete it
//Si il y a un déjà un toke, nous le détruisons
if($this->MotDePasseOublieModele->verify($email, $token))
{
$this->MotDePasseOublieModele->delete($email, $token);
......@@ -156,27 +156,45 @@ class Authentification extends CI_Controller {
$headers .= 'Reply-To: lockhome@lockhome.nrocher.fr' . "\r\n";
$headers .= 'X-Mailer: PHP/' . phpversion();
if(mail($email, $subject, $message, $headers)) {
echo "<br>Email accepted by server";
} else {
echo "<br>Error: Email not accepted by server";
}
return mail($email, $subject, $message, $headers);
}
public function nouveau_mot_de_passe($token)
{
if(isset($_POST["email"]) && isset($_POST["mot_de_passe"]) && $token != '')
// Envoit du formulaire
if($this->input->server('REQUEST_METHOD') == 'POST')
{
if($this->MotDePasseOublieModele->verify(isset($_POST["email"]), $token))
// Vérification du formulaire
if(isset($_POST["email"]) && isset($_POST["mot_de_passe"]) && $token != '')
{
$this->MotDePasseOublieModele->resetPassword(isset($_POST["mot_de_passe"]), isset($_POST["email"]));
$this->MotDePasseOublieModele->delete(isset($_POST["email"]), $token);
// On vérifie si il a bien demandé une réinitialisation du mot de passe
if($this->MotDePasseOublieModele->verify($_POST["email"], $token))
{
// On chnage le mot de passe avec le nouveau
$this->MotDePasseOublieModele->resetPassword($_POST["mot_de_passe"], $_POST["email"]);
// On supprime la demande
$this->MotDePasseOublieModele->delete($_POST["email"], $token);
//On affiche une vue pour montrer à l'utilisateur que le mot de passe a été changé
$msg = array("nouveauMotDePasse" => true);
$this->load->view('auth/nouveau_mot_de_passe', $msg);
} else {
$msg = array("error" => "Aucune demande de réinitialisation de mot de passe n'a été faite.");
$this->load->view('auth/nouveau_mot_de_passe', $msg);
}
// Si il a pas envoyé toutes les informations, on affiche une erreur
} else {
$msg = array("error" => "Il n'y a pas d'email, mot de passe ou de token initialisé.");
$this->load->view('auth/nouveau_mot_de_passe', $msg);
}
}
else
{
echo "<br>email, password or token not set !";
}
// Sinon nous sommes en GET, donc en renvoit la vue
} else {
$this->load->view('auth/nouveau_mot_de_passe');
}
}
}
\ No newline at end of file
......@@ -9,118 +9,125 @@ class LogCapteurModele extends CI_Model
}
// METHODE PERMETTANT DE RECUPERER TOUT LES INTRUSION DU JOUR
// METHODE PERMETTANT DE RECUPERER TOUT LES INTRUSIONS DU JOUR
// @return : false ou un Objet comprenant les informations de l'intrusion
public function getIntrusionForToday()
{
$date = new DateTime();
// Requete SQL permettant de sélectionner la première intrusion de la journée
$sql = "SELECT LogCapteur.*, Capteur.nom from LogCapteur, Capteur WHERE LogCapteur.capteurId = Capteur.id AND action = 'intrusion' AND `date` BETWEEN '" . date_format($date, "Y-m-d"). " 00:00:01' AND '" . date_format($date, "Y-m-d"). " 23:59:59' LIMIT 1";
// On execute la requete
$query = $this->db->query($sql);
// Si aucune valeur, on renvoit false
if ($query->num_rows() == 0) {
return false;
} else {
return $query->result()[0];
// Si il y a des données
$result = $query->result()[0];
// On transforme la date en un objet DateTime
$result->date = DateTime::createFromFormat("Y-m-d H:i:s", $result->date);
// On renvoit l'objet
return $result;
}
}
// METHODE PERMETTANT DE RECUPERER TOUT LES LOGS D'UNE JOURNEE
// @return : false ou un tableau de log
public function getAllDay($date = "today")
{
// On transforme la date en DateTime
$date = $date === "today" ? new DateTime() : $date;
// Permet de sélectionner les logs de la journée
$sql = "SELECT LogCapteur.*, Capteur.nom from LogCapteur, Capteur WHERE LogCapteur.capteurId = Capteur.id AND `date` BETWEEN '" . date_format($date, "Y-m-d"). " 00:00:01' AND '" . date_format($date, "Y-m-d"). " 23:59:59'";
// On execute la requete
$query = $this->db->query($sql);
// On renvoit false si aucune donnée
if ($query->num_rows() == 0) {
return false;
} else {
$result = $query->result();
if($result !== false){
$group = [];
$groupe = "";
foreach ($result as $item) {
$dt = DateTime::createFromFormat("Y-m-d H:i:s", $item->date);
$time = mktime($dt->format('H'), $dt->format('i'), $dt->format('s'), 1, 1, 1);
// Sinon, on va formatter les données
// Gestion des groupes
$gr_1 = mktime($dt->format('H'), 0, 0, 1, 1, 1) - $time;
$gr_2 = mktime($dt->format('H'), 30, 0, 1, 1, 1) - $time;
$tren = mktime($dt->format('H'), 30, 0, 1, 1, 1);
if($gr_1 <= $gr_2 and $time < $tren){
// RENTRE DANS LE GROUPE 1
$groupe = $dt->format("H").":00";
} else {
// RENTRE DANS LE GROUPE 2
$groupe = $dt->format("H").":30";
}
$result = $query->result();
if (!isset($group[$groupe])) {
$group[$groupe] = [];
}
$group = [];
$groupe = "";
// Pour chaque logs
// On va grouper les logs par groupe de 30 minutes
foreach ($result as $item) {
// On formatte la date en objet DateTime
$dt = DateTime::createFromFormat("Y-m-d H:i:s", $item->date);
$item->date = $dt;
/* -------------------------------------- */
/* On calcule dans quel groupe est le log
/* -------------------------------------- */
$time = mktime($dt->format('H'), $dt->format('i'), $dt->format('s'), 1, 1, 1);
$gr_1 = mktime($dt->format('H'), 0, 0, 1, 1, 1) - $time;
$gr_2 = mktime($dt->format('H'), 30, 0, 1, 1, 1) - $time;
$tren = mktime($dt->format('H'), 30, 0, 1, 1, 1);
if($gr_1 <= $gr_2 and $time < $tren){
$groupe = $dt->format("H").":00"; // Groupe H : 00
} else {
$groupe = $dt->format("H").":30"; // Groupe H : 30
}
$item->date = $dt;
/* -------------------------------------- */
array_push($group[$groupe], $item);
// On vérifie que le groupe existe
if (!isset($group[$groupe])) {
$group[$groupe] = [];
}
$result = $group;
// On ajoute dans le groupe correspondant
array_push($group[$groupe], $item);
}
return $result;
}
}
// METHODE PERMETTANT DE RECUPERER TOUT LES LOGS D'UN CAPTEUR POUR UNE DATE
public function getForDayForSensor($date = "today", $idCapteur)
{
$date = $date == "today" ? date("Y-m-d H:i:s") : $date;
$sql = "SELECT * from LogCapteur WHERE `idCapteur` = '" . $idCapteur . "' AND `date` BETWEEN '" . date("Y-m-d"). " 00:00:01' AND '" . date("Y-m-d"). " 23:59:59'";
$query = $this->db->query($sql);
if ($query->num_rows() == 0) {
return false;
} else {
return $query->result();
// On renvoit les groupes
return $group;
}
}
// METHODE PERMETTANT DE RECUPERER TOUT LES LOGS
// METHODE PERMETTANT DE RECUPERER LA PREMIERE INTRUSION D'UN JOUR
// @return : false ou un tableau de groupe
public function getAll($index = 0)
{
$limit = 25;
$offset = $index * $limit;
// $limit et $offset permettent de limiter la réception de log
$limit = 25; // Ici fixer a 25
$offset = $index * $limit; // Permet de définir quelle page de log on souhaite consulter
// Requete permettant de récuperer les logs
$sql = "SELECT date from LogCapteur ORDER BY date ASC LIMIT $limit OFFSET $index";
// On execute la requete
$query = $this->db->query($sql);
// On renvoit false si pas de donnée
if ($query->num_rows() == 0) {
return false;
} else {
// On va chercher les données
// On récupère uniquement les dates
$date = array_column($query->result(), "date");
$inc_date = array();
$return = array();
// On récupère uniquement le premier log pour une journée donnée
foreach($date as $d){
// On récupère uniquement le premier log pour une journée donnée
$date_formated = date_format(date_create($d), "Y-m-d");
if(!in_array($date_formated, $inc_date)){
array_push($inc_date, $date_formated);
......@@ -133,18 +140,17 @@ class LogCapteurModele extends CI_Model
}
// METHODE PERMETTANT D'AJOUTER UN LOG
// @return : boolean
public function add($capteurID, $action)
{
// On prépare les données
$data = array();
$data["capteurId"] = $capteurID;
$data["action"] = $action;
// On envoit les données
$this->db->insert('LogCapteur', $data);
if ($this->db->affected_rows() > 0) {
return true;
} else {
return false;
}
return $this->db->affected_rows() > 0;
}
}
......@@ -28,14 +28,21 @@ class MotDePasseOublieModele extends CI_Model
public function verify($email, $token)
{
$user = $this->getIdUser($email);
var_dump($user);
if($user)
{
$sql = "SELECT * FROM MotDePasseOublie WHERE user = ? AND token = ? LIMIT 1";
$query = $this->db->query($sql, array($user, $token));
return $this->db->affected_rows() > 0;
if($this->db->affected_rows() > 0)
{
return true;
} else {
return false;
}
} else {
echo "<br> L'idUser n'est pas définis";
}
}
......@@ -48,7 +55,9 @@ class MotDePasseOublieModele extends CI_Model
$this->db->delete('MotDePasseOublie', array("user" => $id));
return $this->db->affected_rows();
}
} else {
echo "<br> L'idUser n'est pas définis";
}
}
public function add($email, $token) //mdp oublié premier form
......@@ -64,6 +73,8 @@ class MotDePasseOublieModele extends CI_Model
$this->db->insert('MotDePasseOublie', $data);
return $this->db->affected_rows();
} else {
echo "<br> L'idUser n'est pas définis";
}
}
......@@ -75,7 +86,7 @@ class MotDePasseOublieModele extends CI_Model
$data = array();
$data["password"] = $password;
$this->db->update('Authentification', $date, array("email" => $email));
$this->db->update('Authentification', $data, array("email" => $email));
return $this->db->affected_rows();
}
......
......@@ -5,22 +5,34 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Nouveau mot de passe</title>
<link rel="stylesheet" type="text/css" href="static/connexion.css">
<link rel="stylesheet" type="text/css" href="/static/connexion.css">
<link rel="stylesheet" href="https://unicons.iconscout.com/release/v2.0.1/css/unicons.css">
</head>
<body>
<div class="contenu">
<div class="logo">
<img src="static/ressources/logo.png">
<img src="/static/ressources/logo.png">
<h1>Lock Home</h1>
</div>
<h2>Changement de mot de passe</h2>
<form action="./nouveau_mot_de_passe" method="post">
<form action="<?= base_url(uri_string()) ?>" method="post">
<?php if(isset($nouveauMotDePasse) && $nouveauMotDePasse == true) { ?>
<div class="okay"><i class='uil uil-envelope-send'></i>Votre mot de passe a bien été changé.</div>
<a href="/accueil" class="okay_retour"><i class='uil uil-envelope-send'></i>Retour à l'accueil.</a>
<?php } else { ?>
<?php if(isset($error)) { ?>
<div class="error"><i class='uil uil-exclamation-triangle'></i> <?= $error; ?></div>
<?php } ?>
<input type="email" name="email" placeholder="Email" required="required">
<input type="password" name="mot_de_passe" placeholder="Mot de passe" required="required">
<button type="submit">Mettre à jour</button>
<?php } ?>
</form>
</div>
</body>
......
body{
font-family: Roboto,sans-serif;
width: 100%;
padding: 0;
margin: 0;
/*background: #F1F1F1;*/
body {
font-family: Roboto, sans-serif;
width: 100%;
padding: 0;
margin: 0;
/*background: #F1F1F1;*/
}
.contenu{
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
width: 100%;
.contenu {
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
width: 100%;
}
.logo{
text-align: center;
.logo {
text-align: center;
}
.logo img{
width: 50%;
height: auto;
.logo img {
width: 50%;
height: auto;
}
h1{
text-align: center;
font-style: normal;
font-weight: bold;
color: #1B6DC1;
h1 {
text-align: center;
font-style: normal;
font-weight: bold;
color: #1B6DC1;
}
h2 {
display: block;
padding: 0px;
margin: 5px 0;
margin-top: 25px;
width: 80%;
max-width: 450px;
display: block;
padding: 0px;
margin: 5px 0;
margin-top: 25px;
width: 80%;
max-width: 450px;
}
form {
display: flex;
flex-direction: column;
align-items: center;
width: 100%;