cyla/core.php

156 lines
4.3 KiB
PHP
Raw Normal View History

2025-01-15 15:44:23 +01:00
<?php
// Charger la configuration avant tout
require_once __DIR__ . '/config.php';
// Démarrer la session
session_name(SESSION_NAME);
session_start();
/**
* Classe principale de Cyla
*/
class Cyla {
/**
* Vérifie si un utilisateur est connecté
* @return bool
*/
public static function isLoggedIn() {
return isset($_SESSION['user']) && isset($_SESSION['last_activity']) &&
(time() - $_SESSION['last_activity']) < SESSION_LIFETIME;
}
/**
* Met à jour le timestamp de dernière activité
*/
public static function updateActivity() {
$_SESSION['last_activity'] = time();
}
/**
* Authentifie un utilisateur
* @param string $username Nom d'utilisateur
* @param string $password Mot de passe
* @return bool
*/
public static function authenticate($username, $password) {
global $ADMIN_USERS;
if (!isset($ADMIN_USERS[$username])) {
return false;
}
$user = $ADMIN_USERS[$username];
$hashed = hash(HASH_ALGO, $password . $user['salt']);
if ($hashed === $user['password']) {
$_SESSION['user'] = $username;
self::updateActivity();
return true;
}
return false;
}
/**
* Déconnecte l'utilisateur
*/
public static function logout() {
session_destroy();
}
/**
* Génère un nom de fichier unique
* @param string $originalName Nom original du fichier
* @return string
*/
public static function generateUniqueFilename($originalName) {
$extension = pathinfo($originalName, PATHINFO_EXTENSION);
return uniqid() . '_' . time() . '.' . $extension;
}
/**
* Vérifie si un fichier peut être uploadé
* @param array $file Informations du fichier ($_FILES)
* @return array ['valid' => bool, 'error' => string|null]
*/
public static function validateUpload($file) {
$result = ['valid' => true, 'error' => null];
// Vérifier les erreurs d'upload PHP
if ($file['error'] !== UPLOAD_ERR_OK) {
$result['valid'] = false;
$result['error'] = 'Erreur lors de l\'upload';
return $result;
}
// Vérifier la taille
if ($file['size'] > MAX_FILE_SIZE) {
$result['valid'] = false;
$result['error'] = 'Le fichier dépasse la taille maximale autorisée';
return $result;
}
// Vérifier l'extension
$extension = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
if (!isAllowedExtension($extension)) {
$result['valid'] = false;
$result['error'] = 'Extension de fichier non autorisée';
return $result;
}
return $result;
}
/**
* Sécurise les sorties HTML
* @param string $text Texte à sécuriser
* @return string
*/
public static function escape($text) {
return htmlspecialchars($text, ENT_QUOTES, 'UTF-8');
}
/**
* Génère un token CSRF
* @return string
*/
public static function generateCSRFToken() {
if (!isset($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
return $_SESSION['csrf_token'];
}
/**
* Vérifie un token CSRF
* @param string $token Token à vérifier
* @return bool
*/
public static function verifyCSRFToken($token) {
return isset($_SESSION['csrf_token']) && hash_equals($_SESSION['csrf_token'], $token);
}
/**
* Liste les fichiers uploadés
* @return array
*/
public static function listFiles() {
$files = [];
foreach (glob(UPLOAD_DIR . '*') as $file) {
$info = pathinfo($file);
$files[] = [
'name' => basename($file),
'size' => filesize($file),
'extension' => strtolower($info['extension']),
'uploaded' => filemtime($file),
'preview_type' => getPreviewType($info['extension'])
];
}
return $files;
}
}
// Vérifier et mettre à jour l'activité si l'utilisateur est connecté
if (Cyla::isLoggedIn()) {
Cyla::updateActivity();
}