You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@guacamole.apache.org by vn...@apache.org on 2018/01/05 15:35:47 UTC
[1/6] guacamole-client git commit: GUACAMOLE-394: List users in a
table displaying last active time.
Repository: guacamole-client
Updated Branches:
refs/heads/staging/0.9.14 8c2a76b91 -> ed6722ba5
GUACAMOLE-394: List users in a table displaying last active time.
Project: http://git-wip-us.apache.org/repos/asf/guacamole-client/repo
Commit: http://git-wip-us.apache.org/repos/asf/guacamole-client/commit/138ea40d
Tree: http://git-wip-us.apache.org/repos/asf/guacamole-client/tree/138ea40d
Diff: http://git-wip-us.apache.org/repos/asf/guacamole-client/diff/138ea40d
Branch: refs/heads/staging/0.9.14
Commit: 138ea40dc947f8ff32f82737e7c2d74adcc07718
Parents: 67fc77a
Author: Michael Jumper <mj...@apache.org>
Authored: Mon Sep 18 12:36:35 2017 -0700
Committer: Michael Jumper <mj...@apache.org>
Committed: Mon Dec 11 20:44:28 2017 -0800
----------------------------------------------------------------------
.../settings/directives/guacSettingsUsers.js | 33 ++++++++++++++-
.../webapp/app/settings/styles/user-list.css | 42 ++++++++++++++++++++
.../app/settings/templates/settingsUsers.html | 35 +++++++++++-----
guacamole/src/main/webapp/translations/de.json | 6 ++-
guacamole/src/main/webapp/translations/en.json | 7 +++-
guacamole/src/main/webapp/translations/fr.json | 6 ++-
guacamole/src/main/webapp/translations/it.json | 6 ++-
guacamole/src/main/webapp/translations/nl.json | 6 ++-
guacamole/src/main/webapp/translations/no.json | 6 ++-
guacamole/src/main/webapp/translations/ru.json | 6 ++-
10 files changed, 134 insertions(+), 19 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/138ea40d/guacamole/src/main/webapp/app/settings/directives/guacSettingsUsers.js
----------------------------------------------------------------------
diff --git a/guacamole/src/main/webapp/app/settings/directives/guacSettingsUsers.js b/guacamole/src/main/webapp/app/settings/directives/guacSettingsUsers.js
index cc134fa..1ac9fad 100644
--- a/guacamole/src/main/webapp/app/settings/directives/guacSettingsUsers.js
+++ b/guacamole/src/main/webapp/app/settings/directives/guacSettingsUsers.js
@@ -36,9 +36,11 @@ angular.module('settings').directive('guacSettingsUsers', [function guacSettings
// Required types
var ManageableUser = $injector.get('ManageableUser');
var PermissionSet = $injector.get('PermissionSet');
+ var SortOrder = $injector.get('SortOrder');
// Required services
var $location = $injector.get('$location');
+ var $translate = $injector.get('$translate');
var authenticationService = $injector.get('authenticationService');
var dataSourceService = $injector.get('dataSourceService');
var guacNotification = $injector.get('guacNotification');
@@ -98,10 +100,38 @@ angular.module('settings').directive('guacSettingsUsers', [function guacSettings
* @type String[]
*/
$scope.filteredUserProperties = [
+ 'user.lastActive',
'user.username'
];
/**
+ * The date format for use for the last active date.
+ *
+ * @type String
+ */
+ $scope.dateFormat = null;
+
+ /**
+ * SortOrder instance which stores the sort order of the listed
+ * users.
+ *
+ * @type SortOrder
+ */
+ $scope.order = new SortOrder([
+ 'user.username',
+ '-user.lastActive'
+ ]);
+
+ // Get session date format
+ $translate('SETTINGS_USERS.FORMAT_DATE')
+ .then(function dateFormatReceived(retrievedDateFormat) {
+
+ // Store received date format
+ $scope.dateFormat = retrievedDateFormat;
+
+ });
+
+ /**
* Returns whether critical data has completed being loaded.
*
* @returns {Boolean}
@@ -110,7 +140,8 @@ angular.module('settings').directive('guacSettingsUsers', [function guacSettings
*/
$scope.isLoaded = function isLoaded() {
- return $scope.manageableUsers !== null
+ return $scope.dateFormat !== null
+ && $scope.manageableUsers !== null
&& $scope.permissions !== null;
};
http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/138ea40d/guacamole/src/main/webapp/app/settings/styles/user-list.css
----------------------------------------------------------------------
diff --git a/guacamole/src/main/webapp/app/settings/styles/user-list.css b/guacamole/src/main/webapp/app/settings/styles/user-list.css
new file mode 100644
index 0000000..6c0edd5
--- /dev/null
+++ b/guacamole/src/main/webapp/app/settings/styles/user-list.css
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+.settings.users table.user-list {
+ width: 100%;
+}
+
+.settings.users table.user-list th.last-active,
+.settings.users table.user-list td.last-active {
+ white-space: nowrap;
+ width: 0;
+}
+
+.settings.users table.user-list th.username,
+.settings.users table.user-list td.username {
+ width: 100%;
+}
+
+.settings.users table.user-list tr.user td.username a[href] {
+ display: block;
+ padding: .5em 1em;
+}
+
+.settings.users table.user-list tr.user td.username {
+ padding: 0;
+}
http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/138ea40d/guacamole/src/main/webapp/app/settings/templates/settingsUsers.html
----------------------------------------------------------------------
diff --git a/guacamole/src/main/webapp/app/settings/templates/settingsUsers.html b/guacamole/src/main/webapp/app/settings/templates/settingsUsers.html
index 41dac6c..67f6760 100644
--- a/guacamole/src/main/webapp/app/settings/templates/settingsUsers.html
+++ b/guacamole/src/main/webapp/app/settings/templates/settingsUsers.html
@@ -21,19 +21,32 @@
</div>
<!-- List of users this user has access to -->
- <div class="user-list">
- <div ng-repeat="manageableUser in manageableUserPage" class="user list-item">
- <a ng-href="#/manage/{{manageableUser.dataSource}}/users/{{manageableUser.user.username}}">
- <div class="caption">
- <div class="icon user"></div>
- <span class="name">{{manageableUser.user.username}}</span>
- </div>
- </a>
- </div>
- </div>
+ <table class="sorted user-list">
+ <thead>
+ <tr>
+ <th guac-sort-order="order" guac-sort-property="'user.username'" class="username">
+ {{'SETTINGS_USERS.TABLE_HEADER_USERNAME' | translate}}
+ </th>
+ <th guac-sort-order="order" guac-sort-property="'user.lastActive'" class="last-active">
+ {{'SETTINGS_USERS.TABLE_HEADER_LAST_ACTIVE' | translate}}
+ </th>
+ </tr>
+ </thead>
+ <tbody ng-class="{loading: !isLoaded()}">
+ <tr ng-repeat="manageableUser in manageableUserPage" class="user">
+ <td class="username">
+ <a ng-href="#/manage/{{manageableUser.dataSource}}/users/{{manageableUser.user.username}}">
+ <div class="icon user"></div>
+ <span class="name">{{manageableUser.user.username}}</span>
+ </a>
+ </td>
+ <td class="last-active">{{manageableUser.user.lastActive | date : dateFormat}}</td>
+ </tr>
+ </tbody>
+ </table>
<!-- Pager controls for user list -->
<guac-pager page="manageableUserPage" page-size="25"
- items="filteredManageableUsers | orderBy : 'user.username'"></guac-pager>
+ items="filteredManageableUsers | orderBy : order.predicate"></guac-pager>
</div>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/138ea40d/guacamole/src/main/webapp/translations/de.json
----------------------------------------------------------------------
diff --git a/guacamole/src/main/webapp/translations/de.json b/guacamole/src/main/webapp/translations/de.json
index 9403402..90953e5 100644
--- a/guacamole/src/main/webapp/translations/de.json
+++ b/guacamole/src/main/webapp/translations/de.json
@@ -598,9 +598,13 @@
"FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER",
+ "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE",
+
"HELP_USERS" : "Klicke oder Tippe auf einen Benutzer um diesen zu verwalten. Abhänig von Ihrer Zugriffsebene können Benutzer hinzugefügt, gelöscht bzw. dessen Passwort geändert werden.",
- "SECTION_HEADER_USERS" : "Benutzer"
+ "SECTION_HEADER_USERS" : "Benutzer",
+
+ "TABLE_HEADER_USERNAME" : "Benutzername"
},
http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/138ea40d/guacamole/src/main/webapp/translations/en.json
----------------------------------------------------------------------
diff --git a/guacamole/src/main/webapp/translations/en.json b/guacamole/src/main/webapp/translations/en.json
index 2b4fb5d..a64f64c 100644
--- a/guacamole/src/main/webapp/translations/en.json
+++ b/guacamole/src/main/webapp/translations/en.json
@@ -675,9 +675,14 @@
"FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER",
+ "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE",
+
"HELP_USERS" : "Click or tap on a user below to manage that user. Depending on your access level, users can be added and deleted, and their passwords can be changed.",
- "SECTION_HEADER_USERS" : "Users"
+ "SECTION_HEADER_USERS" : "Users",
+
+ "TABLE_HEADER_LAST_ACTIVE" : "Last active",
+ "TABLE_HEADER_USERNAME" : "Username"
},
http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/138ea40d/guacamole/src/main/webapp/translations/fr.json
----------------------------------------------------------------------
diff --git a/guacamole/src/main/webapp/translations/fr.json b/guacamole/src/main/webapp/translations/fr.json
index d59c384..8ebbd36 100644
--- a/guacamole/src/main/webapp/translations/fr.json
+++ b/guacamole/src/main/webapp/translations/fr.json
@@ -601,9 +601,13 @@
"FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER",
+ "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE",
+
"HELP_USERS" : "Cliquer ou appuyer sur un utilisateur en dessous pour le gérer. Selon vos permissions, les utilisateurs peuvent être ajoutés, supprimés, leur mot de passe changé.",
- "SECTION_HEADER_USERS" : "Utilisateur"
+ "SECTION_HEADER_USERS" : "Utilisateur",
+
+ "TABLE_HEADER_USERNAME" : "Identifiant"
},
http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/138ea40d/guacamole/src/main/webapp/translations/it.json
----------------------------------------------------------------------
diff --git a/guacamole/src/main/webapp/translations/it.json b/guacamole/src/main/webapp/translations/it.json
index e84e67f..5b3f641 100644
--- a/guacamole/src/main/webapp/translations/it.json
+++ b/guacamole/src/main/webapp/translations/it.json
@@ -543,9 +543,13 @@
"FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER",
+ "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE",
+
"HELP_USERS" : "Click or tap on a user below to manage that user. Depending on your access level, users can be added and deleted, and their passwords can be changed.",
- "SECTION_HEADER_USERS" : "Utenti"
+ "SECTION_HEADER_USERS" : "Utenti",
+
+ "TABLE_HEADER_USERNAME" : "Username"
},
http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/138ea40d/guacamole/src/main/webapp/translations/nl.json
----------------------------------------------------------------------
diff --git a/guacamole/src/main/webapp/translations/nl.json b/guacamole/src/main/webapp/translations/nl.json
index 7cc867b..69a789a 100644
--- a/guacamole/src/main/webapp/translations/nl.json
+++ b/guacamole/src/main/webapp/translations/nl.json
@@ -631,9 +631,13 @@
"FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER",
+ "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE",
+
"HELP_USERS" : "Klik of tik op een van de onderstaande gebruikers om die te beheren. Afhankelijk van uw toegangsniveau kunnen gebruikers worden toegevoegd, verwijderd en hun wachtwoorden gewijzigd.",
- "SECTION_HEADER_USERS" : "Gebruikers"
+ "SECTION_HEADER_USERS" : "Gebruikers",
+
+ "TABLE_HEADER_USERNAME" : "Gebruikersnaam"
},
http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/138ea40d/guacamole/src/main/webapp/translations/no.json
----------------------------------------------------------------------
diff --git a/guacamole/src/main/webapp/translations/no.json b/guacamole/src/main/webapp/translations/no.json
index 8b20b5d..30ea871 100644
--- a/guacamole/src/main/webapp/translations/no.json
+++ b/guacamole/src/main/webapp/translations/no.json
@@ -612,9 +612,13 @@
"FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER",
+ "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE",
+
"HELP_USERS" : "Klikk på en bruker under for å administrere den brukeren. Avhengig av din tilgang kan brukere legges til, slettes og passordet kan endres.",
- "SECTION_HEADER_USERS" : "Brukere"
+ "SECTION_HEADER_USERS" : "Brukere",
+
+ "TABLE_HEADER_USERNAME" : "Brukernavn"
},
http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/138ea40d/guacamole/src/main/webapp/translations/ru.json
----------------------------------------------------------------------
diff --git a/guacamole/src/main/webapp/translations/ru.json b/guacamole/src/main/webapp/translations/ru.json
index 0e47f60..4f04525 100644
--- a/guacamole/src/main/webapp/translations/ru.json
+++ b/guacamole/src/main/webapp/translations/ru.json
@@ -524,9 +524,13 @@
"FIELD_PLACEHOLDER_FILTER" : "@:APP.FIELD_PLACEHOLDER_FILTER",
+ "FORMAT_DATE" : "@:APP.FORMAT_DATE_TIME_PRECISE",
+
"HELP_USERS" : "Нажмите на пользователя, чтобы управлять им. В зависимости от прав доступа возможно добавление и удаление пользователей, а также изменение паролей.",
- "SECTION_HEADER_USERS" : "Пользователи"
+ "SECTION_HEADER_USERS" : "Пользователи",
+
+ "TABLE_HEADER_USERNAME" : "Имя пользователя"
},
[2/6] guacamole-client git commit: GUACAMOLE-394: Add user history
REST endpoint.
Posted by vn...@apache.org.
GUACAMOLE-394: Add user history REST endpoint.
Project: http://git-wip-us.apache.org/repos/asf/guacamole-client/repo
Commit: http://git-wip-us.apache.org/repos/asf/guacamole-client/commit/29284725
Tree: http://git-wip-us.apache.org/repos/asf/guacamole-client/tree/29284725
Diff: http://git-wip-us.apache.org/repos/asf/guacamole-client/diff/29284725
Branch: refs/heads/staging/0.9.14
Commit: 2928472549e5664247ff892d9155ddca8c9365b5
Parents: 9df20f2
Author: Michael Jumper <mj...@apache.org>
Authored: Mon Sep 11 18:27:21 2017 -0700
Committer: Michael Jumper <mj...@apache.org>
Committed: Mon Dec 11 20:44:28 2017 -0800
----------------------------------------------------------------------
.../rest/history/APIActivityRecord.java | 131 +++++++++++++++++
.../rest/history/APIConnectionRecord.java | 89 +-----------
.../APIConnectionRecordSortPredicate.java | 144 -------------------
.../rest/history/APISortPredicate.java | 144 +++++++++++++++++++
.../guacamole/rest/history/HistoryResource.java | 60 +++++++-
5 files changed, 335 insertions(+), 233 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/29284725/guacamole/src/main/java/org/apache/guacamole/rest/history/APIActivityRecord.java
----------------------------------------------------------------------
diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/history/APIActivityRecord.java b/guacamole/src/main/java/org/apache/guacamole/rest/history/APIActivityRecord.java
new file mode 100644
index 0000000..c1a0149
--- /dev/null
+++ b/guacamole/src/main/java/org/apache/guacamole/rest/history/APIActivityRecord.java
@@ -0,0 +1,131 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.guacamole.rest.history;
+
+import java.util.Date;
+import org.apache.guacamole.net.auth.ActivityRecord;
+
+/**
+ * A activity record which may be exposed through the REST endpoints.
+ */
+public class APIActivityRecord {
+
+ /**
+ * The date and time the activity began.
+ */
+ private final Date startDate;
+
+ /**
+ * The date and time the activity ended, or null if the activity is
+ * still in progress or if the end time is unknown.
+ */
+ private final Date endDate;
+
+ /**
+ * The hostname or IP address of the remote host that performed the
+ * activity associated with this record, if known.
+ */
+ private final String remoteHost;
+
+ /**
+ * The name of the user who performed or is performing the activity
+ * associated with this record.
+ */
+ private final String username;
+
+ /**
+ * Whether the activity is still in progress.
+ */
+ private final boolean active;
+
+ /**
+ * Creates a new APIActivityRecord, copying the data from the given activity
+ * record.
+ *
+ * @param record
+ * The record to copy data from.
+ */
+ public APIActivityRecord(ActivityRecord record) {
+ this.startDate = record.getStartDate();
+ this.endDate = record.getEndDate();
+ this.remoteHost = record.getRemoteHost();
+ this.username = record.getUsername();
+ this.active = record.isActive();
+ }
+
+ /**
+ * Returns the date and time the activity began.
+ *
+ * @return
+ * The date and time the activity began.
+ */
+ public Date getStartDate() {
+ return startDate;
+ }
+
+ /**
+ * Returns the date and time the activity ended, if applicable.
+ *
+ * @return
+ * The date and time the activity ended, or null if the activity is
+ * still in progress or if the end time is unknown.
+ */
+ public Date getEndDate() {
+ return endDate;
+ }
+
+ /**
+ * Returns the hostname or IP address of the remote host that performed the
+ * activity associated with this record, if known.
+ *
+ * @return
+ * The hostname or IP address of the remote host that performed the
+ * activity associated with this record, or null if the remote host is
+ * unknown.
+ */
+ public String getRemoteHost() {
+ return remoteHost;
+ }
+
+ /**
+ * Returns the name of the user who performed or is performing the activity
+ * associated with this record.
+ *
+ * @return
+ * The name of the user who performed or is performing the activity
+ * associated with this record.
+ */
+ public String getUsername() {
+ return username;
+ }
+
+ /**
+ * Returns whether the activity associated with this record is still in
+ * progress.
+ *
+ * @return
+ * true if the activity associated with this record is still in
+ * progress, false otherwise.
+ */
+ public boolean isActive() {
+ return active;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/29284725/guacamole/src/main/java/org/apache/guacamole/rest/history/APIConnectionRecord.java
----------------------------------------------------------------------
diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/history/APIConnectionRecord.java b/guacamole/src/main/java/org/apache/guacamole/rest/history/APIConnectionRecord.java
index 97c99a0..9d17fbf 100644
--- a/guacamole/src/main/java/org/apache/guacamole/rest/history/APIConnectionRecord.java
+++ b/guacamole/src/main/java/org/apache/guacamole/rest/history/APIConnectionRecord.java
@@ -19,13 +19,12 @@
package org.apache.guacamole.rest.history;
-import java.util.Date;
import org.apache.guacamole.net.auth.ConnectionRecord;
/**
* A connection record which may be exposed through the REST endpoints.
*/
-public class APIConnectionRecord {
+public class APIConnectionRecord extends APIActivityRecord {
/**
* The identifier of the connection associated with this record.
@@ -48,32 +47,6 @@ public class APIConnectionRecord {
private final String sharingProfileName;
/**
- * The date and time the connection began.
- */
- private final Date startDate;
-
- /**
- * The date and time the connection ended, or null if the connection is
- * still running or if the end time is unknown.
- */
- private final Date endDate;
-
- /**
- * The host from which the connection originated, if known.
- */
- private final String remoteHost;
-
- /**
- * The name of the user who used or is using the connection.
- */
- private final String username;
-
- /**
- * Whether the connection is currently active.
- */
- private final boolean active;
-
- /**
* Creates a new APIConnectionRecord, copying the data from the given
* record.
*
@@ -81,15 +54,11 @@ public class APIConnectionRecord {
* The record to copy data from.
*/
public APIConnectionRecord(ConnectionRecord record) {
+ super(record);
this.connectionIdentifier = record.getConnectionIdentifier();
this.connectionName = record.getConnectionName();
this.sharingProfileIdentifier = record.getSharingProfileIdentifier();
this.sharingProfileName = record.getSharingProfileName();
- this.startDate = record.getStartDate();
- this.endDate = record.getEndDate();
- this.remoteHost = record.getRemoteHost();
- this.username = record.getUsername();
- this.active = record.isActive();
}
/**
@@ -139,58 +108,4 @@ public class APIConnectionRecord {
return sharingProfileName;
}
- /**
- * Returns the date and time the connection began.
- *
- * @return
- * The date and time the connection began.
- */
- public Date getStartDate() {
- return startDate;
- }
-
- /**
- * Returns the date and time the connection ended, if applicable.
- *
- * @return
- * The date and time the connection ended, or null if the connection is
- * still running or if the end time is unknown.
- */
- public Date getEndDate() {
- return endDate;
- }
-
- /**
- * Returns the remote host from which this connection originated.
- *
- * @return
- * The remote host from which this connection originated.
- */
- public String getRemoteHost() {
- return remoteHost;
- }
-
- /**
- * Returns the name of the user who used or is using the connection at the
- * times given by this connection record.
- *
- * @return
- * The name of the user who used or is using the associated connection.
- */
- public String getUsername() {
- return username;
- }
-
- /**
- * Returns whether the connection associated with this record is still
- * active.
- *
- * @return
- * true if the connection associated with this record is still active,
- * false otherwise.
- */
- public boolean isActive() {
- return active;
- }
-
}
http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/29284725/guacamole/src/main/java/org/apache/guacamole/rest/history/APIConnectionRecordSortPredicate.java
----------------------------------------------------------------------
diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/history/APIConnectionRecordSortPredicate.java b/guacamole/src/main/java/org/apache/guacamole/rest/history/APIConnectionRecordSortPredicate.java
deleted file mode 100644
index d2281d0..0000000
--- a/guacamole/src/main/java/org/apache/guacamole/rest/history/APIConnectionRecordSortPredicate.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.guacamole.rest.history;
-
-import javax.ws.rs.core.Response;
-import org.apache.guacamole.GuacamoleClientException;
-import org.apache.guacamole.net.auth.ActivityRecordSet;
-import org.apache.guacamole.rest.APIException;
-
-/**
- * A sort predicate which species the property to use when sorting connection
- * records, along with the sort order.
- */
-public class APIConnectionRecordSortPredicate {
-
- /**
- * The prefix which will be included before the name of a sortable property
- * to indicate that the sort order is descending, not ascending.
- */
- public static final String DESCENDING_PREFIX = "-";
-
- /**
- * All possible property name strings and their corresponding
- * ActivityRecordSet.SortableProperty values.
- */
- public enum SortableProperty {
-
- /**
- * The date that the connection associated with the connection record
- * began (connected).
- */
- startDate(ActivityRecordSet.SortableProperty.START_DATE);
-
- /**
- * The ActivityRecordSet.SortableProperty that this property name
- * string represents.
- */
- public final ActivityRecordSet.SortableProperty recordProperty;
-
- /**
- * Creates a new SortableProperty which associates the property name
- * string (identical to its own name) with the given
- * ActivityRecordSet.SortableProperty value.
- *
- * @param recordProperty
- * The ActivityRecordSet.SortableProperty value to associate with
- * the new SortableProperty.
- */
- SortableProperty(ActivityRecordSet.SortableProperty recordProperty) {
- this.recordProperty = recordProperty;
- }
-
- }
-
- /**
- * The property to use when sorting ConnectionRecords.
- */
- private ActivityRecordSet.SortableProperty property;
-
- /**
- * Whether the requested sort order is descending (true) or ascending
- * (false).
- */
- private boolean descending;
-
- /**
- * Parses the given string value, determining the requested sort property
- * and ordering. Possible values consist of any valid property name, and
- * may include an optional prefix to denote descending sort order. Each
- * possible property name is enumerated by the SortableValue enum.
- *
- * @param value
- * The sort predicate string to parse, which must consist ONLY of a
- * valid property name, possibly preceded by the DESCENDING_PREFIX.
- *
- * @throws APIException
- * If the provided sort predicate string is invalid.
- */
- public APIConnectionRecordSortPredicate(String value)
- throws APIException {
-
- // Parse whether sort order is descending
- if (value.startsWith(DESCENDING_PREFIX)) {
- descending = true;
- value = value.substring(DESCENDING_PREFIX.length());
- }
-
- // Parse sorting property into ActivityRecordSet.SortableProperty
- try {
- this.property = SortableProperty.valueOf(value).recordProperty;
- }
-
- // Bail out if sort property is not valid
- catch (IllegalArgumentException e) {
- throw new APIException(
- Response.Status.BAD_REQUEST,
- new GuacamoleClientException(String.format("Invalid sort property: \"%s\"", value))
- );
- }
-
- }
-
- /**
- * Returns the SortableProperty defined by ActivityRecordSet which
- * represents the property requested.
- *
- * @return
- * The ActivityRecordSet.SortableProperty which refers to the same
- * property as the string originally provided when this
- * APIConnectionRecordSortPredicate was created.
- */
- public ActivityRecordSet.SortableProperty getProperty() {
- return property;
- }
-
- /**
- * Returns whether the requested sort order is descending.
- *
- * @return
- * true if the sort order is descending, false if the sort order is
- * ascending.
- */
- public boolean isDescending() {
- return descending;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/29284725/guacamole/src/main/java/org/apache/guacamole/rest/history/APISortPredicate.java
----------------------------------------------------------------------
diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/history/APISortPredicate.java b/guacamole/src/main/java/org/apache/guacamole/rest/history/APISortPredicate.java
new file mode 100644
index 0000000..c45ae9a
--- /dev/null
+++ b/guacamole/src/main/java/org/apache/guacamole/rest/history/APISortPredicate.java
@@ -0,0 +1,144 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.guacamole.rest.history;
+
+import javax.ws.rs.core.Response;
+import org.apache.guacamole.GuacamoleClientException;
+import org.apache.guacamole.net.auth.ActivityRecordSet;
+import org.apache.guacamole.rest.APIException;
+
+/**
+ * A sort predicate which species the property to use when sorting activity
+ * records, along with the sort order.
+ */
+public class APISortPredicate {
+
+ /**
+ * The prefix which will be included before the name of a sortable property
+ * to indicate that the sort order is descending, not ascending.
+ */
+ public static final String DESCENDING_PREFIX = "-";
+
+ /**
+ * All possible property name strings and their corresponding
+ * ActivityRecordSet.SortableProperty values.
+ */
+ public enum SortableProperty {
+
+ /**
+ * The date that the activity associated with the activity record
+ * began.
+ */
+ startDate(ActivityRecordSet.SortableProperty.START_DATE);
+
+ /**
+ * The ActivityRecordSet.SortableProperty that this property name
+ * string represents.
+ */
+ public final ActivityRecordSet.SortableProperty recordProperty;
+
+ /**
+ * Creates a new SortableProperty which associates the property name
+ * string (identical to its own name) with the given
+ * ActivityRecordSet.SortableProperty value.
+ *
+ * @param recordProperty
+ * The ActivityRecordSet.SortableProperty value to associate with
+ * the new SortableProperty.
+ */
+ SortableProperty(ActivityRecordSet.SortableProperty recordProperty) {
+ this.recordProperty = recordProperty;
+ }
+
+ }
+
+ /**
+ * The property to use when sorting ActivityRecords.
+ */
+ private ActivityRecordSet.SortableProperty property;
+
+ /**
+ * Whether the requested sort order is descending (true) or ascending
+ * (false).
+ */
+ private boolean descending;
+
+ /**
+ * Parses the given string value, determining the requested sort property
+ * and ordering. Possible values consist of any valid property name, and
+ * may include an optional prefix to denote descending sort order. Each
+ * possible property name is enumerated by the SortableValue enum.
+ *
+ * @param value
+ * The sort predicate string to parse, which must consist ONLY of a
+ * valid property name, possibly preceded by the DESCENDING_PREFIX.
+ *
+ * @throws APIException
+ * If the provided sort predicate string is invalid.
+ */
+ public APISortPredicate(String value)
+ throws APIException {
+
+ // Parse whether sort order is descending
+ if (value.startsWith(DESCENDING_PREFIX)) {
+ descending = true;
+ value = value.substring(DESCENDING_PREFIX.length());
+ }
+
+ // Parse sorting property into ActivityRecordSet.SortableProperty
+ try {
+ this.property = SortableProperty.valueOf(value).recordProperty;
+ }
+
+ // Bail out if sort property is not valid
+ catch (IllegalArgumentException e) {
+ throw new APIException(
+ Response.Status.BAD_REQUEST,
+ new GuacamoleClientException(String.format("Invalid sort property: \"%s\"", value))
+ );
+ }
+
+ }
+
+ /**
+ * Returns the SortableProperty defined by ActivityRecordSet which
+ * represents the property requested.
+ *
+ * @return
+ * The ActivityRecordSet.SortableProperty which refers to the same
+ * property as the string originally provided when this
+ * APISortPredicate was created.
+ */
+ public ActivityRecordSet.SortableProperty getProperty() {
+ return property;
+ }
+
+ /**
+ * Returns whether the requested sort order is descending.
+ *
+ * @return
+ * true if the sort order is descending, false if the sort order is
+ * ascending.
+ */
+ public boolean isDescending() {
+ return descending;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/29284725/guacamole/src/main/java/org/apache/guacamole/rest/history/HistoryResource.java
----------------------------------------------------------------------
diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/history/HistoryResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/history/HistoryResource.java
index 53a8cdb..559ebd5 100644
--- a/guacamole/src/main/java/org/apache/guacamole/rest/history/HistoryResource.java
+++ b/guacamole/src/main/java/org/apache/guacamole/rest/history/HistoryResource.java
@@ -28,6 +28,7 @@ import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import org.apache.guacamole.GuacamoleException;
+import org.apache.guacamole.net.auth.ActivityRecord;
import org.apache.guacamole.net.auth.ActivityRecordSet;
import org.apache.guacamole.net.auth.ConnectionRecord;
import org.apache.guacamole.net.auth.UserContext;
@@ -88,7 +89,7 @@ public class HistoryResource {
@Path("connections")
public List<APIConnectionRecord> getConnectionHistory(
@QueryParam("contains") List<String> requiredContents,
- @QueryParam("order") List<APIConnectionRecordSortPredicate> sortPredicates)
+ @QueryParam("order") List<APISortPredicate> sortPredicates)
throws GuacamoleException {
// Retrieve overall connection history
@@ -101,7 +102,7 @@ public class HistoryResource {
}
// Sort according to specified ordering
- for (APIConnectionRecordSortPredicate predicate : sortPredicates)
+ for (APISortPredicate predicate : sortPredicates)
history = history.sort(predicate.getProperty(), predicate.isDescending());
// Limit to maximum result size
@@ -117,4 +118,59 @@ public class HistoryResource {
}
+ /**
+ * Retrieves the login history for all users, restricted by optional filter
+ * parameters.
+ *
+ * @param requiredContents
+ * The set of strings that each must occur somewhere within the
+ * returned user records, whether within the associated username or any
+ * associated date. If non-empty, any user record not matching each of
+ * the strings within the collection will be excluded from the results.
+ *
+ * @param sortPredicates
+ * A list of predicates to apply while sorting the resulting user
+ * records, describing the properties involved and the sort order for
+ * those properties.
+ *
+ * @return
+ * A list of user records, describing the start and end times of user
+ * sessions.
+ *
+ * @throws GuacamoleException
+ * If an error occurs while retrieving the user history.
+ */
+ @GET
+ @Path("users")
+ public List<APIActivityRecord> getUserHistory(
+ @QueryParam("contains") List<String> requiredContents,
+ @QueryParam("order") List<APISortPredicate> sortPredicates)
+ throws GuacamoleException {
+
+ // Retrieve overall user history
+ ActivityRecordSet<ActivityRecord> history = userContext.getUserHistory();
+
+ // Restrict to records which contain the specified strings
+ for (String required : requiredContents) {
+ if (!required.isEmpty())
+ history = history.contains(required);
+ }
+
+ // Sort according to specified ordering
+ for (APISortPredicate predicate : sortPredicates)
+ history = history.sort(predicate.getProperty(), predicate.isDescending());
+
+ // Limit to maximum result size
+ history = history.limit(MAXIMUM_HISTORY_SIZE);
+
+ // Convert record set to collection of API user records
+ List<APIActivityRecord> apiRecords = new ArrayList<APIActivityRecord>();
+ for (ActivityRecord record : history.asCollection())
+ apiRecords.add(new APIActivityRecord(record));
+
+ // Return the converted history
+ return apiRecords;
+
+ }
+
}
[5/6] guacamole-client git commit: GUACAMOLE-394: Timestamps within
JSON from the REST API are in milliseconds, not seconds.
Posted by vn...@apache.org.
GUACAMOLE-394: Timestamps within JSON from the REST API are in milliseconds, not seconds.
Project: http://git-wip-us.apache.org/repos/asf/guacamole-client/repo
Commit: http://git-wip-us.apache.org/repos/asf/guacamole-client/commit/dba3f52d
Tree: http://git-wip-us.apache.org/repos/asf/guacamole-client/tree/dba3f52d
Diff: http://git-wip-us.apache.org/repos/asf/guacamole-client/diff/dba3f52d
Branch: refs/heads/staging/0.9.14
Commit: dba3f52d2e50fc7f1ca11a457172c52d0054217e
Parents: 138ea40
Author: Michael Jumper <mj...@apache.org>
Authored: Thu Jan 4 23:25:09 2018 -0800
Committer: Michael Jumper <mj...@apache.org>
Committed: Thu Jan 4 23:25:09 2018 -0800
----------------------------------------------------------------------
guacamole/src/main/webapp/app/rest/types/Connection.js | 2 +-
guacamole/src/main/webapp/app/rest/types/User.js | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/dba3f52d/guacamole/src/main/webapp/app/rest/types/Connection.js
----------------------------------------------------------------------
diff --git a/guacamole/src/main/webapp/app/rest/types/Connection.js b/guacamole/src/main/webapp/app/rest/types/Connection.js
index 52da6b7..76ece9d 100644
--- a/guacamole/src/main/webapp/app/rest/types/Connection.js
+++ b/guacamole/src/main/webapp/app/rest/types/Connection.js
@@ -105,7 +105,7 @@ angular.module('rest').factory('Connection', [function defineConnection() {
this.sharingProfiles = template.sharingProfiles;
/**
- * The time that this connection was last used, in seconds since
+ * The time that this connection was last used, in milliseconds since
* 1970-01-01 00:00:00 UTC. If this information is unknown or
* unavailable, this will be null.
*
http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/dba3f52d/guacamole/src/main/webapp/app/rest/types/User.js
----------------------------------------------------------------------
diff --git a/guacamole/src/main/webapp/app/rest/types/User.js b/guacamole/src/main/webapp/app/rest/types/User.js
index d0a96cc..f796147 100644
--- a/guacamole/src/main/webapp/app/rest/types/User.js
+++ b/guacamole/src/main/webapp/app/rest/types/User.js
@@ -54,7 +54,7 @@ angular.module('rest').factory('User', [function defineUser() {
this.password = template.password;
/**
- * The time that this user was last logged in, in seconds since
+ * The time that this user was last logged in, in milliseconds since
* 1970-01-01 00:00:00 UTC. If this information is unknown or
* unavailable, this will be null.
*
[4/6] guacamole-client git commit: GUACAMOLE-394: Add history
endpoint at user level (analogous to Connection).
Posted by vn...@apache.org.
GUACAMOLE-394: Add history endpoint at user level (analogous to Connection).
Project: http://git-wip-us.apache.org/repos/asf/guacamole-client/repo
Commit: http://git-wip-us.apache.org/repos/asf/guacamole-client/commit/b8ce9c96
Tree: http://git-wip-us.apache.org/repos/asf/guacamole-client/tree/b8ce9c96
Diff: http://git-wip-us.apache.org/repos/asf/guacamole-client/diff/b8ce9c96
Branch: refs/heads/staging/0.9.14
Commit: b8ce9c96e712c7751eb7b2dc606c3f39c3945133
Parents: 2928472
Author: Michael Jumper <mj...@apache.org>
Authored: Mon Sep 11 18:39:32 2017 -0700
Committer: Michael Jumper <mj...@apache.org>
Committed: Mon Dec 11 20:44:28 2017 -0800
----------------------------------------------------------------------
.../guacamole/rest/user/UserResource.java | 30 ++++++++++++++++++++
1 file changed, 30 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/b8ce9c96/guacamole/src/main/java/org/apache/guacamole/rest/user/UserResource.java
----------------------------------------------------------------------
diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/user/UserResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/user/UserResource.java
index 3f142ff..75a49db 100644
--- a/guacamole/src/main/java/org/apache/guacamole/rest/user/UserResource.java
+++ b/guacamole/src/main/java/org/apache/guacamole/rest/user/UserResource.java
@@ -21,8 +21,11 @@ package org.apache.guacamole.rest.user;
import com.google.inject.assistedinject.Assisted;
import com.google.inject.assistedinject.AssistedInject;
+import java.util.ArrayList;
+import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
@@ -30,6 +33,7 @@ import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import org.apache.guacamole.GuacamoleException;
import org.apache.guacamole.GuacamoleSecurityException;
+import org.apache.guacamole.net.auth.ActivityRecord;
import org.apache.guacamole.net.auth.AuthenticationProvider;
import org.apache.guacamole.net.auth.Credentials;
import org.apache.guacamole.net.auth.User;
@@ -38,6 +42,7 @@ import org.apache.guacamole.net.auth.UserContext;
import org.apache.guacamole.net.auth.credentials.GuacamoleCredentialsException;
import org.apache.guacamole.rest.directory.DirectoryObjectResource;
import org.apache.guacamole.rest.directory.DirectoryObjectTranslator;
+import org.apache.guacamole.rest.history.APIActivityRecord;
import org.apache.guacamole.rest.permission.PermissionSetResource;
/**
@@ -93,6 +98,31 @@ public class UserResource
this.user = user;
}
+ /**
+ * Retrieves the login (session) history of a single user.
+ *
+ * @return
+ * A list of activity records, describing the start and end times of
+ * this user's sessions.
+ *
+ * @throws GuacamoleException
+ * If an error occurs while retrieving the user history.
+ */
+ @GET
+ @Path("history")
+ public List<APIActivityRecord> getUserHistory()
+ throws GuacamoleException {
+
+ // Retrieve the requested user's history
+ List<APIActivityRecord> apiRecords = new ArrayList<APIActivityRecord>();
+ for (ActivityRecord record : user.getHistory())
+ apiRecords.add(new APIActivityRecord(record));
+
+ // Return the converted history
+ return apiRecords;
+
+ }
+
@Override
public void updateObject(APIUser modifiedObject) throws GuacamoleException {
[3/6] guacamole-client git commit: GUACAMOLE-394: Expose "last
active" time for connections and users via REST API.
Posted by vn...@apache.org.
GUACAMOLE-394: Expose "last active" time for connections and users via REST API.
Project: http://git-wip-us.apache.org/repos/asf/guacamole-client/repo
Commit: http://git-wip-us.apache.org/repos/asf/guacamole-client/commit/67fc77a1
Tree: http://git-wip-us.apache.org/repos/asf/guacamole-client/tree/67fc77a1
Diff: http://git-wip-us.apache.org/repos/asf/guacamole-client/diff/67fc77a1
Branch: refs/heads/staging/0.9.14
Commit: 67fc77a1c7a2efb64e74d400fec8d2013c41ab56
Parents: b8ce9c9
Author: Michael Jumper <mj...@apache.org>
Authored: Mon Sep 11 19:03:27 2017 -0700
Committer: Michael Jumper <mj...@apache.org>
Committed: Mon Dec 11 20:44:28 2017 -0800
----------------------------------------------------------------------
.../rest/connection/APIConnection.java | 33 +++++++++++++++++++-
.../org/apache/guacamole/rest/user/APIUser.java | 31 ++++++++++++++++++
.../main/webapp/app/rest/types/Connection.js | 9 ++++++
.../src/main/webapp/app/rest/types/User.js | 9 ++++++
4 files changed, 81 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/67fc77a1/guacamole/src/main/java/org/apache/guacamole/rest/connection/APIConnection.java
----------------------------------------------------------------------
diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/connection/APIConnection.java b/guacamole/src/main/java/org/apache/guacamole/rest/connection/APIConnection.java
index 8e6a385..e402e67 100644
--- a/guacamole/src/main/java/org/apache/guacamole/rest/connection/APIConnection.java
+++ b/guacamole/src/main/java/org/apache/guacamole/rest/connection/APIConnection.java
@@ -20,6 +20,7 @@
package org.apache.guacamole.rest.connection;
import java.util.Collection;
+import java.util.Date;
import java.util.Map;
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import org.codehaus.jackson.map.annotate.JsonSerialize;
@@ -75,7 +76,13 @@ public class APIConnection {
* The count of currently active connections using this connection.
*/
private int activeConnections;
-
+
+ /**
+ * The date and time that this connection was last used, or null if this
+ * connection has never been used or this information is unavailable.
+ */
+ private Date lastActive;
+
/**
* Create an empty APIConnection.
*/
@@ -97,6 +104,7 @@ public class APIConnection {
this.identifier = connection.getIdentifier();
this.parentIdentifier = connection.getParentIdentifier();
this.activeConnections = connection.getActiveConnections();
+ this.lastActive = connection.getLastActive();
// Set protocol from configuration
GuacamoleConfiguration configuration = connection.getConfiguration();
@@ -257,4 +265,27 @@ public class APIConnection {
this.sharingProfiles = sharingProfiles;
}
+ /**
+ * Returns the date and time that this connection was last used, or null if
+ * this connection has never been used or this information is unavailable.
+ *
+ * @return
+ * The date and time that this connection was last used, or null if this
+ * connection has never been used or this information is unavailable.
+ */
+ public Date getLastActive() {
+ return lastActive;
+ }
+
+ /**
+ * Sets the date and time that this connection was last used.
+ *
+ * @param lastActive
+ * The date and time that this connection was last used, or null if this
+ * connection has never been used or this information is unavailable.
+ */
+ public void setLastActive(Date lastActive) {
+ this.lastActive = lastActive;
+ }
+
}
http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/67fc77a1/guacamole/src/main/java/org/apache/guacamole/rest/user/APIUser.java
----------------------------------------------------------------------
diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/user/APIUser.java b/guacamole/src/main/java/org/apache/guacamole/rest/user/APIUser.java
index 96e2230..e71b5d2 100644
--- a/guacamole/src/main/java/org/apache/guacamole/rest/user/APIUser.java
+++ b/guacamole/src/main/java/org/apache/guacamole/rest/user/APIUser.java
@@ -19,6 +19,7 @@
package org.apache.guacamole.rest.user;
+import java.util.Date;
import java.util.Map;
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import org.codehaus.jackson.map.annotate.JsonSerialize;
@@ -47,6 +48,12 @@ public class APIUser {
private Map<String, String> attributes;
/**
+ * The date and time that this user was last logged in, or null if this user
+ * has never logged in or this information is unavailable.
+ */
+ private Date lastActive;
+
+ /**
* Construct a new empty APIUser.
*/
public APIUser() {}
@@ -60,6 +67,7 @@ public class APIUser {
// Set user information
this.username = user.getIdentifier();
this.password = user.getPassword();
+ this.lastActive = user.getLastActive();
// Associate any attributes
this.attributes = user.getAttributes();
@@ -122,4 +130,27 @@ public class APIUser {
this.attributes = attributes;
}
+ /**
+ * Returns the date and time that this user was last logged in, or null if
+ * this user has never logged in or this information is unavailable.
+ *
+ * @return
+ * The date and time that this user was last logged in, or null if this
+ * user has never logged in or this information is unavailable.
+ */
+ public Date getLastActive() {
+ return lastActive;
+ }
+
+ /**
+ * Sets the date and time that this user was last logged in.
+ *
+ * @param lastActive
+ * The date and time that this user was last logged in, or null if this
+ * user has never logged in or this information is unavailable.
+ */
+ public void setLastActive(Date lastActive) {
+ this.lastActive = lastActive;
+ }
+
}
http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/67fc77a1/guacamole/src/main/webapp/app/rest/types/Connection.js
----------------------------------------------------------------------
diff --git a/guacamole/src/main/webapp/app/rest/types/Connection.js b/guacamole/src/main/webapp/app/rest/types/Connection.js
index b4639b2..52da6b7 100644
--- a/guacamole/src/main/webapp/app/rest/types/Connection.js
+++ b/guacamole/src/main/webapp/app/rest/types/Connection.js
@@ -104,6 +104,15 @@ angular.module('rest').factory('Connection', [function defineConnection() {
*/
this.sharingProfiles = template.sharingProfiles;
+ /**
+ * The time that this connection was last used, in seconds since
+ * 1970-01-01 00:00:00 UTC. If this information is unknown or
+ * unavailable, this will be null.
+ *
+ * @type Number
+ */
+ this.lastActive = template.lastActive;
+
};
return Connection;
http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/67fc77a1/guacamole/src/main/webapp/app/rest/types/User.js
----------------------------------------------------------------------
diff --git a/guacamole/src/main/webapp/app/rest/types/User.js b/guacamole/src/main/webapp/app/rest/types/User.js
index 9edd1f2..d0a96cc 100644
--- a/guacamole/src/main/webapp/app/rest/types/User.js
+++ b/guacamole/src/main/webapp/app/rest/types/User.js
@@ -54,6 +54,15 @@ angular.module('rest').factory('User', [function defineUser() {
this.password = template.password;
/**
+ * The time that this user was last logged in, in seconds since
+ * 1970-01-01 00:00:00 UTC. If this information is unknown or
+ * unavailable, this will be null.
+ *
+ * @type Number
+ */
+ this.lastActive = template.lastActive;
+
+ /**
* Arbitrary name/value pairs which further describe this user. The
* semantics and validity of these attributes are dictated by the
* extension which defines them.
[6/6] guacamole-client git commit: GUACAMOLE-394: Merge add interface
for browsing user access history.
Posted by vn...@apache.org.
GUACAMOLE-394: Merge add interface for browsing user access history.
Project: http://git-wip-us.apache.org/repos/asf/guacamole-client/repo
Commit: http://git-wip-us.apache.org/repos/asf/guacamole-client/commit/ed6722ba
Tree: http://git-wip-us.apache.org/repos/asf/guacamole-client/tree/ed6722ba
Diff: http://git-wip-us.apache.org/repos/asf/guacamole-client/diff/ed6722ba
Branch: refs/heads/staging/0.9.14
Commit: ed6722ba590262f686e5c89ec51aa19071ece815
Parents: 8c2a76b dba3f52
Author: Nick Couchman <vn...@apache.org>
Authored: Fri Jan 5 10:33:56 2018 -0500
Committer: Nick Couchman <vn...@apache.org>
Committed: Fri Jan 5 10:33:56 2018 -0500
----------------------------------------------------------------------
.../rest/connection/APIConnection.java | 33 ++++-
.../rest/history/APIActivityRecord.java | 131 +++++++++++++++++
.../rest/history/APIConnectionRecord.java | 89 +-----------
.../APIConnectionRecordSortPredicate.java | 144 -------------------
.../rest/history/APISortPredicate.java | 144 +++++++++++++++++++
.../guacamole/rest/history/HistoryResource.java | 60 +++++++-
.../org/apache/guacamole/rest/user/APIUser.java | 31 ++++
.../guacamole/rest/user/UserResource.java | 30 ++++
.../main/webapp/app/rest/types/Connection.js | 9 ++
.../src/main/webapp/app/rest/types/User.js | 9 ++
.../settings/directives/guacSettingsUsers.js | 33 ++++-
.../webapp/app/settings/styles/user-list.css | 42 ++++++
.../app/settings/templates/settingsUsers.html | 35 +++--
guacamole/src/main/webapp/translations/de.json | 6 +-
guacamole/src/main/webapp/translations/en.json | 7 +-
guacamole/src/main/webapp/translations/fr.json | 6 +-
guacamole/src/main/webapp/translations/it.json | 6 +-
guacamole/src/main/webapp/translations/nl.json | 6 +-
guacamole/src/main/webapp/translations/no.json | 6 +-
guacamole/src/main/webapp/translations/ru.json | 6 +-
20 files changed, 580 insertions(+), 253 deletions(-)
----------------------------------------------------------------------