diff --git a/core/js/js.js b/core/js/js.js index 21a2d4c1b3..096cc3ad7c 100644 --- a/core/js/js.js +++ b/core/js/js.js @@ -1087,6 +1087,7 @@ function initCore() { $('a.action.delete').tipsy({gravity:'e', fade:true, live:true}); $('a.action').tipsy({gravity:'s', fade:true, live:true}); $('td .modified').tipsy({gravity:'s', fade:true, live:true}); + $('td.lastLogin').tipsy({gravity:'s', fade:true, html:true}); $('input').tipsy({gravity:'w', fade:true}); // toggle for menus diff --git a/lib/base.php b/lib/base.php index 5f2131f388..5866c949b6 100644 --- a/lib/base.php +++ b/lib/base.php @@ -882,6 +882,7 @@ class OC { // if return is true we are logged in -> redirect to the default page if ($return === true) { + OC_User::getManager()->get(OC_User::getUser())->updateLastLogin(); $_REQUEST['redirect_url'] = \OC_Request::requestUri(); OC_Util::redirectToDefaultPage(); exit; @@ -915,6 +916,7 @@ class OC { $granted = OC_User::loginWithCookie( $_COOKIE['oc_username'], $_COOKIE['oc_token']); if($granted === true) { + OC_User::getManager()->get(OC_User::getUser())->updateLastLogin(); OC_Util::redirectToDefaultPage(); // doesn't return } @@ -952,6 +954,7 @@ class OC { } $userid = OC_User::getUser(); + OC_User::getManager()->get($userid)->updateLastLogin(); self::cleanupLoginTokens($userid); if (!empty($_POST["remember_login"])) { if (defined("DEBUG") && DEBUG) { @@ -983,6 +986,7 @@ class OC { if (OC_User::login($_SERVER["PHP_AUTH_USER"], $_SERVER["PHP_AUTH_PW"])) { //OC_Log::write('core',"Logged in with HTTP Authentication", OC_Log::DEBUG); + OC_User::getManager()->get(OC_User::getUser())->updateLastLogin(); OC_User::unsetMagicInCookie(); $_SERVER['HTTP_REQUESTTOKEN'] = OC_Util::callRegister(); } diff --git a/lib/private/user/user.php b/lib/private/user/user.php index 8aba7188e2..82f02e0f2b 100644 --- a/lib/private/user/user.php +++ b/lib/private/user/user.php @@ -52,6 +52,11 @@ class User { */ private $config; + /** + * @var int $home + */ + private $lastLogin; + /** * @param string $uid * @param \OC_User_Interface $backend @@ -243,4 +248,19 @@ class User { $this->config->setUserValue($this->uid, 'core', 'enabled', $enabled); } } + + /** + * returns the timestamp of the user's last login or 0 if the user did never + * login + * + * @return int + */ + public function getLastLogin() { + return $this->lastLogin; + } + + public function updateLastLogin() { + $this->lastLogin = time(); + \OC_Preferences::setValue($this->uid, 'login', 'lastLogin', $this->lastLogin); + } } diff --git a/settings/ajax/userlist.php b/settings/ajax/userlist.php index b73826393d..b1c2642953 100644 --- a/settings/ajax/userlist.php +++ b/settings/ajax/userlist.php @@ -44,7 +44,9 @@ if (OC_User::isAdminUser(OC_User::getUser())) { 'groups' => join(', ', OC_Group::getUserGroups($uid)), 'subadmin' => join(', ', OC_SubAdmin::getSubAdminsGroups($uid)), 'quota' => OC_Preferences::getValue($uid, 'files', 'quota', 'default'), - 'storageLocation' => $user->getHome()); + 'storageLocation' => $user->getHome(), + 'lastLogin' => $user->getLastLogin(), + ); } } else { $groups = OC_SubAdmin::getSubAdminsGroups(OC_User::getUser()); @@ -56,7 +58,9 @@ if (OC_User::isAdminUser(OC_User::getUser())) { 'displayname' => $user->getDisplayName(), 'groups' => join(', ', OC_Group::getUserGroups($uid)), 'quota' => OC_Preferences::getValue($uid, 'files', 'quota', 'default'), - 'storageLocation' => $user->getHome()); + 'storageLocation' => $user->getHome(), + 'lastLogin' => $user->getLastLogin(), + ); } } OC_JSON::success(array('data' => $users)); diff --git a/settings/js/users.js b/settings/js/users.js index f31367472a..0068cb3641 100644 --- a/settings/js/users.js +++ b/settings/js/users.js @@ -125,7 +125,7 @@ var UserList = { } }, - add: function (username, displayname, groups, subadmin, quota, storageLocation, sort) { + add: function (username, displayname, groups, subadmin, quota, storageLocation, lastLogin, sort) { var tr = $('tbody tr').first().clone(); var subadminsEl; var subadminSelect; @@ -185,6 +185,13 @@ var UserList = { } } tr.find('td.storageLocation').text(storageLocation); + if(lastLogin == 0) { + lastLogin = t('settings', 'never'); + } else { + lastLogin = new Date(lastLogin); + lastLogin = relative_modified_date(lastLogin.getTime() / 1000); + } + tr.find('td.lastLogin').text(lastLogin); $(tr).appendTo('tbody'); if (sort) { @@ -280,7 +287,7 @@ var UserList = { if($('tr[data-uid="' + user.name + '"]').length > 0) { return true; } - alert(user.storageLocation); + var tr = UserList.add(user.name, user.displayname, user.groups, user.subadmin, user.quota, user.storageLocation, user.lastLogin, false); tr.addClass('appear transparent'); trs.push(tr); loadedUsers++; @@ -575,7 +582,7 @@ $(document).ready(function () { }, 10000); } if($('tr[data-uid="' + username + '"]').length === 0) { - UserList.add(username, username, result.data.groups, null, 'default', result.data.storageLocation, true); + UserList.add(username, username, result.data.groups, null, 'default', result.data.storageLocation, 0, true); } } } diff --git a/settings/templates/users.php b/settings/templates/users.php index 129f01282a..204079977a 100644 --- a/settings/templates/users.php +++ b/settings/templates/users.php @@ -141,6 +141,7 @@ $_['subadmingroups'] = array_flip($items); t('Quota')); ?> t('Storage Location')); ?> + t('Last Login')); ?>   @@ -218,6 +219,16 @@ $_['subadmingroups'] = array_flip($items); + + ').p($lastLoginDate).p(''); ?>"> diff --git a/settings/users.php b/settings/users.php index e1b3083ed3..dd0fdd80eb 100644 --- a/settings/users.php +++ b/settings/users.php @@ -76,6 +76,7 @@ foreach($accessibleusers as $uid => $displayName) { 'isQuotaUserDefined' => $isQuotaUserDefined, 'subadmin' => OC_SubAdmin::getSubAdminsGroups($uid), 'storageLocation' => $user->getHome(), + 'lastLogin' => $user->getLastLogin(), ); }