summaryrefslogtreecommitdiffstats
path: root/src/main/java/de/bwlehrpool/bwlp_guac/AvailableClient.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/de/bwlehrpool/bwlp_guac/AvailableClient.java')
-rw-r--r--src/main/java/de/bwlehrpool/bwlp_guac/AvailableClient.java26
1 files changed, 23 insertions, 3 deletions
diff --git a/src/main/java/de/bwlehrpool/bwlp_guac/AvailableClient.java b/src/main/java/de/bwlehrpool/bwlp_guac/AvailableClient.java
index 0a9e8ec..5d551d9 100644
--- a/src/main/java/de/bwlehrpool/bwlp_guac/AvailableClient.java
+++ b/src/main/java/de/bwlehrpool/bwlp_guac/AvailableClient.java
@@ -28,6 +28,8 @@ public class AvailableClient implements Cloneable {
private String inUseBy;
+ private WrappedConnection connection;
+
private long deadline;
private long lastConnectionCheck;
@@ -52,6 +54,13 @@ public class AvailableClient implements Cloneable {
* can't possibly be in use by the old user anymore.
*/
public synchronized void update(JsonClient source) {
+ if (this.inUseBy != null && source.state != State.OCCUPIED && !TunnelListener.hasTunnel(this.inUseBy)) {
+ LOGGER.info("Free client blocked by a disconnected user detected.");
+ LOGGER.info("Client " + this + " is available again");
+ this.inUseBy = null;
+ if (this.connection != null) this.connection.invalidate();
+ }
+
if (this.password == null || !this.password.equals(source.password)) {
if (source.state != State.OCCUPIED) {
if (this.inUseBy != null) {
@@ -62,7 +71,10 @@ public class AvailableClient implements Cloneable {
this.lastConnectionCheck = 0;
this.password = source.password;
}
- this.state = source.state;
+
+ if (this.inUseBy == null || source.state != State.IDLE)
+ this.state = source.state;
+
this.deadline = 0;
}
@@ -82,13 +94,17 @@ public class AvailableClient implements Cloneable {
}
public synchronized WrappedConnection getConnection(String expectedOwner) {
- if (isInUseBy(expectedOwner))
- return new WrappedConnection(this.clientip + "/" + CON_ID.incrementAndGet(), this);
+ if (isInUseBy(expectedOwner)) {
+ if (this.connection == null || !this.connection.isValid())
+ this.connection = new WrappedConnection(this.clientip + "/" + CON_ID.incrementAndGet(), this);
+ return this.connection;
+ }
return null;
}
public synchronized void releaseConnection(String expectedOwner) {
if (isInUseBy(expectedOwner)) {
+ if (this.connection != null) this.connection.invalidate();
LOGGER.info("Prematurely releasing client " + this);
this.inUseBy = null;
} else {
@@ -121,6 +137,10 @@ public class AvailableClient implements Cloneable {
return locationid;
}
+ public void markAsMissing() {
+ this.state = State.OFFLINE;
+ }
+
public GuacamoleConfiguration toGuacConfig() {
GuacamoleConfiguration cfg = new GuacamoleConfiguration();
cfg.setProtocol("vnc");