diff options
Diffstat (limited to 'src/main/java/de/bwlehrpool/bwlp_guac/AvailableClient.java')
-rw-r--r-- | src/main/java/de/bwlehrpool/bwlp_guac/AvailableClient.java | 26 |
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"); |