Fix: superadmin pääsy kaikkiin yrityksiin

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 <noreply@anthropic.com>
This commit is contained in:
2026-03-12 22:24:03 +02:00
parent 9878656c4d
commit 6a12da858f

28
api.php
View File

@@ -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;