mise en place de la base du système de gestion des albums privés

création de la table et la modification du stockage
This commit is contained in:
Esenjin 2025-01-05 12:22:36 +01:00
parent d25d6a4b36
commit aa13840290
2 changed files with 139 additions and 0 deletions

View File

@ -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();
}
?>

View File

@ -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 !";
?>