Compare commits

..

No commits in common. "414b460e20be7c148d984f2265a8c665bbd6f12e" and "f4596236de668151d03821a8f22e208febd9be86" have entirely different histories.

12 changed files with 70 additions and 161 deletions

12
api.php
View file

@ -45,10 +45,9 @@
$query = isset($_GET["req"]) ? $_GET["req"] : ""; $query = isset($_GET["req"]) ? $_GET["req"] : "";
$length = isset($_GET["duree"]) ? $_GET["duree"] : ""; $length = isset($_GET["duree"]) ? $_GET["duree"] : "";
$themes = isset($_GET["themes"]) ? explode(",", $_GET["themes"]) : []; $themes = isset($_GET["themes"]) ? explode(",", $_GET["themes"]) : [];
$tout_les_insa = isset($_GET["tout_les_insa"]) ? true : false;
//print_r($_GET); //print_r($_GET);
try { try {
$results = RechercheExercices($query, $length, $themes,$tout_les_insa); $results = RechercheExercices($query, $length, $themes);
echo json_encode(["status" => "1", "resultats" => $results]); echo json_encode(["status" => "1", "resultats" => $results]);
} catch (Exception $e) { } catch (Exception $e) {
echo json_encode(["status" => "0", "msg" => $e->getMessage()]); echo json_encode(["status" => "0", "msg" => $e->getMessage()]);
@ -162,10 +161,10 @@
case "aj_doc": case "aj_doc":
if($user_auth){ if($user_auth){
/*if(!$csrf->validate($context='televersement',$_POST["jeton-csrf"])){ if(!$csrf->validate($context='televersement',$_POST["jeton-csrf"])){
echo( json_encode(["status"=> "2","msg"=>"jeton csrf manquant ou invalide. ( contenu du champ : ".$_POST["jeton-csrf"]." )"]) ); echo( json_encode(["status"=> "2","msg"=>"jeton csrf manquant ou invalide. ( contenu du champ : ".$_POST["jeton-csrf"]." )"]) );
break; break;
}*/ }
try{ try{
ajouter_doc($_POST); ajouter_doc($_POST);
@ -250,15 +249,14 @@
$username = $_POST['username']; $username = $_POST['username'];
$password = $_POST['password']; $password = $_POST['password'];
$nom_insa = $_POST['nom_insa'];
$password_hash = password_hash($password, PASSWORD_DEFAULT); $password_hash = password_hash($password, PASSWORD_DEFAULT);
$succes = inscription_utilisateur(htmlspecialchars($username),$password_hash,$nom_insa); $succes = inscription_utilisateur(htmlspecialchars($username),$password_hash);
if($succes){ if($succes){
echo( json_encode(["status"=> 1,"msg"=> "Utilisateur inscrit !" ]) ); echo( json_encode(["status"=> 1,"msg"=> "Utilisateur inscrit !" ]) );
}else{ }else{
echo( json_encode(["status"=> "0","msg"=> "Une erreur est survenue lors de votre inscription ou vous avez essayé de modifier le contenu de la requête :/" ]) ); echo( json_encode(["status"=> "0","msg"=> "Une erreur est survenue lors de votre inscription :/" ]) );
} }
break; break;

94
bdd.php
View file

@ -53,14 +53,14 @@ function ajouter_doc($request){
die("Connection failed: " . $conn->connect_error); die("Connection failed: " . $conn->connect_error);
} }
$sql = "INSERT INTO ensembles (commentaire_auteur,corrige_inclu,date_conception,id_auteur) VALUES(?,?,?,?)"; $sql = "INSERT INTO ensembles (commentaire_auteur,corrige_inclu,date_conception) VALUES(?,?,?)";
try{ try{
$stm = $conn->prepare($sql); $stm = $conn->prepare($sql);
$request['commentaire_auteur'] = htmlspecialchars($request["commentaire_auteur"]); $request['commentaire_auteur'] = htmlspecialchars($request["commentaire_auteur"]);
$request["corrige_inclu"] = boolval($request["corrige_inclu"]); $request["corrige_inclu"] = boolval($request["corrige_inclu"]);
$request["date_conception"] = htmlspecialchars($request["date_conception"]); $request["date_conception"] = htmlspecialchars($request["date_conception"]);
$stm->bind_param("sisi",$request['commentaire_auteur'],$request["corrige_inclu"],$request["date_conception"],$_SESSION["user_id"]); $stm->bind_param("sis",$request['commentaire_auteur'],$request["corrige_inclu"],$request["date_conception"]);
$stm->execute(); $stm->execute();
//$conn->execute_query($sql,array(htmlspecialchars($request['commentaire_auteur']),boolval($request["corrige_inclu"]))); //$conn->execute_query($sql,array(htmlspecialchars($request['commentaire_auteur']),boolval($request["corrige_inclu"])));
@ -218,86 +218,67 @@ function saveFilesFromPost($postData,$id_ensemble) {
} }
} }
function RechercheExercices($query, $length, $tags, $tout_les_insa) function RechercheExercices($query, $length, $tags)
{ {
global $conn; global $conn;
// Start with the base SQL query // Build the SQL query based on the search parameters
$sql = "SELECT * FROM documents AS d INNER JOIN ensembles AS e ON d.ensemble_id = e.id JOIN users as u ON u.id=e.id_auteur WHERE e.valide=TRUE"; $sql = "SELECT * FROM documents AS d INNER JOIN ensembles AS e ON d.ensemble_id = e.id WHERE e.valide=TRUE ";
// Array to hold the parameters $conditions = [];
$params = [];
$types = ""; // Types for the bind_param function
// Handle the INSA restriction
if (!$tout_les_insa) {
$sql .= " AND u.nom_insa = ?";
$params[] = $_SESSION["nom_insa"];
$types .= "s"; // Assuming nom_insa is a string
}
// Handle the search query
if (!empty($query)) { if (!empty($query)) {
$query_words = preg_split("/\s+/", htmlspecialchars($query));
// va essayer de retrouver tout les mots de la requête dans le titre
$query = htmlspecialchars($query);
$query_words = preg_split("[ ]",$query);
foreach ($query_words as $word) { foreach ($query_words as $word) {
$sql .= " AND titre LIKE ?"; $conditions[] = "AND titre LIKE '%$word%'";
$params[] = "%$word%";
$types .= "s";
} }
} }
// Handle the length filter
if (!empty($length)) { if (!empty($length)) {
$sql .= " AND duree = ?"; $conditions[] = "duree = $length";
$params[] = $length;
$types .= "i"; // Assuming duree is an integer
} }
// Handle the tags filter
if (!empty($tags)) { if (!empty($tags)) {
foreach ($tags as $tag) { $tagConditions = array_map(function ($tag) {
$tag = htmlspecialchars($tag); $tag = htmlspecialchars($tag);
$sql .= " AND EXISTS (SELECT * FROM exercices_themes AS et INNER JOIN themes AS t ON et.exercice_id = t.id WHERE et.theme_id = t.id AND t.name = ?)"; return "EXISTS (SELECT * FROM exercices_themes AS et INNER JOIN themes AS t ON et.exercice_id = t.id WHERE et.theme_id = t.id AND t.name = '$tag')";
$params[] = $tag; }, $tags);
$types .= "s";
} $conditions[] = implode(" AND ", $tagConditions);
} }
// Prepare the SQL statement
$stmt = $conn->prepare($sql);
if ($stmt === false) {
throw new Exception("Error preparing the query: " . $conn->error);
}
// Bind the parameters dynamically
if (!empty($params)) {
$stmt->bind_param($types, ...$params);
}
$sql .= implode(" AND ", $conditions);
//echo $sql;
// Execute the query // Execute the query
if (!$stmt->execute()) { $result = $conn->query($sql);
throw new Exception("Error executing the search query: " . $stmt->error);
if (!$result) {
throw new Exception("Error executing search query: " . $conn->error);
} }
// Fetch the results
$result = $stmt->get_result();
$exercises = []; $exercises = [];
while ($row = $result->fetch_assoc()) { while ($row = $result->fetch_assoc()) {
$exercises[] = $row; $exercises[] = $row;
} }
// Clean up
$stmt->close();
$conn->close(); $conn->close();
return $exercises; return $exercises;
}
}
function valider_ensemble($ensembleId) { function valider_ensemble($ensembleId) {
$sql = "UPDATE ensembles SET valide = 1 WHERE id = $ensembleId"; $sql = "UPDATE ensembles SET valide = 1 WHERE id = $ensembleId";
@ -371,22 +352,20 @@ function connecter_utilisateur($username,$password){
$ret = 0; $ret = 0;
$stmt = $conn->prepare("SELECT id,password_hash,admin,nom_insa FROM users WHERE username = ?"); $stmt = $conn->prepare("SELECT password_hash,admin FROM users WHERE username = ?");
$stmt->bind_param("s", $username); $stmt->bind_param("s", $username);
$stmt->execute(); $stmt->execute();
$stmt->store_result(); $stmt->store_result();
if ($stmt->num_rows > 0) { if ($stmt->num_rows > 0) {
$stmt->bind_result($id,$password_hash,$admin,$nom_insa); $stmt->bind_result($password_hash,$admin);
$ret = $stmt->fetch(); $ret = $stmt->fetch();
if (password_verify($password, $password_hash)) { if (password_verify($password, $password_hash)) {
$_SESSION["utilisateur_authentifie"] = true; $_SESSION["utilisateur_authentifie"] = true;
$_SESSION["username"] = $username; $_SESSION["username"] = $username;
$_SESSION["admin"] = $admin; $_SESSION["admin"] = $admin;
$_SESSION["nom_insa"] = $nom_insa;
$_SESSION["user_id"] = $id;
$ret = 1; $ret = 1;
} else { } else {
$ret = 0; $ret = 0;
@ -400,17 +379,12 @@ function connecter_utilisateur($username,$password){
} }
function inscription_utilisateur($username,$password_hash,$nom_insa){ function inscription_utilisateur($username,$password_hash){
global $conn; global $conn;
if(!in_array($nom_insa,["insa_toulouse","insa_lyon","insa_rennes","insa_cvl","insa_hdf","insa_rouen","insa_strasbourg","insa_hdf"])){ $stmt = $conn->prepare("INSERT INTO users (username, password_hash) VALUES (?, ?)");
$ret = 0; $stmt->bind_param("ss", $username, $password_hash);
return $ret;
}
$stmt = $conn->prepare("INSERT INTO users (username, password_hash,nom_insa) VALUES (?, ?,?)");
$stmt->bind_param("sss", $username, $password_hash,$nom_insa);
$ret = $stmt->execute(); $ret = $stmt->execute();
@ -421,8 +395,6 @@ function inscription_utilisateur($username,$password_hash,$nom_insa){
$_SESSION["utilisateur_authentifie"] = true; $_SESSION["utilisateur_authentifie"] = true;
$_SESSION["username"] = $username; $_SESSION["username"] = $username;
$_SESSION["admin"] = 0; $_SESSION["admin"] = 0;
$_SESSION["nom_insa"] = $nom_insa;
$_SESSION["user_id"] = $conn->insert_id;
} }
return $ret; return $ret;

View file

@ -195,14 +195,4 @@
.secondary-text { .secondary-text {
font-size: 14px; font-size: 14px;
color: #777; color: #777;
}
#recherche_input{
height: 4vw;
}
.checkbox{
height: 20px;
width: 20px;
} }

View file

@ -118,10 +118,3 @@
margin-right: auto; margin-right: auto;
display: block; display: block;
} }
.label-input{
margin-left: auto;
margin-right: auto;
font-size: larger;
margin-top: 1vw;
}

View file

@ -24,18 +24,9 @@
<h4>Comme vous pouvez le constater, on cherche quelqu'un pour le design (html + css) du site :D club.info@amicale-insat.fr</h4> <h4>Comme vous pouvez le constater, on cherche quelqu'un pour le design (html + css) du site :D club.info@amicale-insat.fr</h4>
<?php <a href="inscription.php" class="button color-red-tr" id="btn-connection">S'inscrire</a>
if(isset($_SESSION["utilisateur_authentifie"]) && ($_SESSION["utilisateur_authentifie"] == 1)){ <a href="connection.php" class="button color-red-tr" id="btn-connection">Se connecter</a>
?> <a href="deconnection.php" class="button color-red-tr" id="btn-deconnection">Se déconnecter</a>
<a href="deconnection.php" class="button color-red-tr" id="btn-deconnection">Se déconnecter</a>
<?php
}else{
?>
<a href="inscription.php" class="button color-red-tr" id="btn-connection">S'inscrire</a>
<a href="connection.php" class="button color-red-tr" id="btn-connection">Se connecter</a>
<?php
}
?>
<br> <br>
<br> <br>
<div id="user_status"> <div id="user_status">
@ -51,9 +42,7 @@
<div class="barre-recherche centre-horizontal"> <div class="barre-recherche centre-horizontal">
<form id="recherche_form"> <form id="recherche_form">
<input class="champ" type="text" id="recherche_input" placeholder="Rechercher une fiche, annale ..."> <input class="champ" type="text" id="recherche_input" placeholder="Rechercher une fiche, annale ...">
<label class="champ" for="tout-les-insa-switch">Activer la recherche sur tout les INSA</label> <input hidden type="submit">
<input class="champ checkbox" type="checkbox" id="tout_les_insa_switch">
<!--<input hidden type="submit">-->
<input hidden class="champ" type="text" id="themes_input" placeholder="themes (appuyez sur la touche entrée entre chaque thèmes)"> <input hidden class="champ" type="text" id="themes_input" placeholder="themes (appuyez sur la touche entrée entre chaque thèmes)">
<input hidden class="champ" type="number" id="duree_input" placeholder="durée en minutes"> <input hidden class="champ" type="number" id="duree_input" placeholder="durée en minutes">
</form> </form>

View file

@ -12,15 +12,6 @@ if ($conn->connect_error) {
// Create tables // Create tables
$sql = " $sql = "
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL,
nom_insa VARCHAR(25) NOT NULL,
admin BOOLEAN DEFAULT 0
);
CREATE TABLE IF NOT EXISTS themes ( CREATE TABLE IF NOT EXISTS themes (
id INT AUTO_INCREMENT PRIMARY KEY, id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL name VARCHAR(255) NOT NULL
@ -32,9 +23,7 @@ $sql = "
valide BOOLEAN NOT NULL DEFAULT FALSE, valide BOOLEAN NOT NULL DEFAULT FALSE,
corrige_inclu BOOLEAN NOT NULL DEFAULT FALSE, corrige_inclu BOOLEAN NOT NULL DEFAULT FALSE,
date_televersement DATETIME DEFAULT CURRENT_TIMESTAMP, date_televersement DATETIME DEFAULT CURRENT_TIMESTAMP,
date_conception VARCHAR(10), date_conception VARCHAR(9)
id_auteur INT,
FOREIGN KEY (id_auteur) REFERENCES users(id)
); );
CREATE TABLE IF NOT EXISTS documents ( CREATE TABLE IF NOT EXISTS documents (
@ -71,6 +60,13 @@ $sql = "
FOREIGN KEY (theme_id) REFERENCES themes(id) FOREIGN KEY (theme_id) REFERENCES themes(id)
); );
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL,
admin BOOLEAN DEFAULT 0
);
"; ";
if ($conn->multi_query($sql) === TRUE) { if ($conn->multi_query($sql) === TRUE) {

View file

@ -25,21 +25,6 @@ session_start();
<div class="formulaire"> <div class="formulaire">
<input class="champ" id="username-input" type="text" name="username" placeholder="Nom d'utilisateur" required> <input class="champ" id="username-input" type="text" name="username" placeholder="Nom d'utilisateur" required>
<input class="champ" id="password-input" type="password" name="password" placeholder="Mot de passe" required> <input class="champ" id="password-input" type="password" name="password" placeholder="Mot de passe" required>
<h4 class=" centre-txt label-input" for="insa-input">Selectionne ton INSA</h4>
<select class="champ" id="insa-input" type="select" name="insa" required>
<option value="insa_toulouse">INSA Toulouse &lt;3</option>
<option value="insa_lyon">INSA Lyon</option>
<option value="insa_rennes">INSA Rennes</option>
<option value="insa_cvl">INSA CVL</option>
<option value="insa_hdf">INSA HDF</option>
<option value="insa_rouen">INSA Rouen</option>
<option value="insa_strasbourg">INSA Strasbourg</option>
<option value="insa_hdf">INSA HDF</option>
</select>
<button class="submit-button color-red-tr" onclick="inscription()">S'inscrire !</button> <button class="submit-button color-red-tr" onclick="inscription()">S'inscrire !</button>
</div> </div>
<h2>Oui c'est vide oui ~\_(^-^)_/~</h2> <h2>Oui c'est vide oui ~\_(^-^)_/~</h2>

View file

@ -1,6 +1,4 @@
async function rechercher(){ async function rechercher(){
var req = document.getElementById("recherche_input").value; var req = document.getElementById("recherche_input").value;
var themes = []; var themes = [];
Array.from(document.getElementsByClassName("theme")).forEach(function (el) { Array.from(document.getElementsByClassName("theme")).forEach(function (el) {
@ -9,36 +7,24 @@ async function rechercher(){
}); });
var duree =document.getElementById("duree_input").value var duree =document.getElementById("duree_input").value
var url = "api.php/rechercher?req="+req; var url = "api.php/rechercher?req="+req;
if(themes.toString() != ""){ if(themes.toString() != ""){
url = url +"&themes="+themes.toString(); url = url +"&themes="+themes.toString();
} }
if(duree != ""){ if(duree != ""){
url = url +"&duree="+duree; url = url +"duree="+duree;
} }
console.log(url); console.log(url);
var tout_les_insa_switch = document.getElementById("tout_les_insa_switch").checked;
if(tout_les_insa_switch){
url = url+"&tout_les_insa=1"
}
resp = await fetch(url); resp = await fetch(url);
data = await resp.json(); data = await resp.json();
console.log(data);
// vide d'abord les éléments présents dans la liste sur la page // vide d'abord les éléments présents dans la liste sur la page
document.getElementById("liste_resultats").innerHTML = ""; document.getElementById("liste_resultats").innerHTML = "";
// ensuite on ajoute un petit titre à la chronologie
let titre = document.createElement("h1");
titre.innerText = "Voilà les "+data.resultats.length+" résultats de ta recherche :";
document.getElementById("liste_resultats").appendChild(titre);
if(data.status == 1){ if(data.status == 1){
data.resultats.forEach(doc => { data.resultats.forEach(doc => {
@ -143,6 +129,7 @@ async function gen_chronologie(){
resp = await fetch(url); resp = await fetch(url);
data = await resp.json(); data = await resp.json();
console.log(data);
// vide d'abord les éléments présents dans la liste sur la page // vide d'abord les éléments présents dans la liste sur la page
document.getElementById("liste_resultats").innerHTML = ""; document.getElementById("liste_resultats").innerHTML = "";
@ -253,21 +240,17 @@ document.addEventListener("DOMContentLoaded", (event)=>{
gen_chronologie(); gen_chronologie();
test_auth(); test_auth();
document.getElementById("recherche_input").addEventListener("keypress", (event)=>{ document.getElementById("recherche_input").onkeydown =function(event) {
console.log("???");
if (event.key === "Enter"){ if (event.key === "Enter"){
event.preventDefault();
rechercher(); rechercher();
} }
}); }
document.getElementById("recherche_form").onsubmit = function(event){ document.getElementById("recherche_form").onsubmit = function(event){
event.preventDefault(); event.preventDefault();
// faire tomber le clavier sur mobile // faire tomber le clavier sur mobile
document.activeElement.blur(); document.activeElement.blur();
rechercher(); rechercher();
} }
document.getElementById("themes_input").onkeydown =function(event) { document.getElementById("themes_input").onkeydown =function(event) {
@ -293,6 +276,5 @@ document.addEventListener("DOMContentLoaded", (event)=>{
window.location.pathname = "/archinsa"; window.location.pathname = "/archinsa";
}); });
}); });

View file

@ -4,8 +4,7 @@ function inscription(){
formData.append("username",document.getElementById("username-input").value); formData.append("username",document.getElementById("username-input").value);
formData.append("password",document.getElementById("password-input").value); formData.append("password",document.getElementById("password-input").value);
console.log(document.getElementById("insa-input").value);
formData.append("nom_insa",document.getElementById("insa-input").value)
formData.append("jeton-csrf",jeton_csrf); formData.append("jeton-csrf",jeton_csrf);
fetch('api.php/inscription', { fetch('api.php/inscription', {

View file

@ -44,7 +44,7 @@ function televerser_fichiers() {
formData.append("type",document.getElementById("select_type").value); formData.append("type",document.getElementById("select_type").value);
formData.append("titre",concatener_titre_inputs()); formData.append("titre",concatenater_titre_inputs());
formData.append("commentaire_auteur",document.getElementById("commentaire_auteur").value); formData.append("commentaire_auteur",document.getElementById("commentaire_auteur").value);
formData.append("corrige_inclu",document.getElementById("corrige_checkbox").value); formData.append("corrige_inclu",document.getElementById("corrige_checkbox").value);

View file

@ -59,9 +59,7 @@ D'autres fonctionnalités seront ajoutées petit à petit. (si vous avez des sug
## TOUDOU : ## TOUDOU :
> choisir un insa à l'inscription > Tester le code qui a été séparé en plusieurs fichiers différents (les pages pour utilisateurs)
> rajouter automatiquement l'insa de celui qui dépose un truc dans la table des ensembles
> mettre un switch pour activer une recherche sur tout les insa
### téléverser.php : ### téléverser.php :
@ -72,4 +70,10 @@ let ex = [{duree:"10",themes:["algèbre","analyse"],commentaire_exo:"cci est un
; ;
`` ``
### _partials/_head.php
- définir la variable $titre_page avant de l'inclure
- va s'occuper de generer tout ce qu'on met dans les tags <head> ainsi que d'importer un fichier css du même nom que la page depuis css/<page>.css (s'il existe)
### _partials/_footer.php
- tout ce qu'on veut faire en fin de chargement de page
- va inclure un script depuis js/<page>.js (s'il existe).

View file

@ -6,15 +6,16 @@ session_start();
$csrf = new CSRF(); $csrf = new CSRF();
// Check if user is logged in and is an admin
if (!isset($_SESSION["utilisateur_authentifie"]) || $_SESSION["utilisateur_authentifie"] !== true || !$_SESSION["admin"]) { include("session_verif.php");
header("Location: index.php");
exit;
}
include("test_creds.php"); include("test_creds.php");
$conn = new mysqli($servername, $username, $password,$dbname); $conn = new mysqli($servername, $username, $password,$dbname);
admin_seulement();
// Function to fetch and display documents // Function to fetch and display documents
function generer_chronologie() { function generer_chronologie() {