From aa13840290017e68c5e1eabc64de3408dd919e17 Mon Sep 17 00:00:00 2001 From: Esenjin Date: Sun, 5 Jan 2025 12:22:36 +0100 Subject: [PATCH] =?UTF-8?q?mise=20en=20place=20de=20la=20base=20du=20syst?= =?UTF-8?q?=C3=A8me=20de=20gestion=20des=20albums=20priv=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit création de la table et la modification du stockage --- fonctions.php | 115 ++++++++++++++++++++++++++++++++++++++++++++++++ init-db-php.php | 24 ++++++++++ 2 files changed, 139 insertions(+) diff --git a/fonctions.php b/fonctions.php index 7982165..320e7da 100644 --- a/fonctions.php +++ b/fonctions.php @@ -222,4 +222,119 @@ function sanitizeFilename($filename) { // Limite la longueur du nom de fichier return substr($filename, 0, 255); } + +/** + * Génère une clé cryptographiquement sûre pour le partage + * @param int $length Longueur de la clé + * @return string Clé générée + */ +function generateShareKey($length = 64) { + return bin2hex(random_bytes($length / 2)); +} + +/** + * Génère un identifiant unique pour un album + * @param int $length Longueur de l'identifiant + * @return string Identifiant généré + */ +function generateAlbumIdentifier($length = 32) { + return bin2hex(random_bytes($length / 2)); +} + +/** + * Crée ou récupère l'identifiant unique d'un album + * @param string $albumPath Chemin de l'album + * @return string|false Identifiant de l'album ou false en cas d'erreur + */ +function ensureAlbumIdentifier($albumPath) { + $db = new SQLite3('database.sqlite'); + + // Vérifie si l'album a déjà un identifiant + $stmt = $db->prepare('SELECT identifier FROM album_identifiers WHERE path = :path'); + $stmt->bindValue(':path', $albumPath, SQLITE3_TEXT); + $result = $stmt->execute(); + + if ($row = $result->fetchArray()) { + return $row['identifier']; + } + + // Génère un nouvel identifiant + $identifier = generateAlbumIdentifier(); + + // Insère le nouvel identifiant + $stmt = $db->prepare('INSERT INTO album_identifiers (identifier, path) VALUES (:identifier, :path)'); + $stmt->bindValue(':identifier', $identifier, SQLITE3_TEXT); + $stmt->bindValue(':path', $albumPath, SQLITE3_TEXT); + + if ($stmt->execute()) { + return $identifier; + } + + return false; +} + +/** + * Crée une nouvelle clé de partage + * @param string $albumIdentifier Identifiant de l'album + * @param int $duration Durée de validité en heures + * @param string $comment Commentaire optionnel + * @return string|false Clé de partage ou false en cas d'erreur + */ +function createShareKey($albumIdentifier, $duration, $comment = '') { + $db = new SQLite3('database.sqlite'); + + // Génère une nouvelle clé + $key = generateShareKey(); + $expiresAt = date('Y-m-d H:i:s', strtotime("+{$duration} hours")); + + // Insère la clé + $stmt = $db->prepare('INSERT INTO share_keys (key_value, album_identifier, expires_at, comment) + VALUES (:key, :identifier, :expires, :comment)'); + $stmt->bindValue(':key', $key, SQLITE3_TEXT); + $stmt->bindValue(':identifier', $albumIdentifier, SQLITE3_TEXT); + $stmt->bindValue(':expires', $expiresAt, SQLITE3_TEXT); + $stmt->bindValue(':comment', $comment, SQLITE3_TEXT); + + if ($stmt->execute()) { + return $key; + } + + return false; +} + +/** + * Vérifie la validité d'une clé de partage + * @param string $key Clé de partage + * @return array|false Informations sur l'album ou false si clé invalide + */ +function validateShareKey($key) { + $db = new SQLite3('database.sqlite'); + + $stmt = $db->prepare('SELECT a.path, a.identifier + FROM share_keys s + JOIN album_identifiers a ON s.album_identifier = a.identifier + WHERE s.key_value = :key + AND s.expires_at > datetime("now")'); + $stmt->bindValue(':key', $key, SQLITE3_TEXT); + $result = $stmt->execute(); + + if ($row = $result->fetchArray(SQLITE3_ASSOC)) { + return $row; + } + + return false; +} + +/** + * Nettoie les clés de partage expirées + * @return int Nombre de clés supprimées + */ +function cleanExpiredShareKeys() { + $db = new SQLite3('database.sqlite'); + + $stmt = $db->prepare('DELETE FROM share_keys WHERE expires_at <= datetime("now")'); + $stmt->execute(); + + return $db->changes(); +} ?> \ No newline at end of file diff --git a/init-db-php.php b/init-db-php.php index a54f894..cf11904 100644 --- a/init-db-php.php +++ b/init-db-php.php @@ -18,6 +18,25 @@ $db->exec('CREATE TABLE IF NOT EXISTS protected_albums ( created_at DATETIME DEFAULT CURRENT_TIMESTAMP )'); +// Créer la nouvelle table des clés de partage +$db->exec('CREATE TABLE IF NOT EXISTS share_keys ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + key_value TEXT UNIQUE NOT NULL, + album_identifier TEXT NOT NULL, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + expires_at DATETIME NOT NULL, + comment TEXT, + FOREIGN KEY (album_identifier) REFERENCES album_identifiers(identifier) +)'); + +// Créer la table des identifiants d'albums +$db->exec('CREATE TABLE IF NOT EXISTS album_identifiers ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + identifier TEXT UNIQUE NOT NULL, + path TEXT UNIQUE NOT NULL, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP +)'); + // Insérer un admin par défaut si la table est vide $result = $db->query('SELECT COUNT(*) as count FROM admins'); $count = $result->fetchArray()['count']; @@ -36,6 +55,11 @@ if ($count === 0) { echo "Admin par défaut créé (username: admin, password: admin). Pensez à changer ces identifiants !"; } +// Créer les index nécessaires +$db->exec('CREATE INDEX IF NOT EXISTS idx_share_keys_expires_at ON share_keys(expires_at)'); +$db->exec('CREATE INDEX IF NOT EXISTS idx_share_keys_album_identifier ON share_keys(album_identifier)'); +$db->exec('CREATE INDEX IF NOT EXISTS idx_album_identifiers_identifier ON album_identifiers(identifier)'); + $db->close(); echo "Base de données initialisée avec succès !"; ?> \ No newline at end of file