diff --git a/module/knowledgecenter_update/Ajax/Ajax.php b/module/knowledgecenter_update/Ajax/Ajax.php index 617b308..788e6d7 100644 --- a/module/knowledgecenter_update/Ajax/Ajax.php +++ b/module/knowledgecenter_update/Ajax/Ajax.php @@ -24,6 +24,37 @@ require_once($connEnv); db_connect(); +// Prüft ob der aktuelle User Wiki-Schreibrechte hat (r-wiki oder r-wiki-br) +function ajax_has_wiki_edit(): bool +{ + $mid = $GLOBALS['main_contact']['master_mandant_id'] ?? 0; + $uid = $GLOBALS['main_contact']['id'] ?? 0; + return get_permission_state('r-wiki', $mid, $uid) == 1 + || get_permission_state('r-wiki-br', $mid, $uid) == 1; +} + +// Betriebsrat darf einen Post nur bearbeiten, wenn er in einer freigegebenen Kategorie liegt. +// Gibt false zurück wenn Bearbeitung verboten, true wenn erlaubt. +function ajax_can_edit_post(int $postId): bool +{ + $mid = $GLOBALS['main_contact']['master_mandant_id'] ?? 0; + $uid = $GLOBALS['main_contact']['id'] ?? 0; + if (get_permission_state('r-wiki', $mid, $uid) == 1) { + return true; // Redakteur darf immer + } + if (get_permission_state('r-wiki-br', $mid, $uid) != 1) { + return false; // Kein Wiki-Recht + } + // Betriebsrat: Post muss in betriebsrat_editable Kategorie liegen + $res = 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"); + $row = mysqli_fetch_assoc($res); + return $row && (int)$row['cnt'] > 0; +} + // AJAX-Handler: Falls per POST eine Aktion übergeben wurde, diese verarbeiten und das Skript beenden. if (isset($_POST["action"])) { header('Content-Type: application/json'); @@ -243,6 +274,7 @@ function update_category_detail() { $is_navigation_item = isset($_POST['is_navigation_item']) ? (int) $_POST['is_navigation_item'] : 0; $enable_post_color_pickers = isset($_POST['enable_post_color_pickers']) ? (int) $_POST['enable_post_color_pickers'] : 0; + $betriebsrat_editable = isset($_POST['betriebsrat_editable']) ? (int) $_POST['betriebsrat_editable'] : 0; $color_hex = mysqli_real_escape_string($GLOBALS['mysql_con'], $_POST['color_hex'] ?? ''); $categoryId = (int) ($_POST['id'] ?? 0); $languageId = (int) ($_POST['language_id'] ?? 0); @@ -287,11 +319,12 @@ function update_category_detail() exit; } - $mainUpdate = "UPDATE knowledgecenter_categories_update + $mainUpdate = "UPDATE knowledgecenter_categories_update SET modified_by = '$modified_by', modified_at = NOW(), state = $state, enable_post_color_pickers = $enable_post_color_pickers, + betriebsrat_editable = $betriebsrat_editable, color_hex = '$color_hex' WHERE id = $categoryId"; if (!mysqli_query($GLOBALS['mysql_con'], $mainUpdate)) { @@ -1583,6 +1616,10 @@ function save_post_files() echo json_encode(['error' => 'Ungültige Post-ID']); exit; } + if (!ajax_can_edit_post($postId)) { + echo json_encode(['error' => 'Keine Berechtigung']); + exit; + } if (!empty($filesStr)) { // Zerlege den String in einzelne Pfade (getrennt durch Komma und optional Leerzeichen) @@ -1650,7 +1687,7 @@ function delete_post_file() exit; } - $selectQuery = "SELECT path FROM knowledgecenter_post_files WHERE id = $fileId LIMIT 1"; + $selectQuery = "SELECT path, post_id FROM knowledgecenter_post_files WHERE id = $fileId LIMIT 1"; $selectResult = mysqli_query($GLOBALS['mysql_con'], $selectQuery); if (!$selectResult || mysqli_num_rows($selectResult) === 0) { echo json_encode(['error' => 'Datei-Eintrag nicht gefunden']); @@ -1660,6 +1697,11 @@ function delete_post_file() $row = mysqli_fetch_assoc($selectResult); $storedPath = trim((string) ($row['path'] ?? '')); + if (!ajax_can_edit_post((int)($row['post_id'] ?? 0))) { + echo json_encode(['error' => 'Keine Berechtigung']); + exit; + } + $userdataRoot = realpath($_SERVER['DOCUMENT_ROOT'] . '/userdata'); if ($userdataRoot === false) { echo json_encode(['error' => 'userdata-Verzeichnis nicht gefunden']); diff --git a/module/knowledgecenter_update/Ajax/endpoints/upload_inline_image.php b/module/knowledgecenter_update/Ajax/endpoints/upload_inline_image.php index e6ab167..376691a 100644 --- a/module/knowledgecenter_update/Ajax/endpoints/upload_inline_image.php +++ b/module/knowledgecenter_update/Ajax/endpoints/upload_inline_image.php @@ -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.'); } diff --git a/module/knowledgecenter_update/Controllers/knowledgecenter.inc.php b/module/knowledgecenter_update/Controllers/knowledgecenter.inc.php index 527e5e6..e603e75 100644 --- a/module/knowledgecenter_update/Controllers/knowledgecenter.inc.php +++ b/module/knowledgecenter_update/Controllers/knowledgecenter.inc.php @@ -829,7 +829,6 @@ if (isset($_GET[$c_form]) && !empty($_POST)) { // Helper-Funktion zur Berechtigungsprüfung function require_permission($permissionCode) { - // Hier nehmen wir an, dass $GLOBALS["main_contact"] korrekt gesetzt ist if ( get_permission_state( $permissionCode, @@ -842,6 +841,32 @@ function require_permission($permissionCode) } } +// Prüft, ob der User voller Wiki-Redakteur ist (r-wiki) +function is_wiki_redakteur(): bool +{ + return get_permission_state('r-wiki', $GLOBALS['main_contact']['master_mandant_id'], $GLOBALS['main_contact']['id']) == 1; +} + +// Prüft, ob der User Betriebsrat-Wiki-Recht hat (r-wiki-br) +function is_wiki_betriebsrat(): bool +{ + return get_permission_state('r-wiki-br', $GLOBALS['main_contact']['master_mandant_id'], $GLOBALS['main_contact']['id']) == 1; +} + +// Prüft, ob der User irgendeins der Wiki-Bearbeitungsrechte hat +function has_wiki_edit_permission(): bool +{ + return is_wiki_redakteur() || is_wiki_betriebsrat(); +} + +function require_wiki_edit_permission(): void +{ + if (!has_wiki_edit_permission()) { + echo "Sie haben nicht die notwendigen Berechtigungen, um diese Seite zu sehen."; + exit; + } +} + // Switch-Case für die verschiedenen Aktionen $action = $_GET["action"] ?? "List"; switch ($action) { @@ -850,6 +875,7 @@ switch ($action) { require_once(__DIR__ . '/../Installation/Installation.php'); break; case "Categories": + // Kategorieverwaltung nur für vollständige Redakteure if (isset($_GET['detail'])) { require_permission('r-wiki'); require_once(__DIR__ . '/../Views/categories_cardform.php'); @@ -859,7 +885,8 @@ switch ($action) { } break; case "PostList": - require_permission('r-wiki'); + // Betriebsrat darf die Post-Liste sehen (gefiltert auf seine Kategorien) + require_wiki_edit_permission(); require_once(__DIR__ . '/../Views/post_listform.php'); break; case "Post": @@ -870,7 +897,8 @@ switch ($action) { require_once(__DIR__ . '/../Import/Import.php'); break; case "NewPost": - require_permission('r-wiki'); + // Betriebsrat darf neue Posts erstellen (nur in freigegebenen Kategorien) + require_wiki_edit_permission(); $_GET['new'] = 1; require_once(__DIR__ . '/../Views/post_cardform.php'); break; diff --git a/module/knowledgecenter_update/Script/Script.php b/module/knowledgecenter_update/Script/Script.php index 8cad629..39d9a6e 100644 --- a/module/knowledgecenter_update/Script/Script.php +++ b/module/knowledgecenter_update/Script/Script.php @@ -1,15 +1,25 @@