feat(wiki): Betriebsrat-Berechtigung (r-wiki-br)

Neue Permission r-wiki-br ermöglicht eingeschränkte Wiki-Bearbeitung:

- Neue Permission in main_permission (ID 30: r-wiki-br)
- Neue Spalte betriebsrat_editable in knowledgecenter_categories_update
- Checkbox "Für Betriebsrat bearbeitbar" in der Kategorie-Verwaltung
  (nur für r-wiki-Redakteure sichtbar und speicherbar)

Berechtigungslogik:
- r-wiki schlägt immer: Wer beide Rechte hat, verhält sich wie Redakteur
- Betriebsrat sieht nur Kategorien mit betriebsrat_editable=1
- "Beitrag erstellen"-Button nur in freigegebenen Kategorien sichtbar
- Neue Posts/Bearbeitungen auf betriebsrat_editable-Kategorien beschränkt
- Settings-Tab und Kategorieverwaltung weiterhin r-wiki-only
- Ajax-Endpoints (save_post_files, delete_post_file, upload_inline_image)
  prüfen Kategorie-Berechtigung serverseitig

File Gallery:
- Betriebsrat ist per kc_lock_path auf den Post-eigenen Ordner beschränkt
- Redakteur kann frei navigieren (kein Lock)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-26 13:16:36 +02:00
parent 07f9f304a4
commit a0698d621e
8 changed files with 168 additions and 27 deletions

View File

@@ -58,8 +58,10 @@ if (!$q || !($contactRow = mysqli_fetch_assoc($q))) {
$contactId = (int) $contactRow['id'];
$masterMandantId = (int) $contactRow['master_mandant_id'];
if (get_permission_state('r-wiki', $masterMandantId, $contactId) != 1) {
respond_error('Keine Berechtigung (r-wiki).', 403);
$hasRwiki = get_permission_state('r-wiki', $masterMandantId, $contactId) == 1;
$hasRwikiBr = get_permission_state('r-wiki-br', $masterMandantId, $contactId) == 1;
if (!$hasRwiki && !$hasRwikiBr) {
respond_error('Keine Berechtigung.', 403);
}
$postId = isset($_POST['post_id']) ? (int) $_POST['post_id'] : 0;
@@ -72,6 +74,18 @@ if (!$verifyQ || mysqli_num_rows($verifyQ) === 0) {
respond_error('Beitrag existiert nicht.', 404);
}
// Betriebsrat darf Bilder nur in freigegebene Kategorien hochladen
if (!$hasRwiki && $hasRwikiBr) {
$brRes = mysqli_query($GLOBALS['mysql_con'],
"SELECT COUNT(*) AS cnt FROM knowledgecenter_category_post kcp
JOIN knowledgecenter_categories_update kcu ON kcu.id = kcp.category_id
WHERE kcp.post_id = $postId AND kcu.betriebsrat_editable = 1");
$brRow = mysqli_fetch_assoc($brRes);
if (!$brRow || (int)$brRow['cnt'] === 0) {
respond_error('Keine Berechtigung für diesen Beitrag.', 403);
}
}
if (!isset($_FILES['file']) || !is_array($_FILES['file'])) {
respond_error('Keine Datei empfangen.');
}