diff --git a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/extension/ExtensionModule.java b/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/extension/ExtensionModule.java index e2bae9bdf..99c20e377 100644 --- a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/extension/ExtensionModule.java +++ b/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/extension/ExtensionModule.java @@ -216,13 +216,20 @@ public class ExtensionModule extends ServletModule { return ALLOWED_GUACAMOLE_VERSIONS.contains(guacamoleVersion); } - @Override - protected void configureServlets() { - - // Load authentication provider from guacamole.properties for sake of backwards compatibility - Class authProviderProperty = getAuthProviderProperty(); - if (authProviderProperty != null) - bindAuthenticationProvider(authProviderProperty); + /** + * Loads all extensions within the GUACAMOLE_HOME/extensions directory, if + * any, adding their static resource to the given resoure collections. + * + * @param javaScriptResources + * A modifiable collection of static JavaScript resources which may + * receive new JavaScript resources from extensions. + * + * @param cssResources + * A modifiable collection of static CSS resources which may receive + * new CSS resources from extensions. + */ + private void loadExtensions(Collection javaScriptResources, + Collection cssResources) { // Retrieve and validate extensions directory File extensionsDir = new File(environment.getGuacamoleHome(), EXTENSIONS_DIRECTORY); @@ -239,14 +246,10 @@ public class ExtensionModule extends ServletModule { }); - // Init JavaScript resources with base guacamole.min.js - Collection javaScriptResources = new ArrayList(); - javaScriptResources.add(new WebApplicationResource(getServletContext(), "/guacamole.min.js")); - - // Init CSS resources with base guacamole.min.css - Collection cssResources = new ArrayList(); - cssResources.add(new WebApplicationResource(getServletContext(), "/guacamole.min.css")); - + // Verify contents are accessible + if (extensionFiles == null) + logger.warn("Although GUACAMOLE_HOME/" + EXTENSIONS_DIRECTORY + " exists, its contents cannot be read."); + // Load each extension within the extension directory for (File extensionFile : extensionFiles) { @@ -285,7 +288,28 @@ public class ExtensionModule extends ServletModule { } - // Default to basic auth if nothing else chosen/provided + } + + @Override + protected void configureServlets() { + + // Load authentication provider from guacamole.properties for sake of backwards compatibility + Class authProviderProperty = getAuthProviderProperty(); + if (authProviderProperty != null) + bindAuthenticationProvider(authProviderProperty); + + // Init JavaScript resources with base guacamole.min.js + Collection javaScriptResources = new ArrayList(); + javaScriptResources.add(new WebApplicationResource(getServletContext(), "/guacamole.min.js")); + + // Init CSS resources with base guacamole.min.css + Collection cssResources = new ArrayList(); + cssResources.add(new WebApplicationResource(getServletContext(), "/guacamole.min.css")); + + // Load all extensions + loadExtensions(javaScriptResources, cssResources); + + // Bind basic auth if nothing else chosen/provided if (boundAuthenticationProvider == null) { logger.info("Using default, \"basic\", XML-driven authentication."); bindAuthenticationProvider(BasicFileAuthenticationProvider.class);