GUACAMOLE-394: Merge refactor extension API to define user history

This commit is contained in:
Nick Couchman
2017-09-27 18:14:43 -04:00
27 changed files with 504 additions and 194 deletions

View File

@@ -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();
}

View File

@@ -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 <RecordType>
* The type of ActivityRecord contained within this set.
*/
public interface ActivityRecordSet<RecordType extends ActivityRecord> {
/**
* 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<RecordType> 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<RecordType> contains(String value)
throws GuacamoleException;
/**
* Returns the subset of records containing only the first
* <code>limit</code> records. If the subset has fewer than
* <code>limit</code> 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
* <code>limit</code> records.
*
* @throws GuacamoleException
* If an error occurs while limiting the current subset.
*/
ActivityRecordSet<RecordType> 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<RecordType> sort(SortableProperty property, boolean desc)
throws GuacamoleException;
}

View File

@@ -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<String, String> 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

View File

@@ -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();
}

View File

@@ -19,107 +19,13 @@
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.
*
* @deprecated
* Use {@link ActivityRecordSet}&lt;{@link ConnectionRecord}&gt; instead.
*/
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<ConnectionRecord> asCollection() throws GuacamoleException;
/**
* 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.
*/
ConnectionRecordSet contains(String value) throws GuacamoleException;
/**
* Returns the subset of connection history records containing only the
* first <code>limit</code> records. If the subset has fewer than
* <code>limit</code> 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 <code>limit</code> records.
*
* @throws GuacamoleException
* If an error occurs while limiting the current subset.
*/
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.
*/
ConnectionRecordSet sort(SortableProperty property, boolean desc)
throws GuacamoleException;
@Deprecated
public interface ConnectionRecordSet
extends ActivityRecordSet<ConnectionRecord> {
}

View File

@@ -19,6 +19,8 @@
package org.apache.guacamole.net.auth;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.apache.guacamole.GuacamoleException;
import org.apache.guacamole.net.auth.permission.ObjectPermissionSet;
@@ -100,6 +102,34 @@ public interface User extends Identifiable {
*/
void setAttributes(Map<String, String> 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
* 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<? extends ActivityRecord> getHistory() throws GuacamoleException;
/**
* Returns all system-level permissions given to this user.
*

View File

@@ -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 ConnectionRecordSet.
* 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.
@@ -153,7 +155,23 @@ public interface UserContext {
* @throws GuacamoleException
* If an error occurs while retrieving the connection records.
*/
ConnectionRecordSet getConnectionHistory() throws GuacamoleException;
ActivityRecordSet<ConnectionRecord> getConnectionHistory()
throws GuacamoleException;
/**
* 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.
*
* @throws GuacamoleException
* If an error occurs while retrieving the user records.
*/
ActivityRecordSet<ActivityRecord> getUserHistory() throws GuacamoleException;
/**
* Retrieves a connection group which can be used to view and manipulate

View File

@@ -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 <RecordType>
* The type of ActivityRecord contained within this set.
*/
public class SimpleActivityRecordSet<RecordType extends ActivityRecord>
implements ActivityRecordSet<RecordType> {
@Override
public Collection<RecordType> asCollection()
throws GuacamoleException {
return Collections.<RecordType>emptyList();
}
@Override
public ActivityRecordSet<RecordType> contains(String value)
throws GuacamoleException {
return this;
}
@Override
public ActivityRecordSet<RecordType> limit(int limit)
throws GuacamoleException {
return this;
}
@Override
public ActivityRecordSet<RecordType> sort(SortableProperty property,
boolean desc) throws GuacamoleException {
return this;
}
}

View File

@@ -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<ConnectionRecord> getHistory() throws GuacamoleException {
return Collections.<ConnectionRecord>emptyList();

View File

@@ -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}&lt;{@link ConnectionRecord}&gt;
* instead.
*/
public class SimpleConnectionRecordSet implements ConnectionRecordSet {
@Deprecated
public class SimpleConnectionRecordSet implements org.apache.guacamole.net.auth.ConnectionRecordSet {
@Override
public Collection<ConnectionRecord> 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;
}

View File

@@ -21,11 +21,14 @@ 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;
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 +166,16 @@ public class SimpleUser extends AbstractUser {
// Do nothing - there are no attributes
}
@Override
public Date getLastActive() {
return null;
}
@Override
public List<ActivityRecord> getHistory() throws GuacamoleException {
return Collections.<ActivityRecord>emptyList();
}
@Override
public SystemPermissionSet getSystemPermissions()
throws GuacamoleException {

View File

@@ -27,10 +27,12 @@ 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;
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 +211,15 @@ public class SimpleUserContext implements UserContext {
}
@Override
public ConnectionRecordSet getConnectionHistory()
public ActivityRecordSet<ConnectionRecord> getConnectionHistory()
throws GuacamoleException {
return new SimpleConnectionRecordSet();
return new SimpleActivityRecordSet<ConnectionRecord>();
}
@Override
public ActivityRecordSet<ActivityRecord> getUserHistory()
throws GuacamoleException {
return new SimpleActivityRecordSet<ActivityRecord>();
}
@Override