Security: verwijder hardcoded wachtwoord, voeg random-wachtwoord-generator toe bij eerste installatie
This commit is contained in:
+201
-35
@@ -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
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user