summaryrefslogtreecommitdiffstats
path: root/modules-available/session
diff options
context:
space:
mode:
Diffstat (limited to 'modules-available/session')
-rw-r--r--modules-available/session/hooks/cron.inc.php6
-rw-r--r--modules-available/session/lang/de/module.json1
-rw-r--r--modules-available/session/lang/de/template-tags.json11
-rw-r--r--modules-available/session/lang/en/module.json1
-rw-r--r--modules-available/session/lang/en/template-tags.json11
-rw-r--r--modules-available/session/page.inc.php33
-rw-r--r--modules-available/session/templates/change-password.html43
-rw-r--r--modules-available/session/templates/page-login.html4
8 files changed, 96 insertions, 14 deletions
diff --git a/modules-available/session/hooks/cron.inc.php b/modules-available/session/hooks/cron.inc.php
new file mode 100644
index 00000000..e2cd46e6
--- /dev/null
+++ b/modules-available/session/hooks/cron.inc.php
@@ -0,0 +1,6 @@
+<?php
+
+// Clean up old sessions
+if (mt_rand(1, 10) === 4) {
+ Database::exec("DELETE FROM session WHERE dateline < UNIX_TIMESTAMP()");
+} \ No newline at end of file
diff --git a/modules-available/session/lang/de/module.json b/modules-available/session/lang/de/module.json
index 0d2b001c..fb6cf339 100644
--- a/modules-available/session/lang/de/module.json
+++ b/modules-available/session/lang/de/module.json
@@ -1,3 +1,4 @@
{
+ "page-title-session-list": "Aktive Sitzungen",
"page_title": "Anmelden"
} \ No newline at end of file
diff --git a/modules-available/session/lang/de/template-tags.json b/modules-available/session/lang/de/template-tags.json
index c7b6d881..d518e1cb 100644
--- a/modules-available/session/lang/de/template-tags.json
+++ b/modules-available/session/lang/de/template-tags.json
@@ -1,10 +1,15 @@
{
+ "lang_activeSessions": "Bekannte Sitzungen",
"lang_changePassword": "Passwort \u00e4ndern",
"lang_currentPassword": "Aktuelles Passwort",
"lang_enter": "Anmeldung",
+ "lang_expires": "L\u00e4uft bei Inaktivit\u00e4t ab",
+ "lang_fixedIpSession": "Sitzung an IP-Adresse binden",
+ "lang_killOtherSessions": "Alle meine anderen Sitzungen ausloggen",
+ "lang_lastAddress": "Letzter Zugriff von",
"lang_login": "Anmelden",
"lang_newPassword": "Neues Passwort",
"lang_register": "Registrieren",
- "lang_rememberID": "Angemeldet bleiben",
- "lang_repeatPassword": "Passwort wiederholen"
-}
+ "lang_repeatPassword": "Passwort wiederholen",
+ "lang_uid": "User#"
+} \ No newline at end of file
diff --git a/modules-available/session/lang/en/module.json b/modules-available/session/lang/en/module.json
index 5fb22548..44d024c8 100644
--- a/modules-available/session/lang/en/module.json
+++ b/modules-available/session/lang/en/module.json
@@ -1,3 +1,4 @@
{
+ "page-title-session-list": "Active sessions",
"page_title": "Log in"
} \ No newline at end of file
diff --git a/modules-available/session/lang/en/template-tags.json b/modules-available/session/lang/en/template-tags.json
index f9e0b393..e21a1bf9 100644
--- a/modules-available/session/lang/en/template-tags.json
+++ b/modules-available/session/lang/en/template-tags.json
@@ -1,10 +1,15 @@
{
+ "lang_activeSessions": "Known sessions",
"lang_changePassword": "Change password",
"lang_currentPassword": "Current password",
"lang_enter": "Enter",
+ "lang_expires": "Expires on no activity",
+ "lang_fixedIpSession": "Bind session to IP address",
+ "lang_killOtherSessions": "Log out all my other sessions",
+ "lang_lastAddress": "Last access from",
"lang_login": "Login",
"lang_newPassword": "New password",
"lang_register": "Register",
- "lang_rememberID": "Remember ID",
- "lang_repeatPassword": "Repeat password"
-}
+ "lang_repeatPassword": "Repeat password",
+ "lang_uid": "User#"
+} \ No newline at end of file
diff --git a/modules-available/session/page.inc.php b/modules-available/session/page.inc.php
index 0a6eac77..5f5e5d28 100644
--- a/modules-available/session/page.inc.php
+++ b/modules-available/session/page.inc.php
@@ -12,18 +12,18 @@ class Page_Session extends Page
if (User::isLoggedIn()) // and then just redirect
Util::redirect('?do=main');
// Else, try to log in
- if (User::login(Request::post('user'), Request::post('pass')))
+ if (User::login(Request::post('user'),
+ Request::post('pass'),
+ Request::post('fixedip', false, 'bool'))) {
Util::redirect('?do=main');
+ }
// Login credentials wrong - delay and show error message
sleep(1);
Message::addError('loginfail');
- }
- if ($action === 'logout') {
+ } elseif ($action === 'logout') {
// Log user out (or do nothing if not logged in)
User::logout();
- Util::redirect('?do=main');
- }
- if ($action === 'changepw') {
+ } elseif ($action === 'changepw') {
if (!User::isLoggedIn()) {
Util::redirect('?do=main');
}
@@ -47,19 +47,38 @@ class Page_Session extends Page
Message::addError('adduser.password-mismatch');
Util::redirect('?do=session');
}
+ if (Request::post('kill-other-sessions', false, 'bool')) {
+ Session::deleteAllButCurrent();
+ }
if (User::updatePassword($new)) {
Message::addSuccess('password-changed');
} else {
Message::addWarning('password-unchanged');
}
Util::redirect('?do=session');
+ } else {
+ // No action, change title to session list
+ Render::setTitle(Dictionary::translate('page-title-session-list'));
}
}
protected function doRender()
{
if (User::isLoggedIn()) {
- Render::addTemplate('change-password');
+ $res = Database::simpleQuery("SELECT u.login, s.userid, s.dateline, s.lastip, s.fixedip
+ FROM session s
+ INNER JOIN user u USING (userid)
+ ORDER BY dateline DESC");
+ $sessions = [];
+ $perm = User::hasPermission('.adduser.user.*');
+ foreach ($res as $row) {
+ if ($perm || $row['userid'] == User::getId()) {
+ $row['dateline_s'] = Util::prettyTime($row['dateline']);
+ $sessions[] = $row;
+ }
+ }
+ Render::addTemplate('change-password', ['sessions' => $sessions,
+ 'link' => User::hasPermission('.adduser.user.edit')]);
} else {
Render::addTemplate('page-login');
}
diff --git a/modules-available/session/templates/change-password.html b/modules-available/session/templates/change-password.html
index 70ab7b92..9f19c695 100644
--- a/modules-available/session/templates/change-password.html
+++ b/modules-available/session/templates/change-password.html
@@ -5,7 +5,48 @@
<input type="password" name="newpass1" class="form-control" placeholder="{{lang_newPassword}}">
<input type="password" name="newpass2" class="form-control" placeholder="{{lang_repeatPassword}}">
</div>
+ <div class="checkbox">
+ <input type="checkbox" id="kill-other-sessions" name="kill-other-sessions" value="1">
+ <label for="kill-other-sessions">{{lang_killOtherSessions}}</label>
+ </div>
<button class="btn btn-lg btn-primary btn-block" type="submit">{{lang_changePassword}}</button>
<input type="hidden" name="action" value="changepw">
<input type="hidden" name="token" value="{{token}}">
-</form> \ No newline at end of file
+</form>
+
+<h2>{{lang_activeSessions}}</h2>
+<table class="table">
+ <thead>
+ <tr>
+ <th>{{lang_user}}</th>
+ <th>{{lang_expires}}</th>
+ <th>{{lang_lastAddress}}</th>
+ <th class="slx-smallcol">{{lang_fixedIpSession}}</th>
+ </tr>
+ </thead>
+ <tbody>
+ {{#sessions}}
+ <tr>
+ <td>
+ {{#link}}
+ <a href="?do=adduser&amp;show=edituser&amp;userid={{userid}}">
+ {{/link}}
+ {{login}}
+ {{#link}}
+ </a>
+ {{/link}}
+ </td>
+ <td>{{dateline_s}}</td>
+ <td>{{lastip}}</td>
+ <td class="text-nowrap">
+ {{#fixedip}}
+ <span class="glyphicon glyphicon-ok"></span>
+ {{/fixedip}}
+ {{^fixedip}}
+ <span class="glyphicon glyphicon-remove"></span>
+ {{/fixedip}}
+ </td>
+ </tr>
+ {{/sessions}}
+ </tbody>
+</table> \ No newline at end of file
diff --git a/modules-available/session/templates/page-login.html b/modules-available/session/templates/page-login.html
index 4be7232a..94b69f7d 100644
--- a/modules-available/session/templates/page-login.html
+++ b/modules-available/session/templates/page-login.html
@@ -3,6 +3,10 @@
<div>
<input type="text" name="user" class="form-control" placeholder="{{lang_username}}" autofocus>
<input type="password" name="pass" class="form-control" placeholder="{{lang_password}}">
+ <div class="checkbox">
+ <input type="checkbox" id="fixed-ip" name="fixedip" value="1" checked>
+ <label for="fixed-ip">{{lang_fixedIpSession}}</label>
+ </div>
</div>
<button class="btn btn-lg btn-primary btn-block" type="submit">{{lang_login}}</button>
<a class="btn btn-lg btn-default btn-block" href="?do=AddUser">{{lang_register}}</a>