Security: verwijder hardcoded wachtwoord, voeg random-wachtwoord-generator toe bij eerste installatie

This commit is contained in:
2026-08-27 08:57:05 +00:00
parent 6485f693dc
commit 74612aefbb
55 changed files with 6019 additions and 876 deletions
+201 -35
View File
@@ -1,34 +1,105 @@
<?php
/**
* LogManager - Dynamic logging for CodePress CMS
* Dynamische logging voor CodePress CMS.
*
* Supports three drivers:
* - syslog: Send log entries to a remote syslog server (UDP) or local syslog.
* - sqlite: Store log entries in a SQLite database (default when no syslog
* server is configured and SQLite is available).
* - file: Fallback to plain text files when SQLite is unavailable.
* Ondersteunt drie drivers:
* - syslog: Stuurt log entries naar een remote syslog-server (UDP) of de
* lokale syslog.
* - sqlite: Slaat log entries op in een SQLite-database (standaard wanneer
* geen syslog-server geconfigureerd is en SQLite beschikbaar is).
* - file: Fallback naar platte-tekstbestanden wanneer SQLite niet
* beschikbaar is.
*
* Which event types are recorded is controlled dynamically via the
* "logging.events" config section (admin, requests, errors, security,
* Welke event-types geregistreerd worden, wordt dynamisch gestuurd via de
* "logging.events" configuratiesectie (admin, requests, errors, security,
* content, system).
*
* @since 2.6.4
*/
class LogManager {
/**
* Event-type voor admin-acties.
*
* @since 2.6.4
* @var string
*/
const EVENT_ADMIN = 'admin';
/**
* Event-type voor request-logging.
*
* @since 2.6.4
* @var string
*/
const EVENT_REQUESTS = 'requests';
/**
* Event-type voor fouten en waarschuwingen.
*
* @since 2.6.4
* @var string
*/
const EVENT_ERRORS = 'errors';
/**
* Event-type voor beveiligingsgebeurtenissen.
*
* @since 2.6.4
* @var string
*/
const EVENT_SECURITY = 'security';
/**
* Event-type voor content-wijzigingen.
*
* @since 2.6.4
* @var string
*/
const EVENT_CONTENT = 'content';
/**
* Event-type voor systeemgebeurtenissen.
*
* @since 2.6.4
* @var string
*/
const EVENT_SYSTEM = 'system';
/**
* De "logging" configuratiesectie, of null indien niet geïnitialiseerd.
*
* @since 2.6.4
* @var array|null
*/
private static $config = null;
/**
* Lazy-initialized PDO-verbinding met de SQLite-database, of null.
*
* @since 2.6.4
* @var \PDO|null
*/
private static $pdo = null;
/**
* Pad naar het SQLite-databasebestand, of null indien niet geïnitialiseerd.
*
* @since 2.6.4
* @var string|null
*/
private static $dbPath = null;
/**
* Initialize the log manager with the logging config section.
* Initialiseert de log-manager met de logging-configuratie.
*
* @param array $loggingConfig The "logging" section from config.json
* Slaat de configuratie op en stelt het pad naar de SQLite-database in
* onder `admin/storage/logs`.
*
* @since 2.6.4
*
* @param array $loggingConfig De "logging" sectie uit config.json.
* @return void
*/
public static function init(array $loggingConfig): void
{
@@ -37,7 +108,11 @@ class LogManager {
}
/**
* Whether logging is enabled at all.
* Geeft aan of logging in het algemeen ingeschakeld is.
*
* @since 2.6.4
*
* @return bool True indien logging ingeschakeld is, anders false.
*/
public static function isEnabled(): bool
{
@@ -45,9 +120,15 @@ class LogManager {
}
/**
* Whether a given event type should be recorded.
* Geeft aan of een bepaald event-type geregistreerd moet worden.
*
* @param string $event One of the EVENT_* constants
* Controleert eerst of logging in het algemeen ingeschakeld is en
* daarna of het specifieke event aan staat in de configuratie.
*
* @since 2.6.4
*
* @param string $event Een van de EVENT_* constanten.
* @return bool True indien het event geregistreerd moet worden.
*/
public static function isEventEnabled(string $event): bool
{
@@ -59,9 +140,15 @@ class LogManager {
}
/**
* Get the local storage driver: 'sqlite' (falling back to 'file' if
* SQLite is unavailable). Syslog is an additional output, not a storage
* driver, so it never replaces local storage.
* Geeft de actieve lokale opslag-driver.
*
* Retourneert 'sqlite' wanneer SQLite beschikbaar is, anders 'file'.
* Syslog is een aanvullende output en vervangt nooit de lokale
* opslag, en komt dus nooit als driver terug.
*
* @since 2.6.4
*
* @return string 'sqlite' of 'file'.
*/
public static function getDriver(): string
{
@@ -75,12 +162,20 @@ class LogManager {
}
/**
* Record a log entry if the event type is enabled.
* Slaat een log-entry op indien het event-type ingeschakeld is.
*
* @param string $event Event type (EVENT_* constant)
* @param string $level Log level (info, warning, error, debug)
* @param string $message Log message
* @param array $context Additional structured context
* De entry wordt altijd lokaal opgeslagen (SQLite of file-fallback) zodat
* de dynamische admin-log altijd entries bevat. Wanneer een syslog-host
* geconfigureerd is, wordt de entry tevens naar de remote syslog-server
* gestuurd. Het IP-adres wordt uit de context of de RequestLogger gehaald.
*
* @since 2.6.4
*
* @param string $event Event-type (een EVENT_* constante).
* @param string $level Loglevel (info, warning, error, debug).
* @param string $message Logbericht.
* @param array $context Aanvullende gestructureerde context. Default lege array.
* @return void
*/
public static function log(string $event, string $level, string $message, array $context = []): void
{
@@ -115,7 +210,15 @@ class LogManager {
}
/**
* Send a log entry to a remote syslog server over UDP.
* Stuurt een log-entry naar een remote syslog-server over UDP.
*
* Bouwt een syslog-bericht op met facility, severity en ident en stuurt
* dit via een UDP-socket. Verbindings- en schrijffouten worden gesilenced.
*
* @since 2.6.4
*
* @param array $entry De te versturen log-entry.
* @return void
*/
private static function writeSyslog(array $entry): void
{
@@ -138,7 +241,16 @@ class LogManager {
}
/**
* Store a log entry in the SQLite database.
* Slaat een log-entry op in de SQLite-database.
*
* De context-array wordt als JSON opgeslagen. Wanneer de PDO-verbinding
* niet beschikbaar is of het schrijven faalt, wordt teruggevallen op
* de file-driver.
*
* @since 2.6.4
*
* @param array $entry De op te slaan log-entry.
* @return void
*/
private static function writeSqlite(array $entry): void
{
@@ -167,7 +279,15 @@ class LogManager {
}
/**
* Append a log entry to a plain text file (fallback driver).
* Voegt een log-entry toe aan een platte-tekstbestand (fallback-driver).
*
* Zorgt dat de doelmap bestaat en schrijft de entry met een vaste
* opmaak. Schrijffouten worden gesilenced.
*
* @since 2.6.4
*
* @param array $entry De toe te voegen log-entry.
* @return void
*/
private static function writeFile(array $entry): void
{
@@ -182,7 +302,15 @@ class LogManager {
}
/**
* Get (and lazily create) the PDO connection to the SQLite database.
* Geeft (en creëert lazy) de PDO-verbinding met de SQLite-database.
*
* Maakt de tabel en indices aan indien deze nog niet bestaan. Bij een
* fout wordt de interne verbinding op null gezet en null teruggegeven,
* zodat de aanroeper kan terugvallen op de file-driver.
*
* @since 2.6.4
*
* @return \PDO|null PDO-verbinding of null indien SQLite niet beschikbaar/faalt.
*/
private static function getPdo(): ?\PDO
{
@@ -222,7 +350,11 @@ class LogManager {
}
/**
* Whether the SQLite PDO driver is available.
* Geeft aan of de SQLite PDO-driver beschikbaar is.
*
* @since 2.6.4
*
* @return bool True indien PDO en de sqlite-driver beschikbaar zijn.
*/
private static function sqliteAvailable(): bool
{
@@ -230,7 +362,16 @@ class LogManager {
}
/**
* Map a facility name to its syslog numeric value.
* Vertaalt een facility-naam naar de bijbehorende numerieke syslog-waarde.
*
* Ondersteunt de standaard facilities (kern, user, mail, daemon, auth,
* syslog, lpr, news, uucp, cron, authpriv, ftp) en local0 t/m local7.
* Onbekende faciliteiten vallen terug op local0 (16).
*
* @since 2.6.4
*
* @param string $facility Naam van de facility. Default 'local0' wordt door aanroeper gezet.
* @return int Numerieke facility-waarde.
*/
private static function syslogFacility(string $facility): int
{
@@ -245,7 +386,15 @@ class LogManager {
}
/**
* Map a log level to its syslog severity value.
* Vertaalt een loglevel naar de bijbehorende syslog-severity.
*
* Ondersteunt debug t/m emergency. Onbekende levels vallen terug op
* info (6). De invoer wordt case-insensitive vergeleken.
*
* @since 2.6.4
*
* @param string $level Loglevel (debug, info, notice, warning, error, ...).
* @return int Numerieke severity-waarde (0 t/m 7).
*/
private static function syslogSeverity(string $level): int
{
@@ -263,13 +412,22 @@ class LogManager {
}
/**
* Query recent log entries from the active store.
* Zoekt recente log-entries op uit de actieve opslag.
*
* @param int $limit Number of entries to return
* @param string|null $event Optional event filter
* @param string|null $level Optional level filter (info, warning, error, ...)
* @param string|null $search Optional text search on the message
* @return array List of log entries (newest first)
* Bij de SQLite-driver wordt een geparametriseerde query uitgevoerd met
* optionele filters op event, level en een zoekterm op het bericht.
* Bij de file-driver wordt het logbestand uitgelezen en met een regex
* geparseerd; de resultaten worden gefilterd en oudste eerst teruggegeven.
* Resultaten worden altijd nieuwste eerst geretourneerd (SQLite via
* ORDER BY id DESC, file via array_reverse).
*
* @since 2.6.4
*
* @param int $limit Aantal terug te geven entries. Default 200.
* @param string|null $event Optioneel event-filter. Default null (geen filter).
* @param string|null $level Optioneel levelfilter (info, warning, error, ...). Default null.
* @param string|null $search Optionele tekstzoekopdracht op het bericht. Default null.
* @return array<int, array<string, mixed>> Lijst met log-entries (nieuwste eerst).
*/
public static function getLogs(int $limit = 200, ?string $event = null, ?string $level = null, ?string $search = null): array
{
@@ -340,7 +498,15 @@ class LogManager {
}
/**
* Clear all stored log entries.
* Wist alle opgeslagen log-entries.
*
* Bij de SQLite-driver worden alle rijen uit de logs-tabel verwijderd.
* Bij de file-driver wordt het logbestand leeggemaakt. Schrijffouten
* worden gesilenced.
*
* @since 2.6.4
*
* @return void
*/
public static function clear(): void
{