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:
28
api.php
28
api.php
@@ -97,7 +97,8 @@ function requireCompany(): string {
|
|||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
$userCompanies = $_SESSION['companies'] ?? [];
|
$userCompanies = $_SESSION['companies'] ?? [];
|
||||||
if (!in_array($companyId, $userCompanies)) {
|
$isSuperadmin = ($_SESSION['role'] ?? '') === 'superadmin';
|
||||||
|
if (!$isSuperadmin && !in_array($companyId, $userCompanies)) {
|
||||||
http_response_code(403);
|
http_response_code(403);
|
||||||
echo json_encode(['error' => 'Ei oikeutta tähän yritykseen']);
|
echo json_encode(['error' => 'Ei oikeutta tähän yritykseen']);
|
||||||
exit;
|
exit;
|
||||||
@@ -1466,7 +1467,13 @@ switch ($action) {
|
|||||||
$_SESSION['username'] = $u['username'];
|
$_SESSION['username'] = $u['username'];
|
||||||
$_SESSION['nimi'] = $u['nimi'];
|
$_SESSION['nimi'] = $u['nimi'];
|
||||||
$_SESSION['role'] = $u['role'];
|
$_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'] ?? [];
|
$_SESSION['company_roles'] = $u['company_roles'] ?? [];
|
||||||
// Valitse aktiivinen yritys: domain-match > ensimmäinen sallittu
|
// Valitse aktiivinen yritys: domain-match > ensimmäinen sallittu
|
||||||
if ($domainCompanyId && in_array($domainCompanyId, $allowedCompanyIds)) {
|
if ($domainCompanyId && in_array($domainCompanyId, $allowedCompanyIds)) {
|
||||||
@@ -1481,7 +1488,8 @@ switch ($action) {
|
|||||||
// Hae yritysten nimet + IP-status
|
// Hae yritysten nimet + IP-status
|
||||||
$companyList = [];
|
$companyList = [];
|
||||||
foreach ($allCompanies as $comp) {
|
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']];
|
$entry = ['id' => $comp['id'], 'nimi' => $comp['nimi']];
|
||||||
// Merkitse IP-estetyt yritykset (superadmin ohittaa)
|
// Merkitse IP-estetyt yritykset (superadmin ohittaa)
|
||||||
if ($u['role'] !== 'superadmin' && !isIpAllowed($ip, $comp['allowed_ips'] ?? '')) {
|
if ($u['role'] !== 'superadmin' && !isIpAllowed($ip, $comp['allowed_ips'] ?? '')) {
|
||||||
@@ -1517,7 +1525,13 @@ switch ($action) {
|
|||||||
// Synkronoi aina tuoreet yritysoikeudet tietokannasta sessioon
|
// Synkronoi aina tuoreet yritysoikeudet tietokannasta sessioon
|
||||||
$u = dbGetUser($_SESSION['user_id']);
|
$u = dbGetUser($_SESSION['user_id']);
|
||||||
if ($u) {
|
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'] ?? [];
|
$_SESSION['company_roles'] = $u['company_roles'] ?? [];
|
||||||
// Varmista aktiivinen yritys on sallittu
|
// Varmista aktiivinen yritys on sallittu
|
||||||
if (!in_array($_SESSION['company_id'] ?? '', $_SESSION['companies'])) {
|
if (!in_array($_SESSION['company_id'] ?? '', $_SESSION['companies'])) {
|
||||||
@@ -1534,7 +1548,8 @@ switch ($action) {
|
|||||||
$companyList = [];
|
$companyList = [];
|
||||||
$firstAllowedId = null;
|
$firstAllowedId = null;
|
||||||
foreach ($allCompanies as $comp) {
|
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']];
|
$entry = ['id' => $comp['id'], 'nimi' => $comp['nimi']];
|
||||||
if (!$isSuperAdmin && !isIpAllowed($ip, $comp['allowed_ips'] ?? '')) {
|
if (!$isSuperAdmin && !isIpAllowed($ip, $comp['allowed_ips'] ?? '')) {
|
||||||
$entry['ip_blocked'] = true;
|
$entry['ip_blocked'] = true;
|
||||||
@@ -3970,7 +3985,8 @@ switch ($action) {
|
|||||||
$input = json_decode(file_get_contents('php://input'), true);
|
$input = json_decode(file_get_contents('php://input'), true);
|
||||||
$companyId = $input['company_id'] ?? '';
|
$companyId = $input['company_id'] ?? '';
|
||||||
$userCompanies = $_SESSION['companies'] ?? [];
|
$userCompanies = $_SESSION['companies'] ?? [];
|
||||||
if (!in_array($companyId, $userCompanies)) {
|
$isSuperadmin = ($_SESSION['role'] ?? '') === 'superadmin';
|
||||||
|
if (!$isSuperadmin && !in_array($companyId, $userCompanies)) {
|
||||||
http_response_code(403);
|
http_response_code(403);
|
||||||
echo json_encode(['error' => 'Ei oikeutta tähän yritykseen']);
|
echo json_encode(['error' => 'Ei oikeutta tähän yritykseen']);
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user