Repository: incubator-guacamole-client
Updated Branches:
  refs/heads/master 5f1927166 -> 1b26600ca


GUACAMOLE-289: Add getResource() functions to UserContext and 
AuthenticationProvider, allowing extensions to expose arbitrary REST 
resources/services.


Project: http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/commit/4455cbc7
Tree: 
http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/tree/4455cbc7
Diff: 
http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/diff/4455cbc7

Branch: refs/heads/master
Commit: 4455cbc78124365dd7a3247afa7f651715cf763c
Parents: 0c2bcdb
Author: Michael Jumper <[email protected]>
Authored: Sat Apr 29 12:34:32 2017 -0700
Committer: Michael Jumper <[email protected]>
Committed: Sat Apr 29 12:34:32 2017 -0700

----------------------------------------------------------------------
 .../auth/duo/DuoAuthenticationProvider.java     |   5 +
 .../HTTPHeaderAuthenticationProvider.java       |   5 +
 .../jdbc/InjectedAuthenticationProvider.java    |   5 +
 .../jdbc/sharing/user/SharedUserContext.java    |   5 +
 .../auth/jdbc/user/ModeledUserContext.java      |   5 +
 .../auth/ldap/LDAPAuthenticationProvider.java   |   5 +
 .../guacamole/auth/ldap/user/UserContext.java   |   5 +
 .../net/auth/AuthenticationProvider.java        |  20 ++++
 .../apache/guacamole/net/auth/UserContext.java  |  20 ++++
 .../simple/SimpleAuthenticationProvider.java    |   5 +
 .../net/auth/simple/SimpleUserContext.java      |   5 +
 .../extension/AuthenticationProviderFacade.java |  14 +++
 .../guacamole/rest/RESTServiceModule.java       |   2 +
 .../rest/extension/ExtensionRESTService.java    | 104 +++++++++++++++++++
 .../guacamole/rest/extension/package-info.java  |  23 ++++
 .../rest/session/UserContextResource.java       |  26 +++++
 16 files changed, 254 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/blob/4455cbc7/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/DuoAuthenticationProvider.java
----------------------------------------------------------------------
diff --git 
a/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/DuoAuthenticationProvider.java
 
b/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/DuoAuthenticationProvider.java
index ccb1c40..f998996 100644
--- 
a/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/DuoAuthenticationProvider.java
+++ 
b/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/DuoAuthenticationProvider.java
@@ -63,6 +63,11 @@ public class DuoAuthenticationProvider implements 
AuthenticationProvider {
     }
 
     @Override
+    public Object getResource() {
+        return null;
+    }
+
+    @Override
     public AuthenticatedUser authenticateUser(Credentials credentials)
             throws GuacamoleException {
         return null;

http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/blob/4455cbc7/extensions/guacamole-auth-header/src/main/java/org/apache/guacamole/auth/header/HTTPHeaderAuthenticationProvider.java
----------------------------------------------------------------------
diff --git 
a/extensions/guacamole-auth-header/src/main/java/org/apache/guacamole/auth/header/HTTPHeaderAuthenticationProvider.java
 
b/extensions/guacamole-auth-header/src/main/java/org/apache/guacamole/auth/header/HTTPHeaderAuthenticationProvider.java
index 8729b08..1721f16 100644
--- 
a/extensions/guacamole-auth-header/src/main/java/org/apache/guacamole/auth/header/HTTPHeaderAuthenticationProvider.java
+++ 
b/extensions/guacamole-auth-header/src/main/java/org/apache/guacamole/auth/header/HTTPHeaderAuthenticationProvider.java
@@ -64,6 +64,11 @@ public class HTTPHeaderAuthenticationProvider implements 
AuthenticationProvider
     }
 
     @Override
+    public Object getResource() {
+        return null;
+    }
+
+    @Override
     public AuthenticatedUser authenticateUser(Credentials credentials)
             throws GuacamoleException {
 

http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/blob/4455cbc7/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/InjectedAuthenticationProvider.java
----------------------------------------------------------------------
diff --git 
a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/InjectedAuthenticationProvider.java
 
b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/InjectedAuthenticationProvider.java
index 4c5918b..d06d6ed 100644
--- 
a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/InjectedAuthenticationProvider.java
+++ 
b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/InjectedAuthenticationProvider.java
@@ -71,6 +71,11 @@ public abstract class InjectedAuthenticationProvider 
implements AuthenticationPr
     }
 
     @Override
+    public Object getResource() throws GuacamoleException {
+        return null;
+    }
+
+    @Override
     public AuthenticatedUser authenticateUser(Credentials credentials)
             throws GuacamoleException {
         return authProviderService.authenticateUser(this, credentials);

http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/blob/4455cbc7/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUserContext.java
----------------------------------------------------------------------
diff --git 
a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUserContext.java
 
b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUserContext.java
index 21f97e3..cad1bab 100644
--- 
a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUserContext.java
+++ 
b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUserContext.java
@@ -137,6 +137,11 @@ public class SharedUserContext implements UserContext {
     }
 
     @Override
+    public Object getResource() throws GuacamoleException {
+        return null;
+    }
+
+    @Override
     public AuthenticationProvider getAuthenticationProvider() {
         return authProvider;
     }

http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/blob/4455cbc7/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUserContext.java
----------------------------------------------------------------------
diff --git 
a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUserContext.java
 
b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUserContext.java
index fdeb64d..d43c3c1 100644
--- 
a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUserContext.java
+++ 
b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUserContext.java
@@ -117,6 +117,11 @@ public class ModeledUserContext extends RestrictedObject
     }
 
     @Override
+    public Object getResource() throws GuacamoleException {
+        return null;
+    }
+
+    @Override
     public AuthenticationProvider getAuthenticationProvider() {
         return getCurrentUser().getModelAuthenticationProvider();
     }

http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/blob/4455cbc7/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/LDAPAuthenticationProvider.java
----------------------------------------------------------------------
diff --git 
a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/LDAPAuthenticationProvider.java
 
b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/LDAPAuthenticationProvider.java
index 001f2c6..1db4ee9 100644
--- 
a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/LDAPAuthenticationProvider.java
+++ 
b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/LDAPAuthenticationProvider.java
@@ -69,6 +69,11 @@ public class LDAPAuthenticationProvider implements 
AuthenticationProvider {
     }
 
     @Override
+    public String getResource() {
+        return null;
+    }
+
+    @Override
     public AuthenticatedUser authenticateUser(Credentials credentials) throws 
GuacamoleException {
 
         AuthenticationProviderService authProviderService = 
injector.getInstance(AuthenticationProviderService.class);

http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/blob/4455cbc7/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/user/UserContext.java
----------------------------------------------------------------------
diff --git 
a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/user/UserContext.java
 
b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/user/UserContext.java
index 0f693fb..2c4703c 100644
--- 
a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/user/UserContext.java
+++ 
b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/user/UserContext.java
@@ -160,6 +160,11 @@ public class UserContext implements 
org.apache.guacamole.net.auth.UserContext {
     }
 
     @Override
+    public String getResource() {
+        return null;
+    }
+
+    @Override
     public AuthenticationProvider getAuthenticationProvider() {
         return authProvider;
     }

http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/blob/4455cbc7/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AuthenticationProvider.java
----------------------------------------------------------------------
diff --git 
a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AuthenticationProvider.java
 
b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AuthenticationProvider.java
index 977b3b6..401754d 100644
--- 
a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AuthenticationProvider.java
+++ 
b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AuthenticationProvider.java
@@ -41,6 +41,26 @@ public interface AuthenticationProvider {
     String getIdentifier();
 
     /**
+     * Returns an arbitrary REST resource. The REST resource returned must be
+     * properly annotated with JSR-311 annotations, and may serve as the root
+     * resource for any number of extension-specific REST resources which are
+     * unrelated to an authenticated user's session. The returned resource is
+     * ultimately exposed at ".../api/ext/IDENTIFIER/", where IDENTIFIER is the
+     * identifier of the AuthenticationProvider.
+     *
+     * REST resources which ARE related to an authenticated user's session
+     * should instead be returned from UserContext.getResource().
+     *
+     * @return
+     *     An arbitrary REST resource, annotated with JSR-311 annotations, or
+     *     null if no such resource is defined.
+     *
+     * @throws GuacamoleException
+     *     If the REST resource cannot be returned due to an error.
+     */
+    Object getResource() throws GuacamoleException;
+
+    /**
      * Returns an AuthenticatedUser representing the user authenticated by the
      * given credentials, if any.
      *

http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/blob/4455cbc7/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/UserContext.java
----------------------------------------------------------------------
diff --git 
a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/UserContext.java 
b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/UserContext.java
index 42f2a37..7c48337 100644
--- a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/UserContext.java
+++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/UserContext.java
@@ -39,6 +39,26 @@ public interface UserContext {
     User self();
 
     /**
+     * Returns an arbitrary REST resource. The REST resource returned must be
+     * properly annotated with JSR-311 annotations, and may serve as the root
+     * resource for any number of extension-specific REST resources related to
+     * an authenticated user's session. The returned resource is ultimately
+     * exposed at ".../api/session/data/IDENTIFIER/ext/", where IDENTIFIER is
+     * the identifier of the AuthenticationProvider.
+     *
+     * REST resources which are NOT related to an authenticated user's session
+     * should instead be returned from AuthenticationProvider.getResource().
+     *
+     * @return
+     *     An arbitrary REST resource, annotated with JSR-311 annotations, or
+     *     null if no such resource is defined.
+     *
+     * @throws GuacamoleException
+     *     If the REST resource cannot be returned due to an error.
+     */
+    Object getResource() throws GuacamoleException;
+
+    /**
      * Returns the AuthenticationProvider which created this UserContext, which
      * may not be the same AuthenticationProvider that authenticated the user
      * associated with this UserContext.

http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/blob/4455cbc7/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleAuthenticationProvider.java
----------------------------------------------------------------------
diff --git 
a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleAuthenticationProvider.java
 
b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleAuthenticationProvider.java
index db70651..96766cb 100644
--- 
a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleAuthenticationProvider.java
+++ 
b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleAuthenticationProvider.java
@@ -204,6 +204,11 @@ public abstract class SimpleAuthenticationProvider
     }
 
     @Override
+    public Object getResource() throws GuacamoleException {
+        return null;
+    }
+
+    @Override
     public AuthenticatedUser authenticateUser(final Credentials credentials)
             throws GuacamoleException {
 

http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/blob/4455cbc7/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUserContext.java
----------------------------------------------------------------------
diff --git 
a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUserContext.java
 
b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUserContext.java
index c2d512b..1e55db9 100644
--- 
a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUserContext.java
+++ 
b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUserContext.java
@@ -164,6 +164,11 @@ public class SimpleUserContext implements UserContext {
     }
 
     @Override
+    public Object getResource() throws GuacamoleException {
+        return null;
+    }
+
+    @Override
     public AuthenticationProvider getAuthenticationProvider() {
         return authProvider;
     }

http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/blob/4455cbc7/guacamole/src/main/java/org/apache/guacamole/extension/AuthenticationProviderFacade.java
----------------------------------------------------------------------
diff --git 
a/guacamole/src/main/java/org/apache/guacamole/extension/AuthenticationProviderFacade.java
 
b/guacamole/src/main/java/org/apache/guacamole/extension/AuthenticationProviderFacade.java
index b1c671c..e1ed5ff 100644
--- 
a/guacamole/src/main/java/org/apache/guacamole/extension/AuthenticationProviderFacade.java
+++ 
b/guacamole/src/main/java/org/apache/guacamole/extension/AuthenticationProviderFacade.java
@@ -135,6 +135,20 @@ public class AuthenticationProviderFacade implements 
AuthenticationProvider {
     }
 
     @Override
+    public Object getResource() throws GuacamoleException {
+
+        // Ignore auth attempts if no auth provider could be loaded
+        if (authProvider == null) {
+            logger.warn("The authentication system could not be loaded. Please 
check for errors earlier in the logs.");
+            return null;
+        }
+
+        // Delegate to underlying auth provider
+        return authProvider.getResource();
+
+    }
+
+    @Override
     public AuthenticatedUser authenticateUser(Credentials credentials)
             throws GuacamoleException {
 

http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/blob/4455cbc7/guacamole/src/main/java/org/apache/guacamole/rest/RESTServiceModule.java
----------------------------------------------------------------------
diff --git 
a/guacamole/src/main/java/org/apache/guacamole/rest/RESTServiceModule.java 
b/guacamole/src/main/java/org/apache/guacamole/rest/RESTServiceModule.java
index 95be583..cab4d97 100644
--- a/guacamole/src/main/java/org/apache/guacamole/rest/RESTServiceModule.java
+++ b/guacamole/src/main/java/org/apache/guacamole/rest/RESTServiceModule.java
@@ -36,6 +36,7 @@ import 
org.apache.guacamole.rest.auth.SecureRandomAuthTokenGenerator;
 import org.apache.guacamole.rest.auth.TokenSessionMap;
 import org.apache.guacamole.rest.connection.ConnectionModule;
 import org.apache.guacamole.rest.connectiongroup.ConnectionGroupModule;
+import org.apache.guacamole.rest.extension.ExtensionRESTService;
 import org.apache.guacamole.rest.language.LanguageRESTService;
 import org.apache.guacamole.rest.patch.PatchRESTService;
 import org.apache.guacamole.rest.session.SessionResourceFactory;
@@ -84,6 +85,7 @@ public class RESTServiceModule extends ServletModule {
         bindInterceptor(Matchers.any(), new RESTMethodMatcher(), interceptor);
 
         // Set up the API endpoints
+        bind(ExtensionRESTService.class);
         bind(LanguageRESTService.class);
         bind(PatchRESTService.class);
         bind(TokenRESTService.class);

http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/blob/4455cbc7/guacamole/src/main/java/org/apache/guacamole/rest/extension/ExtensionRESTService.java
----------------------------------------------------------------------
diff --git 
a/guacamole/src/main/java/org/apache/guacamole/rest/extension/ExtensionRESTService.java
 
b/guacamole/src/main/java/org/apache/guacamole/rest/extension/ExtensionRESTService.java
new file mode 100644
index 0000000..487bb7c
--- /dev/null
+++ 
b/guacamole/src/main/java/org/apache/guacamole/rest/extension/ExtensionRESTService.java
@@ -0,0 +1,104 @@
+/*
+ * 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.rest.extension;
+
+import com.google.inject.Inject;
+import java.util.List;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import org.apache.guacamole.GuacamoleException;
+import org.apache.guacamole.GuacamoleResourceNotFoundException;
+import org.apache.guacamole.net.auth.AuthenticationProvider;
+
+/**
+ * A REST service which provides access to extension-specific REST resources,
+ * each exposed by the identifier of that extension's AuthenticationProvider.
+ */
+@Path("/ext")
+public class ExtensionRESTService {
+
+    /**
+     * All configured authentication providers.
+     */
+    @Inject
+    private List<AuthenticationProvider> authProviders;
+
+    /**
+     * Returns the AuthenticationProvider having the given identifier. If no
+     * such AuthenticationProvider has been loaded, null is returned.
+     *
+     * @param identifier
+     *     The identifier of the AuthenticationProvider to locate.
+     *
+     * @return
+     *     The AuthenticationProvider having the given identifier, or null if
+     *     no such AuthenticationProvider is loaded.
+     */
+    private AuthenticationProvider getAuthenticationProvider(String 
identifier) {
+
+        // Iterate through all installed AuthenticationProviders, searching for
+        // the given identifier
+        for (AuthenticationProvider authProvider : authProviders) {
+            if (authProvider.getIdentifier().equals(identifier))
+                return authProvider;
+        }
+
+        // No such AuthenticationProvider found
+        return null;
+
+    }
+
+    /**
+     * Returns the arbitrary REST resource exposed by the 
AuthenticationProvider
+     * having the given identifier.
+     *
+     * @param identifier
+     *     The identifier of the AuthenticationProvider whose REST resource
+     *     should be retrieved.
+     *
+     * @return
+     *     The arbitrary REST resource exposed by the AuthenticationProvider
+     *     having the given identifier.
+     *
+     * @throws GuacamoleException
+     *     If no such resource could be found, or if an error occurs while
+     *     retrieving that resource.
+     */
+    @Path("{identifier}")
+    public Object getExtensionResource(@PathParam("identifier") String 
identifier)
+            throws GuacamoleException {
+
+        // Retrieve authentication provider having given identifier
+        AuthenticationProvider authProvider = 
getAuthenticationProvider(identifier);
+        if (authProvider != null) {
+
+            // Pull resource from authentication provider
+            Object resource = authProvider.getResource();
+            if (resource != null)
+                return resource;
+
+        }
+
+        // AuthenticationProvider-specific resource could not be found
+        throw new GuacamoleResourceNotFoundException("No such resource.");
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/blob/4455cbc7/guacamole/src/main/java/org/apache/guacamole/rest/extension/package-info.java
----------------------------------------------------------------------
diff --git 
a/guacamole/src/main/java/org/apache/guacamole/rest/extension/package-info.java 
b/guacamole/src/main/java/org/apache/guacamole/rest/extension/package-info.java
new file mode 100644
index 0000000..4e86a4c
--- /dev/null
+++ 
b/guacamole/src/main/java/org/apache/guacamole/rest/extension/package-info.java
@@ -0,0 +1,23 @@
+/*
+ * 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.
+ */
+
+/**
+ * Classes related to the arbitrary REST services exposed by extensions.
+ */
+package org.apache.guacamole.rest.extension;

http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/blob/4455cbc7/guacamole/src/main/java/org/apache/guacamole/rest/session/UserContextResource.java
----------------------------------------------------------------------
diff --git 
a/guacamole/src/main/java/org/apache/guacamole/rest/session/UserContextResource.java
 
b/guacamole/src/main/java/org/apache/guacamole/rest/session/UserContextResource.java
index 29b443f..b2e5eaa 100644
--- 
a/guacamole/src/main/java/org/apache/guacamole/rest/session/UserContextResource.java
+++ 
b/guacamole/src/main/java/org/apache/guacamole/rest/session/UserContextResource.java
@@ -29,6 +29,7 @@ import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import org.apache.guacamole.GuacamoleException;
+import org.apache.guacamole.GuacamoleResourceNotFoundException;
 import org.apache.guacamole.net.auth.ActiveConnection;
 import org.apache.guacamole.net.auth.Connection;
 import org.apache.guacamole.net.auth.ConnectionGroup;
@@ -253,4 +254,29 @@ public class UserContextResource {
         return new SchemaResource(userContext);
     }
 
+    /**
+     * Returns the arbitrary REST resource exposed by the UserContext exposed
+     * by this UserContextResource.
+     *
+     * @return
+     *     The arbitrary REST resource exposed by the UserContext exposed by
+     *     this UserContextresource.
+     *
+     * @throws GuacamoleException
+     *     If no such resource could be found, or if an error occurs while
+     *     retrieving that resource.
+     */
+    @Path("ext")
+    public Object getExtensionResource() throws GuacamoleException {
+
+        // Pull resource from user context
+        Object resource = userContext.getResource();
+        if (resource != null)
+            return resource;
+
+        // UserContext-specific resource could not be found
+        throw new GuacamoleResourceNotFoundException("No such resource.");
+
+    }
+
 }

Reply via email to