You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@guacamole.apache.org by vn...@apache.org on 2018/10/06 12:11:15 UTC

[5/7] guacamole-client git commit: GUACAMOLE-524: Add convenience classes for injecting custom parameter tokens through decoration.

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 <mj...@apache.org>
Authored: Thu Oct 4 21:17:22 2018 -0700
Committer: Michael Jumper <mj...@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();
+            }
+
+        };
+    }
+
+}