GUACAMOLE-524: Add convenience classes for injecting custom parameter tokens through decoration.
Project: http://git-wip-us.apache.org/repos/asf/guacamole-client/repo Commit: http://git-wip-us.apache.org/repos/asf/guacamole-client/commit/0d7cff5f Tree: http://git-wip-us.apache.org/repos/asf/guacamole-client/tree/0d7cff5f Diff: http://git-wip-us.apache.org/repos/asf/guacamole-client/diff/0d7cff5f Branch: refs/heads/master Commit: 0d7cff5f2d394fa7a7d8a5878895f3b5b9ffea4d Parents: 7a3f51b Author: Michael Jumper <mjum...@apache.org> Authored: Thu Oct 4 21:17:22 2018 -0700 Committer: Michael Jumper <mjum...@apache.org> Committed: Fri Oct 5 12:47:26 2018 -0700 ---------------------------------------------------------------------- .../net/auth/TokenInjectingConnection.java | 69 +++++++++ .../net/auth/TokenInjectingConnectionGroup.java | 69 +++++++++ .../net/auth/TokenInjectingUserContext.java | 144 +++++++++++++++++++ 3 files changed, 282 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/0d7cff5f/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/TokenInjectingConnection.java ---------------------------------------------------------------------- diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/TokenInjectingConnection.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/TokenInjectingConnection.java new file mode 100644 index 0000000..8a826d8 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/TokenInjectingConnection.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.HashMap; +import java.util.Map; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.protocol.GuacamoleClientInformation; + +/** + * Connection implementation which overrides the connect() function of an + * underlying Connection, adding a given set of parameter tokens to the tokens + * already supplied. + */ +public class TokenInjectingConnection extends DelegatingConnection { + + /** + * The additional tokens to include with each call to connect(). + */ + private final Map<String, String> tokens; + + /** + * Wraps the given Connection, automatically adding the given tokens to + * each invocation of connect(). Any additional tokens which have the same + * name as existing tokens will override the existing values. + * + * @param connection + * The Connection to wrap. + * + * @param tokens + * The additional tokens to include with each call to connect(). + */ + public TokenInjectingConnection(Connection connection, + Map<String, String> tokens) { + super(connection); + this.tokens = tokens; + } + + @Override + public GuacamoleTunnel connect(GuacamoleClientInformation info, + Map<String, String> tokens) throws GuacamoleException { + + // Apply provided tokens over those given to connect() + tokens = new HashMap<>(tokens); + tokens.putAll(this.tokens); + + return super.connect(info, tokens); + + } + +} http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/0d7cff5f/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/TokenInjectingConnectionGroup.java ---------------------------------------------------------------------- diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/TokenInjectingConnectionGroup.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/TokenInjectingConnectionGroup.java new file mode 100644 index 0000000..0ec93ba --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/TokenInjectingConnectionGroup.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.HashMap; +import java.util.Map; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.GuacamoleTunnel; +import org.apache.guacamole.protocol.GuacamoleClientInformation; + +/** + * ConnectionGroup implementation which overrides the connect() function of an + * underlying ConnectionGroup, adding a given set of parameter tokens to the + * tokens already supplied. + */ +public class TokenInjectingConnectionGroup extends DelegatingConnectionGroup { + + /** + * The additional tokens to include with each call to connect(). + */ + private final Map<String, String> tokens; + + /** + * Wraps the given ConnectionGroup, automatically adding the given tokens + * to each invocation of connect(). Any additional tokens which have the + * same name as existing tokens will override the existing values. + * + * @param connectionGroup + * The ConnectionGroup to wrap. + * + * @param tokens + * The additional tokens to include with each call to connect(). + */ + public TokenInjectingConnectionGroup(ConnectionGroup connectionGroup, + Map<String, String> tokens) { + super(connectionGroup); + this.tokens = tokens; + } + + @Override + public GuacamoleTunnel connect(GuacamoleClientInformation info, + Map<String, String> tokens) throws GuacamoleException { + + // Apply provided tokens over those given to connect() + tokens = new HashMap<>(tokens); + tokens.putAll(this.tokens); + + return super.connect(info, tokens); + + } + +} http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/0d7cff5f/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/TokenInjectingUserContext.java ---------------------------------------------------------------------- diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/TokenInjectingUserContext.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/TokenInjectingUserContext.java new file mode 100644 index 0000000..a1ede96 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/TokenInjectingUserContext.java @@ -0,0 +1,144 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.net.auth; + +import java.util.Collections; +import java.util.Map; +import org.apache.guacamole.GuacamoleException; + +/** + * UserContext implementation which decorates a given UserContext, + * automatically applying additional parameter tokens during the connection + * process of any retrieved Connections and ConnectionGroups. + */ +public class TokenInjectingUserContext extends DelegatingUserContext { + + /** + * The additional tokens to include with each call to connect() if + * getTokens() is not overridden. + */ + private final Map<String, String> tokens; + + /** + * Wraps the given UserContext, overriding the connect() function of each + * retrieved Connection and ConnectionGroup such that the given additional + * parameter tokens are included. Any additional tokens which have the same + * name as existing tokens will override the existing values. If tokens + * specific to a particular connection or connection group need to be + * included, getTokens() may be overridden to provide a different set of + * tokens. + * + * @param userContext + * The UserContext to wrap. + * + * @param tokens + * The additional tokens to include with each call to connect(). + */ + public TokenInjectingUserContext(UserContext userContext, + Map<String, String> tokens) { + super(userContext); + this.tokens = tokens; + } + + /** + * Wraps the given UserContext, overriding the connect() function of each + * retrieved Connection and ConnectionGroup such that the additional + * parameter tokens returned by getTokens() are included. Any additional + * tokens which have the same name as existing tokens will override the + * existing values. + * + * @param userContext + * The UserContext to wrap. + */ + public TokenInjectingUserContext(UserContext userContext) { + this(userContext, Collections.<String, String>emptyMap()); + } + + /** + * Returns the tokens which should be added to an in-progress call to + * connect() for the given Connection. If not overridden, this function + * will return the tokens provided when this instance of + * TokenInjectingUserContext was created. + * + * @param connection + * The Connection on which connect() has been called. + * + * @return + * The tokens which should be added to the in-progress call to + * connect(). + */ + protected Map<String, String> getTokens(Connection connection) { + return tokens; + } + + /** + * Returns the tokens which should be added to an in-progress call to + * connect() for the given ConnectionGroup. If not overridden, this + * function will return the tokens provided when this instance of + * TokenInjectingUserContext was created. + * + * @param connectionGroup + * The ConnectionGroup on which connect() has been called. + * + * @return + * The tokens which should be added to the in-progress call to + * connect(). + */ + protected Map<String, String> getTokens(ConnectionGroup connectionGroup) { + return tokens; + } + + @Override + public Directory<ConnectionGroup> getConnectionGroupDirectory() + throws GuacamoleException { + return new DecoratingDirectory<ConnectionGroup>(super.getConnectionGroupDirectory()) { + + @Override + protected ConnectionGroup decorate(ConnectionGroup object) throws GuacamoleException { + return new TokenInjectingConnectionGroup(object, getTokens(object)); + } + + @Override + protected ConnectionGroup undecorate(ConnectionGroup object) throws GuacamoleException { + return ((TokenInjectingConnectionGroup) object).getDelegateConnectionGroup(); + } + + }; + } + + @Override + public Directory<Connection> getConnectionDirectory() + throws GuacamoleException { + return new DecoratingDirectory<Connection>(super.getConnectionDirectory()) { + + @Override + protected Connection decorate(Connection object) throws GuacamoleException { + return new TokenInjectingConnection(object, getTokens(object)); + } + + @Override + protected Connection undecorate(Connection object) throws GuacamoleException { + return ((TokenInjectingConnection) object).getDelegateConnection(); + } + + }; + } + +}