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:
24
api.php
24
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'];
|
||||
// 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) {
|
||||
// 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;
|
||||
|
||||
Reference in New Issue
Block a user