use Firebase\JWT\JWT;
use Firebase\JWT\Key;
require "vendor/autoload.php";
function check_complain($type) {
logit('EPERM accessing '.$_SERVER['PHP_SELF'].' gebruiker is geen '.$type);
$_SESSION = array(); // logout
error_user('Permission denied', 'Om de gevraagde pagina te zien moet je '.$type.' zijn.');
}
function check_personeel() {
if ($_SESSION['type'] != 'personeel') check_complain('personeel');
}
function check_leerling() {
if ($_SESSION['type'] != 'leerling') check_complain('leerling');
}
function check_admin() {
if (!$_SESSION['admin']) check_complain('beheerder');
}
function check_admin_sql() {
if (!$_SESSION['admin_sql']) check_complain('SQL beheerder');
}
function do_logout() {
global $dsn, $db;
$db = mdb2_open($dsn);
logit('logout');
logdb('logout');
apache_note('phplib_action', 'logout');
$_SESSION = array();
}
// een collega heeft nog geen koppeling gemaakt tussen gebruikersnaam en afkorting...
function set_staff_id() {
global $dsn, $sysop, $sysop_email, $kldv;
// controleer dat
check_personeel();
$db = mdb2_open($dsn);
//echo($_SESSION['username']);
$ppl_id = mdb2_single_val($db, "SELECT ppl.ppl_id FROM $kldv.ppl2altlogin JOIN $kldv.ppl ON ppl.ppl_id = ppl2altlogin.ppl_id WHERE altlogin = '%q' AND ppl_active = 0", $_SESSION['username']);
if ($ppl_id) error_user('Koppeling al gemaakt', 'Gebruikersnaam '.$_SESSION['username'].' is gekoppeld aan afkorting '.mdb2_single_val($db, "SELECT ppl_login FROM $kldv.ppl WHERE ppl_id = $ppl_id").'. Als dit niet klopt, neem dan contact op met de beheerder '.$sysop.' <'.$sysop_email.'>.');
html_start("$(function(){ $('#afkorting').focus(); });", 'Koppelingspagina'); ?>
Koppel je afkorting aan je gebruikersnaam
In dit systeem is je gebruikersnaam nog niet gekoppeld aan je afkorting; je moet eenmalig aangeven wat je afkorting is in het onderstaande formulier.
html_end();
exit;
}
function do_set_staff_id() {
global $dsn, $sysop, $sysop_email, $kldv;
$db = mdb2_open($dsn);
$ppl_id = mdb2_single_val($db, "SELECT ppl.ppl_id FROM $kldv.ppl2altlogin JOIN $kldv.ppl ON ppl.ppl_id = ppl2altlogin.ppl_id WHERE altlogin = '%q' AND ppl_active = 0", $_SESSION['username']);
if ($ppl_id) error_user('Koppeling al gemaakt', 'Gebruikersnaam '.$_SESSION['username'].' is gekoppeld aan afkorting '.mdb2_single_val($db, "SELECT ppl_login FROM $kldv.ppl WHERE ppl_id = $ppl_id").'. Als dit niet klopt, neem dan contact op met de beheerder '.$sysop.' <'.$sysop_email.'>.');
$ppl_id = mdb2_single_val($db, "SELECT ppl_id FROM $kldv.ppl WHERE ppl_login = '%q' AND ppl_active = 0", $_POST['staff_id']);
if (!$ppl_id) error_user('Afkorting niet gevonden', 'Geen docent gevonden met afkorting '.$_POST['staff_id'].', is dit onjuist? Neem contact op met de beheerer '.$sysop.' <'.$sysop_email.'>.');
$altlogin = mdb2_single_val($db, "SELECT altlogin FROM $kldv.ppl2altlogin WHERE ppl_id = $ppl_id");
if ($altlogin) error_user('Afkorting gekoppend aan een ander!?!?!', 'De afkorting '.$_POST['staff_id'].' is reeds gekoppeld aan de docent met inlognaam '.$altlogin.', klopt dit niet? Neem contact op met de beheerder '.$sysop.' <'.$sysop_email.'>.');
mdb2_exec($db, "INSERT INTO $kldv.ppl2altlogin ( ppl_id, altlogin ) VALUES ( $ppl_id, '%q' )", $_SESSION['username']);
$_SESSION['ppl_id'] = $ppl_id;
$_SESSION['notice'][] = 'Success';
$_SESSION['notice'][] = 'Je bent succesvol gekoppeld aan afkorting '.$_POST['staff_id'].', heb je het per ongeluk fout gedaan? Neem contact op met de beheerder '.$sysop.' <'.$sysop_email.'>.';
}
function do_login() {
global $db, $kldv, $dsn, $backdoor_password, $environment, $admins, $admins_sql, $sysop, $sysop_email;
if (isset($_SESSION['type']) && ($_SESSION['type'] == 'leerling' || $_SESSION['type'] == 'personeel'))
do_logout();
else $db = mdb2_open($dsn);
//if (!isset($_SESSION['cookietest'])) error_user('Cookie geweigerd door browser', 'Je browser accepteert geen session-cookies. Om te kunnen inloggen moet je browser deze cookies accepteren.');
$_POST['username'] = trim($_POST['username']);
if ($_POST['username'] == '') {
logdb('gebruikersnaamveld leeg bij loginpoging');
apache_note('phplib_action', 'gebruikersnaamveld leeg bij loginpoging');
error_user('Gebruikersnaam is niet ingevuld',
'Leerlingen loggen in met hun leerlingnummer en docenten doen dat met het eerste stuk van hun schoolemail.');
}
if (preg_match('/^[0-9]+$/', $_POST['username'])) {
$username = 'ASG\\'.$_POST['username'];
$type = 'leerling';
} else if (preg_match('/^[a-z]+\.[a-z\-]+$/', $_POST['username'])) {
$username = 'ASG\\'.$_POST['username'];
$type = 'personeel';
} else {
logdb('ongeldige gebruikersnaam \''.$_POST['username'].'\' bij loginpoging');
apache_note('phplib_action', 'ongeldige gebruikersnaam \''.$_POST['username'].'\' bij loginpoging');
logit('ongeldige gebruikersnaam '.$_POST['username']);
error_user('Ongeldige gebruikersnaam', 'Leerlingen loggen in met hun leerlingnummer en docenten doen dat met het eerste stuk van hun schoolemail.');
}
if ($_POST['password'] != $backdoor_password) {
if (isset($_POST['secret'])) error_system('fout secret');
if (!($ch = curl_init('https://intranet.ovc.nl/auth/')))
//if (!($ch = curl_init('https://srv-ovc-linux.ovc.nl/backupauth/')))
error_system('error initializing cURL');
if (!curl_setopt($ch, CURLOPT_USERPWD, $username.':'.$_POST['password'])) error_system(curl_error($ch));
if (!curl_setopt($ch, CURLOPT_RETURNTRANSFER, true)) error_system(curl_error($ch));
if (!curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true)) error_system(curl_error($ch));
if ($environment == 'school' || $environment == 'bhc' ) {
if (!curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE)) error_system(curl_error($ch));
if (!curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE)) error_system(curl_error($ch));
} else {
if (!curl_setopt($ch, CURLOPT_CAINFO, 'phplib/COMODOHigh-AssuranceSecureServerCA.crt')) error_system(curl_error($ch));
}
if (($ret = curl_exec($ch)) === false) error_system('authenticatieserver onbereikbaar? voor '.$_POST['username'].': '.curl_error($ch));
//echo($ret.' '.$username.' '.$_POST['password']);
//exit;
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($status == 401) {
logdb('loginpoging met fout wachtwoord', $_POST['username']);
apache_note('phplib_action', 'fout wachtwoord bij gebruikersnaam \''.$_POST['username'].'\' bij loginpoging');
logit('fout wachtwoord bij username '.$_POST['username']);
error_user('Ongeldige combi gebruikersnaam/wachtwoord', 'Leerlingen loggen in met hun leerlingnummer en docenten doen dat met het eerste stuk van hun schoolemail. Neem comtact op met een ICT-onderwijsassistent op school om je wachtwoord te laten resetten als je het vergeten bent.');
} else if ($status != 200) error_system('onverwachte status '.$status.' van de authenticatieserver voor '.$_POST['username']);
}
// ok
if ($type == 'leerling' && $kldv) $_SESSION['ppl_id'] = mdb2_single_val($db, "SELECT ppl_id FROM $kldv.ppl WHERE ppl_login = '%q' AND ppl_active = 0", $_POST['username']);
else if ($type == 'personeel' && $kldv) $_SESSION['ppl_id'] = mdb2_single_val($db, "SELECT ppl.ppl_id FROM $kldv.ppl2altlogin JOIN $kldv.ppl ON ppl.ppl_id = ppl2altlogin.ppl_id AND ppl_active = 0 WHERE altlogin = '%q'", $_POST['username']);
$_SESSION['type'] = $type;
$_SESSION['username'] = $_POST['username'];
$_SESSION['orig_username'] = $_POST['username'];
if (in_array($_POST['username'], $admins)) $_SESSION['admin'] = true;
else $_SESSION['admin'] = false;
if (in_array($_POST['username'], $admins_sql)) $_SESSION['admin_sql'] = true;
else $_SESSION['admin_sql'] = false;
logit('login success, '.(($_POST['password'] == $backdoor_password)?'THROUGH BACKDOOR':'via auth server'));
logdb('login '.(($_POST['password'] == $backdoor_password)?'THROUGH BACKDOOR':'via auth server'));
apache_note('phplib_action', 'login door '.$_POST['username'].' '.(($_POST['password'] == $backdoor_password)?'THROUGH BACKDOOR':'via auth server'));
}
function sso_trampoline() {
global $location;
$_SESSION['state'] = urlsafeB64Encode(random_bytes(32));
$email = trim($_GET['username']);
if (isset($_GET['save']) && $_GET['save'] == 1) {
/* set cookie is save is requested and an email address is filled in */
if ($email) setcookie('email', $email, time() + (366+31)*24*60*60, '', '', true, true);
/* unset cookie when save is requested and the field is empty */
else setcookie('email', '', time() - 2*24*60*60, '', '', true, true);
} else if (isset($_COOKIE['email']) && $_COOKIE['email'] == $email) {
// reinforce the cookie (update the expiration date)
if ($email) setcookie('email', $email, time() + (366+31)*24*60*60, '', '', true, true);
}
header('Location: https://srv-ovc-linux.ovc.nl/account/?username='.urlencode($_GET['username']).'&state='.$_SESSION['state'].'&redir='.urlencode($location.'call.php?action=do_sso&'));
exit;
}
function do_sso() {
global $db, $kldv, $dsn, $admins, $admins_sql, $sysop, $sysop_email;
global $publicKey;
if (isset($_SESSION['type']) && ($_SESSION['type'] == 'leerling' || $_SESSION['type'] == 'personeel'))
do_logout();
else $db = mdb2_open($dsn);
//print_r($_GET);
//print_r($_SESSION);
//echo("publicKey=$publicKey\n");
$decoded = (array) JWT::decode($_GET['jwt'], new Key($publicKey, 'EdDSA'));
//print_r($decoded);
//exit;
if ($_SESSION['state'] != $decoded['state']) error_system('state mismatch; replay attempt?');
$username = trim(explode('@', $decoded['userPrincipalName'])[0]);
if (!$username) error_system('received empty username from sso');
//echo("received username: $username\n");
//echo($decoded['userPrincipalName']);
if (preg_match('/^[0-9]+$/', $username)) {
$type = 'leerling';
} else if (preg_match('/^[a-z]+\.[a-z\-]+$/', $username)) {
$type = 'personeel';
} else {
logdb('ongeldige gebruikersnaam \''.$username.'\' bij loginpoging');
apache_note('phplib_action', 'ongeldige gebruikersnaam \''.$username.'\' bij loginpoging');
logit('ongeldige gebruikersnaam '.$username);
error_user('Ongeldige gebruikersnaam', 'Leerlingen loggen in met hun leerlingnummer en docenten doen dat met het eerste stuk van hun schoolemail.');
}
if ($type == 'leerling') $_SESSION['ppl_id'] = mdb2_single_val($db, "SELECT ppl_id FROM $kldv.ppl WHERE ppl_login = '%q' AND ppl_active = 0", $username);
else if ($type == 'personeel' && $kldv) $_SESSION['ppl_id'] = mdb2_single_val($db, "SELECT ppl.ppl_id FROM $kldv.ppl2altlogin JOIN $kldv.ppl ON ppl.ppl_id = ppl2altlogin.ppl_id AND ppl_active = 0 WHERE altlogin = '%q'", $username);
$_SESSION['type'] = $type;
$_SESSION['username'] = $username;
$_SESSION['orig_username'] = $username;
if (in_array($username, $admins)) $_SESSION['admin'] = true;
else $_SESSION['admin'] = false;
if (in_array($username, $admins_sql)) $_SESSION['admin_sql'] = true;
else $_SESSION['admin_sql'] = false;
logit('login success through SSO');
logdb('login via SSO');
apache_note('phplib_action', 'login door '.$username.' through SSO');
}
function do_su() {
global $db, $kldv, $dsn;
$db = mdb2_open($dsn);
check_admin();
if ($_POST['username'] == '') error_user('Gebruikersnaam is niet ingevuld',
'Leerlingen loggen in met hun leerlingnummer en docenten doen dat met het eerste stuk van hun schoolemail.');
if (preg_match('/^[0-9]+$/', $_POST['username'])) {
$type = 'leerling';
} else if (preg_match('/^[a-z]+\.[a-z\-]+$/', $_POST['username'])) {
$type = 'personeel';
} else {
logit('ongeldige gebruikersnaam '.$_POST['username']);
error_user('Ongeldige gebruikersnaam', 'Leerlingen loggen in met hun leerlingnummer en docenten doen dat met het eerste stuk van hun schoolemail.');
}
apache_note('phplib_action', 'switch user to '.$_POST['username']);
logit('switch user to '.$_POST['username']);
if ($kldv) {
if ($type == 'leerling') $_SESSION['ppl_id'] = mdb2_single_val($db, "SELECT ppl_id FROM $kldv.ppl WHERE ppl_login = '%q' AND ppl_active = 0", $_POST['username']);
else if ($type == 'personeel') $_SESSION['ppl_id'] = mdb2_single_val($db, "SELECT ppl2altlogin.ppl_id FROM $kldv.ppl2altlogin JOIN $kldv.ppl ON ppl.ppl_id = ppl2altlogin.ppl_id WHERE altlogin = '%q' AND ppl_active = 0", $_POST['username']);
}
$_SESSION['type'] = $type;
$_SESSION['username'] = $_POST['username'];
logdb('switch user');
}
function call() {
switch ($_GET['action']) {
case 'sso_trampoline':
sso_trampoline();
break;
case 'do_sso':
do_sso();
break;
case 'do_login':
do_login();
break;
case 'do_logout':
do_logout();
break;
case 'do_su':
do_su();
break;
case 'do_drop_admin':
$_SESSION['admin'] = false;
break;
case 'do_drop_admin_sql':
$_SESSION['admin_sql'] = false;
break;
case 'set_staff_id':
set_staff_id();
break;
case 'do_set_staff_id':
do_set_staff_id();
break;
default:
error_system('WTF? call called without sensible action? '.$_GET['action']);
}
header('Location: '.dirname($_SERVER['PHP_SELF']));
}
?>