git.schokokeks.org
Repositories
Help
Report an Issue
webinterface.git
Code
Commits
Branches
Tags
Suche
Strukturansicht:
984013b
Branches
Tags
master
ticket
webinterface.git
certlogin
index.php
Ermögliche Client-Cert-Login auch für VMail-Accounts
bernd
commited
984013b
at 2012-03-05 06:19:25
index.php
Blame
History
Raw
<?php chdir('..'); require_once('config.php'); global $prefix; $prefix = '../'; // Das Parent-Verzeichnis in den Include-Pfad, da wir uns jetzt in einem anderen Verzeichnis befinden. ini_set('include_path', ini_get('include_path').':../'); require_once('session/start.php'); require_once('inc/base.php'); require_once('inc/debug.php'); require_once('inc/error.php'); require_once('inc/theme.php'); function prepare_cert($cert) { return str_replace(array('-----BEGIN CERTIFICATE-----', '-----END CERTIFICATE-----', ' ', "\n"), array(), $cert); } function get_logins_by_cert($cert) { $cert = mysql_real_escape_string(prepare_cert($cert)); $query = "SELECT type,username,startpage FROM system.clientcert WHERE cert='{$cert}'"; $result = db_query($query); if (mysql_num_rows($result) < 1) return NULL; else { $ret = array(); while ($row = mysql_fetch_assoc($result)) { $ret[] = $row; } return $ret; } } DEBUG('$_SERVER:'); DEBUG($_SERVER); if ($_SESSION['role'] != ROLE_ANONYMOUS && isset($_REQUEST['record']) && isset($_REQUEST['backto']) && check_path($_REQUEST['backto'])) { DEBUG('recording client-cert'); if (isset($_SERVER['REDIRECT_SSL_CLIENT_CERT']) && isset($_SERVER['REDIRECT_SSL_CLIENT_S_DN']) && isset($_SERVER['REDIRECT_SSL_CLIENT_I_DN'])) { $_SESSION['clientcert_cert'] = prepare_cert($_SERVER['REDIRECT_SSL_CLIENT_CERT']); $_SESSION['clientcert_dn'] = $_SERVER['REDIRECT_SSL_CLIENT_S_DN']; $_SESSION['clientcert_issuer'] = $_SERVER['REDIRECT_SSL_CLIENT_I_DN']; header('Location: '.$prefix.$_REQUEST['backto'].encode_querystring('')); die(); } else { system_failure('Ihr Browser hat kein Client-Zertifikat gesendet'); } } elseif (isset($_REQUEST['type']) && isset($_REQUEST['username'])) { if (!isset($_SERVER['REDIRECT_SSL_CLIENT_CERT'])) system_failure('Ihr Browser hat kein Client-Zertifikat gesendet'); $ret = get_logins_by_cert($_SERVER['REDIRECT_SSL_CLIENT_CERT']); DEBUG($ret); foreach ($ret as $account) { DEBUG('/'.$account['type'].'/'.$_REQUEST['type'].'/ /'.$account['username'].'/'.$_REQUEST['username'].'/ =>'); if (($account['type'] == urldecode($_REQUEST['type'])) && ($account['username'] == urldecode($_REQUEST['username']))) { $uid = $account['username']; $role = find_role($uid, '', True); setup_session($role, $uid); $destination = 'go/index/index'; if (check_path($account['startpage'])) $destination = $account['startpage']; if (isset($_REQUEST['destination']) && check_path($_REQUEST['destination'])) $destination = $_REQUEST['destination']; header('Location: ../'.$destination); die(); } } system_failure('Der angegebene Account kann mit diesem Client-Zertifikat nicht eingeloggt werden.'); } else { if (isset($_SERVER['REDIRECT_SSL_CLIENT_CERT']) && isset($_SERVER['REDIRECT_SSL_CLIENT_S_DN']) && $_SERVER['REDIRECT_SSL_CLIENT_S_DN'] != '' && isset($_SERVER['REDIRECT_SSL_CLIENT_I_DN']) && $_SERVER['REDIRECT_SSL_CLIENT_I_DN'] != '') { $ret = get_logins_by_cert($_SERVER['REDIRECT_SSL_CLIENT_CERT']); if ($ret === NULL) { system_failure('Ihr Browser hat ein Client-Zertifikat gesendet, dieses ist aber noch nicht für den Zugang hinterlegt. Gehen Sie bitte zurück und melden Sie sich bitte per Benutzername und Passwort an.'); } if (count($ret) == 1) { $uid = $ret[0]['username']; $role = find_role($uid, '', True); setup_session($role, $uid); $destination = 'go/index/index'; if (check_path($ret[0]['startpage'])) $destination = $ret[0]['startpage']; if (isset($_REQUEST['destination']) && check_path($_REQUEST['destination'])) $destination = $_REQUEST['destination']; header('Location: ../'.$destination); die(); } output('<p>Ihr Browser hat ein gültiges SSL-Client-Zertifikat gesendet, mit dem Sie sich auf dieser Seite einloggen können. Allerdings haben Sie dieses Client-Zertifikat für mehrere Zugänge hinterlegt. Wählen Sie bitte den Zugang aus, mit dem Sie sich anmelden möchten.</p> <ul>'); foreach ($ret as $account) { $type = 'System-Account'; if ($account['type'] == 'email') { $type = 'E-Mail-Konto'; } elseif ($account['type'] == 'subuser') { $type = 'Unter-Nutzer'; } elseif ($account['type'] == 'customer') { $type = 'Kundenaccount'; } $destination = 'go/index/index'; if ($account['startpage'] && check_path($account['startpage'])) $destination = $account['startpage']; output('<li>'.internal_link('', $type.': <strong>'.$account['username'].'</strong>', 'type='.$account['type'].'&username='.urlencode($account['username']).'&destination='.urlencode($destination)).'</li>'); } output('</ul>'); } else { title('Kein Client-Zertifikat'); output('<p>Ihr Browser hat kein Client-Zertifikat gesendet. Eventuell müssen Sie in den Einstellungen des Browsers diese Funktion einschalten.</p>'); output('<p>Bitte verwenden Sie <a href="/">die reguläre Anmeldung mit Benutzername und Passwort</a>.</p>'); } } show_page('certlogin'); ?>