Fix: _ mappen verborgen in frontend + image URL rewriting naar /-media/
- Bug: mappen met _ prefix (zoals _drafts, _data) werden zichtbaar in frontend navigatie omdat scanDirectory() alleen . en - oversloeg. scanDirectory(), searchInDirectory() en scanForPageTitles() skippen nu ook _ prefix (consistente filtering). - Bug: images in markdown niet weergegeven.  werd <img src=test.svg> (relatief -> 404) en  werd /content/test.svg (buiten webroot -> 404). processContent() herschrijft nu lokale image/link URLs naar /-media/ endpoint. Externe URLs (http(s)://), /-media/, /-assets/, /themes/, /plugins/, /admin/, data: en mailto: worden ongewijzigd gelaten. - Release notes v2.6.2 bijgewerkt met beide bugfixes - Pentest 30/30, WCAG 25/25
This commit is contained in:
@@ -108,6 +108,8 @@
|
|||||||
- [x] Uniformiteit: scanEditorFiles() unified scanner (scanPluginFiles/scanThemeFiles/scanContentFiles als dunne wrappers)
|
- [x] Uniformiteit: scanEditorFiles() unified scanner (scanPluginFiles/scanThemeFiles/scanContentFiles als dunne wrappers)
|
||||||
- [x] Media invoegen in editor: ?theme= scope voor media-list endpoint + _media-modal.twig
|
- [x] Media invoegen in editor: ?theme= scope voor media-list endpoint + _media-modal.twig
|
||||||
- [x] Bug: thema-naam niet overgenomen bij kopiëren — title in theme.json wordt overschreven met nieuwe themanaam; README.md krijgt nieuwe header
|
- [x] Bug: thema-naam niet overgenomen bij kopiëren — title in theme.json wordt overschreven met nieuwe themanaam; README.md krijgt nieuwe header
|
||||||
|
- [x] Bug: mappen met `_` prefix zichtbaar in frontend navigatie — scanDirectory/searchInDirectory/scanForPageTitles skippen nu `_` prefix (consistente filtering met `.` en `-`)
|
||||||
|
- [x] Bug: images in markdown niet weergegeven — processContent() herschrijft lokale image/link URLs naar /-media/ endpoint (relatief, /content/, subdir); externe URLs ongewijzigd gelaten
|
||||||
- [x] Handleidingen in guide/ bijgewerkt (thema-beheer.md NL+EN volledig herschreven met thema-editor uitleg; content-beheer.md NL+EN volledig herschreven met content-editor uitleg)
|
- [x] Handleidingen in guide/ bijgewerkt (thema-beheer.md NL+EN volledig herschreven met thema-editor uitleg; content-beheer.md NL+EN volledig herschreven met content-editor uitleg)
|
||||||
- [x] Verslag gemaakt (docs/release-notes/v2.6.2.md)
|
- [x] Verslag gemaakt (docs/release-notes/v2.6.2.md)
|
||||||
- [x] Versie verhoogd naar 2.6.2
|
- [x] Versie verhoogd naar 2.6.2
|
||||||
|
|||||||
@@ -330,7 +330,8 @@ class CodePressCMS {
|
|||||||
$result = [];
|
$result = [];
|
||||||
|
|
||||||
foreach ($items as $item) {
|
foreach ($items as $item) {
|
||||||
if ($item[0] === '.' || $item[0] === '-') continue;
|
// Skip hidden/system entries: dotfiles, -assets, _drafts, etc.
|
||||||
|
if ($item[0] === '.' || $item[0] === '-' || $item[0] === '_') continue;
|
||||||
|
|
||||||
// Skip assets directory (old name, kept for safety)
|
// Skip assets directory (old name, kept for safety)
|
||||||
if ($item === 'assets' && is_dir($dir . '/' . $item)) continue;
|
if ($item === 'assets' && is_dir($dir . '/' . $item)) continue;
|
||||||
@@ -397,7 +398,8 @@ class CodePressCMS {
|
|||||||
$items = scandir($dir);
|
$items = scandir($dir);
|
||||||
|
|
||||||
foreach ($items as $item) {
|
foreach ($items as $item) {
|
||||||
if ($item[0] === '.') continue;
|
// Skip hidden/system entries (consistent met scanDirectory)
|
||||||
|
if ($item[0] === '.' || $item[0] === '-' || $item[0] === '_') continue;
|
||||||
|
|
||||||
$path = $dir . '/' . $item;
|
$path = $dir . '/' . $item;
|
||||||
$relativePath = $prefix ? $prefix . '/' . $item : $item;
|
$relativePath = $prefix ? $prefix . '/' . $item : $item;
|
||||||
@@ -886,7 +888,8 @@ class CodePressCMS {
|
|||||||
sort($items);
|
sort($items);
|
||||||
|
|
||||||
foreach ($items as $item) {
|
foreach ($items as $item) {
|
||||||
if ($item[0] === '.') continue;
|
// Skip hidden/system entries (consistent met scanDirectory)
|
||||||
|
if ($item[0] === '.' || $item[0] === '-' || $item[0] === '_') continue;
|
||||||
|
|
||||||
$path = $dir . '/' . $item;
|
$path = $dir . '/' . $item;
|
||||||
$relativePath = $prefix ? $prefix . '/' . $item : $item;
|
$relativePath = $prefix ? $prefix . '/' . $item : $item;
|
||||||
@@ -1802,6 +1805,37 @@ class CodePressCMS {
|
|||||||
|
|
||||||
private function processContent(string $content): string
|
private function processContent(string $content): string
|
||||||
{
|
{
|
||||||
return str_replace('-/assets/', '/-assets/', $content);
|
// Legacy rewrite for the old -/assets/ shortcut
|
||||||
|
$content = str_replace('-/assets/', '/-assets/', $content);
|
||||||
|
|
||||||
|
// Rewrite <img src="..."> and <a href="..."> that point to files in the
|
||||||
|
// content directory so they are served via the /-media/ endpoint. The
|
||||||
|
// content/ directory lives outside the webroot, so raw URLs like
|
||||||
|
// "test.svg", "/content/test.svg" or "sub/test.svg" would otherwise 404.
|
||||||
|
//
|
||||||
|
// Skipped (left untouched):
|
||||||
|
// - absolute URLs (http://, https://, //)
|
||||||
|
// - already rewritten /-media/ and /-assets/ URLs
|
||||||
|
// - theme/plugin asset URLs (/themes/..., /plugins/..., /admin/...)
|
||||||
|
// - data: and mailto: URLs
|
||||||
|
// - fragment-only URLs (#anchor)
|
||||||
|
$content = preg_replace_callback(
|
||||||
|
'~(<(?:img|a)\b[^>]*\b(?:src|href)\s*=\s*")([^"]+)(")~i',
|
||||||
|
function ($m) {
|
||||||
|
$url = $m[2];
|
||||||
|
// Leave absolute, already-rewritten, asset, data: and anchor URLs alone
|
||||||
|
if (preg_match('~^(?:[a-z][a-z0-9+.\-]*:|//|/themes/|/plugins/|/admin/|/-media/|/-assets/|data:|mailto:)~i', $url)) {
|
||||||
|
return $m[0];
|
||||||
|
}
|
||||||
|
// Strip a leading /content/ prefix if present, then prefix with /-media/
|
||||||
|
$clean = preg_replace('~^/content/~', '', $url);
|
||||||
|
// Strip a leading slash so it becomes a clean /-media/<path>
|
||||||
|
$clean = ltrim($clean, '/');
|
||||||
|
return $m[1] . '/-media/' . $clean . $m[3];
|
||||||
|
},
|
||||||
|
$content
|
||||||
|
);
|
||||||
|
|
||||||
|
return $content;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -117,6 +117,8 @@ De file-upload/delete/move handler-families zijn per-scope behouden (plugin: pro
|
|||||||
## Bug fixes
|
## Bug fixes
|
||||||
|
|
||||||
- **Thema-naam niet overgenomen bij kopiëren** — bij het aanmaken van een nieuw thema met een basisthema werd de `title` uit het basisthema's `theme.json` gekopieerd; nu wordt de `title` overschreven met de nieuwe themanaam en krijgt `README.md` een nieuwe header
|
- **Thema-naam niet overgenomen bij kopiëren** — bij het aanmaken van een nieuw thema met een basisthema werd de `title` uit het basisthema's `theme.json` gekopieerd; nu wordt de `title` overschreven met de nieuwe themanaam en krijgt `README.md` een nieuwe header
|
||||||
|
- **Mappen met `_` prefix zichtbaar in frontend navigatie** — mappen zoals `_drafts`, `_data` werden in het menu getoond omdat `scanDirectory()` alleen `.` en `-` prefixen oversloeg. Nu worden ook `_`-prefix mappen overgeslagen in `scanDirectory()`, `searchInDirectory()` en `scanForPageTitles()` (consistente filtering)
|
||||||
|
- **Images in markdown niet weergegeven** — `` werd gerenderd als `<img src="test.svg">` (relatieve URL → 404) of `` als `<img src="/content/test.svg">` (content/ staat buiten webroot → 404). `processContent()` herschrijft nu lokale image/link URLs naar de `/-media/` endpoint die bestanden uit `content/` serveert met juiste MIME-type. Externe URLs (`http(s)://`), `/-media/`, `/-assets/`, `/themes/`, `/plugins/`, `/admin/`, `data:` en `mailto:` worden ongewijzigd gelaten.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -153,6 +155,7 @@ De file-upload/delete/move handler-families zijn per-scope behouden (plugin: pro
|
|||||||
- `admin/theme/default/views/pages/theme-new.twig` — base-theme keuze dropdown
|
- `admin/theme/default/views/pages/theme-new.twig` — base-theme keuze dropdown
|
||||||
- `admin/theme/default/views/pages/_media-modal.twig` — `?theme=` scope support
|
- `admin/theme/default/views/pages/_media-modal.twig` — `?theme=` scope support
|
||||||
- `admin/theme/default/assets/js/editor-toolbar.js` — `twig` → `htmlmixed` mode toegevoegd
|
- `admin/theme/default/assets/js/editor-toolbar.js` — `twig` → `htmlmixed` mode toegevoegd
|
||||||
|
- `cms/core/class/CodePressCMS.php` — `scanDirectory`/`searchInDirectory`/`scanForPageTitles` skippen nu `_` prefix; `processContent()` herschrijft lokale image/link URLs naar `/-media/`
|
||||||
- `language/{nl,en,de}/admin.php` — ~45 nieuwe vertaalstrings (theme-editor + content-editor)
|
- `language/{nl,en,de}/admin.php` — ~45 nieuwe vertaalstrings (theme-editor + content-editor)
|
||||||
- `guide/{nl,en}/admin-beheerder/thema-beheer.md` — volledig herschreven met thema-editor uitleg
|
- `guide/{nl,en}/admin-beheerder/thema-beheer.md` — volledig herschreven met thema-editor uitleg
|
||||||
- `guide/{nl,en}/admin-beheerder/content-beheer.md` — volledig herschreven met content-editor uitleg
|
- `guide/{nl,en}/admin-beheerder/content-beheer.md` — volledig herschreven met content-editor uitleg
|
||||||
@@ -165,7 +168,7 @@ De file-upload/delete/move handler-families zijn per-scope behouden (plugin: pro
|
|||||||
- **Pentest**: 30/30 tests geslaagd — 0 vulnerabilities
|
- **Pentest**: 30/30 tests geslaagd — 0 vulnerabilities
|
||||||
- **WCAG 2.1 AA accessibility**: 25/25 tests geslaagd — 100% compliance
|
- **WCAG 2.1 AA accessibility**: 25/25 tests geslaagd — 100% compliance
|
||||||
- **PHP lint**: alle bestanden schoon (geen syntax errors)
|
- **PHP lint**: alle bestanden schoon (geen syntax errors)
|
||||||
- **curl tests**: alle nieuwe routes getest (aanmaken, bewerken, opslaan, uploaden, verwijderen, verplaatsen, map aanmaken/hernoemen/verwijderen, SCSS compileren, thema activeren/verwijderen, thema kopiëren); path-traversal pogingen (delete/new_file/upload) allemaal geblokkeerd; default/active theme bescherming geverifieerd; theme.json verwijderen/plaatsen geblokkeerd
|
- **curl tests**: alle nieuwe routes getest (aanmaken, bewerken, opslaan, uploaden, verwijderen, verplaatsen, map aanmaken/hernoemen/verwijderen, SCSS compileren, thema activeren/verwijderen, thema kopiëren); path-traversal pogingen (delete/new_file/upload) allemaal geblokkeerd; default/active theme bescherming geverifieerd; theme.json verwijderen/plaatsen geblokkeerd; image-URL rewriting geverifieerd (relatief, /content/, subdir, extern ongewijzigd); `_`-map niet in frontend navigatie
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user