From ced83b2dae2763449cc5c57591ba024dd7bc3d56 Mon Sep 17 00:00:00 2001 From: Udo Walter Date: Thu, 18 Jun 2020 05:14:59 +0200 Subject: Send resolution from the users browser to the server and try to autologin the user on the client. --- .../de/bwlehrpool/bwlp_guac/AvailableClient.java | 28 +++++++++++++++++++++- .../bwlp_guac/BwlpAuthenticationProvider.java | 25 ++++++++++++------- .../de/bwlehrpool/bwlp_guac/BwlpUserContext.java | 6 ++++- .../de/bwlehrpool/bwlp_guac/WrappedConnection.java | 5 ++++ .../resources/controllers/groupFieldController.js | 2 +- 5 files changed, 54 insertions(+), 12 deletions(-) diff --git a/src/main/java/de/bwlehrpool/bwlp_guac/AvailableClient.java b/src/main/java/de/bwlehrpool/bwlp_guac/AvailableClient.java index 5165a9c..ca4b7a5 100644 --- a/src/main/java/de/bwlehrpool/bwlp_guac/AvailableClient.java +++ b/src/main/java/de/bwlehrpool/bwlp_guac/AvailableClient.java @@ -1,15 +1,18 @@ package de.bwlehrpool.bwlp_guac; -import java.io.IOException; +import java.io.*; +import java.net.Socket; import java.util.ArrayList; import java.util.concurrent.atomic.AtomicLong; +import org.apache.guacamole.net.auth.Credentials; import org.apache.guacamole.protocol.GuacamoleConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import de.bwlehrpool.bwlp_guac.JsonClient.State; + public class AvailableClient implements Cloneable { private static final Logger LOGGER = LoggerFactory.getLogger(AvailableClient.class); @@ -197,6 +200,29 @@ public class AvailableClient implements Cloneable { } } + public void remoteLogin(Credentials credentials, String resolution) { + String username = credentials.getUsername(); + try { + LOGGER.info("Logging in user " + username + " on client " + this); + + Socket socket = new Socket(this.clientip, 1234); // TODO Port? + OutputStream output = socket.getOutputStream(); + + int version = 1; + output.write(version & 0xFF); + output.write(version >> 8); + + String data = username + "\n" + credentials.getPassword() + "\n" + resolution; + output.write(data.getBytes()); + + output.flush(); + + socket.close(); + } catch (IOException e) { + LOGGER.warn("Login failed. User: " + username + " Client: " + this, e); + } + } + @Override public AvailableClient clone() { AvailableClient c = new AvailableClient(this.clientip); diff --git a/src/main/java/de/bwlehrpool/bwlp_guac/BwlpAuthenticationProvider.java b/src/main/java/de/bwlehrpool/bwlp_guac/BwlpAuthenticationProvider.java index 017c806..a75d585 100644 --- a/src/main/java/de/bwlehrpool/bwlp_guac/BwlpAuthenticationProvider.java +++ b/src/main/java/de/bwlehrpool/bwlp_guac/BwlpAuthenticationProvider.java @@ -70,17 +70,23 @@ public class BwlpAuthenticationProvider implements AuthenticationProvider { if (exConn != null) { user = new BwlpUserContext(authenticatedUser, context, exConn); } else { - int groupid = requestGroup(credentials); + UserResponse response = requestGroup(credentials); LOGGER.warn("Doing the REdecoration"); - user = new BwlpUserContext(authenticatedUser, context, groupid); + user = new BwlpUserContext(authenticatedUser, context, response.groupid, response.resolution); } oldMappings.put(username, user); return user; } + final class UserResponse { + public int groupid = 0; + public String resolution = "1920x1080"; + } + + private UserResponse requestGroup(Credentials credentials) throws GuacamoleException { + UserResponse response = new UserResponse(); - private int requestGroup(Credentials credentials) throws GuacamoleException { // Request the user to select a group ConnectionManager.updateList(); HttpServletRequest request = credentials.getRequest(); @@ -97,23 +103,24 @@ public class BwlpAuthenticationProvider implements AuthenticationProvider { String message = "Select a Location"; - int selectedId = 0; boolean tryAgain = false; String password = ""; String correctPassword = null; try { JsonNode group = mapper.readTree(groupJson); - selectedId = Integer.parseInt(group.get("id").asText()); - if (selectedId != 0) { + response.resolution = group.get("resolution").asText(); + + response.groupid = Integer.parseInt(group.get("id").asText()); + if (response.groupid != 0) { password = group.get("password").asText(); - correctPassword = ConnectionManager.getGroupPool().get(selectedId).password; + correctPassword = ConnectionManager.getGroupPool().get(response.groupid).password; } } catch (Exception e) { LOGGER.info("Error reading group", e); tryAgain = true; } - if (selectedId != 0 && correctPassword != null && !password.equals(correctPassword)) { + if (response.groupid != 0 && correctPassword != null && !password.equals(correctPassword)) { tryAgain = true; message = "Wrong password!"; } @@ -125,7 +132,7 @@ public class BwlpAuthenticationProvider implements AuthenticationProvider { )); } - return selectedId; + return response; } public void shutdown() { diff --git a/src/main/java/de/bwlehrpool/bwlp_guac/BwlpUserContext.java b/src/main/java/de/bwlehrpool/bwlp_guac/BwlpUserContext.java index 2fcc6a6..88208b9 100644 --- a/src/main/java/de/bwlehrpool/bwlp_guac/BwlpUserContext.java +++ b/src/main/java/de/bwlehrpool/bwlp_guac/BwlpUserContext.java @@ -31,6 +31,7 @@ public class BwlpUserContext extends AbstractUserContext { private final AuthenticatedUser authUser; private final UserContext originalContext; private final Integer groupid; + private final String resolution; /** * The Directory with access to all connections within the root group associated @@ -38,11 +39,12 @@ public class BwlpUserContext extends AbstractUserContext { */ private Directory connectionDirectory; - public BwlpUserContext(AuthenticatedUser authenticatedUser, UserContext context, int groupid) + public BwlpUserContext(AuthenticatedUser authenticatedUser, UserContext context, int groupid, String resolution) throws GuacamoleCredentialsException { authUser = authenticatedUser; originalContext = context; this.groupid = groupid; + this.resolution = resolution; // OK addConn(); } @@ -51,12 +53,14 @@ public class BwlpUserContext extends AbstractUserContext { authUser = authenticatedUser; originalContext = context; this.groupid = -1; + this.resolution = ""; connectionDirectory = new SimpleDirectory(exConn); } private void addConn() throws GuacamoleCredentialsException { WrappedConnection connection = ConnectionManager.getForUser(authUser.getCredentials().getUsername(), groupid); if (connection != null) { + connection.remoteLogin(authUser.getCredentials(), this.resolution); connection.setContext(this); connectionDirectory = new SimpleDirectory(connection); } else { diff --git a/src/main/java/de/bwlehrpool/bwlp_guac/WrappedConnection.java b/src/main/java/de/bwlehrpool/bwlp_guac/WrappedConnection.java index 95a014b..8dedd15 100644 --- a/src/main/java/de/bwlehrpool/bwlp_guac/WrappedConnection.java +++ b/src/main/java/de/bwlehrpool/bwlp_guac/WrappedConnection.java @@ -1,5 +1,6 @@ package de.bwlehrpool.bwlp_guac; +import org.apache.guacamole.net.auth.Credentials; import org.apache.guacamole.net.auth.simple.SimpleConnection; import org.apache.guacamole.protocol.GuacamoleConfiguration; @@ -43,4 +44,8 @@ public class WrappedConnection extends SimpleConnection { this.context = context; } + public void remoteLogin(Credentials credentials, String resolution) { + this.ac.remoteLogin(credentials, resolution); + } + } diff --git a/src/main/resources/controllers/groupFieldController.js b/src/main/resources/controllers/groupFieldController.js index 3b6f9ea..f49862b 100644 --- a/src/main/resources/controllers/groupFieldController.js +++ b/src/main/resources/controllers/groupFieldController.js @@ -1,6 +1,6 @@ angular.module('group').controller('groupFieldController', ['$scope', function groupFieldController($scope) { - $scope.data = { id: 0, password: '' }; + $scope.data = { id: 0, password: '', resolution: window.screen.innerWidth + 'x' + window.screen.innerHeight }; $scope.$watch('data', function(newValue) { if (window.location.hash !== '#/') { -- cgit v1.2.3-55-g7522