# CodePress CMS **[πŸ‡³πŸ‡± Nederlands](#) | [πŸ‡¬πŸ‡§ English](README.en.md)** Een lichtgewicht, file-based content management systeem gebouwd met PHP (β‰₯8.0). **Versie:** 2.6.1 | **Licentie:** AGPL v3 / Commercial ## ✨ Features - πŸ“ **Multi-format Content** - Markdown, PHP en HTML bestanden - 🧭 **Dynamic Navigation** - Automatische menu generatie - 🌍 **Multi-language** - NL/EN/DE ondersteuning - πŸ” **Search** - Volledige tekst zoekfunctie - πŸ“± **Responsive** - Bootstrap 5 thema's - πŸ”’ **Security** - 100/100 pentest score - πŸ›‘οΈ **Admin Console** - CodeMirror editor, media beheer, thema's, plugins - πŸ‘₯ **Gebruikersrollen** - Admin, Content Beheerder, BI Beheerder, Site Admin - πŸ“Š **Analytics** - Bezoekersstatistieken met GeoIP - πŸ€– **BotGuard** - Bot/AI bescherming - πŸ“ˆ **Logging** - Uitgebreid logging systeem - πŸ”Œ **Plugin Systeem** - Sidebar plugins met eigen CSS/SCSS, Twig templates ## πŸš€ Quick Start ```bash # Installeer dependencies composer install # Start server met router voor schone URLs (alleen lokaal) php -S localhost:8080 cms/router.php ``` **Website:** `http://localhost:8080` **Admin:** `http://localhost:8080/admin` (login: `admin` / `admin`) ## πŸ“¦ Installatie ### Vereisten - **PHP** β‰₯ 8.0 met extensies: `json`, `mbstring` - **Composer** (PHP dependency manager) - Webserver: **Apache 2.4+** met `mod_rewrite` of **Nginx** met PHP-FPM - Optioneel: `opcache` (aanbevolen voor performance), `git` (voor content versioning), `zip` extensie (voor ZIP backup/restore) ### Stap 1 β€” Code en dependencies ```bash git clone codepress cd codepress composer install ``` ### Stap 2 β€” Configuratie ```bash cp config.json.example config.json cp admin/config/admin.json.example admin/config/admin.json ``` Pas `config.json` aan met je site titel, taal en plugins. Wijzig het admin wachtwoord in `admin/config/admin.json` (standaard `admin`/`admin`). ### Stap 3a β€” Apache 2.4+ De webroot is de `public/` map. Voorbeeld vhost (`/etc/apache2/sites-available/codepress.conf`): ```apache ServerName example.com DocumentRoot /var/www/codepress/public AllowOverride All Require all granted ErrorLog ${APACHE_LOG_DIR}/codepress_error.log CustomLog ${APACHE_LOG_DIR}/codepress_access.log combined ``` Benodigde Apache modules: ```bash sudo a2enmod rewrite headers sudo systemctl restart apache2 ``` - `mod_rewrite` β€” voor clean URLs (`/nl/pagina`) en asset-serving - `mod_headers` β€” voor security headers - `AllowOverride All` β€” zodat `.htaccess` in `public/` wordt toegepast ### Stap 3b β€” Nginx Voorbeeld server block (`/etc/nginx/sites-available/codepress`): ```nginx server { listen 80; server_name example.com; root /var/www/codepress/public; index index.php; # Clean URLs: taal-prefixed pagina's location ~ ^/(nl|en|de)(/(.+))?$ { try_files $uri /index.php?lang=$1&page=$2; } # Admin routes location /admin { try_files $uri /admin.php?$args; } # Asset-serving via asset.php (themes/plugins/admin buiten webroot) location ~ ^/(themes|plugins)/([^/]+)/assets/(.+)$ { try_files $uri /asset.php; } location ~ ^/admin/assets/(.+)$ { try_files $uri /asset.php; } # PHP via FPM location ~ \.php$ { fastcgi_pass unix:/run/php/php8.0-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # Beveiliging: blokkeer toegang tot gevoelige mappen location ~ ^/(content|cms|admin/src|admin/config|admin/storage|var|vendor)/ { deny all; return 403; } location ~ /\.(git|htaccess) { deny all; } } ``` **Let op:** Nginx gebruikt geen `.htaccess`. De security headers moeten in de Nginx config worden gezet: ```nginx add_header X-Content-Type-Options nosniff; add_header X-Frame-Options SAMEORIGIN; add_header X-XSS-Protection "1; mode=block"; add_header Referrer-Policy strict-origin-when-cross-origin; add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self';"; ``` ### Stap 4 β€” Mappen rechten Zorg dat de webserver schrijfrechten heeft op de runtime mappen: ```bash chown -R www-data:www-data var/ admin/storage/ content/ chmod -R 755 . ``` ### Stap 5 β€” Test Open de website in je browser. Bij een lege content-map zie je een welkomstpagina. De admin console is bereikbaar via `/admin` (login `admin`/`admin`). ## πŸ“š Handleidingen Zie **[guide/](guide/)** voor uitgebreide documentatie per rol: | Rol | Handleiding | |-----|-------------| | πŸ“ Redacteur | [Content Beheerder](guide/nl/content-beheerder.md) | | βš™οΈ Administrator | [Admin Beheerder](guide/nl/admin-beheerder.md) | | 🎨 Theme bouwer | [Theme Developer](guide/nl/theme-developer.md) | | πŸ’» Developer | [CodePress Developer](guide/nl/codepress-developer.md) | Elke handleiding heeft sub-onderdelen in aparte mappen met een zijbalknavigatie. ## πŸ‘₯ Gebruikersrollen | Rol | Permissies | |-----|-----------| | **Admin** | Volledige toegang (alles) | | **Content Beheerder** | Content beheer, handleiding | | **BI Beheerder** | Statistieken, logs, handleiding | | **Site Admin** | Thema, plugins, statistieken, logs, update, handleiding | ## πŸ“ Project Structuur ``` codepress/ β”œβ”€β”€ cms/ # Core CMS engine β”‚ β”œβ”€β”€ core/class/ # CMS classes (CodePressCMS, ThemeManager, etc.) β”‚ β”œβ”€β”€ core/plugin/ # Plugin systeem (PluginManager, CMSAPI) β”‚ └── router.php # PHP dev server router (schone URLs) β”œβ”€β”€ language/ # Taalbestanden (nl/, en/, de/ β€” elk met site.php + admin.php) β”œβ”€β”€ admin/ # Admin console β”‚ β”œβ”€β”€ config/ # Admin configuratie (admin.json) β”‚ β”œβ”€β”€ src/AdminAuth.php # Authenticatie, rollen, permissies β”‚ β”œβ”€β”€ static/ # Statische bestanden (404.html) β”‚ β”œβ”€β”€ storage/ # Logs, cache, geoip β”‚ └── theme/default/ # Admin thema β”‚ β”œβ”€β”€ assets/ # CSS, JS, fonts, codemirror β”‚ β”œβ”€β”€ views/ # Twig templates (layouts, pages) β”‚ └── theme.json # Admin thema configuratie β”œβ”€β”€ themes/ # Website thema's β”‚ β”œβ”€β”€ default/ # Standaard thema β”‚ β”‚ β”œβ”€β”€ theme.json # Layout mapping, kleuren β”‚ β”‚ β”œβ”€β”€ base.twig # Hoofd layout β”‚ β”‚ β”œβ”€β”€ *.twig # Layout templates β”‚ β”‚ β”œβ”€β”€ partials/ # Header, navigation, footer β”‚ β”‚ └── assets/ # SCSS, CSS, JS, img β”œβ”€β”€ plugins/ # Plugins β”‚ β”œβ”€β”€ Dashboard/ # Systeem plugin (admin taal) β”‚ β”œβ”€β”€ HTMLBlock/ # Content plugin (content taal) β”‚ β”œβ”€β”€ Navigation/ # EssentiΓ«le navigatie plugin (beschermd) β”‚ └── Statistics/ # Systeem plugin (admin taal) β”‚ β”œβ”€β”€ Statistics.php # Plugin code β”‚ β”œβ”€β”€ plugin.json # Plugin metadata + instellingen β”‚ β”œβ”€β”€ README.md # Plugin documentatie β”‚ β”œβ”€β”€ assets/ # Plugin CSS/JS/SCSS β”‚ └── language/ # Plugin vertalingen (nl/, en/) β”œβ”€β”€ content/ # Website content (.md, .php, .html) β”œβ”€β”€ public/ # Web root β”‚ β”œβ”€β”€ index.php # Website entry point β”‚ └── admin.php # Admin entry point + routing β”œβ”€β”€ guide/ # Handleidingen (nl/en) β”‚ β”œβ”€β”€ nl/ # Nederlandse handleidingen β”‚ └── en/ # Engelse handleidingen β”œβ”€β”€ cli/test/ # Test suites β”œβ”€β”€ var/ # Cache (twig) β”œβ”€β”€ config.json # Site configuratie β”œβ”€β”€ composer.json # PHP dependencies └── version.php # Versie informatie ``` ## βš™οΈ Configuratie ### config.json ```json { "site_title": "CodePress", "active_theme": "default", "default_page": "auto", "language": { "default": "nl", "available": ["nl", "en"] }, "enabled_plugins": ["HTMLBlock", "Navigation"], "features": { "search_enabled": true, "breadcrumbs_enabled": true }, "security": { "block_ai_bots": true, "rate_limit_enabled": true }, "analytics": { "enabled": true }, "logging": { "enabled": true } } ``` ## πŸ”§ Dependencies - **PHP β‰₯8.0** met extensies: json, mbstring - **Composer** packages: - twig/twig (templating) - scssphp/scssphp (SCSS compilatie) - league/commonmark (Markdown met HeadingPermalinks) - maxmind-db/reader (GeoIP) ## πŸ” Security - βœ… XSS preventie (htmlspecialchars) - βœ… CSRF tokens (admin formulieren) - βœ… Path traversal preventie (realpath checks) - βœ… Secure cookies (HttpOnly, SameSite) - βœ… Security headers (X-Frame-Options, CSP) - βœ… Bot/AI bescherming (BotGuard) - βœ… Rate limiting per IP - βœ… Role-based access control (RBAC) ## πŸ”Œ Plugins ### Plugin structuur Elke plugin heeft een uniforme structuur: ``` plugins/MijnPlugin/ β”œβ”€β”€ MijnPlugin.php # Plugin code (naam = pluginnaam) β”œβ”€β”€ plugin.json # Plugin metadata + instellingen β”œβ”€β”€ README.md # Plugin documentatie β”œβ”€β”€ assets/scss/ # Plugin SCSS bron β”œβ”€β”€ assets/css/ # Plugin CSS (na compilatie) └── language/ # Plugin vertalingen (i18n) β”œβ”€β”€ nl/admin.php # NL admin labels (systeem plugins) └── en/admin.php # EN admin labels ``` - **Systeem plugins** volgen de admin-taal (`language//admin.php`) - **Content plugins** volgen de content-taal (`language//site.php`) - Fallback chain: geselecteerde taal β†’ plugin `default_language` β†’ CMS site default Zie `guide/nl/codepress-developer/plugin-development.md` voor uitgebreide documentatie. ### Plugin editor De admin plugin-editor (`/admin/plugins-edit`) biedt een volledige bestandsbeheer-omgeving: - Geneste bestandsbrowser zijbalk (alle bestanden in de plugin-map) - Nieuw bestand aanmaken, uploaden naar assets/, verwijderen en verplaatsen - CodeMirror editor voor .php, .json, .md, .html, .css, .scss, .js bestanden ### EssentiΓ«le plugins De **Navigation** plugin is een essentiΓ«le plugin en kan niet worden gedeactiveerd, bewerkt of verwijderd. Deze plugin genereert automatisch de zijbalknavigatie voor handleidingen en content. ### Plugin CSS Plugin CSS wordt automatisch geladen na thema CSS, zodat thema's plugin styling kunnen overschrijven. ## πŸ“ Content Voorbeelden ### Markdown met frontmatter ```markdown --- layout: full_content plugins: HTMLBlock, Navigation --- # Pagina titel Content in Markdown formaat... ``` ### PHP content ```php getAllPages(); echo "

Mijn Pagina

"; echo "

Aantal pagina's: " . count($pages) . "

"; ``` ## πŸ§ͺ Testen ```bash # Penetration tests cli/test/pentest/security-test.sh # Accessibility tests (WCAG 2.1 AA) cli/test/accessibility.sh # Functionele tests cli/test/functional/*.sh ``` ## πŸ“ž Ondersteuning - **Documentatie:** [guide/](guide/) - **Issues:** Git repository - **Contact:** commercial@noorlander.info ## πŸ“„ Licentie **Dual-licensed:** - **AGPL v3** - Voor open-source projecten - **Commercial** - Voor propriΓ«tair gebruik Zie [LICENSE](LICENSE) voor details. --- **CodePress CMS** - Gebouwd door E.Noorlander / CodePress Development Team