GUACAMOLE-360: Allow connections to active connections at API level.
diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ActiveConnection.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ActiveConnection.java
index ad1d6d3..9bcce3e 100644
--- a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ActiveConnection.java
+++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/ActiveConnection.java
@@ -20,13 +20,18 @@
package org.apache.guacamole.net.auth;
import java.util.Date;
+import java.util.Map;
+import org.apache.guacamole.GuacamoleException;
+import org.apache.guacamole.GuacamoleSecurityException;
import org.apache.guacamole.net.GuacamoleTunnel;
+import org.apache.guacamole.protocol.GuacamoleClientInformation;
/**
* A pairing of username and GuacamoleTunnel representing an active usage of a
* particular connection.
*/
-public interface ActiveConnection extends Identifiable, Shareable<SharingProfile> {
+public interface ActiveConnection extends Identifiable, Connectable,
+ Shareable<SharingProfile> {
/**
* Returns the identifier of the connection being actively used. Unlike the
@@ -136,5 +141,31 @@
* The connected GuacamoleTunnel, or null if permission is denied.
*/
void setTunnel(GuacamoleTunnel tunnel);
+
+ /**
+ * Returns whether this ActiveConnection may be joined through a call to
+ * {@link #connect(org.apache.guacamole.protocol.GuacamoleClientInformation, java.util.Map)}
+ * by the user that retrieved this ActiveConnection.
+ *
+ * @return
+ * true if the user that retrieved this ActiveConnection may join the
+ * ActiveConnection through a call to
+ * {@link #connect(org.apache.guacamole.protocol.GuacamoleClientInformation, java.util.Map)},
+ * false otherwise.
+ */
+ default boolean isConnectable() {
+ return false;
+ }
+
+ @Override
+ default GuacamoleTunnel connect(GuacamoleClientInformation info,
+ Map<String, String> tokens) throws GuacamoleException {
+ throw new GuacamoleSecurityException("Permission denied.");
+ }
+
+ @Override
+ default int getActiveConnections() {
+ return 0;
+ }
}
diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/APIActiveConnection.java b/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/APIActiveConnection.java
index 0041a03..1634378 100644
--- a/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/APIActiveConnection.java
+++ b/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/APIActiveConnection.java
@@ -55,6 +55,11 @@
private final String username;
/**
+ * Whether this active connection may be connected to.
+ */
+ private final boolean connectable;
+
+ /**
* Creates a new APIActiveConnection, copying the information from the given
* active connection.
*
@@ -67,6 +72,7 @@
this.startDate = connection.getStartDate();
this.remoteHost = connection.getRemoteHost();
this.username = connection.getUsername();
+ this.connectable = connection.isConnectable();
}
/**
@@ -121,5 +127,16 @@
public String getIdentifier() {
return identifier;
}
-
+
+ /***
+ * Returns whether this active connection may be connected to, just as a
+ * normal connection.
+ *
+ * @return
+ * true if this active connection may be connected to, false otherwise.
+ */
+ public boolean isConnectable() {
+ return connectable;
+ }
+
}
diff --git a/guacamole/src/main/webapp/app/rest/types/ActiveConnection.js b/guacamole/src/main/webapp/app/rest/types/ActiveConnection.js
index 6c5aac2..dc0b140 100644
--- a/guacamole/src/main/webapp/app/rest/types/ActiveConnection.js
+++ b/guacamole/src/main/webapp/app/rest/types/ActiveConnection.js
@@ -76,6 +76,14 @@
*/
this.username = template.username;
+ /**
+ * Whether this active connection may be connected to, just as a
+ * normal connection.
+ *
+ * @type Boolean
+ */
+ this.connectable = template.connectable;
+
};
return ActiveConnection;