From 14cdfafd40c28b2e6aa9bedacb476df35c2fcbe8 Mon Sep 17 00:00:00 2001 From: Jukka Lampikoski Date: Tue, 10 Mar 2026 16:36:05 +0200 Subject: [PATCH] feat: domain-based login restriction Users can only log in from domains belonging to their assigned company. E.g. cuitunet users can only log in via intra.cuitunet.fi. Admin users can still log in from any domain. Co-Authored-By: Claude Opus 4.6 --- api.php | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/api.php b/api.php index 6323d78..cb26ae6 100644 --- a/api.php +++ b/api.php @@ -770,18 +770,24 @@ switch ($action) { $password = $input['password'] ?? ''; $u = dbGetUserByUsername($username); if ($u && password_verify($password, $u['password_hash'])) { + $userCompanies = $u['companies'] ?? []; + // Domain-pohjainen kirjautumisrajoitus + $host = strtolower(explode(':', $_SERVER['HTTP_HOST'] ?? '')[0]); + $domainCompany = dbGetCompanyByDomain($host); + $domainCompanyId = $domainCompany ? $domainCompany['id'] : ''; + // Jos domain kuuluu tietylle yritykselle, vain sen yrityksen käyttäjät + adminit pääsevät sisään + if ($domainCompanyId && $u['role'] !== 'admin' && !in_array($domainCompanyId, $userCompanies)) { + dbRecordLoginAttempt($ip); + http_response_code(403); + echo json_encode(['error' => 'Sinulla ei ole oikeutta kirjautua tälle sivustolle.']); + break; + } session_regenerate_id(true); $_SESSION['user_id'] = $u['id']; $_SESSION['username'] = $u['username']; $_SESSION['nimi'] = $u['nimi']; $_SESSION['role'] = $u['role']; - // Multi-company: aseta käyttäjän yritykset sessioon - $userCompanies = $u['companies'] ?? []; $_SESSION['companies'] = $userCompanies; - // Domain-pohjainen oletusyritys - $host = strtolower(explode(':', $_SERVER['HTTP_HOST'] ?? '')[0]); - $domainCompany = dbGetCompanyByDomain($host); - $domainCompanyId = $domainCompany ? $domainCompany['id'] : ''; // Jos domain matchaa ja käyttäjällä on oikeus -> käytä sitä if ($domainCompanyId && in_array($domainCompanyId, $userCompanies)) { $_SESSION['company_id'] = $domainCompanyId;