calendrier
Deploy HouseHub / deploy (push) Successful in 1s

This commit is contained in:
Cedric
2026-05-13 14:37:38 +02:00
parent 1c274289bf
commit 912734d2cc
3 changed files with 54 additions and 10 deletions
+1
View File
@@ -1,2 +1,3 @@
househub_db_data househub_db_data
.env .env
data/.hh_app_secret
+2
View File
@@ -12,6 +12,8 @@ services:
DB_NAME: ${DB_NAME:-househub} DB_NAME: ${DB_NAME:-househub}
DB_USER: ${DB_USER:-househub} DB_USER: ${DB_USER:-househub}
DB_PASS: ${DB_PASS:-changeme} DB_PASS: ${DB_PASS:-changeme}
# Clé applicative pour chiffrer les secrets (iCloud, etc.). Optionnel si absent : fichier data/.hh_app_secret ou dérivation DB.
APP_SECRET_KEY: ${APP_SECRET_KEY:-}
volumes: volumes:
- househub_uploads:/uploads - househub_uploads:/uploads
- /opt/container/househub:/var/www/html - /opt/container/househub:/var/www/html
+51 -10
View File
@@ -1,11 +1,56 @@
<?php <?php
/**
* Matériau de clé pour chiffrer les secrets (mot de passe dapp iCloud, etc.).
* Ordre de priorité :
* 1. Variable denvironnement APP_SECRET_KEY (recommandé en production)
* 2. Fichier data/.hh_app_secret (généré automatiquement au premier besoin si le dossier est inscriptible)
* 3. Dérivation stable depuis DB_PASS + DB_HOST (évite lerreur si rien nest configuré ; change si le mot de passe DB change)
*/
function hh_secret_key_material(): string
{
$fromEnv = trim((string) getenv('APP_SECRET_KEY'));
if ($fromEnv !== '') {
return $fromEnv;
}
$keyFile = dirname(__DIR__) . '/data/.hh_app_secret';
if (is_readable($keyFile)) {
$content = trim((string) file_get_contents($keyFile));
if ($content !== '' && strlen($content) >= 32) {
return $content;
}
}
$dir = dirname($keyFile);
if (!is_dir($dir)) {
@mkdir($dir, 0700, true);
}
if (is_dir($dir) && is_writable($dir)) {
try {
$material = bin2hex(random_bytes(32));
if (@file_put_contents($keyFile, $material, LOCK_EX) !== false) {
@chmod($keyFile, 0600);
return $material;
}
} catch (\Throwable $e) {
// continuer vers la dérivation
}
}
$dbPass = (string) (getenv('DB_PASS') ?: '');
$dbHost = (string) (getenv('DB_HOST') ?: '');
return 'hh-derived|' . $dbPass . '|' . $dbHost . '|HouseHub-calendar-ios-v1';
}
function hh_encryption_key(): string
{
return hash('sha256', hh_secret_key_material(), true);
}
function hh_encrypt_secret(string $plain): string function hh_encrypt_secret(string $plain): string
{ {
$keyMaterial = getenv('APP_SECRET_KEY') ?: ''; $key = hh_encryption_key();
if ($keyMaterial === '') {
throw new RuntimeException('APP_SECRET_KEY manquant');
}
$key = hash('sha256', $keyMaterial, true);
$iv = random_bytes(16); $iv = random_bytes(16);
$cipher = openssl_encrypt($plain, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv); $cipher = openssl_encrypt($plain, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
if ($cipher === false) { if ($cipher === false) {
@@ -16,15 +61,11 @@ function hh_encrypt_secret(string $plain): string
function hh_decrypt_secret(string $encrypted): string function hh_decrypt_secret(string $encrypted): string
{ {
$keyMaterial = getenv('APP_SECRET_KEY') ?: ''; $key = hh_encryption_key();
if ($keyMaterial === '') {
throw new RuntimeException('APP_SECRET_KEY manquant');
}
$raw = base64_decode($encrypted, true); $raw = base64_decode($encrypted, true);
if ($raw === false || strlen($raw) <= 16) { if ($raw === false || strlen($raw) <= 16) {
throw new RuntimeException('Secret invalide'); throw new RuntimeException('Secret invalide');
} }
$key = hash('sha256', $keyMaterial, true);
$iv = substr($raw, 0, 16); $iv = substr($raw, 0, 16);
$cipher = substr($raw, 16); $cipher = substr($raw, 16);
$plain = openssl_decrypt($cipher, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv); $plain = openssl_decrypt($cipher, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);