$before['firma'] ?: 'Testfirma', 'strasse' => $before['strasse'] ?: 'Teststr. 1', 'plz' => $before['plz'] ?: '12345', 'ort' => $before['ort'] ?: 'Testort', 'nextcloud_pass' => 'geheimes-nc-passwort', 'mail_smtp_pass' => 'geheimes-smtp-passwort', ])); // Roh-DB-Spalte muss verschlüsselt sein, nicht im Klartext $raw = Database::fetchOne('SELECT nextcloud_pass, mail_smtp_pass FROM company_settings WHERE id = 1'); $this->assert(str_starts_with($raw['nextcloud_pass'], 'enc:v1:'), 'nextcloud_pass ist in der DB verschlüsselt'); $this->assert(str_starts_with($raw['mail_smtp_pass'], 'enc:v1:'), 'mail_smtp_pass ist in der DB verschlüsselt'); // Setting::get() liefert wieder den Klartext $after = Setting::get(); $this->assertEquals('geheimes-nc-passwort', $after['nextcloud_pass'], 'nextcloud_pass entschlüsselt korrekt'); $this->assertEquals('geheimes-smtp-passwort', $after['mail_smtp_pass'], 'mail_smtp_pass entschlüsselt korrekt'); // Leerer Wert wird nicht "verschlüsselt" (Crypto::encrypt('') === '') und bleibt leer/null Setting::update(array_merge($after, [ 'nextcloud_pass' => '', 'mail_smtp_pass' => '', ])); $rawEmpty = Database::fetchOne('SELECT nextcloud_pass, mail_smtp_pass FROM company_settings WHERE id = 1'); $this->assert(empty($rawEmpty['nextcloud_pass']), 'nextcloud_pass wird bei leerem Wert nicht verschlüsselt gespeichert'); $this->assert(empty($rawEmpty['mail_smtp_pass']), 'mail_smtp_pass wird bei leerem Wert nicht verschlüsselt gespeichert'); } finally { if ($oldKey === null) { unset($_ENV['APP_KEY']); } else { $_ENV['APP_KEY'] = $oldKey; } Config::load(); } } }