Yrityskohtainen IP-rajoitus kirjautumiseen

Lisätty allowed_ips kenttä yrityksiin. Tyhjä = ei rajoitusta,
muuten vain listatut IP:t/CIDR-alueet pääsevät kirjautumaan.
Superadmin ohittaa aina IP-tarkistuksen (backdoor).

Tarkistus tehdään login, check_auth ja company_switch -endpointeissa.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-11 08:48:34 +02:00
parent dd1125e2ab
commit 250722dc41
4 changed files with 103 additions and 7 deletions

9
db.php
View File

@@ -447,6 +447,7 @@ function initDatabase(): void {
"ALTER TABLE tickets ADD COLUMN ticket_number INT DEFAULT NULL AFTER id",
"ALTER TABLE mailboxes ADD COLUMN auto_reply_enabled BOOLEAN DEFAULT FALSE AFTER aktiivinen",
"ALTER TABLE mailboxes ADD COLUMN auto_reply_body TEXT AFTER auto_reply_enabled",
"ALTER TABLE companies ADD COLUMN allowed_ips TEXT DEFAULT '' AFTER enabled_modules",
];
foreach ($alters as $sql) {
try { $db->query($sql); } catch (\Throwable $e) { /* sarake on jo olemassa / jo ajettu */ }
@@ -473,6 +474,7 @@ function dbLoadCompanies(): array {
// enabled_modules: JSON-array tai tyhjä (= kaikki päällä)
$raw = $c['enabled_modules'] ?? '';
$c['enabled_modules'] = $raw ? (json_decode($raw, true) ?: []) : [];
$c['allowed_ips'] = $c['allowed_ips'] ?? '';
}
return $companies;
}
@@ -484,13 +486,13 @@ function dbSaveCompany(array $company): void {
$enabledModules = $company['enabled_modules'] ?? [];
$enabledModulesJson = is_array($enabledModules) ? json_encode($enabledModules) : ($enabledModules ?: '');
_dbExecute("
INSERT INTO companies (id, nimi, luotu, aktiivinen, primary_color, subtitle, logo_file, api_key, cors_origins, enabled_modules)
VALUES (:id, :nimi, :luotu, :aktiivinen, :primary_color, :subtitle, :logo_file, :api_key, :cors_origins, :enabled_modules)
INSERT INTO companies (id, nimi, luotu, aktiivinen, primary_color, subtitle, logo_file, api_key, cors_origins, enabled_modules, allowed_ips)
VALUES (:id, :nimi, :luotu, :aktiivinen, :primary_color, :subtitle, :logo_file, :api_key, :cors_origins, :enabled_modules, :allowed_ips)
ON DUPLICATE KEY UPDATE
nimi = VALUES(nimi), aktiivinen = VALUES(aktiivinen),
primary_color = VALUES(primary_color), subtitle = VALUES(subtitle),
logo_file = VALUES(logo_file), api_key = VALUES(api_key), cors_origins = VALUES(cors_origins),
enabled_modules = VALUES(enabled_modules)
enabled_modules = VALUES(enabled_modules), allowed_ips = VALUES(allowed_ips)
", [
'id' => $company['id'],
'nimi' => $company['nimi'],
@@ -502,6 +504,7 @@ function dbSaveCompany(array $company): void {
'api_key' => $company['api_key'] ?? '',
'cors_origins' => $company['cors_origins'] ?? '',
'enabled_modules' => $enabledModulesJson,
'allowed_ips' => $company['allowed_ips'] ?? '',
]);
// Päivitä domainit