From cd5d23866db316e5835cd7fcd5fcc3a9c9a3a67e Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Tue, 5 Sep 2017 13:45:45 -0700 Subject: [PATCH 1/6] GUACAMOLE-394: Separate definition of records and record sets into generalized interface. --- .../guacamole/net/auth/ActivityRecord.java | 78 +++++++++++ .../guacamole/net/auth/ActivityRecordSet.java | 128 ++++++++++++++++++ .../guacamole/net/auth/ConnectionRecord.java | 48 +------ .../net/auth/ConnectionRecordSet.java | 32 +---- 4 files changed, 211 insertions(+), 75 deletions(-) create mode 100644 guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ActivityRecord.java create mode 100644 guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ActivityRecordSet.java diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ActivityRecord.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ActivityRecord.java new file mode 100644 index 000000000..2324b0ee4 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ActivityRecord.java @@ -0,0 +1,78 @@ +/* + * 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.net.auth; + +import java.util.Date; + +/** + * A logging record describing when a user started and ended a particular + * activity. + */ +public interface ActivityRecord { + + /** + * Returns the date and time the activity began. + * + * @return + * The date and time the activity began. + */ + public Date getStartDate(); + + /** + * 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 ongoing or if the end time is unknown. + */ + public Date getEndDate(); + + /** + * Returns the hostname or IP address of the remote host that performed the + * activity associated with this record, if known. If the hostname or IP + * address is not known, null is returned. + * + * @return + * The hostname or IP address of the remote host, or null if this + * information is not available. + */ + public String getRemoteHost(); + + /** + * Returns the name of the user who performed or is performing the activity + * at the times given by this record. + * + * @return + * The name of the user who performed or is performing the associated + * activity. + */ + public String getUsername(); + + /** + * Returns whether the activity associated with this record is still + * ongoing. + * + * @return + * true if the activity associated with this record is still ongoing, + * false otherwise. + */ + public boolean isActive(); + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ActivityRecordSet.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ActivityRecordSet.java new file mode 100644 index 000000000..4cce03e65 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ActivityRecordSet.java @@ -0,0 +1,128 @@ +/* + * 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.net.auth; + +import java.util.Collection; +import org.apache.guacamole.GuacamoleException; + +/** + * A set of all available records related to a type of activity which has a + * defined start and end time, such as a user being logged in or connected, or a + * subset of those records. + * + * @param + * The type of ActivityRecord contained within this set. + */ +public interface ActivityRecordSet { + + /** + * All properties of activity records which can be used as sorting + * criteria. + */ + enum SortableProperty { + + /** + * The date and time when the activity associated with the record + * began. + */ + START_DATE + + }; + + /** + * Returns all records within this set as a standard Collection. + * + * @return + * A collection containing all records within this set. + * + * @throws GuacamoleException + * If an error occurs while retrieving the records within this set. + */ + Collection asCollection() throws GuacamoleException; + + /** + * Returns the subset of records which contain the given value. The + * properties and semantics involved with determining whether a particular + * record "contains" the given value is implementation dependent. This + * function may affect the contents of the current ActivityRecordSet. The + * contents of the current ActivityRecordSet should NOT be relied upon + * after this function is called. + * + * @param value + * The value which all records within the resulting subset should + * contain. + * + * @return + * The subset of records which contain the specified value. + * + * @throws GuacamoleException + * If an error occurs while restricting the current subset. + */ + ActivityRecordSet contains(String value) + throws GuacamoleException; + + /** + * Returns the subset of records containing only the first + * limit records. If the subset has fewer than + * limit records, then this function has no effect. This + * function may also affect the contents of the current ActivityRecordSet. + * The contents of the current ActivityRecordSet should NOT be relied upon + * after this function is called. + * + * @param limit + * The maximum number of records that the new subset should contain. + * + * @return + * The subset of records that containing only the first + * limit records. + * + * @throws GuacamoleException + * If an error occurs while limiting the current subset. + */ + ActivityRecordSet limit(int limit) throws GuacamoleException; + + /** + * Returns a ActivityRecordSet containing identically the records within + * this set, sorted according to the specified criteria. The sort operation + * performed is guaranteed to be stable with respect to any past call to + * sort(). This function may also affect the contents of the current + * ActivityRecordSet. The contents of the current ActivityRecordSet + * should NOT be relied upon after this function is called. + * + * @param property + * The property by which the records within the resulting set should be + * sorted. + * + * @param desc + * Whether the records should be sorted according to the specified + * property in descending order. If false, records will be sorted + * according to the specified property in ascending order. + * + * @return + * The ActivityRecordSet, sorted according to the specified criteria. + * + * @throws GuacamoleException + * If an error occurs while sorting the current subset, or if the given + * property is not supported by the implementation. + */ + ActivityRecordSet sort(SortableProperty property, boolean desc) + throws GuacamoleException; + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ConnectionRecord.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ConnectionRecord.java index 95c5f6ca1..21e30a98e 100644 --- a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ConnectionRecord.java +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ConnectionRecord.java @@ -19,13 +19,11 @@ package org.apache.guacamole.net.auth; -import java.util.Date; - /** * A logging record describing when a user started and ended usage of a * particular connection. */ -public interface ConnectionRecord { +public interface ConnectionRecord extends ActivityRecord { /** * Returns the identifier of the connection associated with this @@ -72,48 +70,4 @@ public interface ConnectionRecord { */ public String getSharingProfileName(); - /** - * Returns the date and time the connection began. - * - * @return The date and time the connection began. - */ - public Date getStartDate(); - - /** - * 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(); - - /** - * Returns the hostname or IP address of the remote host that used the - * connection associated with this record, if known. If the hostname or IP - * address is not known, null is returned. - * - * @return - * The hostname or IP address of the remote host, or null if this - * information is not available. - */ - public String getRemoteHost(); - - /** - * 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(); - - /** - * 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(); - } diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ConnectionRecordSet.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ConnectionRecordSet.java index 5198cfa80..87f91bb57 100644 --- a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ConnectionRecordSet.java +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ConnectionRecordSet.java @@ -19,39 +19,12 @@ package org.apache.guacamole.net.auth; -import java.util.Collection; import org.apache.guacamole.GuacamoleException; /** * The set of all available connection records, or a subset of those records. */ -public interface ConnectionRecordSet { - - /** - * All properties of connection records which can be used as sorting - * criteria. - */ - enum SortableProperty { - - /** - * The date and time when the connection associated with the - * connection record began. - */ - START_DATE - - }; - - /** - * Returns all connection records within this set as a standard Collection. - * - * @return - * A collection containing all connection records within this set. - * - * @throws GuacamoleException - * If an error occurs while retrieving the connection records within - * this set. - */ - Collection asCollection() throws GuacamoleException; +public interface ConnectionRecordSet extends ActivityRecordSet { /** * Returns the subset of connection records to only those where the @@ -73,6 +46,7 @@ public interface ConnectionRecordSet { * @throws GuacamoleException * If an error occurs while restricting the current subset. */ + @Override ConnectionRecordSet contains(String value) throws GuacamoleException; /** @@ -93,6 +67,7 @@ public interface ConnectionRecordSet { * @throws GuacamoleException * If an error occurs while limiting the current subset. */ + @Override ConnectionRecordSet limit(int limit) throws GuacamoleException; /** @@ -119,6 +94,7 @@ public interface ConnectionRecordSet { * @throws GuacamoleException * If an error occurs while sorting the current subset. */ + @Override ConnectionRecordSet sort(SortableProperty property, boolean desc) throws GuacamoleException; From 26122ebc3eb07934264618c319f93738a230a973 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Sat, 9 Sep 2017 13:20:43 -0700 Subject: [PATCH 2/6] GUACAMOLE-394: Deprecate ConnectionRecordSet. Refactor accordingly. --- .../jdbc/connection/ConnectionRecordSet.java | 10 ++- .../ConnectionRecordSortPredicate.java | 8 +- .../jdbc/sharing/user/SharedUserContext.java | 9 +- .../connection/ConnectionRecordMapper.xml | 4 +- .../connection/ConnectionRecordMapper.xml | 4 +- .../guacamole/auth/ldap/user/UserContext.java | 9 +- .../net/auth/ConnectionRecordSet.java | 82 ++----------------- .../guacamole/net/auth/UserContext.java | 5 +- .../auth/simple/SimpleActivityRecordSet.java | 62 ++++++++++++++ .../simple/SimpleConnectionRecordSet.java | 14 ++-- .../net/auth/simple/SimpleUserContext.java | 7 +- .../APIConnectionRecordSortPredicate.java | 26 +++--- .../rest/history/HistoryResource.java | 4 +- 13 files changed, 123 insertions(+), 121 deletions(-) create mode 100644 guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleActivityRecordSet.java diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordSet.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordSet.java index f89a45028..7b3d629c4 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordSet.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordSet.java @@ -27,15 +27,17 @@ import java.util.List; import java.util.Set; import org.apache.guacamole.GuacamoleException; import org.apache.guacamole.auth.jdbc.base.RestrictedObject; +import org.apache.guacamole.net.auth.ActivityRecordSet; +import org.apache.guacamole.net.auth.ActivityRecordSet.SortableProperty; import org.apache.guacamole.net.auth.ConnectionRecord; /** - * A JDBC implementation of ConnectionRecordSet. Calls to asCollection() will - * query connection history records from the database. Which records are - * returned will be determined by the values passed in earlier. + * A JDBC implementation of ActivityRecordSet for ConnectionRecords. Calls to + * asCollection() will query connection history records from the database. Which + * records are returned will be determined by the values passed in earlier. */ public class ConnectionRecordSet extends RestrictedObject - implements org.apache.guacamole.net.auth.ConnectionRecordSet { + implements ActivityRecordSet { /** * Service for managing connection objects. diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordSortPredicate.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordSortPredicate.java index 17f43806d..69eee780b 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordSortPredicate.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordSortPredicate.java @@ -19,7 +19,7 @@ package org.apache.guacamole.auth.jdbc.connection; -import org.apache.guacamole.net.auth.ConnectionRecordSet; +import org.apache.guacamole.net.auth.ActivityRecordSet; /** * A sort predicate which species the property to use when sorting connection @@ -30,7 +30,7 @@ public class ConnectionRecordSortPredicate { /** * The property to use when sorting ConnectionRecords. */ - private final ConnectionRecordSet.SortableProperty property; + private final ActivityRecordSet.SortableProperty property; /** * Whether the sort order is descending (true) or ascending (false). @@ -47,7 +47,7 @@ public class ConnectionRecordSortPredicate { * @param descending * Whether the sort order is descending (true) or ascending (false). */ - public ConnectionRecordSortPredicate(ConnectionRecordSet.SortableProperty property, + public ConnectionRecordSortPredicate(ActivityRecordSet.SortableProperty property, boolean descending) { this.property = property; this.descending = descending; @@ -59,7 +59,7 @@ public class ConnectionRecordSortPredicate { * @return * The property that should be used when sorting ConnectionRecords. */ - public ConnectionRecordSet.SortableProperty getProperty() { + public ActivityRecordSet.SortableProperty getProperty() { return property; } diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUserContext.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUserContext.java index 2092898ae..cdfe0fca6 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUserContext.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUserContext.java @@ -28,16 +28,17 @@ import org.apache.guacamole.auth.jdbc.sharing.connectiongroup.SharedRootConnecti import org.apache.guacamole.auth.jdbc.user.RemoteAuthenticatedUser; import org.apache.guacamole.form.Form; import org.apache.guacamole.net.auth.ActiveConnection; +import org.apache.guacamole.net.auth.ActivityRecordSet; import org.apache.guacamole.net.auth.AuthenticationProvider; import org.apache.guacamole.net.auth.Connection; import org.apache.guacamole.net.auth.ConnectionGroup; -import org.apache.guacamole.net.auth.ConnectionRecordSet; +import org.apache.guacamole.net.auth.ConnectionRecord; import org.apache.guacamole.net.auth.Directory; import org.apache.guacamole.net.auth.SharingProfile; import org.apache.guacamole.net.auth.User; import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.auth.simple.SimpleActivityRecordSet; import org.apache.guacamole.net.auth.simple.SimpleConnectionGroupDirectory; -import org.apache.guacamole.net.auth.simple.SimpleConnectionRecordSet; import org.apache.guacamole.net.auth.simple.SimpleDirectory; /** @@ -175,8 +176,8 @@ public class SharedUserContext implements UserContext { } @Override - public ConnectionRecordSet getConnectionHistory() { - return new SimpleConnectionRecordSet(); + public ActivityRecordSet getConnectionHistory() { + return new SimpleActivityRecordSet(); } @Override diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordMapper.xml index c2c12c138..287ca02fa 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordMapper.xml +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordMapper.xml @@ -129,7 +129,7 @@ - + - + - + - + getConnectionHistory() throws GuacamoleException { - return new SimpleConnectionRecordSet(); + return new SimpleActivityRecordSet(); } @Override diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ConnectionRecordSet.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ConnectionRecordSet.java index 87f91bb57..62c84ec44 100644 --- a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ConnectionRecordSet.java +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ConnectionRecordSet.java @@ -19,83 +19,13 @@ package org.apache.guacamole.net.auth; -import org.apache.guacamole.GuacamoleException; - /** * The set of all available connection records, or a subset of those records. + * + * @deprecated + * Use {@link ActivityRecordSet}<{@link ConnectionRecord}> instead. */ -public interface ConnectionRecordSet extends ActivityRecordSet { - - /** - * Returns the subset of connection records to only those where the - * connection name, user identifier, or any associated date field contain - * the given value. This function may also affect the contents of the - * current ConnectionRecordSet. The contents of the current - * ConnectionRecordSet should NOT be relied upon after this function is - * called. - * - * @param value - * The value which all connection records within the resulting subset - * should contain within their associated connection name or user - * identifier. - * - * @return - * The subset of connection history records which contain the specified - * value within their associated connection name or user identifier. - * - * @throws GuacamoleException - * If an error occurs while restricting the current subset. - */ - @Override - ConnectionRecordSet contains(String value) throws GuacamoleException; - - /** - * Returns the subset of connection history records containing only the - * first limit records. If the subset has fewer than - * limit records, then this function has no effect. This - * function may also affect the contents of the current - * ConnectionRecordSet. The contents of the current ConnectionRecordSet - * should NOT be relied upon after this function is called. - * - * @param limit - * The maximum number of records that the new subset should contain. - * - * @return - * The subset of connection history records that containing only the - * first limit records. - * - * @throws GuacamoleException - * If an error occurs while limiting the current subset. - */ - @Override - ConnectionRecordSet limit(int limit) throws GuacamoleException; - - /** - * Returns a ConnectionRecordSet containing identically the records within - * this set, sorted according to the specified criteria. The sort operation - * performed is guaranteed to be stable with respect to any past call to - * sort(). This function may also affect the contents of the current - * ConnectionRecordSet. The contents of the current ConnectionRecordSet - * should NOT be relied upon after this function is called. - * - * @param property - * The property by which the connection records within the resulting - * set should be sorted. - * - * @param desc - * Whether the records should be sorted according to the specified - * property in descending order. If false, records will be sorted - * according to the specified property in ascending order. - * - * @return - * The ConnnectionRecordSet, sorted according to the specified - * criteria. - * - * @throws GuacamoleException - * If an error occurs while sorting the current subset. - */ - @Override - ConnectionRecordSet sort(SortableProperty property, boolean desc) - throws GuacamoleException; - +@Deprecated +public interface ConnectionRecordSet + extends ActivityRecordSet { } diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/UserContext.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/UserContext.java index 596c5d94f..92f360459 100644 --- a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/UserContext.java +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/UserContext.java @@ -145,7 +145,7 @@ public interface UserContext { /** * Retrieves all connection records visible to current user. The resulting * set of connection records can be further filtered and ordered using the - * methods defined on ConnectionRecordSet. + * methods defined on ActivityRecordSet. * * @return * A set of all connection records visible to the current user. @@ -153,7 +153,8 @@ public interface UserContext { * @throws GuacamoleException * If an error occurs while retrieving the connection records. */ - ConnectionRecordSet getConnectionHistory() throws GuacamoleException; + ActivityRecordSet getConnectionHistory() + throws GuacamoleException; /** * Retrieves a connection group which can be used to view and manipulate diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleActivityRecordSet.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleActivityRecordSet.java new file mode 100644 index 000000000..a9a3c3eed --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleActivityRecordSet.java @@ -0,0 +1,62 @@ +/* + * 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.net.auth.simple; + +import java.util.Collection; +import java.util.Collections; +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.ActivityRecordSet.SortableProperty; + +/** + * An immutable and empty ActivityRecordSet. + * + * @param + * The type of ActivityRecord contained within this set. + */ +public class SimpleActivityRecordSet + implements ActivityRecordSet { + + @Override + public Collection asCollection() + throws GuacamoleException { + return Collections.emptyList(); + } + + @Override + public ActivityRecordSet contains(String value) + throws GuacamoleException { + return this; + } + + @Override + public ActivityRecordSet limit(int limit) + throws GuacamoleException { + return this; + } + + @Override + public ActivityRecordSet sort(SortableProperty property, + boolean desc) throws GuacamoleException { + return this; + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleConnectionRecordSet.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleConnectionRecordSet.java index f18b3d6eb..41971c9ae 100644 --- a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleConnectionRecordSet.java +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleConnectionRecordSet.java @@ -23,12 +23,16 @@ import java.util.Collection; import java.util.Collections; import org.apache.guacamole.GuacamoleException; import org.apache.guacamole.net.auth.ConnectionRecord; -import org.apache.guacamole.net.auth.ConnectionRecordSet; /** * An immutable and empty ConnectionRecordSet. + * + * @deprecated + * Use {@link SimpleActivityRecordSet}<{@link ConnectionRecord}> + * instead. */ -public class SimpleConnectionRecordSet implements ConnectionRecordSet { +@Deprecated +public class SimpleConnectionRecordSet implements org.apache.guacamole.net.auth.ConnectionRecordSet { @Override public Collection asCollection() @@ -37,19 +41,19 @@ public class SimpleConnectionRecordSet implements ConnectionRecordSet { } @Override - public ConnectionRecordSet contains(String value) + public org.apache.guacamole.net.auth.ConnectionRecordSet contains(String value) throws GuacamoleException { return this; } @Override - public ConnectionRecordSet limit(int limit) + public org.apache.guacamole.net.auth.ConnectionRecordSet limit(int limit) throws GuacamoleException { return this; } @Override - public ConnectionRecordSet sort(SortableProperty property, boolean desc) + public org.apache.guacamole.net.auth.ConnectionRecordSet sort(SortableProperty property, boolean desc) throws GuacamoleException { return this; } diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUserContext.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUserContext.java index d87cf950b..97584ed28 100644 --- a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUserContext.java +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUserContext.java @@ -27,10 +27,11 @@ import java.util.UUID; import org.apache.guacamole.GuacamoleException; import org.apache.guacamole.form.Form; import org.apache.guacamole.net.auth.ActiveConnection; +import org.apache.guacamole.net.auth.ActivityRecordSet; import org.apache.guacamole.net.auth.AuthenticationProvider; import org.apache.guacamole.net.auth.Connection; import org.apache.guacamole.net.auth.ConnectionGroup; -import org.apache.guacamole.net.auth.ConnectionRecordSet; +import org.apache.guacamole.net.auth.ConnectionRecord; import org.apache.guacamole.net.auth.Directory; import org.apache.guacamole.net.auth.SharingProfile; import org.apache.guacamole.net.auth.User; @@ -209,9 +210,9 @@ public class SimpleUserContext implements UserContext { } @Override - public ConnectionRecordSet getConnectionHistory() + public ActivityRecordSet getConnectionHistory() throws GuacamoleException { - return new SimpleConnectionRecordSet(); + return new SimpleActivityRecordSet(); } @Override 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 index 2a4c81878..d2281d037 100644 --- a/guacamole/src/main/java/org/apache/guacamole/rest/history/APIConnectionRecordSortPredicate.java +++ b/guacamole/src/main/java/org/apache/guacamole/rest/history/APIConnectionRecordSortPredicate.java @@ -21,7 +21,7 @@ package org.apache.guacamole.rest.history; import javax.ws.rs.core.Response; import org.apache.guacamole.GuacamoleClientException; -import org.apache.guacamole.net.auth.ConnectionRecordSet; +import org.apache.guacamole.net.auth.ActivityRecordSet; import org.apache.guacamole.rest.APIException; /** @@ -38,7 +38,7 @@ public class APIConnectionRecordSortPredicate { /** * All possible property name strings and their corresponding - * ConnectionRecordSet.SortableProperty values. + * ActivityRecordSet.SortableProperty values. */ public enum SortableProperty { @@ -46,24 +46,24 @@ public class APIConnectionRecordSortPredicate { * The date that the connection associated with the connection record * began (connected). */ - startDate(ConnectionRecordSet.SortableProperty.START_DATE); + startDate(ActivityRecordSet.SortableProperty.START_DATE); /** - * The ConnectionRecordSet.SortableProperty that this property name + * The ActivityRecordSet.SortableProperty that this property name * string represents. */ - public final ConnectionRecordSet.SortableProperty recordProperty; + public final ActivityRecordSet.SortableProperty recordProperty; /** * Creates a new SortableProperty which associates the property name * string (identical to its own name) with the given - * ConnectionRecordSet.SortableProperty value. + * ActivityRecordSet.SortableProperty value. * * @param recordProperty - * The ConnectionRecordSet.SortableProperty value to associate with + * The ActivityRecordSet.SortableProperty value to associate with * the new SortableProperty. */ - SortableProperty(ConnectionRecordSet.SortableProperty recordProperty) { + SortableProperty(ActivityRecordSet.SortableProperty recordProperty) { this.recordProperty = recordProperty; } @@ -72,7 +72,7 @@ public class APIConnectionRecordSortPredicate { /** * The property to use when sorting ConnectionRecords. */ - private ConnectionRecordSet.SortableProperty property; + private ActivityRecordSet.SortableProperty property; /** * Whether the requested sort order is descending (true) or ascending @@ -102,7 +102,7 @@ public class APIConnectionRecordSortPredicate { value = value.substring(DESCENDING_PREFIX.length()); } - // Parse sorting property into ConnectionRecordSet.SortableProperty + // Parse sorting property into ActivityRecordSet.SortableProperty try { this.property = SortableProperty.valueOf(value).recordProperty; } @@ -118,15 +118,15 @@ public class APIConnectionRecordSortPredicate { } /** - * Returns the SortableProperty defined by ConnectionRecordSet which + * Returns the SortableProperty defined by ActivityRecordSet which * represents the property requested. * * @return - * The ConnectionRecordSet.SortableProperty which refers to the same + * The ActivityRecordSet.SortableProperty which refers to the same * property as the string originally provided when this * APIConnectionRecordSortPredicate was created. */ - public ConnectionRecordSet.SortableProperty getProperty() { + public ActivityRecordSet.SortableProperty getProperty() { return property; } 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 49695c4d3..53a8cdba8 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,8 +28,8 @@ 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.ActivityRecordSet; import org.apache.guacamole.net.auth.ConnectionRecord; -import org.apache.guacamole.net.auth.ConnectionRecordSet; import org.apache.guacamole.net.auth.UserContext; /** @@ -92,7 +92,7 @@ public class HistoryResource { throws GuacamoleException { // Retrieve overall connection history - ConnectionRecordSet history = userContext.getConnectionHistory(); + ActivityRecordSet history = userContext.getConnectionHistory(); // Restrict to records which contain the specified strings for (String required : requiredContents) { From 5340f553616108283f399a811dc1eace14aa92d2 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Sat, 9 Sep 2017 13:43:49 -0700 Subject: [PATCH 3/6] GUACAMOLE-394: Add API support for user login/logout records. --- .../jdbc/sharing/user/SharedUserContext.java | 7 ++++ .../auth/jdbc/user/ModeledUserContext.java | 9 +++++ .../guacamole/auth/ldap/user/UserContext.java | 7 ++++ .../guacamole/net/auth/UserContext.java | 13 +++++++ .../apache/guacamole/net/auth/UserRecord.java | 39 +++++++++++++++++++ .../net/auth/simple/SimpleUserContext.java | 7 ++++ 6 files changed, 82 insertions(+) create mode 100644 guacamole-ext/src/main/java/org/apache/guacamole/net/auth/UserRecord.java diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUserContext.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUserContext.java index cdfe0fca6..67cb6e481 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUserContext.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUserContext.java @@ -37,6 +37,7 @@ import org.apache.guacamole.net.auth.Directory; import org.apache.guacamole.net.auth.SharingProfile; import org.apache.guacamole.net.auth.User; import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.auth.UserRecord; import org.apache.guacamole.net.auth.simple.SimpleActivityRecordSet; import org.apache.guacamole.net.auth.simple.SimpleConnectionGroupDirectory; import org.apache.guacamole.net.auth.simple.SimpleDirectory; @@ -180,6 +181,12 @@ public class SharedUserContext implements UserContext { return new SimpleActivityRecordSet(); } + @Override + public ActivityRecordSet getUserHistory() + throws GuacamoleException { + return new SimpleActivityRecordSet(); + } + @Override public ConnectionGroup getRootConnectionGroup() { return rootGroup; diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUserContext.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUserContext.java index 9d3ba69f2..b18b9558a 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUserContext.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUserContext.java @@ -36,12 +36,15 @@ import org.apache.guacamole.auth.jdbc.sharingprofile.ModeledSharingProfile; import org.apache.guacamole.auth.jdbc.sharingprofile.SharingProfileDirectory; import org.apache.guacamole.form.Form; import org.apache.guacamole.net.auth.ActiveConnection; +import org.apache.guacamole.net.auth.ActivityRecordSet; import org.apache.guacamole.net.auth.AuthenticationProvider; import org.apache.guacamole.net.auth.Connection; import org.apache.guacamole.net.auth.ConnectionGroup; import org.apache.guacamole.net.auth.Directory; import org.apache.guacamole.net.auth.SharingProfile; import org.apache.guacamole.net.auth.User; +import org.apache.guacamole.net.auth.UserRecord; +import org.apache.guacamole.net.auth.simple.SimpleActivityRecordSet; /** * UserContext implementation which is driven by an arbitrary, underlying @@ -161,6 +164,12 @@ public class ModeledUserContext extends RestrictedObject return connectionRecordSet; } + @Override + public ActivityRecordSet getUserHistory() + throws GuacamoleException { + return new SimpleActivityRecordSet(); + } + @Override public ConnectionGroup getRootConnectionGroup() throws GuacamoleException { diff --git a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/user/UserContext.java b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/user/UserContext.java index 98d65ea88..b7e9e2708 100644 --- a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/user/UserContext.java +++ b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/user/UserContext.java @@ -37,6 +37,7 @@ import org.apache.guacamole.net.auth.ConnectionRecord; import org.apache.guacamole.net.auth.Directory; import org.apache.guacamole.net.auth.SharingProfile; import org.apache.guacamole.net.auth.User; +import org.apache.guacamole.net.auth.UserRecord; import org.apache.guacamole.net.auth.simple.SimpleActivityRecordSet; import org.apache.guacamole.net.auth.simple.SimpleConnectionGroup; import org.apache.guacamole.net.auth.simple.SimpleConnectionGroupDirectory; @@ -210,6 +211,12 @@ public class UserContext implements org.apache.guacamole.net.auth.UserContext { return new SimpleActivityRecordSet(); } + @Override + public ActivityRecordSet getUserHistory() + throws GuacamoleException { + return new SimpleActivityRecordSet(); + } + @Override public Collection
getUserAttributes() { return Collections.emptyList(); diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/UserContext.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/UserContext.java index 92f360459..8c741b8d8 100644 --- a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/UserContext.java +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/UserContext.java @@ -156,6 +156,19 @@ public interface UserContext { ActivityRecordSet getConnectionHistory() throws GuacamoleException; + /** + * Retrieves all user records visible to current user. The resulting + * set of user records can be further filtered and ordered using the + * methods defined on ActivityRecordSet. + * + * @return + * A set of all user records visible to the current user. + * + * @throws GuacamoleException + * If an error occurs while retrieving the user records. + */ + ActivityRecordSet getUserHistory() throws GuacamoleException; + /** * Retrieves a connection group which can be used to view and manipulate * connections, but only as allowed by the permissions given to the user of diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/UserRecord.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/UserRecord.java new file mode 100644 index 000000000..16ca2c615 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/UserRecord.java @@ -0,0 +1,39 @@ +/* + * 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.net.auth; + +/** + * A logging record describing when a user started and ended their Guacamole + * session. + */ +public interface UserRecord extends ActivityRecord { + + /** + * Returns the authentication token associated with the user's session, if + * known. If permission is not granted to view the authentication tokens of + * other users, this may be null. + * + * @return + * The authentication token associated with the user's session, or null + * if this information is unavailable. + */ + public String getToken(); + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUserContext.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUserContext.java index 97584ed28..360d74ab7 100644 --- a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUserContext.java +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUserContext.java @@ -36,6 +36,7 @@ import org.apache.guacamole.net.auth.Directory; import org.apache.guacamole.net.auth.SharingProfile; import org.apache.guacamole.net.auth.User; import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.net.auth.UserRecord; import org.apache.guacamole.protocol.GuacamoleConfiguration; /** @@ -215,6 +216,12 @@ public class SimpleUserContext implements UserContext { return new SimpleActivityRecordSet(); } + @Override + public ActivityRecordSet getUserHistory() + throws GuacamoleException { + return new SimpleActivityRecordSet(); + } + @Override public Collection getUserAttributes() { return Collections.emptyList(); From 700005e8238ec1cba18feb00c98c3a9997380811 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Mon, 11 Sep 2017 18:20:53 -0700 Subject: [PATCH 4/6] GUACAMOLE-394: Remove UserRecord interface - recording historical auth tokens doesn't make sense, and removing that turns UserRecord into an empty interface. --- .../jdbc/sharing/user/SharedUserContext.java | 6 +-- .../auth/jdbc/user/ModeledUserContext.java | 6 +-- .../guacamole/auth/ldap/user/UserContext.java | 6 +-- .../guacamole/net/auth/UserContext.java | 18 +++++---- .../apache/guacamole/net/auth/UserRecord.java | 39 ------------------- .../net/auth/simple/SimpleUserContext.java | 6 +-- 6 files changed, 23 insertions(+), 58 deletions(-) delete mode 100644 guacamole-ext/src/main/java/org/apache/guacamole/net/auth/UserRecord.java diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUserContext.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUserContext.java index 67cb6e481..4bc54b562 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUserContext.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUserContext.java @@ -28,6 +28,7 @@ import org.apache.guacamole.auth.jdbc.sharing.connectiongroup.SharedRootConnecti import org.apache.guacamole.auth.jdbc.user.RemoteAuthenticatedUser; import org.apache.guacamole.form.Form; import org.apache.guacamole.net.auth.ActiveConnection; +import org.apache.guacamole.net.auth.ActivityRecord; import org.apache.guacamole.net.auth.ActivityRecordSet; import org.apache.guacamole.net.auth.AuthenticationProvider; import org.apache.guacamole.net.auth.Connection; @@ -37,7 +38,6 @@ import org.apache.guacamole.net.auth.Directory; import org.apache.guacamole.net.auth.SharingProfile; import org.apache.guacamole.net.auth.User; import org.apache.guacamole.net.auth.UserContext; -import org.apache.guacamole.net.auth.UserRecord; import org.apache.guacamole.net.auth.simple.SimpleActivityRecordSet; import org.apache.guacamole.net.auth.simple.SimpleConnectionGroupDirectory; import org.apache.guacamole.net.auth.simple.SimpleDirectory; @@ -182,9 +182,9 @@ public class SharedUserContext implements UserContext { } @Override - public ActivityRecordSet getUserHistory() + public ActivityRecordSet getUserHistory() throws GuacamoleException { - return new SimpleActivityRecordSet(); + return new SimpleActivityRecordSet(); } @Override diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUserContext.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUserContext.java index b18b9558a..1b238abf6 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUserContext.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUserContext.java @@ -36,6 +36,7 @@ import org.apache.guacamole.auth.jdbc.sharingprofile.ModeledSharingProfile; import org.apache.guacamole.auth.jdbc.sharingprofile.SharingProfileDirectory; import org.apache.guacamole.form.Form; import org.apache.guacamole.net.auth.ActiveConnection; +import org.apache.guacamole.net.auth.ActivityRecord; import org.apache.guacamole.net.auth.ActivityRecordSet; import org.apache.guacamole.net.auth.AuthenticationProvider; import org.apache.guacamole.net.auth.Connection; @@ -43,7 +44,6 @@ import org.apache.guacamole.net.auth.ConnectionGroup; import org.apache.guacamole.net.auth.Directory; import org.apache.guacamole.net.auth.SharingProfile; import org.apache.guacamole.net.auth.User; -import org.apache.guacamole.net.auth.UserRecord; import org.apache.guacamole.net.auth.simple.SimpleActivityRecordSet; /** @@ -165,9 +165,9 @@ public class ModeledUserContext extends RestrictedObject } @Override - public ActivityRecordSet getUserHistory() + public ActivityRecordSet getUserHistory() throws GuacamoleException { - return new SimpleActivityRecordSet(); + return new SimpleActivityRecordSet(); } @Override diff --git a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/user/UserContext.java b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/user/UserContext.java index b7e9e2708..5e19dcaa1 100644 --- a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/user/UserContext.java +++ b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/user/UserContext.java @@ -28,6 +28,7 @@ import org.apache.guacamole.auth.ldap.connection.ConnectionService; import org.apache.guacamole.GuacamoleException; import org.apache.guacamole.form.Form; import org.apache.guacamole.net.auth.ActiveConnection; +import org.apache.guacamole.net.auth.ActivityRecord; import org.apache.guacamole.net.auth.ActivityRecordSet; import org.apache.guacamole.net.auth.AuthenticatedUser; import org.apache.guacamole.net.auth.AuthenticationProvider; @@ -37,7 +38,6 @@ import org.apache.guacamole.net.auth.ConnectionRecord; import org.apache.guacamole.net.auth.Directory; import org.apache.guacamole.net.auth.SharingProfile; import org.apache.guacamole.net.auth.User; -import org.apache.guacamole.net.auth.UserRecord; import org.apache.guacamole.net.auth.simple.SimpleActivityRecordSet; import org.apache.guacamole.net.auth.simple.SimpleConnectionGroup; import org.apache.guacamole.net.auth.simple.SimpleConnectionGroupDirectory; @@ -212,9 +212,9 @@ public class UserContext implements org.apache.guacamole.net.auth.UserContext { } @Override - public ActivityRecordSet getUserHistory() + public ActivityRecordSet getUserHistory() throws GuacamoleException { - return new SimpleActivityRecordSet(); + return new SimpleActivityRecordSet(); } @Override diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/UserContext.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/UserContext.java index 8c741b8d8..1c82f9ce8 100644 --- a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/UserContext.java +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/UserContext.java @@ -143,9 +143,11 @@ public interface UserContext { throws GuacamoleException; /** - * Retrieves all connection records visible to current user. The resulting - * set of connection records can be further filtered and ordered using the - * methods defined on ActivityRecordSet. + * Retrieves all connection records visible to current user. Connection + * history records describe the start and end times of connections, and + * correspond to the times that users connect or disconnect to individual + * remote desktops. The resulting set of connection records can be further + * filtered and ordered using the methods defined on ActivityRecordSet. * * @return * A set of all connection records visible to the current user. @@ -157,9 +159,11 @@ public interface UserContext { throws GuacamoleException; /** - * Retrieves all user records visible to current user. The resulting - * set of user records can be further filtered and ordered using the - * methods defined on ActivityRecordSet. + * Retrieves all user history records visible to current user. User history + * records describe the start and end times of user sessions, and correspond + * to the times that users logged in or out. The resulting set of user + * records can be further filtered and ordered using the methods defined on + * ActivityRecordSet. * * @return * A set of all user records visible to the current user. @@ -167,7 +171,7 @@ public interface UserContext { * @throws GuacamoleException * If an error occurs while retrieving the user records. */ - ActivityRecordSet getUserHistory() throws GuacamoleException; + ActivityRecordSet getUserHistory() throws GuacamoleException; /** * Retrieves a connection group which can be used to view and manipulate diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/UserRecord.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/UserRecord.java deleted file mode 100644 index 16ca2c615..000000000 --- a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/UserRecord.java +++ /dev/null @@ -1,39 +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.net.auth; - -/** - * A logging record describing when a user started and ended their Guacamole - * session. - */ -public interface UserRecord extends ActivityRecord { - - /** - * Returns the authentication token associated with the user's session, if - * known. If permission is not granted to view the authentication tokens of - * other users, this may be null. - * - * @return - * The authentication token associated with the user's session, or null - * if this information is unavailable. - */ - public String getToken(); - -} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUserContext.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUserContext.java index 360d74ab7..1678d8827 100644 --- a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUserContext.java +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUserContext.java @@ -27,6 +27,7 @@ import java.util.UUID; import org.apache.guacamole.GuacamoleException; import org.apache.guacamole.form.Form; import org.apache.guacamole.net.auth.ActiveConnection; +import org.apache.guacamole.net.auth.ActivityRecord; import org.apache.guacamole.net.auth.ActivityRecordSet; import org.apache.guacamole.net.auth.AuthenticationProvider; import org.apache.guacamole.net.auth.Connection; @@ -36,7 +37,6 @@ import org.apache.guacamole.net.auth.Directory; import org.apache.guacamole.net.auth.SharingProfile; import org.apache.guacamole.net.auth.User; import org.apache.guacamole.net.auth.UserContext; -import org.apache.guacamole.net.auth.UserRecord; import org.apache.guacamole.protocol.GuacamoleConfiguration; /** @@ -217,9 +217,9 @@ public class SimpleUserContext implements UserContext { } @Override - public ActivityRecordSet getUserHistory() + public ActivityRecordSet getUserHistory() throws GuacamoleException { - return new SimpleActivityRecordSet(); + return new SimpleActivityRecordSet(); } @Override From b61f14e4db06bf2d2dfc1fd7e2098e0d96618b82 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Mon, 11 Sep 2017 18:33:49 -0700 Subject: [PATCH 5/6] GUACAMOLE-394: Add history list at User object level (similar to Connection). --- .../auth/jdbc/sharing/user/SharedUser.java | 10 ++++++++++ .../guacamole/auth/jdbc/user/ModeledUser.java | 7 +++++++ .../org/apache/guacamole/net/auth/User.java | 18 ++++++++++++++++++ .../guacamole/net/auth/simple/SimpleUser.java | 7 +++++++ .../guacamole/rest/user/APIUserWrapper.java | 8 ++++++++ 5 files changed, 50 insertions(+) diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUser.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUser.java index 57120ea1c..07d762a4b 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUser.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUser.java @@ -20,9 +20,11 @@ package org.apache.guacamole.auth.jdbc.sharing.user; import java.util.Collections; +import java.util.List; import java.util.Map; import org.apache.guacamole.GuacamoleException; import org.apache.guacamole.auth.jdbc.sharing.permission.SharedObjectPermissionSet; +import org.apache.guacamole.net.auth.ActivityRecord; import org.apache.guacamole.net.auth.AuthenticatedUser; import org.apache.guacamole.net.auth.Connection; import org.apache.guacamole.net.auth.ConnectionGroup; @@ -88,6 +90,14 @@ public class SharedUser implements User { // Do nothing - no attributes supported } + @Override + public List getHistory() throws GuacamoleException { + + // History is not recorded for shared users + return Collections.emptyList(); + + } + @Override public String getPassword() { return null; diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUser.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUser.java index 36a0be878..1d40c1f05 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUser.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUser.java @@ -29,6 +29,7 @@ import java.util.Calendar; import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.TimeZone; import org.apache.guacamole.auth.jdbc.base.ModeledDirectoryObject; @@ -49,6 +50,7 @@ import org.apache.guacamole.form.Form; import org.apache.guacamole.form.TextField; import org.apache.guacamole.form.TimeField; import org.apache.guacamole.form.TimeZoneField; +import org.apache.guacamole.net.auth.ActivityRecord; import org.apache.guacamole.net.auth.User; import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; import org.apache.guacamole.net.auth.permission.SystemPermission; @@ -792,4 +794,9 @@ public class ModeledUser extends ModeledDirectoryObject implements Us return getModel().isExpired(); } + @Override + public List getHistory() throws GuacamoleException { + return Collections.emptyList(); + } + } diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/User.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/User.java index 88756e495..43d57c0b7 100644 --- a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/User.java +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/User.java @@ -19,6 +19,7 @@ package org.apache.guacamole.net.auth; +import java.util.List; import java.util.Map; import org.apache.guacamole.GuacamoleException; import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; @@ -100,6 +101,23 @@ public interface User extends Identifiable { */ void setAttributes(Map attributes); + /** + * Returns a list of ActivityRecords representing the login history + * of this user, including any active sessions. ActivityRecords + * in this list will be sorted in descending order of end time (active + * sessions are first), and then in descending order of start time + * (newer sessions are first). + * + * @return + * A list of ActivityRecords representing the login history of this + * User. + * + * @throws GuacamoleException + * If an error occurs while reading the history of this user, or if + * permission is denied. + */ + List getHistory() throws GuacamoleException; + /** * Returns all system-level permissions given to this user. * diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUser.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUser.java index d6db92fa5..cd20f3961 100644 --- a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUser.java +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUser.java @@ -22,10 +22,12 @@ package org.apache.guacamole.net.auth.simple; import java.util.Collection; import java.util.Collections; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; import org.apache.guacamole.GuacamoleException; import org.apache.guacamole.net.auth.AbstractUser; +import org.apache.guacamole.net.auth.ActivityRecord; import org.apache.guacamole.net.auth.permission.ObjectPermission; import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; import org.apache.guacamole.net.auth.permission.SystemPermissionSet; @@ -163,6 +165,11 @@ public class SimpleUser extends AbstractUser { // Do nothing - there are no attributes } + @Override + public List getHistory() throws GuacamoleException { + return Collections.emptyList(); + } + @Override public SystemPermissionSet getSystemPermissions() throws GuacamoleException { diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/user/APIUserWrapper.java b/guacamole/src/main/java/org/apache/guacamole/rest/user/APIUserWrapper.java index 35769faa7..7f37be67c 100644 --- a/guacamole/src/main/java/org/apache/guacamole/rest/user/APIUserWrapper.java +++ b/guacamole/src/main/java/org/apache/guacamole/rest/user/APIUserWrapper.java @@ -19,9 +19,12 @@ package org.apache.guacamole.rest.user; +import java.util.Collections; +import java.util.List; import java.util.Map; import org.apache.guacamole.GuacamoleException; import org.apache.guacamole.GuacamoleUnsupportedException; +import org.apache.guacamole.net.auth.ActivityRecord; import org.apache.guacamole.net.auth.User; import org.apache.guacamole.net.auth.permission.ObjectPermissionSet; import org.apache.guacamole.net.auth.permission.SystemPermissionSet; @@ -112,4 +115,9 @@ public class APIUserWrapper implements User { throw new GuacamoleUnsupportedException("APIUserWrapper does not provide permission access."); } + @Override + public List getHistory() throws GuacamoleException { + return Collections.emptyList(); + } + } From 3cd7f453c0a9ba8abd69c76cce8da8a917c0021e Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Mon, 11 Sep 2017 18:49:11 -0700 Subject: [PATCH 6/6] GUACAMOLE-394: Add getLastActive() function, returning the time that a user/connection was last logged-in / used. --- .../auth/jdbc/connection/ModeledConnection.java | 6 ++++++ .../jdbc/sharing/connection/SharedConnection.java | 6 ++++++ .../auth/jdbc/sharing/user/SharedUser.java | 9 +++++++++ .../guacamole/auth/jdbc/user/ModeledUser.java | 5 +++++ .../org/apache/guacamole/net/auth/Connection.java | 13 +++++++++++++ .../java/org/apache/guacamole/net/auth/User.java | 12 ++++++++++++ .../guacamole/net/auth/simple/SimpleConnection.java | 6 ++++++ .../guacamole/net/auth/simple/SimpleUser.java | 6 ++++++ .../rest/connection/APIConnectionWrapper.java | 6 ++++++ .../apache/guacamole/rest/user/APIUserWrapper.java | 6 ++++++ 10 files changed, 75 insertions(+) diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ModeledConnection.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ModeledConnection.java index 365c40dc5..c596b2771 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ModeledConnection.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ModeledConnection.java @@ -24,6 +24,7 @@ import com.google.inject.Provider; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -232,6 +233,11 @@ public class ModeledConnection extends ModeledChildDirectoryObject getHistory() throws GuacamoleException { return connectionService.retrieveHistory(getCurrentUser(), this); diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/connection/SharedConnection.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/connection/SharedConnection.java index 1c955dbd8..5483d0267 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/connection/SharedConnection.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/connection/SharedConnection.java @@ -21,6 +21,7 @@ package org.apache.guacamole.auth.jdbc.sharing.connection; import com.google.inject.Inject; import java.util.Collections; +import java.util.Date; import java.util.List; import java.util.Map; import java.util.Set; @@ -146,6 +147,11 @@ public class SharedConnection implements Connection { // Do nothing - changing attributes not supported } + @Override + public Date getLastActive() { + return null; + } + @Override public List getHistory() throws GuacamoleException { diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUser.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUser.java index 07d762a4b..8e7931d86 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUser.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUser.java @@ -20,6 +20,7 @@ package org.apache.guacamole.auth.jdbc.sharing.user; import java.util.Collections; +import java.util.Date; import java.util.List; import java.util.Map; import org.apache.guacamole.GuacamoleException; @@ -90,6 +91,14 @@ public class SharedUser implements User { // Do nothing - no attributes supported } + @Override + public Date getLastActive() { + + // History is not recorded for shared users + return null; + + } + @Override public List getHistory() throws GuacamoleException { diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUser.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUser.java index 1d40c1f05..fc43e36b1 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUser.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUser.java @@ -794,6 +794,11 @@ public class ModeledUser extends ModeledDirectoryObject implements Us return getModel().isExpired(); } + @Override + public Date getLastActive() { + return null; + } + @Override public List getHistory() throws GuacamoleException { return Collections.emptyList(); diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Connection.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Connection.java index b0795e2a1..85fd1680d 100644 --- a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Connection.java +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Connection.java @@ -19,6 +19,7 @@ package org.apache.guacamole.net.auth; +import java.util.Date; import java.util.List; import java.util.Map; import java.util.Set; @@ -102,6 +103,18 @@ public interface Connection extends Identifiable, Connectable { */ void setAttributes(Map attributes); + /** + * Returns the date and time that this connection was last used. If the + * connection was never used, the time that the connection was last used is + * unknown, or this information is not visible to the current user, this + * may be null. + * + * @return + * The date and time this connection was last used, or null if this + * information is unavailable or inapplicable. + */ + Date getLastActive(); + /** * Returns a list of ConnectionRecords representing the usage history * of this Connection, including any active users. ConnectionRecords diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/User.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/User.java index 43d57c0b7..f7bd61ca2 100644 --- a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/User.java +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/User.java @@ -19,6 +19,7 @@ package org.apache.guacamole.net.auth; +import java.util.Date; import java.util.List; import java.util.Map; import org.apache.guacamole.GuacamoleException; @@ -101,6 +102,17 @@ public interface User extends Identifiable { */ void setAttributes(Map attributes); + /** + * Returns the date and time that this user was last active. If the user + * was never active, the time that the user was last active is unknown, or + * this information is not visible to the current user, this may be null. + * + * @return + * The date and time this user was last active, or null if this + * information is unavailable or inapplicable. + */ + Date getLastActive(); + /** * Returns a list of ActivityRecords representing the login history * of this user, including any active sessions. ActivityRecords diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleConnection.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleConnection.java index 2251a9edf..85783a0a4 100644 --- a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleConnection.java +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleConnection.java @@ -20,6 +20,7 @@ package org.apache.guacamole.net.auth.simple; import java.util.Collections; +import java.util.Date; import java.util.List; import java.util.Map; import org.apache.guacamole.GuacamoleException; @@ -136,6 +137,11 @@ public class SimpleConnection extends AbstractConnection { } + @Override + public Date getLastActive() { + return null; + } + @Override public List getHistory() throws GuacamoleException { return Collections.emptyList(); diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUser.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUser.java index cd20f3961..19ed35731 100644 --- a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUser.java +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUser.java @@ -21,6 +21,7 @@ package org.apache.guacamole.net.auth.simple; import java.util.Collection; import java.util.Collections; +import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -165,6 +166,11 @@ public class SimpleUser extends AbstractUser { // Do nothing - there are no attributes } + @Override + public Date getLastActive() { + return null; + } + @Override public List getHistory() throws GuacamoleException { return Collections.emptyList(); diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/connection/APIConnectionWrapper.java b/guacamole/src/main/java/org/apache/guacamole/rest/connection/APIConnectionWrapper.java index e06e338db..3a987e544 100644 --- a/guacamole/src/main/java/org/apache/guacamole/rest/connection/APIConnectionWrapper.java +++ b/guacamole/src/main/java/org/apache/guacamole/rest/connection/APIConnectionWrapper.java @@ -20,6 +20,7 @@ package org.apache.guacamole.rest.connection; import java.util.Collections; +import java.util.Date; import java.util.List; import java.util.Map; import java.util.Set; @@ -131,6 +132,11 @@ public class APIConnectionWrapper implements Connection { throw new UnsupportedOperationException("Operation not supported."); } + @Override + public Date getLastActive() { + return null; + } + @Override public List getHistory() throws GuacamoleException { return Collections.emptyList(); diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/user/APIUserWrapper.java b/guacamole/src/main/java/org/apache/guacamole/rest/user/APIUserWrapper.java index 7f37be67c..c4b85f9ae 100644 --- a/guacamole/src/main/java/org/apache/guacamole/rest/user/APIUserWrapper.java +++ b/guacamole/src/main/java/org/apache/guacamole/rest/user/APIUserWrapper.java @@ -20,6 +20,7 @@ package org.apache.guacamole.rest.user; import java.util.Collections; +import java.util.Date; import java.util.List; import java.util.Map; import org.apache.guacamole.GuacamoleException; @@ -115,6 +116,11 @@ public class APIUserWrapper implements User { throw new GuacamoleUnsupportedException("APIUserWrapper does not provide permission access."); } + @Override + public Date getLastActive() { + return null; + } + @Override public List getHistory() throws GuacamoleException { return Collections.emptyList();