diff --git a/pom.xml b/pom.xml index e4d5b7625..94b404d3f 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ WebGoat 4.0.0 org.owasp.webgoat - WebGoat-Container + webgoat-container war 6.1.0 @@ -37,6 +37,7 @@ org.apache.maven.plugins maven-compiler-plugin + 3.1 1.7 1.7 @@ -46,15 +47,15 @@ org.apache.maven.plugins maven-war-plugin - + 2.4 false - - true - + + true + ${project.name} ${project.version} @@ -64,15 +65,31 @@ - org.apache.maven.plugins - maven-jar-plugin + maven-war-plugin + 2.6 + + true + + + + org.codehaus.mojo + build-helper-maven-plugin + 1.7 - create-jar - compile + attach-artifacts + package - jar + attach-artifact + + + + ${project.build.directory}/WebGoat-Container-${project.version}-classes.jar + classes-jar + + + @@ -94,7 +111,7 @@ package - + @@ -190,7 +207,7 @@ log4j 1.2.17 - + wsdl4j wsdl4j @@ -239,7 +256,7 @@ spring-core ${org.springframework.version} - + com.fasterxml.jackson.core @@ -354,8 +371,9 @@ 1.7.7 jar - - - + + + + diff --git a/src/main/java/org/owasp/webgoat/lessons/AbstractLesson.java b/src/main/java/org/owasp/webgoat/lessons/AbstractLesson.java index 524f3123b..36aab1e60 100644 --- a/src/main/java/org/owasp/webgoat/lessons/AbstractLesson.java +++ b/src/main/java/org/owasp/webgoat/lessons/AbstractLesson.java @@ -161,6 +161,7 @@ public abstract class AbstractLesson extends Screen implements Comparable classes) { + ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); + PluginClassLoader pluginClassLoader = new PluginClassLoader(contextClassLoader); for (Map.Entry clazz : classes.entrySet()) { - loadClass(clazz.getKey(), clazz.getValue()); + loadClass(pluginClassLoader, clazz.getKey(), clazz.getValue()); } if (lesson == null) { throw new PluginLoadingFailure(String - .format("Lesson class not found, following classes were detected in the plugin: %s", - StringUtils.collectionToCommaDelimitedString(classes.keySet()))); + .format("Lesson class not found, following classes were detected in the plugin: %s", + StringUtils.collectionToCommaDelimitedString(classes.keySet()))); } } - private void loadClass(String name, byte[] classFile) { - ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); - PluginClassLoader pluginClassLoader = new PluginClassLoader(contextClassLoader, name, classFile); - try { - String realClassName = name.replaceFirst("/", "").replaceAll("/", ".").replaceAll(".class", ""); - Class clazz = pluginClassLoader.loadClass(realClassName); - if (AbstractLesson.class.isAssignableFrom(clazz)) { - this.lesson = clazz; - } - } catch (ClassNotFoundException e) { - logger.error("Unable to load class {}", name); + private void loadClass(PluginClassLoader pluginClassLoader, String name, byte[] classFile) { + String realClassName = name.replaceFirst("/", "").replaceAll("/", ".").replaceAll(".class", ""); + + Class clazz = pluginClassLoader.loadClass(realClassName, classFile); + if (AbstractLesson.class.isAssignableFrom(clazz)) { + this.lesson = clazz; } } @@ -97,7 +94,7 @@ public class Plugin { Files.copy(file, bos); Path propertiesPath = createPropertiesDirectory(); ResourceBundleClassLoader.setPropertiesPath(propertiesPath); - if ( reload ) { + if (reload) { Files.write(propertiesPath.resolve(file.getFileName()), bos.toByteArray(), CREATE, APPEND); } else { Files.write(propertiesPath.resolve(file.getFileName()), bos.toByteArray(), CREATE, TRUNCATE_EXISTING); @@ -117,8 +114,14 @@ public class Plugin { public void rewritePaths(Path pluginTarget) { try { - PluginFileUtils.replaceInFiles(this.lesson.getSimpleName() + "_files", pluginTarget.getFileName().toString() + "/plugin/" + this.lesson.getSimpleName() + "/lessonSolutions/en/" + this.lesson.getSimpleName() + "_files", solutionLanguageFiles.values()); - PluginFileUtils.replaceInFiles(this.lesson.getSimpleName() + "_files", pluginTarget.getFileName().toString() + "/plugin/" + this.lesson.getSimpleName() + "/lessonPlans/en/" + this.lesson.getSimpleName() + "_files", lessonPlansLanguageFiles.values()); + PluginFileUtils.replaceInFiles(this.lesson.getSimpleName() + "_files", + pluginTarget.getFileName().toString() + "/plugin/" + this.lesson + .getSimpleName() + "/lessonSolutions/en/" + this.lesson.getSimpleName() + "_files", + solutionLanguageFiles.values()); + PluginFileUtils.replaceInFiles(this.lesson.getSimpleName() + "_files", + pluginTarget.getFileName().toString() + "/plugin/" + this.lesson + .getSimpleName() + "/lessonPlans/en/" + this.lesson.getSimpleName() + "_files", + lessonPlansLanguageFiles.values()); } catch (IOException e) { throw new PluginLoadingFailure("Unable to rewrite the paths in the solutions", e); } diff --git a/src/main/java/org/owasp/webgoat/plugins/PluginClassLoader.java b/src/main/java/org/owasp/webgoat/plugins/PluginClassLoader.java index 6af81a6d3..b5796c0f0 100644 --- a/src/main/java/org/owasp/webgoat/plugins/PluginClassLoader.java +++ b/src/main/java/org/owasp/webgoat/plugins/PluginClassLoader.java @@ -1,22 +1,42 @@ package org.owasp.webgoat.plugins; +import com.google.common.base.Optional; +import com.google.common.base.Predicate; +import com.google.common.collect.FluentIterable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.ArrayList; +import java.util.List; + public class PluginClassLoader extends ClassLoader { + private final List> classes = new ArrayList<>(); private final Logger logger = LoggerFactory.getLogger(Plugin.class); - private final byte[] classFile; - public PluginClassLoader(ClassLoader parent, String nameOfClass, byte[] classFile) { - super(parent); - logger.debug("Creating class loader for {}", nameOfClass); - this.classFile = classFile; + public Class loadClass(String nameOfClass, byte[] classFile) { + Class clazz = defineClass(nameOfClass, classFile, 0, classFile.length); + classes.add(clazz); + return clazz; } - public Class findClass(String name) { + public PluginClassLoader(ClassLoader contextClassLoader) { + super(contextClassLoader); + } + + public Class findClass(final String name) throws ClassNotFoundException { logger.debug("Finding class " + name); - return defineClass(name, classFile, 0, classFile.length); + Optional> foundClass = FluentIterable.from(classes) + .firstMatch(new Predicate>() { + @Override + public boolean apply(Class clazz) { + return clazz.getName().equals(name); + } + }); + if (foundClass.isPresent()) { + return foundClass.get(); + } + throw new ClassNotFoundException("Class " + name + " not found"); } } diff --git a/src/main/java/org/owasp/webgoat/plugins/PluginsLoader.java b/src/main/java/org/owasp/webgoat/plugins/PluginsLoader.java index 6201f6542..5786462d7 100644 --- a/src/main/java/org/owasp/webgoat/plugins/PluginsLoader.java +++ b/src/main/java/org/owasp/webgoat/plugins/PluginsLoader.java @@ -43,7 +43,7 @@ public class PluginsLoader implements Runnable { plugins.add(plugin); } } catch (Plugin.PluginLoadingFailure e) { - logger.error("Unable to load plugin, continue loading others..."); + logger.error("Unable to load plugin, continue loading others...", e); } return FileVisitResult.CONTINUE; } diff --git a/src/main/java/org/owasp/webgoat/session/ErrorScreen.java b/src/main/java/org/owasp/webgoat/session/ErrorScreen.java index 07fe1e4fd..687e72b6b 100644 --- a/src/main/java/org/owasp/webgoat/session/ErrorScreen.java +++ b/src/main/java/org/owasp/webgoat/session/ErrorScreen.java @@ -209,11 +209,6 @@ public class ErrorScreen extends Screen return (new Small().addElement(list)); } - public Element getCredits() - { - return new ElementContainer(); - } - /** * Description of the Method * diff --git a/src/main/java/org/owasp/webgoat/session/Screen.java b/src/main/java/org/owasp/webgoat/session/Screen.java index 0a85cd496..d19c46d01 100644 --- a/src/main/java/org/owasp/webgoat/session/Screen.java +++ b/src/main/java/org/owasp/webgoat/session/Screen.java @@ -79,12 +79,6 @@ public abstract class Screen { */ protected abstract Element createContent(WebSession s); - /** - * Gets the credits attribute of the Screen object - * - * @return The credits value - */ - public abstract Element getCredits(); /** * Creates a new lessonTracker object. diff --git a/src/main/webapp/main.jsp b/src/main/webapp/main.jsp index 7e704027d..eeb9c9e06 100644 --- a/src/main/webapp/main.jsp +++ b/src/main/webapp/main.jsp @@ -278,9 +278,6 @@ <% } %> -
- <% out.println(currentLesson.getCredits());%> -