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
+50 -4
View File
@@ -2,11 +2,15 @@
<?php
/**
* Natural Earth World Map SVG generator for CodePress CMS
* Natural Earth World Map SVG generator voor CodePress CMS.
*
* Converts the Natural Earth 110m TopoJSON (public domain) into a plain SVG
* where every country path carries its ISO 3166-1 alpha-2 code as the id,
* so the admin statistics page can colour countries with plain CSS.
* Zet de Natural Earth 110m TopoJSON (publiek domein) om in een plain SVG
* waarin elk land-pad zijn ISO 3166-1 alpha-2 code als id meekrijgt, zodat
* de admin-statistiekpagina landen met pure CSS kan inkleuren. Wordt via
* de CLI uitgevoerd en schrijft public/assets/img/world-map.svg.
*
* @since 2.6.4
* @package CodePress
*/
/**
@@ -66,6 +70,18 @@ function nameToAlpha2(): array
];
}
/**
* Main generator-functie: bouwt de wereldkaart-SVG uit TopoJSON.
*
* Download (met caching) de countries-110m.json, decodeert delta-gecodeerde
* arcs, projecteert op een equirectangular canvas met antimeridian-unwrap,
* verzamelt paden per ISO alpha-2 code en schrijft de SVG naar
* public/assets/img/world-map.svg.
*
* @since 2.6.4
* @param bool $verbose Of voortgang en statistieken naar stdout worden geschreven.
* @return bool True bij succes, false bij een download- of parse-fout.
*/
function generateWorldMapSvg(bool $verbose = false): bool
{
$outPath = dirname(__DIR__) . '/public/assets/img/world-map.svg';
@@ -104,6 +120,11 @@ function generateWorldMapSvg(bool $verbose = false): bool
$scale = $topo['transform']['scale'];
$translate = $topo['transform']['translate'];
/**
* Delta-gecodeerde arcs decoderen naar plain lon/lat-punten.
*
* @since 2.6.4
*/
// Decode delta-encoded arcs into plain lon/lat pairs. Projection happens
// later, after antimeridian handling, because that works in degrees.
$decodedArcs = [];
@@ -130,6 +151,14 @@ function generateWorldMapSvg(bool $verbose = false): bool
$names = [];
$skipped = [];
/**
* Per land de TopoJSON-geometrie omzetten in SVG-paden.
*
* Bepaalt ISO alpha-2 (via numeric map of naam map), slaat Antarctica over,
* bouwt Polygon/MultiPolygon-rings op en verzamelt paden per code.
*
* @since 2.6.4
*/
foreach ($topo['objects']['countries']['geometries'] as $geo) {
$rawId = $geo['id'] ?? '';
$countryName = $geo['properties']['name'] ?? 'Unknown';
@@ -261,6 +290,15 @@ function generateWorldMapSvg(bool $verbose = false): bool
$pathsByCode[$alpha2] .= ($pathsByCode[$alpha2] === '' ? '' : ' ') . $pathD;
}
/**
* SVG-document samenstellen en wegschrijven.
*
* Sorteert paden per code, formattert <path>-elementen met id, data-name,
* class, d en <title>, voegt inline CSS toe en schrijft het resultaat naar
* de output-map.
*
* @since 2.6.4
*/
ksort($pathsByCode);
$svgPaths = [];
@@ -303,6 +341,14 @@ function generateWorldMapSvg(bool $verbose = false): bool
return true;
}
/**
* CLI-entrypoint: wereldkaart-SVG genereren.
*
* Roept generateWorldMapSvg() aan en rapporteert het resultaat; bij een
* fout wordt met exit(1) afgesloten.
*
* @since 2.6.4
*/
if (php_sapi_name() === 'cli') {
echo "Wereldkaart SVG genereren uit Natural Earth TopoJSON...\n";
if (generateWorldMapSvg(true)) {
+36
View File
@@ -1,6 +1,17 @@
#!/usr/bin/env php
<?php
/**
* DB-IP Lite database downloader & binaire converter voor CodePress CMS.
*
* Downloadt de DB-IP Lite country-CSV (gzip) van download.db-ip.com, pakt
* deze uit en zet de IP-ranges om in compacte binaire bestanden voor IPv4
* en IPv6 (met 2-byte country codes), plus een meta.json met bron en
* statistieken. Kan via de CLI of vanuit een admin-handler worden aangeroepen.
*
* @since 2.6.4
* @package CodePress
*/
/**
* DB-IP Lite database downloader & binary converter for CodePress CMS
*/
@@ -9,6 +20,16 @@ if (php_sapi_name() !== 'cli' && (!isset($_SESSION['admin_user']))) {
// Can also be included from admin handler
}
/**
* GeoIP-database bijwerken: downloaden, uitpakken en converteren.
*
* Probeert maximaal drie recente maandelijkse DB-IP Lite releases. Bij
* succes worden ipv4.bin en ipv6.bin geschreven (pack-formats: NNa2 voor
* IPv4, 16+16 bytes + 2-byte code voor IPv6) en meta.json weggeschreven.
*
* @since 2.6.4
* @return array Resultaat-array met keys: success, message en (optioneel) meta.
*/
function updateGeoIPDatabase(): array
{
$baseDir = dirname(__DIR__) . '/admin/storage/geoip';
@@ -55,6 +76,14 @@ function updateGeoIPDatabase(): array
$v4Count = 0;
$v6Count = 0;
/**
* CSV-records omzetten naar binaire IPv4-/IPv6-records.
*
* Elke geldige regel met start-, end-IP en 2-letterige country code wordt
* weggeschreven naar het juiste binaire bestand met bijbehorend pack-formaat.
*
* @since 2.6.4
*/
foreach ($lines as $line) {
$line = trim($line);
if ($line === '' || $line[0] === '#') continue;
@@ -112,6 +141,13 @@ function updateGeoIPDatabase(): array
];
}
/**
* CLI-entrypoint: DB-IP Lite database bijwerken.
*
* Roept updateGeoIPDatabase() aan en print het resultaatbericht.
*
* @since 2.6.4
*/
if (php_sapi_name() === 'cli' && basename(__FILE__) === basename($_SERVER['SCRIPT_FILENAME'])) {
echo "DB-IP Lite database bijwerken...\n";
$res = updateGeoIPDatabase();
+35 -1
View File
@@ -1,7 +1,11 @@
#!/usr/bin/env php
<?php
/**
* CodePress CMS — Admin wachtwoord reset CLI
* CodePress CMS — Admin wachtwoord reset CLI.
*
* Reset het wachtwoord van een admin-gebruiker via de command line. Genereert
* een random wachtwoord wanneer er geen wordt meegegeven en wist tevens de
* brute-force lockout voor de gebruiker, zodat direct inloggen weer mogelijk is.
*
* Gebruik:
* php cli/reset-admin-password.php [gebruikersnaam] [nieuw_wachtwoord]
@@ -12,8 +16,16 @@
* Voorbeelden:
* php cli/reset-admin-password.php admin
* php cli/reset-admin-password.php admin MijnNieuweWachtwoord123
*
* @since 2.6.4
* @package CodePress
*/
/**
* CLI-only guard: dit script mag alleen via de CLI uitgevoerd worden.
*
* @since 2.6.4
*/
if (php_sapi_name() !== 'cli') {
fwrite(STDERR, "Dit script kan alleen via de CLI uitgevoerd worden.\n");
exit(1);
@@ -24,6 +36,11 @@ require_once $rootDir . '/admin/src/AdminAuth.php';
$appConfig = require $rootDir . '/admin/config/app.php';
/**
* Argumenten parsen en gebruik tonen bij ontbrekende gebruikersnaam.
*
* @since 2.6.4
*/
// Argumenten parsen
$username = $argv[1] ?? '';
$password = $argv[2] ?? '';
@@ -39,6 +56,11 @@ if ($username === '') {
exit(1);
}
/**
* AdminAuth aanmaken en controleren of de gebruiker bestaat.
*
* @since 2.6.4
*/
// AdminAuth aanmaken (zonder sessie requirements)
$auth = new AdminAuth($appConfig);
@@ -50,6 +72,11 @@ if (!isset($users[$username])) {
exit(1);
}
/**
* Wachtwoord genereren indien niet expliciet opgegeven.
*
* @since 2.6.4
*/
// Wachtwoord genereren als niet opgegeven
if ($password === '') {
$password = bin2hex(random_bytes(12));
@@ -58,6 +85,13 @@ if ($password === '') {
$generated = false;
}
/**
* Wachtwoord wijzigen en brute-force lockout wissen.
*
* Bij een mislukte wachtwoordwijziging wordt met exit(1) afgesloten.
*
* @since 2.6.4
*/
// Wachtwoord wijzigen
$result = $auth->changePassword($username, $password);
if (!$result['success']) {