mirror of
https://github.com/gyurix1968/guacamole-client.git
synced 2025-09-06 21:27:40 +00:00
Remove trailing whitespace from lines.
This commit is contained in:
@@ -41,8 +41,8 @@ package net.sourceforge.guacamole.net.auth;
|
|||||||
/**
|
/**
|
||||||
* Basic implementation of a Guacamole user which uses the username to
|
* Basic implementation of a Guacamole user which uses the username to
|
||||||
* determine equality. Username comparison is case-sensitive.
|
* determine equality. Username comparison is case-sensitive.
|
||||||
*
|
*
|
||||||
* @author Michael Jumper
|
* @author Michael Jumper
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractUser implements User {
|
public abstract class AbstractUser implements User {
|
||||||
|
|
||||||
@@ -50,7 +50,7 @@ public abstract class AbstractUser implements User {
|
|||||||
* The name of this user.
|
* The name of this user.
|
||||||
*/
|
*/
|
||||||
private String username;
|
private String username;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This user's password. Note that while this provides a means for the
|
* This user's password. Note that while this provides a means for the
|
||||||
* password to be set, the data stored in this String is not necessarily
|
* password to be set, the data stored in this String is not necessarily
|
||||||
@@ -94,7 +94,7 @@ public abstract class AbstractUser implements User {
|
|||||||
// Get username
|
// Get username
|
||||||
String objUsername = ((AbstractUser) obj).username;
|
String objUsername = ((AbstractUser) obj).username;
|
||||||
|
|
||||||
// If null, equal only if this username is null
|
// If null, equal only if this username is null
|
||||||
if (objUsername == null) return username == null;
|
if (objUsername == null) return username == null;
|
||||||
|
|
||||||
// Otherwise, equal only if strings are identical
|
// Otherwise, equal only if strings are identical
|
||||||
|
@@ -51,15 +51,15 @@ public interface AuthenticationProvider {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the UserContext of the user authorized by the given credentials.
|
* Returns the UserContext of the user authorized by the given credentials.
|
||||||
*
|
*
|
||||||
* @param credentials The credentials to use to retrieve the environment.
|
* @param credentials The credentials to use to retrieve the environment.
|
||||||
* @return The UserContext of the user authorized by the given credentials,
|
* @return The UserContext of the user authorized by the given credentials,
|
||||||
* or null if the credentials are not authorized.
|
* or null if the credentials are not authorized.
|
||||||
*
|
*
|
||||||
* @throws GuacamoleException If an error occurs while creating the
|
* @throws GuacamoleException If an error occurs while creating the
|
||||||
* UserContext.
|
* UserContext.
|
||||||
*/
|
*/
|
||||||
UserContext getUserContext(Credentials credentials)
|
UserContext getUserContext(Credentials credentials)
|
||||||
throws GuacamoleException;
|
throws GuacamoleException;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -49,7 +49,7 @@ import net.sourceforge.guacamole.protocol.GuacamoleConfiguration;
|
|||||||
* human-readable identifier, and abstracts the connection process. The
|
* human-readable identifier, and abstracts the connection process. The
|
||||||
* backing GuacamoleConfiguration may be intentionally obfuscated or tokenized
|
* backing GuacamoleConfiguration may be intentionally obfuscated or tokenized
|
||||||
* to protect sensitive configuration information.
|
* to protect sensitive configuration information.
|
||||||
*
|
*
|
||||||
* @author Michael Jumper
|
* @author Michael Jumper
|
||||||
*/
|
*/
|
||||||
public interface Connection {
|
public interface Connection {
|
||||||
@@ -62,7 +62,7 @@ public interface Connection {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the identifier assigned to this Connection.
|
* Sets the identifier assigned to this Connection.
|
||||||
*
|
*
|
||||||
* @param identifier The identifier to assign.
|
* @param identifier The identifier to assign.
|
||||||
*/
|
*/
|
||||||
public void setIdentifier(String identifier);
|
public void setIdentifier(String identifier);
|
||||||
@@ -71,14 +71,14 @@ public interface Connection {
|
|||||||
* Returns the GuacamoleConfiguration associated with this Connection. Note
|
* Returns the GuacamoleConfiguration associated with this Connection. Note
|
||||||
* that because configurations may contain sensitive information, some data
|
* that because configurations may contain sensitive information, some data
|
||||||
* in this configuration may be omitted or tokenized.
|
* in this configuration may be omitted or tokenized.
|
||||||
*
|
*
|
||||||
* @return The GuacamoleConfiguration associated with this Connection.
|
* @return The GuacamoleConfiguration associated with this Connection.
|
||||||
*/
|
*/
|
||||||
public GuacamoleConfiguration getConfiguration();
|
public GuacamoleConfiguration getConfiguration();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the GuacamoleConfiguration associated with this Connection.
|
* Sets the GuacamoleConfiguration associated with this Connection.
|
||||||
*
|
*
|
||||||
* @param config The GuacamoleConfiguration to associate with this
|
* @param config The GuacamoleConfiguration to associate with this
|
||||||
* Connection.
|
* Connection.
|
||||||
*/
|
*/
|
||||||
@@ -92,27 +92,27 @@ public interface Connection {
|
|||||||
*
|
*
|
||||||
* @param info Information associated with the connecting client.
|
* @param info Information associated with the connecting client.
|
||||||
* @return A fully-established GuacamoleSocket.
|
* @return A fully-established GuacamoleSocket.
|
||||||
*
|
*
|
||||||
* @throws GuacamoleException If an error occurs while connecting to guacd,
|
* @throws GuacamoleException If an error occurs while connecting to guacd,
|
||||||
* or if permission to connect is denied.
|
* or if permission to connect is denied.
|
||||||
*/
|
*/
|
||||||
public GuacamoleSocket connect(GuacamoleClientInformation info)
|
public GuacamoleSocket connect(GuacamoleClientInformation info)
|
||||||
throws GuacamoleException;
|
throws GuacamoleException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a list of ConnectionRecords representing the usage history
|
* Returns a list of ConnectionRecords representing the usage history
|
||||||
* of this Connection, including any active users. ConnectionRecords
|
* of this Connection, including any active users. ConnectionRecords
|
||||||
* in this list will be sorted in descending order of end time (active
|
* in this list will be sorted in descending order of end time (active
|
||||||
* connections are first), and then in descending order of start time
|
* connections are first), and then in descending order of start time
|
||||||
* (newer connections are first).
|
* (newer connections are first).
|
||||||
*
|
*
|
||||||
* @return A list of ConnectionRecrods representing the usage history
|
* @return A list of ConnectionRecrods representing the usage history
|
||||||
* of this Connection.
|
* of this Connection.
|
||||||
*
|
*
|
||||||
* @throws GuacamoleException If an error occurs while reading the history
|
* @throws GuacamoleException If an error occurs while reading the history
|
||||||
* of this connection, or if permission is
|
* of this connection, or if permission is
|
||||||
* denied.
|
* denied.
|
||||||
*/
|
*/
|
||||||
public List<? extends ConnectionRecord> getHistory() throws GuacamoleException;
|
public List<? extends ConnectionRecord> getHistory() throws GuacamoleException;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -42,21 +42,21 @@ import java.util.Date;
|
|||||||
/**
|
/**
|
||||||
* A logging record describing when a user started and ended usage of a
|
* A logging record describing when a user started and ended usage of a
|
||||||
* particular connection.
|
* particular connection.
|
||||||
*
|
*
|
||||||
* @author Michael Jumper
|
* @author Michael Jumper
|
||||||
*/
|
*/
|
||||||
public interface ConnectionRecord {
|
public interface ConnectionRecord {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the date and time the connection began.
|
* Returns the date and time the connection began.
|
||||||
*
|
*
|
||||||
* @return The date and time the connection began.
|
* @return The date and time the connection began.
|
||||||
*/
|
*/
|
||||||
public Date getStartDate();
|
public Date getStartDate();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the date and time the connection ended, if applicable.
|
* Returns the date and time the connection ended, if applicable.
|
||||||
*
|
*
|
||||||
* @return The date and time the connection ended, or null if the
|
* @return The date and time the connection ended, or null if the
|
||||||
* connection is still running or if the end time is unknown.
|
* connection is still running or if the end time is unknown.
|
||||||
*/
|
*/
|
||||||
@@ -65,14 +65,14 @@ public interface ConnectionRecord {
|
|||||||
/**
|
/**
|
||||||
* Returns the user who used or is using the connection at the times
|
* Returns the user who used or is using the connection at the times
|
||||||
* given by this connection record.
|
* given by this connection record.
|
||||||
*
|
*
|
||||||
* @return The user who used or is using the associated connection.
|
* @return The user who used or is using the associated connection.
|
||||||
*/
|
*/
|
||||||
public User getUser();
|
public User getUser();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the connection associated with this record.
|
* Returns the connection associated with this record.
|
||||||
*
|
*
|
||||||
* @return The connection associated with this record.
|
* @return The connection associated with this record.
|
||||||
*/
|
*/
|
||||||
public Connection getConnection();
|
public Connection getConnection();
|
||||||
@@ -80,10 +80,10 @@ public interface ConnectionRecord {
|
|||||||
/**
|
/**
|
||||||
* Returns whether the connection associated with this record is still
|
* Returns whether the connection associated with this record is still
|
||||||
* active.
|
* active.
|
||||||
*
|
*
|
||||||
* @return true if the connection associated with this record is still
|
* @return true if the connection associated with this record is still
|
||||||
* active, false otherwise.
|
* active, false otherwise.
|
||||||
*/
|
*/
|
||||||
public boolean isActive();
|
public boolean isActive();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -46,7 +46,7 @@ import net.sourceforge.guacamole.GuacamoleException;
|
|||||||
* Directory are not necessarily returned to the use as references to
|
* Directory are not necessarily returned to the use as references to
|
||||||
* the stored objects, thus updating an object requires calling an update
|
* the stored objects, thus updating an object requires calling an update
|
||||||
* function.
|
* function.
|
||||||
*
|
*
|
||||||
* @author Michael Jumper
|
* @author Michael Jumper
|
||||||
* @param <IdentifierType> The type of identifier used to identify objects
|
* @param <IdentifierType> The type of identifier used to identify objects
|
||||||
* stored within this Directory.
|
* stored within this Directory.
|
||||||
@@ -60,18 +60,18 @@ public interface Directory<IdentifierType, ObjectType> {
|
|||||||
* the Directory. To update an object stored within an
|
* the Directory. To update an object stored within an
|
||||||
* Directory such that future calls to get() will return the updated
|
* Directory such that future calls to get() will return the updated
|
||||||
* object, you must call update() on the object after modification.
|
* object, you must call update() on the object after modification.
|
||||||
*
|
*
|
||||||
* @param identifier The identifier to use when locating the object to
|
* @param identifier The identifier to use when locating the object to
|
||||||
* return.
|
* return.
|
||||||
* @return The object having the given identifier, or null if no such object
|
* @return The object having the given identifier, or null if no such object
|
||||||
* exists.
|
* exists.
|
||||||
*
|
*
|
||||||
* @throws GuacamoleException If an error occurs while retrieving the
|
* @throws GuacamoleException If an error occurs while retrieving the
|
||||||
* object, or if permission for retrieving the
|
* object, or if permission for retrieving the
|
||||||
* object is denied.
|
* object is denied.
|
||||||
*/
|
*/
|
||||||
ObjectType get(IdentifierType identifier) throws GuacamoleException;
|
ObjectType get(IdentifierType identifier) throws GuacamoleException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a Set containing all identifiers for all objects within this
|
* Returns a Set containing all identifiers for all objects within this
|
||||||
* Directory.
|
* Directory.
|
||||||
@@ -84,34 +84,34 @@ public interface Directory<IdentifierType, ObjectType> {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds the given object to the overall set.
|
* Adds the given object to the overall set.
|
||||||
*
|
*
|
||||||
* @param object The object to add.
|
* @param object The object to add.
|
||||||
*
|
*
|
||||||
* @throws GuacamoleException If an error occurs while adding the object , or
|
* @throws GuacamoleException If an error occurs while adding the object , or
|
||||||
* if adding the object is not allowed.
|
* if adding the object is not allowed.
|
||||||
*/
|
*/
|
||||||
void add(ObjectType object)
|
void add(ObjectType object)
|
||||||
throws GuacamoleException;
|
throws GuacamoleException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates the stored object with the data contained in the given object.
|
* Updates the stored object with the data contained in the given object.
|
||||||
*
|
*
|
||||||
* @param object The object which will supply the data for the update.
|
* @param object The object which will supply the data for the update.
|
||||||
*
|
*
|
||||||
* @throws GuacamoleException If an error occurs while updating the object,
|
* @throws GuacamoleException If an error occurs while updating the object,
|
||||||
* or if updating the object is not allowed.
|
* or if updating the object is not allowed.
|
||||||
*/
|
*/
|
||||||
void update(ObjectType object)
|
void update(ObjectType object)
|
||||||
throws GuacamoleException;
|
throws GuacamoleException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes the object with the given identifier from the overall set.
|
* Removes the object with the given identifier from the overall set.
|
||||||
*
|
*
|
||||||
* @param identifier The identifier of the object to remove.
|
* @param identifier The identifier of the object to remove.
|
||||||
*
|
*
|
||||||
* @throws GuacamoleException If an error occurs while removing the object,
|
* @throws GuacamoleException If an error occurs while removing the object,
|
||||||
* or if removing object is not allowed.
|
* or if removing object is not allowed.
|
||||||
*/
|
*/
|
||||||
void remove(IdentifierType identifier) throws GuacamoleException;
|
void remove(IdentifierType identifier) throws GuacamoleException;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -44,21 +44,21 @@ import net.sourceforge.guacamole.net.auth.permission.Permission;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* A user of the Guacamole web application.
|
* A user of the Guacamole web application.
|
||||||
*
|
*
|
||||||
* @author Michael Jumper
|
* @author Michael Jumper
|
||||||
*/
|
*/
|
||||||
public interface User {
|
public interface User {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the name of this user, which must be unique across all users.
|
* Returns the name of this user, which must be unique across all users.
|
||||||
*
|
*
|
||||||
* @return The name of this user.
|
* @return The name of this user.
|
||||||
*/
|
*/
|
||||||
public String getUsername();
|
public String getUsername();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the name of this user, which must be unique across all users.
|
* Sets the name of this user, which must be unique across all users.
|
||||||
*
|
*
|
||||||
* @param username The name of this user.
|
* @param username The name of this user.
|
||||||
*/
|
*/
|
||||||
public void setUsername(String username);
|
public void setUsername(String username);
|
||||||
@@ -66,7 +66,7 @@ public interface User {
|
|||||||
/**
|
/**
|
||||||
* Returns this user's password. Note that the password returned may be
|
* Returns this user's password. Note that the password returned may be
|
||||||
* hashed or completely arbitrary.
|
* hashed or completely arbitrary.
|
||||||
*
|
*
|
||||||
* @return A String which may (or may not) be the user's password.
|
* @return A String which may (or may not) be the user's password.
|
||||||
*/
|
*/
|
||||||
public String getPassword();
|
public String getPassword();
|
||||||
@@ -75,39 +75,39 @@ public interface User {
|
|||||||
* Sets this user's password. Note that while this function is guaranteed
|
* Sets this user's password. Note that while this function is guaranteed
|
||||||
* to change the password of this User object, there is no guarantee that
|
* to change the password of this User object, there is no guarantee that
|
||||||
* getPassword() will return the value given to setPassword().
|
* getPassword() will return the value given to setPassword().
|
||||||
*
|
*
|
||||||
* @param password The password to set.
|
* @param password The password to set.
|
||||||
*/
|
*/
|
||||||
public void setPassword(String password);
|
public void setPassword(String password);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Lists all permissions given to this user.
|
* Lists all permissions given to this user.
|
||||||
*
|
*
|
||||||
* @return A Set of all permissions granted to this user.
|
* @return A Set of all permissions granted to this user.
|
||||||
*
|
*
|
||||||
* @throws GuacamoleException If an error occurs while retrieving
|
* @throws GuacamoleException If an error occurs while retrieving
|
||||||
* permissions, or if reading all permissions
|
* permissions, or if reading all permissions
|
||||||
* is not allowed.
|
* is not allowed.
|
||||||
*/
|
*/
|
||||||
Set<Permission> getPermissions() throws GuacamoleException;
|
Set<Permission> getPermissions() throws GuacamoleException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests whether this user has the specified permission.
|
* Tests whether this user has the specified permission.
|
||||||
*
|
*
|
||||||
* @param permission The permission to check.
|
* @param permission The permission to check.
|
||||||
* @return true if the permission is granted to this user, false otherwise.
|
* @return true if the permission is granted to this user, false otherwise.
|
||||||
*
|
*
|
||||||
* @throws GuacamoleException If an error occurs while checking permissions,
|
* @throws GuacamoleException If an error occurs while checking permissions,
|
||||||
* or if permissions cannot be checked due to
|
* or if permissions cannot be checked due to
|
||||||
* lack of permissions to do so.
|
* lack of permissions to do so.
|
||||||
*/
|
*/
|
||||||
boolean hasPermission(Permission permission) throws GuacamoleException;
|
boolean hasPermission(Permission permission) throws GuacamoleException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds the specified permission to this user.
|
* Adds the specified permission to this user.
|
||||||
*
|
*
|
||||||
* @param permission The permission to add.
|
* @param permission The permission to add.
|
||||||
*
|
*
|
||||||
* @throws GuacamoleException If an error occurs while adding the
|
* @throws GuacamoleException If an error occurs while adding the
|
||||||
* permission. or if permission to add
|
* permission. or if permission to add
|
||||||
* permissions is denied.
|
* permissions is denied.
|
||||||
@@ -116,9 +116,9 @@ public interface User {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes the specified permission from this specified user.
|
* Removes the specified permission from this specified user.
|
||||||
*
|
*
|
||||||
* @param permission The permission to remove.
|
* @param permission The permission to remove.
|
||||||
*
|
*
|
||||||
* @throws GuacamoleException If an error occurs while removing the
|
* @throws GuacamoleException If an error occurs while removing the
|
||||||
* permission. or if permission to remove
|
* permission. or if permission to remove
|
||||||
* permissions is denied.
|
* permissions is denied.
|
||||||
|
@@ -42,7 +42,7 @@ import net.sourceforge.guacamole.GuacamoleException;
|
|||||||
/**
|
/**
|
||||||
* The context of an active user. The functions of this class enforce all
|
* The context of an active user. The functions of this class enforce all
|
||||||
* permissions and act only within the rights of the associated user.
|
* permissions and act only within the rights of the associated user.
|
||||||
*
|
*
|
||||||
* @author Michael Jumper
|
* @author Michael Jumper
|
||||||
*/
|
*/
|
||||||
public interface UserContext {
|
public interface UserContext {
|
||||||
@@ -50,7 +50,7 @@ public interface UserContext {
|
|||||||
/**
|
/**
|
||||||
* Returns the User whose access rights control the operations of this
|
* Returns the User whose access rights control the operations of this
|
||||||
* UserContext.
|
* UserContext.
|
||||||
*
|
*
|
||||||
* @return The User whose access rights control the operations of this
|
* @return The User whose access rights control the operations of this
|
||||||
* UserContext.
|
* UserContext.
|
||||||
*/
|
*/
|
||||||
@@ -60,26 +60,26 @@ public interface UserContext {
|
|||||||
* Retrieves a Directory which can be used to view and manipulate other
|
* Retrieves a Directory which can be used to view and manipulate other
|
||||||
* users, but only as allowed by the permissions given to the user of this
|
* users, but only as allowed by the permissions given to the user of this
|
||||||
* UserContext.
|
* UserContext.
|
||||||
*
|
*
|
||||||
* @return A Directory whose operations are bound by the restrictions
|
* @return A Directory whose operations are bound by the restrictions
|
||||||
* of this UserContext.
|
* of this UserContext.
|
||||||
*
|
*
|
||||||
* @throws GuacamoleException If an error occurs while creating the
|
* @throws GuacamoleException If an error occurs while creating the
|
||||||
* Directory.
|
* Directory.
|
||||||
*/
|
*/
|
||||||
Directory<String, User> getUserDirectory() throws GuacamoleException;
|
Directory<String, User> getUserDirectory() throws GuacamoleException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves a Directory which can be used to view and manipulate
|
* Retrieves a Directory which can be used to view and manipulate
|
||||||
* connections and their configurations, but only as allowed by the
|
* connections and their configurations, but only as allowed by the
|
||||||
* permissions given to the user of this UserContext.
|
* permissions given to the user of this UserContext.
|
||||||
*
|
*
|
||||||
* @return A Directory whose operations are bound by the restrictions
|
* @return A Directory whose operations are bound by the restrictions
|
||||||
* of this UserContext.
|
* of this UserContext.
|
||||||
*
|
*
|
||||||
* @throws GuacamoleException If an error occurs while creating the
|
* @throws GuacamoleException If an error occurs while creating the
|
||||||
* Directory.
|
* Directory.
|
||||||
*/
|
*/
|
||||||
Directory<String, Connection> getConnectionDirectory()
|
Directory<String, Connection> getConnectionDirectory()
|
||||||
throws GuacamoleException;
|
throws GuacamoleException;
|
||||||
|
|
||||||
|
@@ -40,7 +40,7 @@ package net.sourceforge.guacamole.net.auth.permission;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* A permission which controls access to a GuacamoleConfigurationDirectory.
|
* A permission which controls access to a GuacamoleConfigurationDirectory.
|
||||||
*
|
*
|
||||||
* @author Michael Jumper
|
* @author Michael Jumper
|
||||||
*/
|
*/
|
||||||
public class ConnectionDirectoryPermission
|
public class ConnectionDirectoryPermission
|
||||||
@@ -54,13 +54,13 @@ public class ConnectionDirectoryPermission
|
|||||||
/**
|
/**
|
||||||
* Creates a new ConnectionDirectoryPermission with the given
|
* Creates a new ConnectionDirectoryPermission with the given
|
||||||
* type.
|
* type.
|
||||||
*
|
*
|
||||||
* @param type The type of operation controlled by this permission.
|
* @param type The type of operation controlled by this permission.
|
||||||
*/
|
*/
|
||||||
public ConnectionDirectoryPermission(Type type) {
|
public ConnectionDirectoryPermission(Type type) {
|
||||||
this.type = type;
|
this.type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Type getType() {
|
public Type getType() {
|
||||||
return type;
|
return type;
|
||||||
|
@@ -43,7 +43,7 @@ package net.sourceforge.guacamole.net.auth.permission;
|
|||||||
* GuacamoleConfiguration. Note that this permission only refers to the
|
* GuacamoleConfiguration. Note that this permission only refers to the
|
||||||
* GuacamoleConfiguration by its identifier. The actual GuacamoleConfiguration
|
* GuacamoleConfiguration by its identifier. The actual GuacamoleConfiguration
|
||||||
* is not stored within.
|
* is not stored within.
|
||||||
*
|
*
|
||||||
* @author Michael Jumper
|
* @author Michael Jumper
|
||||||
*/
|
*/
|
||||||
public class ConnectionPermission
|
public class ConnectionPermission
|
||||||
@@ -64,13 +64,13 @@ public class ConnectionPermission
|
|||||||
* Creates a new ConnectionPermission having the given type
|
* Creates a new ConnectionPermission having the given type
|
||||||
* and identifier. The identifier must be the unique identifier assigned
|
* and identifier. The identifier must be the unique identifier assigned
|
||||||
* to the GuacamoleConfiguration by the AuthenticationProvider in use.
|
* to the GuacamoleConfiguration by the AuthenticationProvider in use.
|
||||||
*
|
*
|
||||||
* @param type The type of operation affected by this permission.
|
* @param type The type of operation affected by this permission.
|
||||||
* @param identifier The identifier of the GuacamoleConfiguration associated
|
* @param identifier The identifier of the GuacamoleConfiguration associated
|
||||||
* with the operation affected by this permission.
|
* with the operation affected by this permission.
|
||||||
*/
|
*/
|
||||||
public ConnectionPermission(Type type, String identifier) {
|
public ConnectionPermission(Type type, String identifier) {
|
||||||
|
|
||||||
this.identifier = identifier;
|
this.identifier = identifier;
|
||||||
this.type = type;
|
this.type = type;
|
||||||
|
|
||||||
|
@@ -41,7 +41,7 @@ package net.sourceforge.guacamole.net.auth.permission;
|
|||||||
/**
|
/**
|
||||||
* A permission which affects a specific object, rather than the system as a
|
* A permission which affects a specific object, rather than the system as a
|
||||||
* whole.
|
* whole.
|
||||||
*
|
*
|
||||||
* @author Michael Jumper
|
* @author Michael Jumper
|
||||||
* @param <T> The type of identifier used by the object this permission affects.
|
* @param <T> The type of identifier used by the object this permission affects.
|
||||||
*/
|
*/
|
||||||
@@ -78,10 +78,10 @@ public interface ObjectPermission<T> extends Permission<ObjectPermission.Type> {
|
|||||||
/**
|
/**
|
||||||
* Returns the identifier of the specific object affected by this
|
* Returns the identifier of the specific object affected by this
|
||||||
* permission.
|
* permission.
|
||||||
*
|
*
|
||||||
* @return The identifier of the specific object affected by this
|
* @return The identifier of the specific object affected by this
|
||||||
* permission.
|
* permission.
|
||||||
*/
|
*/
|
||||||
public T getObjectIdentifier();
|
public T getObjectIdentifier();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -41,17 +41,17 @@ package net.sourceforge.guacamole.net.auth.permission;
|
|||||||
/**
|
/**
|
||||||
* A permission which affects a specific type of operation, where all available
|
* A permission which affects a specific type of operation, where all available
|
||||||
* operation types are defined by an enumeration.
|
* operation types are defined by an enumeration.
|
||||||
*
|
*
|
||||||
* @author Michael Jumper
|
* @author Michael Jumper
|
||||||
* @param <Type> The enumeration of all available operation types that this
|
* @param <Type> The enumeration of all available operation types that this
|
||||||
* permission can affect.
|
* permission can affect.
|
||||||
*/
|
*/
|
||||||
public interface Permission<Type extends Enum> {
|
public interface Permission<Type extends Enum> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the type of operation affected by this permission.
|
* Returns the type of operation affected by this permission.
|
||||||
* @return The type of operation affected by this permission.
|
* @return The type of operation affected by this permission.
|
||||||
*/
|
*/
|
||||||
public Type getType();
|
public Type getType();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -41,7 +41,7 @@ package net.sourceforge.guacamole.net.auth.permission;
|
|||||||
/**
|
/**
|
||||||
* A permission which affects the system as a whole, rather than an individual
|
* A permission which affects the system as a whole, rather than an individual
|
||||||
* object.
|
* object.
|
||||||
*
|
*
|
||||||
* @author Michael Jumper
|
* @author Michael Jumper
|
||||||
*/
|
*/
|
||||||
public interface SystemPermission extends Permission<SystemPermission.Type> {
|
public interface SystemPermission extends Permission<SystemPermission.Type> {
|
||||||
@@ -56,7 +56,7 @@ public interface SystemPermission extends Permission<SystemPermission.Type> {
|
|||||||
* Create system-level objects.
|
* Create system-level objects.
|
||||||
*/
|
*/
|
||||||
CREATE
|
CREATE
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -40,7 +40,7 @@ package net.sourceforge.guacamole.net.auth.permission;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* A permission which controls access to a UserDirectory.
|
* A permission which controls access to a UserDirectory.
|
||||||
*
|
*
|
||||||
* @author Michael Jumper
|
* @author Michael Jumper
|
||||||
*/
|
*/
|
||||||
public class UserDirectoryPermission implements SystemPermission {
|
public class UserDirectoryPermission implements SystemPermission {
|
||||||
@@ -52,13 +52,13 @@ public class UserDirectoryPermission implements SystemPermission {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new UserDirectoryPermission with the given type.
|
* Creates a new UserDirectoryPermission with the given type.
|
||||||
*
|
*
|
||||||
* @param type The type of operation controlled by this permission.
|
* @param type The type of operation controlled by this permission.
|
||||||
*/
|
*/
|
||||||
public UserDirectoryPermission(Type type) {
|
public UserDirectoryPermission(Type type) {
|
||||||
this.type = type;
|
this.type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Type getType() {
|
public Type getType() {
|
||||||
return type;
|
return type;
|
||||||
|
@@ -41,7 +41,7 @@ package net.sourceforge.guacamole.net.auth.permission;
|
|||||||
/**
|
/**
|
||||||
* A permission which controls operations that directly affect a specific
|
* A permission which controls operations that directly affect a specific
|
||||||
* User.
|
* User.
|
||||||
*
|
*
|
||||||
* @author Michael Jumper
|
* @author Michael Jumper
|
||||||
*/
|
*/
|
||||||
public class UserPermission implements ObjectPermission<String> {
|
public class UserPermission implements ObjectPermission<String> {
|
||||||
@@ -60,7 +60,7 @@ public class UserPermission implements ObjectPermission<String> {
|
|||||||
/**
|
/**
|
||||||
* Creates a new UserPermission having the given type and identifier. The
|
* Creates a new UserPermission having the given type and identifier. The
|
||||||
* identifier must be the user's username.
|
* identifier must be the user's username.
|
||||||
*
|
*
|
||||||
* @param type The type of operation affected by this permission.
|
* @param type The type of operation affected by this permission.
|
||||||
* @param identifier The username of the User associated with the operation
|
* @param identifier The username of the User associated with the operation
|
||||||
* affected by this permission.
|
* affected by this permission.
|
||||||
|
@@ -52,13 +52,13 @@ import net.sourceforge.guacamole.protocol.GuacamoleConfiguration;
|
|||||||
* implementation intended to be easily extended. It is useful for simple
|
* implementation intended to be easily extended. It is useful for simple
|
||||||
* authentication situations where access to web-based administration and
|
* authentication situations where access to web-based administration and
|
||||||
* complex users and permissions are not required.
|
* complex users and permissions are not required.
|
||||||
*
|
*
|
||||||
* The interface provided by SimpleAuthenticationProvider is similar to that of
|
* The interface provided by SimpleAuthenticationProvider is similar to that of
|
||||||
* the AuthenticationProvider interface of older Guacamole releases.
|
* the AuthenticationProvider interface of older Guacamole releases.
|
||||||
*
|
*
|
||||||
* @author Michael Jumper
|
* @author Michael Jumper
|
||||||
*/
|
*/
|
||||||
public abstract class SimpleAuthenticationProvider
|
public abstract class SimpleAuthenticationProvider
|
||||||
implements AuthenticationProvider {
|
implements AuthenticationProvider {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -84,17 +84,17 @@ public abstract class SimpleAuthenticationProvider
|
|||||||
// Get configurations
|
// Get configurations
|
||||||
Map<String, GuacamoleConfiguration> configs =
|
Map<String, GuacamoleConfiguration> configs =
|
||||||
getAuthorizedConfigurations(credentials);
|
getAuthorizedConfigurations(credentials);
|
||||||
|
|
||||||
// Return as unauthorized if not authorized to retrieve configs
|
// Return as unauthorized if not authorized to retrieve configs
|
||||||
if (configs == null)
|
if (configs == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
// Build new user from credentials
|
// Build new user from credentials
|
||||||
User user = new SimpleUser(credentials.getUsername(), configs);
|
User user = new SimpleUser(credentials.getUsername(), configs);
|
||||||
|
|
||||||
// Return user context restricted to authorized configs
|
// Return user context restricted to authorized configs
|
||||||
return new SimpleUserContext(user, configs);
|
return new SimpleUserContext(user, configs);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -52,7 +52,7 @@ import net.sourceforge.guacamole.protocol.GuacamoleConfiguration;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* An extremely basic Connection implementation.
|
* An extremely basic Connection implementation.
|
||||||
*
|
*
|
||||||
* @author Michael Jumper
|
* @author Michael Jumper
|
||||||
*/
|
*/
|
||||||
public class SimpleConnection extends AbstractConnection {
|
public class SimpleConnection extends AbstractConnection {
|
||||||
@@ -61,17 +61,17 @@ public class SimpleConnection extends AbstractConnection {
|
|||||||
* Backing configuration, containing all sensitive information.
|
* Backing configuration, containing all sensitive information.
|
||||||
*/
|
*/
|
||||||
private GuacamoleConfiguration config;
|
private GuacamoleConfiguration config;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a completely uninitialized SimpleConnection.
|
* Creates a completely uninitialized SimpleConnection.
|
||||||
*/
|
*/
|
||||||
public SimpleConnection() {
|
public SimpleConnection() {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new SimpleConnection having the given identifier and
|
* Creates a new SimpleConnection having the given identifier and
|
||||||
* GuacamoleConfiguration.
|
* GuacamoleConfiguration.
|
||||||
*
|
*
|
||||||
* @param identifier The identifier to associated with this connection.
|
* @param identifier The identifier to associated with this connection.
|
||||||
* @param config The configuration describing how to connect to this
|
* @param config The configuration describing how to connect to this
|
||||||
* connection.
|
* connection.
|
||||||
@@ -95,13 +95,13 @@ public class SimpleConnection extends AbstractConnection {
|
|||||||
// Get guacd connection parameters
|
// Get guacd connection parameters
|
||||||
String hostname = GuacamoleProperties.getProperty(GuacamoleProperties.GUACD_HOSTNAME);
|
String hostname = GuacamoleProperties.getProperty(GuacamoleProperties.GUACD_HOSTNAME);
|
||||||
int port = GuacamoleProperties.getProperty(GuacamoleProperties.GUACD_PORT);
|
int port = GuacamoleProperties.getProperty(GuacamoleProperties.GUACD_PORT);
|
||||||
|
|
||||||
// Return connected socket
|
// Return connected socket
|
||||||
return new ConfiguredGuacamoleSocket(
|
return new ConfiguredGuacamoleSocket(
|
||||||
new InetGuacamoleSocket(hostname, port),
|
new InetGuacamoleSocket(hostname, port),
|
||||||
config, info
|
config, info
|
||||||
);
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@@ -52,10 +52,10 @@ import net.sourceforge.guacamole.protocol.GuacamoleConfiguration;
|
|||||||
* An extremely simple read-only implementation of a Directory of
|
* An extremely simple read-only implementation of a Directory of
|
||||||
* GuacamoleConfigurations which provides access to a pre-defined Map of
|
* GuacamoleConfigurations which provides access to a pre-defined Map of
|
||||||
* GuacamoleConfigurations.
|
* GuacamoleConfigurations.
|
||||||
*
|
*
|
||||||
* @author Michael Jumper
|
* @author Michael Jumper
|
||||||
*/
|
*/
|
||||||
public class SimpleConnectionDirectory
|
public class SimpleConnectionDirectory
|
||||||
implements Directory<String, Connection> {
|
implements Directory<String, Connection> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -67,7 +67,7 @@ public class SimpleConnectionDirectory
|
|||||||
/**
|
/**
|
||||||
* Creates a new SimpleConnectionDirectory which provides
|
* Creates a new SimpleConnectionDirectory which provides
|
||||||
* access to the configurations contained within the given Map.
|
* access to the configurations contained within the given Map.
|
||||||
*
|
*
|
||||||
* @param configs The Map of GuacamoleConfigurations to provide access to.
|
* @param configs The Map of GuacamoleConfigurations to provide access to.
|
||||||
*/
|
*/
|
||||||
public SimpleConnectionDirectory(
|
public SimpleConnectionDirectory(
|
||||||
@@ -77,9 +77,9 @@ public class SimpleConnectionDirectory
|
|||||||
for (Entry<String, GuacamoleConfiguration> entry : configs.entrySet())
|
for (Entry<String, GuacamoleConfiguration> entry : configs.entrySet())
|
||||||
connections.put(entry.getKey(),
|
connections.put(entry.getKey(),
|
||||||
new SimpleConnection(entry.getKey(), entry.getValue()));
|
new SimpleConnection(entry.getKey(), entry.getValue()));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Connection get(String identifier)
|
public Connection get(String identifier)
|
||||||
throws GuacamoleException {
|
throws GuacamoleException {
|
||||||
|
@@ -51,7 +51,7 @@ import net.sourceforge.guacamole.protocol.GuacamoleConfiguration;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* An extremely basic User implementation.
|
* An extremely basic User implementation.
|
||||||
*
|
*
|
||||||
* @author Michael Jumper
|
* @author Michael Jumper
|
||||||
*/
|
*/
|
||||||
public class SimpleUser extends AbstractUser {
|
public class SimpleUser extends AbstractUser {
|
||||||
@@ -60,16 +60,16 @@ public class SimpleUser extends AbstractUser {
|
|||||||
* The set of all permissions available to this user.
|
* The set of all permissions available to this user.
|
||||||
*/
|
*/
|
||||||
private Set<Permission> permissions = new HashSet<Permission>();
|
private Set<Permission> permissions = new HashSet<Permission>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a completely uninitialized SimpleUser.
|
* Creates a completely uninitialized SimpleUser.
|
||||||
*/
|
*/
|
||||||
public SimpleUser() {
|
public SimpleUser() {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new SimpleUser having the given username.
|
* Creates a new SimpleUser having the given username.
|
||||||
*
|
*
|
||||||
* @param username The username to assign to this SimpleUser.
|
* @param username The username to assign to this SimpleUser.
|
||||||
* @param configs All configurations this user has read access to.
|
* @param configs All configurations this user has read access to.
|
||||||
*/
|
*/
|
||||||
@@ -90,9 +90,9 @@ public class SimpleUser extends AbstractUser {
|
|||||||
|
|
||||||
// Add to set
|
// Add to set
|
||||||
permissions.add(permission);
|
permissions.add(permission);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -114,5 +114,5 @@ public class SimpleUser extends AbstractUser {
|
|||||||
public void removePermission(Permission permission) throws GuacamoleException {
|
public void removePermission(Permission permission) throws GuacamoleException {
|
||||||
throw new GuacamoleSecurityException("Permission denied.");
|
throw new GuacamoleSecurityException("Permission denied.");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -49,7 +49,7 @@ import net.sourceforge.guacamole.protocol.GuacamoleConfiguration;
|
|||||||
* An extremely simple UserContext implementation which provides access to
|
* An extremely simple UserContext implementation which provides access to
|
||||||
* a defined and restricted set of GuacamoleConfigurations. Access to
|
* a defined and restricted set of GuacamoleConfigurations. Access to
|
||||||
* querying or modifying either users or permissions is denied.
|
* querying or modifying either users or permissions is denied.
|
||||||
*
|
*
|
||||||
* @author Michael Jumper
|
* @author Michael Jumper
|
||||||
*/
|
*/
|
||||||
public class SimpleUserContext implements UserContext {
|
public class SimpleUserContext implements UserContext {
|
||||||
@@ -59,7 +59,7 @@ public class SimpleUserContext implements UserContext {
|
|||||||
* accessible within this UserContext.
|
* accessible within this UserContext.
|
||||||
*/
|
*/
|
||||||
private final User self;
|
private final User self;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Directory with access only to those Connections that the User
|
* The Directory with access only to those Connections that the User
|
||||||
* associated with this UserContext has access to.
|
* associated with this UserContext has access to.
|
||||||
@@ -71,13 +71,13 @@ public class SimpleUserContext implements UserContext {
|
|||||||
* UserContext.
|
* UserContext.
|
||||||
*/
|
*/
|
||||||
private final Directory<String, User> userDirectory;
|
private final Directory<String, User> userDirectory;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new SimpleUserContext which provides access to only those
|
* Creates a new SimpleUserContext which provides access to only those
|
||||||
* configurations within the given Map. The User given must be the user
|
* configurations within the given Map. The User given must be the user
|
||||||
* that owns this UserContext, and the Map given must contain only
|
* that owns this UserContext, and the Map given must contain only
|
||||||
* GuacamoleConfigurations that the given User has read access to.
|
* GuacamoleConfigurations that the given User has read access to.
|
||||||
*
|
*
|
||||||
* @param self The owner of this UserContext.
|
* @param self The owner of this UserContext.
|
||||||
* @param configs A Map of all configurations for which the user associated
|
* @param configs A Map of all configurations for which the user associated
|
||||||
* with this UserContext has read access.
|
* with this UserContext has read access.
|
||||||
@@ -89,11 +89,11 @@ public class SimpleUserContext implements UserContext {
|
|||||||
|
|
||||||
this.connectionDirectory =
|
this.connectionDirectory =
|
||||||
new SimpleConnectionDirectory(configs);
|
new SimpleConnectionDirectory(configs);
|
||||||
|
|
||||||
this.userDirectory = new SimpleUserDirectory(self);
|
this.userDirectory = new SimpleUserDirectory(self);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public User self() {
|
public User self() {
|
||||||
return self;
|
return self;
|
||||||
|
@@ -48,7 +48,7 @@ import net.sourceforge.guacamole.net.auth.User;
|
|||||||
/**
|
/**
|
||||||
* An extremely simple read-only implementation of a Directory of Users which
|
* An extremely simple read-only implementation of a Directory of Users which
|
||||||
* provides access to a single pre-defined User.
|
* provides access to a single pre-defined User.
|
||||||
*
|
*
|
||||||
* @author Michael Jumper
|
* @author Michael Jumper
|
||||||
*/
|
*/
|
||||||
public class SimpleUserDirectory implements Directory<String, User> {
|
public class SimpleUserDirectory implements Directory<String, User> {
|
||||||
@@ -61,7 +61,7 @@ public class SimpleUserDirectory implements Directory<String, User> {
|
|||||||
/**
|
/**
|
||||||
* Creates a new SimpleUserDirectory which provides access to the single
|
* Creates a new SimpleUserDirectory which provides access to the single
|
||||||
* user provided.
|
* user provided.
|
||||||
*
|
*
|
||||||
* @param user The user to provide access to.
|
* @param user The user to provide access to.
|
||||||
*/
|
*/
|
||||||
public SimpleUserDirectory(User user) {
|
public SimpleUserDirectory(User user) {
|
||||||
|
@@ -41,7 +41,7 @@ import java.io.File;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Abstract representation of the Guacamole configuration directory.
|
* Abstract representation of the Guacamole configuration directory.
|
||||||
*
|
*
|
||||||
* @author Michael Jumper
|
* @author Michael Jumper
|
||||||
*/
|
*/
|
||||||
public class GuacamoleHome {
|
public class GuacamoleHome {
|
||||||
@@ -50,13 +50,13 @@ public class GuacamoleHome {
|
|||||||
* GuacamoleHome is a utility class and cannot be instantiated.
|
* GuacamoleHome is a utility class and cannot be instantiated.
|
||||||
*/
|
*/
|
||||||
private GuacamoleHome() {}
|
private GuacamoleHome() {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the Guacamole home directory by checking, in order:
|
* Returns the Guacamole home directory by checking, in order:
|
||||||
* the guacamole.home system property, the GUACAMOLE_HOME environment
|
* the guacamole.home system property, the GUACAMOLE_HOME environment
|
||||||
* variable, and finally the .guacamole directory in the home directory of
|
* variable, and finally the .guacamole directory in the home directory of
|
||||||
* the user running the servlet container.
|
* the user running the servlet container.
|
||||||
*
|
*
|
||||||
* @return The File representing the Guacamole home directory, which may
|
* @return The File representing the Guacamole home directory, which may
|
||||||
* or may not exist, and may turn out to not be a directory.
|
* or may not exist, and may turn out to not be a directory.
|
||||||
*/
|
*/
|
||||||
@@ -64,7 +64,7 @@ public class GuacamoleHome {
|
|||||||
|
|
||||||
// Attempt to find Guacamole home
|
// Attempt to find Guacamole home
|
||||||
File guacHome;
|
File guacHome;
|
||||||
|
|
||||||
// Use system property by default
|
// Use system property by default
|
||||||
String desiredDir = System.getProperty("guacamole.home");
|
String desiredDir = System.getProperty("guacamole.home");
|
||||||
|
|
||||||
|
@@ -50,7 +50,7 @@ import net.sourceforge.guacamole.GuacamoleServerException;
|
|||||||
* file. The guacamole.properties file is preferably located in the servlet
|
* file. The guacamole.properties file is preferably located in the servlet
|
||||||
* container's user's home directory, in a subdirectory called .guacamole, or
|
* container's user's home directory, in a subdirectory called .guacamole, or
|
||||||
* in the directory set by the system property: guacamole.home.
|
* in the directory set by the system property: guacamole.home.
|
||||||
*
|
*
|
||||||
* If none of those locations are possible, guacamole.properties will also
|
* If none of those locations are possible, guacamole.properties will also
|
||||||
* be read from the root of the classpath.
|
* be read from the root of the classpath.
|
||||||
*
|
*
|
||||||
@@ -104,9 +104,9 @@ public class GuacamoleProperties {
|
|||||||
|
|
||||||
// Attempt to find Guacamole home
|
// Attempt to find Guacamole home
|
||||||
File guacHome = GuacamoleHome.getDirectory();
|
File guacHome = GuacamoleHome.getDirectory();
|
||||||
|
|
||||||
InputStream stream;
|
InputStream stream;
|
||||||
|
|
||||||
// If not a directory, load from classpath
|
// If not a directory, load from classpath
|
||||||
if (!guacHome.isDirectory()) {
|
if (!guacHome.isDirectory()) {
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user