|
1
|
|
|
<?php |
|
2
|
|
|
|
|
3
|
|
|
// Copyright (C) 2014-2018 Universitätsbibliothek Mannheim |
|
4
|
|
|
// See file LICENSE for license details. |
|
5
|
|
|
|
|
6
|
|
|
// This file implements user authorization. |
|
7
|
|
|
|
|
8
|
|
|
// PalMA installation can authorize users by a PIN, by a |
|
9
|
|
|
// user name and by a password. |
|
10
|
|
|
|
|
11
|
|
|
// The PIN is a four digit random number which is changed for |
|
12
|
|
|
// every new session. |
|
13
|
|
|
|
|
14
|
|
|
// Authorization with a user name and a password requires code |
|
15
|
|
|
// which implements the authorization mechanism (for example |
|
16
|
|
|
// proxy based authorization, LDAP, Shibboleth, fixed password). |
|
17
|
|
|
// Password authorization can optionally be disabled. |
|
18
|
|
|
|
|
19
|
|
|
// Connect to database and get configuration constants. |
|
20
|
|
|
require_once('DBConnector.class.php'); |
|
21
|
|
|
$dbcon = new palma\DBConnector(); |
|
22
|
|
|
|
|
23
|
|
|
require_once('i12n.php'); |
|
24
|
|
|
require_once('globals.php'); |
|
25
|
|
|
|
|
26
|
|
|
$errtext = false; |
|
27
|
|
|
|
|
28
|
|
|
function getDevice() |
|
29
|
|
|
{ |
|
30
|
|
|
// Try to determine the user's device type. The device which is |
|
31
|
|
|
// returned is used to select the matching icon for the user list. |
|
32
|
|
|
$agent = $_SERVER["HTTP_USER_AGENT"]; |
|
33
|
|
|
if (preg_match('/iPad/', $agent)) { |
|
34
|
|
|
$device = 'tablet'; |
|
35
|
|
|
} elseif (preg_match('/iPhone/', $agent)) { |
|
36
|
|
|
$device = 'mobile'; |
|
37
|
|
|
} elseif (preg_match('/Android/', $agent)) { |
|
38
|
|
|
$device = 'android'; |
|
39
|
|
|
} elseif (preg_match('/Linux/', $agent)) { |
|
40
|
|
|
$device = 'linux'; |
|
41
|
|
|
} elseif (preg_match('/OS X/', $agent)) { |
|
42
|
|
|
$device = 'apple'; |
|
43
|
|
|
} elseif (preg_match('/Windows/', $agent)) { |
|
44
|
|
|
$device = 'windows'; |
|
45
|
|
|
} else { |
|
46
|
|
|
$device = 'laptop'; |
|
47
|
|
|
} |
|
48
|
|
|
return $device; |
|
49
|
|
|
} |
|
50
|
|
|
|
|
51
|
|
|
function checkCredentials($username, $password) |
|
52
|
|
|
{ |
|
53
|
|
|
// Check username + password against fixed internal value and |
|
54
|
|
|
// external proxy with authentisation. |
|
55
|
|
|
|
|
56
|
|
|
global $errtext; |
|
57
|
|
|
|
|
58
|
|
|
$remote = $_SERVER['REMOTE_ADDR']; |
|
59
|
|
|
if ($username == 'chef' && $password == 'chef') { |
|
60
|
|
|
if ($remote == '::1' || $remote == '127.0.0.1' || |
|
61
|
|
|
preg_match('/^134[.]155[.]36[.]/', $remote) && |
|
62
|
|
|
$remote != '134.155.36.48') { |
|
63
|
|
|
// Allow test access for restricted remote hosts (localhost, |
|
64
|
|
|
// UB Mannheim library staff, but not via proxy server). |
|
65
|
|
|
// TODO: PalMA installations which are accessible from |
|
66
|
|
|
// the Internet may want to remove this test access. |
|
67
|
|
|
return true; |
|
68
|
|
|
} else { |
|
69
|
|
|
trace("Test access not allowed for IP address $remote"); |
|
70
|
|
|
return false; |
|
71
|
|
|
} |
|
72
|
|
|
} |
|
73
|
|
|
|
|
74
|
|
|
if ($username == '' || $password == '') { |
|
75
|
|
|
// Don't allow empty user name or password. |
|
76
|
|
|
// Proxy authentisation can fail with empty values. |
|
77
|
|
|
trace("access denied for user '$username'"); |
|
78
|
|
|
return false; |
|
79
|
|
|
} |
|
80
|
|
|
// TODO: testurl sollte auf einem lokalen Server liegen. |
|
81
|
|
|
$testurl = 'http://www.weilnetz.de/proxytest'; |
|
82
|
|
|
$proxy = 'proxy.bib.uni-mannheim.de:3150'; |
|
83
|
|
|
$curl = curl_init($testurl); |
|
84
|
|
|
curl_setopt($curl, CURLOPT_HEADER, true); |
|
|
|
|
|
|
85
|
|
|
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); |
|
86
|
|
|
curl_setopt($curl, CURLOPT_PROXY, $proxy); |
|
87
|
|
|
curl_setopt($curl, CURLOPT_PROXYAUTH, CURLAUTH_ANY); |
|
88
|
|
|
curl_setopt($curl, CURLOPT_PROXYUSERPWD, "$username:$password"); |
|
89
|
|
|
//~ trace("Start curl"); |
|
90
|
|
|
$out = curl_exec($curl); |
|
|
|
|
|
|
91
|
|
|
curl_close($curl); |
|
|
|
|
|
|
92
|
|
|
|
|
93
|
|
|
if (!$out) { |
|
94
|
|
|
trace("curl failed for user '$username'"); |
|
95
|
|
|
$errtext = addslashes(__('Invalid credentials!')); |
|
|
|
|
|
|
96
|
|
|
} elseif (preg_match('/404 Not Found/', $out)) { |
|
|
|
|
|
|
97
|
|
|
return true; |
|
98
|
|
|
} elseif (preg_match('/Could not resolve proxy/', $out)) { |
|
99
|
|
|
trace('proxy authentisation was not possible'); |
|
100
|
|
|
$errtext = addslashes(__('Cannot check credentials, sorry!')); |
|
101
|
|
|
} elseif (preg_match('/Cache Access Denied/', $out)) { |
|
102
|
|
|
trace("access denied for user '$username'"); |
|
103
|
|
|
$errtext = addslashes(__('Invalid credentials!')); |
|
104
|
|
|
} else { |
|
105
|
|
|
trace("access not possible for user '$username'"); |
|
106
|
|
|
$errtext = addslashes(__('Invalid credentials!')); |
|
107
|
|
|
} |
|
108
|
|
|
return false; |
|
109
|
|
|
} |
|
110
|
|
|
|
|
111
|
|
|
$username = ''; |
|
112
|
|
|
$pin = ''; |
|
113
|
|
|
$posted_pin = ''; |
|
114
|
|
|
if (isset($_REQUEST['pin'])) { |
|
115
|
|
|
$posted_pin = escapeshellcmd($_REQUEST['pin']); |
|
116
|
|
|
} |
|
117
|
|
|
|
|
118
|
|
|
require_once('globals.php'); |
|
119
|
|
|
monitor("login.php: page loaded"); |
|
120
|
|
|
if ($_SERVER['REQUEST_METHOD'] == 'POST') { |
|
121
|
|
|
session_start(); |
|
122
|
|
|
$username = escapeshellcmd($_POST['username']); |
|
123
|
|
|
$password = ''; |
|
124
|
|
|
if (CONFIG_PASSWORD) { |
|
125
|
|
|
// The password must not be escaped. |
|
126
|
|
|
$password = $_POST['userpassword']; |
|
127
|
|
|
} |
|
128
|
|
|
if (CONFIG_PIN) { |
|
129
|
|
|
$posted_pin = escapeshellcmd($_POST['pin']); |
|
130
|
|
|
$pin = $dbcon->querySingle("SELECT value FROM setting WHERE key = 'pin'"); |
|
131
|
|
|
} |
|
132
|
|
|
|
|
133
|
|
|
if (CONFIG_PASSWORD && !checkCredentials($username, $password)) { |
|
134
|
|
|
monitor("login.php: access denied for user '$username'"); |
|
135
|
|
|
// Invalid username or password. |
|
136
|
|
|
} elseif (CONFIG_PIN && ($pin != $posted_pin)) { |
|
137
|
|
|
monitor("login.php: access denied for user '$username': invalid pin"); |
|
138
|
|
|
trace("access denied for user '$username', wrong pin $posted_pin"); |
|
139
|
|
|
$errtext = addslashes(__('Invalid PIN.')); |
|
|
|
|
|
|
140
|
|
|
} else { |
|
141
|
|
|
// Successfully checked username, password and PIN. |
|
142
|
|
|
monitor("login.php: access granted for user '$username'"); |
|
143
|
|
|
trace("access granted for user '$username'"); |
|
144
|
|
|
$_SESSION['username'] = $username; |
|
145
|
|
|
$_SESSION['address'] = $dbcon->ipAddress(); |
|
146
|
|
|
$_SESSION['pin'] = $pin; |
|
147
|
|
|
$_SESSION['starturl'] = CONFIG_START_URL; |
|
148
|
|
|
$_SESSION['monitor'] = CONFIG_STATIONNAME; |
|
149
|
|
|
$dbcon->addUser($username, $dbcon->ipAddress(), getDevice()); |
|
150
|
|
|
|
|
151
|
|
|
// Weiterleitung zur geschützten Startseite |
|
152
|
|
|
if ($_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.1') { |
|
153
|
|
|
if (php_sapi_name() == 'cgi') { |
|
154
|
|
|
header('Status: 303 See Other'); |
|
155
|
|
|
} else { |
|
156
|
|
|
header('HTTP/1.1 303 See Other'); |
|
157
|
|
|
} |
|
158
|
|
|
} |
|
159
|
|
|
trace(CONFIG_START_URL); |
|
160
|
|
|
header('Location: ' . CONFIG_START_URL); |
|
161
|
|
|
exit; |
|
162
|
|
|
} |
|
163
|
|
|
} |
|
164
|
|
|
?> |
|
165
|
|
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" |
|
166
|
|
|
"http://www.w3.org/TR/html4/strict.dtd"> |
|
167
|
|
|
|
|
168
|
|
|
<html lang="de"> |
|
169
|
|
|
|
|
170
|
|
|
<head> |
|
171
|
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> |
|
172
|
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
|
173
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1"> |
|
174
|
|
|
<title><?=addslashes(__("PalMA – Login"))?></title> |
|
175
|
|
|
|
|
176
|
|
|
<link rel="icon" href="theme/<?=CONFIG_THEME?>/favicon.ico" type="image/x-icon"> |
|
177
|
|
|
<link rel="stylesheet" href="font-awesome/css/font-awesome.min.css"> |
|
178
|
|
|
<link rel="stylesheet" href="pure-min.css"> |
|
179
|
|
|
<link rel="stylesheet" href="palma.css"> |
|
180
|
|
|
|
|
181
|
|
|
</head> |
|
182
|
|
|
|
|
183
|
|
|
<!-- |
|
184
|
|
|
|
|
185
|
|
|
Copyright (C) 2014 Stefan Weil, Universitätsbibliothek Mannheim |
|
186
|
|
|
|
|
187
|
|
|
TODO: |
|
188
|
|
|
* Use 'placeholder' attribute for input fields. |
|
189
|
|
|
|
|
190
|
|
|
--> |
|
191
|
|
|
|
|
192
|
|
|
<body onLoad="document.forms.auth.username.focus()"> |
|
193
|
|
|
<div id="login_mask"> |
|
194
|
|
|
|
|
195
|
|
|
<form name="auth" class="pure-form pure-form-aligned" action="login.php" method="post"> |
|
196
|
|
|
|
|
197
|
|
|
<fieldset class="login"> |
|
198
|
|
|
<legend> |
|
199
|
|
|
<img src="theme/<?=CONFIG_THEME?>/palma-logo-67x25.png" alt="PalMA" height="25"/> |
|
200
|
|
|
– <?=addslashes(__("Login"))?> |
|
201
|
|
|
</legend> |
|
202
|
|
|
<div id="login_fields"> |
|
203
|
|
|
<div class="pure-control-group"> |
|
204
|
|
|
<label for="username"><?=addslashes(__("User name"))?></label |
|
205
|
|
|
><input id="username" name="username" type="text" value="<?=htmlspecialchars($username)?>"> |
|
206
|
|
|
</div> |
|
207
|
|
|
<?php |
|
208
|
|
|
if (CONFIG_PASSWORD) { |
|
209
|
|
|
?> |
|
210
|
|
|
<div class="pure-control-group"> |
|
211
|
|
|
<label for="userpassword"><?=addslashes(__("Password"))?></label |
|
212
|
|
|
><input id="userpassword" name="userpassword" type="password"> |
|
213
|
|
|
</div> |
|
214
|
|
|
<?php |
|
215
|
|
|
} |
|
216
|
|
|
if (CONFIG_PIN) { |
|
217
|
|
|
?> |
|
218
|
|
|
<div class="pure-control-group"> |
|
219
|
|
|
<label for="pin"><?=addslashes(__("PIN"))?></label |
|
220
|
|
|
><input id="pin" name="pin" type="text" value="<?=htmlspecialchars($posted_pin)?>"> |
|
221
|
|
|
</div> |
|
222
|
|
|
<?php |
|
223
|
|
|
} |
|
224
|
|
|
?> |
|
225
|
|
|
</div> |
|
226
|
|
|
<div class="pure-controls"> |
|
227
|
|
|
<button type="submit" class="pure-button pure-button-primary"><?=addslashes(__("Log in"))?><i class="fa fa-sign-in"></i></button> |
|
228
|
|
|
</div> |
|
229
|
|
|
</fieldset> |
|
230
|
|
|
|
|
231
|
|
|
</form> |
|
232
|
|
|
|
|
233
|
|
|
<?php |
|
234
|
|
|
if ($errtext) { |
|
235
|
|
|
echo("<p>$errtext</p>"); |
|
236
|
|
|
} |
|
237
|
|
|
if (defined('CONFIG_POLICY')) { |
|
238
|
|
|
echo('<div class="policy">' . CONFIG_POLICY . '</div>'); |
|
239
|
|
|
} |
|
240
|
|
|
?> |
|
241
|
|
|
|
|
242
|
|
|
</div> |
|
243
|
|
|
|
|
244
|
|
|
</body> |
|
245
|
|
|
</html> |
|
246
|
|
|
|