diff options
Diffstat (limited to 'modules-available/session')
-rw-r--r-- | modules-available/session/hooks/cron.inc.php | 6 | ||||
-rw-r--r-- | modules-available/session/lang/de/module.json | 1 | ||||
-rw-r--r-- | modules-available/session/lang/de/template-tags.json | 11 | ||||
-rw-r--r-- | modules-available/session/lang/en/module.json | 1 | ||||
-rw-r--r-- | modules-available/session/lang/en/template-tags.json | 11 | ||||
-rw-r--r-- | modules-available/session/page.inc.php | 33 | ||||
-rw-r--r-- | modules-available/session/templates/change-password.html | 43 | ||||
-rw-r--r-- | modules-available/session/templates/page-login.html | 4 |
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&show=edituser&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> |