diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/token/StandardTokens.java b/guacamole-ext/src/main/java/org/apache/guacamole/token/StandardTokens.java index 8c4655ac4..4bf4221b7 100644 --- a/guacamole-ext/src/main/java/org/apache/guacamole/token/StandardTokens.java +++ b/guacamole-ext/src/main/java/org/apache/guacamole/token/StandardTokens.java @@ -41,6 +41,16 @@ public class StandardTokens { */ public static final String PASSWORD_TOKEN = "GUAC_PASSWORD"; + /** + * The name of the client token added via addStandardTokens(). + */ + public static final String CLIENT_HOST_TOKEN = "GUAC_CLIENT_HOST"; + + /** + * The IP of the client token added via addStandardTokens(). + */ + public static final String CLIENT_IP_TOKEN = "GUAC_CLIENT_IP"; + /** * The name of the date token (server-local time) added via * addStandardTokens(). @@ -115,6 +125,13 @@ public class StandardTokens { if (password != null) filter.setToken(PASSWORD_TOKEN, password); + // Add client hostname and ip tokens + HttpServletRequest request = credentials.getRequest(); + if (request != null) { + filter.setToken(CLIENT_HOST_TOKEN, request.getRemoteHost()); + filter.setToken(CLIENT_IP_TOKEN, request.getRemoteAddr()); + } + // Add any tokens which do not require credentials addStandardTokens(filter); diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/APIRequest.java b/guacamole/src/main/java/org/apache/guacamole/rest/APIRequest.java index 530b4dc74..6a49c3e76 100644 --- a/guacamole/src/main/java/org/apache/guacamole/rest/APIRequest.java +++ b/guacamole/src/main/java/org/apache/guacamole/rest/APIRequest.java @@ -41,6 +41,16 @@ public class APIRequest extends HttpServletRequestWrapper { */ private final Map parameters; + /** + * The remote hostname that initiated the request. + */ + private final String remoteHost; + + /** + * The remote ip address that initiated the request. + */ + private final String remoteAddr; + /** * Wraps the given HttpServletRequest, using the given MultivaluedMap to * provide all request parameters. All HttpServletRequest functions which @@ -58,6 +68,29 @@ public class APIRequest extends HttpServletRequestWrapper { super(request); + // Try a few methods to get client info. + String clientHostname = ""; + String clientAddress = ""; + if(request.getHeader("X-Guacamole-Client-Hostname") != "") { + this.remoteHost = request.getHeader("X-Guacamole-Client-Hostname"); + } else if(request.getHeader("X-Forwarded-For") != "") { + this.remoteHost = request.getHeader("X-Forwarded-For"); + } else if(request.getRemoteHost() != "") { + this.remoteHost = request.getRemoteHost(); + } else { + this.remoteHost = ""; + } + + if(request.getHeader("X-Guacamole-Client-IP") != "") { + this.remoteAddr = request.getHeader("X-Guacamole-Client-IP"); + } else if(request.getHeader("X-Forwarded-For") != "") { + this.remoteAddr = request.getHeader("X-Forwarded-For"); + } else if(request.getRemoteAddr() != "") { + this.remoteAddr = request.getRemoteAddr(); + } else { + this.remoteAddr = ""; + } + // Copy parameters from given MultivaluedMap this.parameters = new HashMap(parameters.size()); for (Map.Entry> entry : parameters.entrySet()) { @@ -101,4 +134,14 @@ public class APIRequest extends HttpServletRequestWrapper { } + @Override + public String getRemoteHost() { + return this.remoteHost; + } + + @Override + public String getRemoteAddr() { + return this.remoteAddr; + } + }