From 6a12da858f6382f7d162c296c245b85cc83e054e Mon Sep 17 00:00:00 2001 From: Jukka Lampikoski Date: Thu, 12 Mar 2026 22:24:03 +0200 Subject: [PATCH] =?UTF-8?q?Fix:=20superadmin=20p=C3=A4=C3=A4sy=20kaikkiin?= =?UTF-8?q?=20yrityksiin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Superadmin-käyttäjällä oli user_companies-taulussa vain yksi yritys, joten hän ei voinut vaihtaa tai muokata muita yrityksiä (esim. intra.web1.fi). Nyt superadmin saa kaikki yritykset sessioon loginissa ja check_auth:ssa, ja requireCompany() + company_switch ohittavat company-tarkistuksen. Co-Authored-By: Claude Opus 4.6 --- api.php | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/api.php b/api.php index f253c5a..9f4798b 100644 --- a/api.php +++ b/api.php @@ -97,7 +97,8 @@ function requireCompany(): string { exit; } $userCompanies = $_SESSION['companies'] ?? []; - if (!in_array($companyId, $userCompanies)) { + $isSuperadmin = ($_SESSION['role'] ?? '') === 'superadmin'; + if (!$isSuperadmin && !in_array($companyId, $userCompanies)) { http_response_code(403); echo json_encode(['error' => 'Ei oikeutta tähän yritykseen']); exit; @@ -1466,7 +1467,13 @@ switch ($action) { $_SESSION['username'] = $u['username']; $_SESSION['nimi'] = $u['nimi']; $_SESSION['role'] = $u['role']; - $_SESSION['companies'] = $userCompanies; + // Superadmin saa pääsyn kaikkiin yrityksiin + if ($u['role'] === 'superadmin') { + $allIds = array_map(fn($c) => $c['id'], $allCompanies); + $_SESSION['companies'] = $allIds; + } else { + $_SESSION['companies'] = $userCompanies; + } $_SESSION['company_roles'] = $u['company_roles'] ?? []; // Valitse aktiivinen yritys: domain-match > ensimmäinen sallittu if ($domainCompanyId && in_array($domainCompanyId, $allowedCompanyIds)) { @@ -1481,7 +1488,8 @@ switch ($action) { // Hae yritysten nimet + IP-status $companyList = []; foreach ($allCompanies as $comp) { - if (in_array($comp['id'], $userCompanies)) { + // Superadmin näkee kaikki yritykset + if ($u['role'] === 'superadmin' || in_array($comp['id'], $userCompanies)) { $entry = ['id' => $comp['id'], 'nimi' => $comp['nimi']]; // Merkitse IP-estetyt yritykset (superadmin ohittaa) if ($u['role'] !== 'superadmin' && !isIpAllowed($ip, $comp['allowed_ips'] ?? '')) { @@ -1517,7 +1525,13 @@ switch ($action) { // Synkronoi aina tuoreet yritysoikeudet tietokannasta sessioon $u = dbGetUser($_SESSION['user_id']); if ($u) { - $_SESSION['companies'] = $u['companies'] ?? []; + // Superadmin saa pääsyn kaikkiin yrityksiin + if (($u['role'] ?? '') === 'superadmin') { + $allComps = dbLoadCompanies(); + $_SESSION['companies'] = array_map(fn($c) => $c['id'], $allComps); + } else { + $_SESSION['companies'] = $u['companies'] ?? []; + } $_SESSION['company_roles'] = $u['company_roles'] ?? []; // Varmista aktiivinen yritys on sallittu if (!in_array($_SESSION['company_id'] ?? '', $_SESSION['companies'])) { @@ -1534,7 +1548,8 @@ switch ($action) { $companyList = []; $firstAllowedId = null; foreach ($allCompanies as $comp) { - if (in_array($comp['id'], $userCompanyIds)) { + // Superadmin näkee kaikki yritykset + if ($isSuperAdmin || in_array($comp['id'], $userCompanyIds)) { $entry = ['id' => $comp['id'], 'nimi' => $comp['nimi']]; if (!$isSuperAdmin && !isIpAllowed($ip, $comp['allowed_ips'] ?? '')) { $entry['ip_blocked'] = true; @@ -3970,7 +3985,8 @@ switch ($action) { $input = json_decode(file_get_contents('php://input'), true); $companyId = $input['company_id'] ?? ''; $userCompanies = $_SESSION['companies'] ?? []; - if (!in_array($companyId, $userCompanies)) { + $isSuperadmin = ($_SESSION['role'] ?? '') === 'superadmin'; + if (!$isSuperadmin && !in_array($companyId, $userCompanies)) { http_response_code(403); echo json_encode(['error' => 'Ei oikeutta tähän yritykseen']); break;