ajout projet cms elyes

This commit is contained in:
elyes
2025-11-03 00:39:36 +01:00
parent a1f7262e89
commit daa719eac7
25 changed files with 924 additions and 0 deletions

View File

@@ -0,0 +1,11 @@
<?php
$env = fn($k, $d=null) => getenv($k) !== false ? getenv($k) : $d;
define('DB_HOST', $env('DB_HOST', 'localhost'));
define('DB_NAME', $env('DB_NAME', 'cms_simplifie'));
define('DB_USER', $env('DB_USER', 'root'));
define('DB_PASS', $env('DB_PASS', ''));
define('BASE_URL', '');
define('APP_NAME', 'CMS Simplifié');
date_default_timezone_set('Europe/Paris');

12
cms_simplifie/inc/db.php Normal file
View File

@@ -0,0 +1,12 @@
<?php
require_once __DIR__ . '/config.php';
try {
$pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8mb4', DB_USER, DB_PASS, [
PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC
]);
} catch(PDOException $e) {
http_response_code(500);
echo "<h1>Erreur DB</h1><p>".htmlspecialchars($e->getMessage())."</p>";
exit;
}

View File

@@ -0,0 +1,9 @@
</main>
<footer class="site-footer">
<div class="container">
<p>&copy; <?= date('Y') ?> <?= e(APP_NAME) ?> — <a href="https://www.basilis-digitale.com" target="_blank" rel="noopener noreferrer">
Développé par Elyes Atoui</a></p>
</div>
</footer>
</body>
</html>

View File

@@ -0,0 +1,45 @@
<?php
// Démarre la session si elle n'est pas déjà active
if (session_status() === PHP_SESSION_NONE) { session_start(); }
// Vrai si un utilisateur est connecté
function is_logged_in(): bool { return !empty($_SESSION['user_id']); }
// Renvoie l'ID de l'utilisateur connecté (ou null)
function current_user_id(): ?int { return $_SESSION['user_id'] ?? null; }
// Renvoie le login/pseudo de l'utilisateur (ou null)
function current_user_login(): ?string { return $_SESSION['login'] ?? null; }
// Renvoie le rôle courant (par défaut 'user')
function current_user_role(): string { return $_SESSION['role'] ?? 'user'; }
// Vrai si l'utilisateur courant est admin
function is_admin(): bool { return current_user_role() === 'admin'; }
// Protège une page : redirige vers /admin/login.php si non connecté
function require_login(): void { if (!is_logged_in()) { header('Location: /admin/login.php'); exit; } }
// Échappe le HTML pour éviter les attaque xss
function e(?string $s): string { return htmlspecialchars((string)$s, ENT_QUOTES, 'UTF-8'); }
// Retourne un extrait limité à 150 caractères
function excerpt(string $c, int $l=150): string { $c=strip_tags($c); return mb_strlen($c)<= $l? $c: mb_substr($c,0,$l).'…'; }
// Génère/récupère le jeton CSRF stocké en session
function csrf_token(): string { if (empty($_SESSION['csrf_token'])) { $_SESSION['csrf_token']=bin2hex(random_bytes(32)); } return $_SESSION['csrf_token']; }
// Champ caché à insérer dans les formulaires avec le jeton CSRF
function csrf_input(): string { return '<input type="hidden" name="csrf" value="'.e(csrf_token()).'">'; }
// Vérifie le jeton CSRF sur les requêtes POST, sinon bloque avec 400
function verify_csrf(): void {
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$t = $_POST['csrf'] ?? '';
if (!$t || !hash_equals($_SESSION['csrf_token'] ?? '', $t)) {
http_response_code(400);
echo "<h1>Requête invalide</h1><p>Jeton CSRF manquant ou invalide.</p>";
exit;
}
}
}

View File

@@ -0,0 +1,28 @@
<?php
require_once __DIR__ . '/functions.php';
?>
<!doctype html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title><?= e(APP_NAME) ?></title>
<link rel="stylesheet" href="/assets/css/style.css">
</head>
<body>
<header class="site-header">
<div class="container">
<h1 class="logo"><a href="/public/index.php"><?= e(APP_NAME) ?></a></h1>
<nav>
<a href="/public/index.php">Accueil</a>
<?php if (is_logged_in()): ?>
<a href="/admin/dashboard.php">Mon espace</a>
<a href="/admin/logout.php">Déconnexion (<?= e(current_user_login()) ?>)</a>
<?php else: ?>
<a href="/admin/login.php">Connexion</a>
<a href="/admin/register.php">Inscription</a>
<?php endif; ?>
</nav>
</div>
</header>
<main class="container">