diff --git a/src/main/java/org/owasp/webgoat/plugins/Plugin.java b/src/main/java/org/owasp/webgoat/plugins/Plugin.java index 7018d697e..18aa5ff75 100644 --- a/src/main/java/org/owasp/webgoat/plugins/Plugin.java +++ b/src/main/java/org/owasp/webgoat/plugins/Plugin.java @@ -1,5 +1,6 @@ package org.owasp.webgoat.plugins; +import com.google.common.base.Optional; import org.owasp.webgoat.lessons.AbstractLesson; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -61,7 +62,7 @@ public class Plugin { private void loadClass(String name, byte[] classFile) { ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); - PluginClassLoader pluginClassLoader = new PluginClassLoader(contextClassLoader, classFile); + PluginClassLoader pluginClassLoader = new PluginClassLoader(contextClassLoader, name, classFile); try { String realClassName = name.replaceFirst("/", "").replaceAll("/", ".").replaceAll(".class", ""); Class clazz = pluginClassLoader.loadClass(realClassName); @@ -123,17 +124,24 @@ public class Plugin { } } + public AbstractLesson getLesson() { + try { + return lesson.newInstance(); + } catch (IllegalAccessException | InstantiationException e) { + throw new PluginLoadingFailure("Unable to instantiate the lesson " + lesson.getName(), e); + } + } - public Class getLesson() { - return lesson; + public Optional getLessonSolution(String language) { + return Optional.fromNullable(this.solutionLanguageFiles.get(language)); } public Map getLessonSolutions() { return this.solutionLanguageFiles; } - public File getLessonSource() { - return lessonSourceFile; + public Optional getLessonSource() { + return Optional.fromNullable(lessonSourceFile); } public Map getLessonPlans() { diff --git a/src/main/java/org/owasp/webgoat/plugins/PluginClassLoader.java b/src/main/java/org/owasp/webgoat/plugins/PluginClassLoader.java index 98b101b8b..6af81a6d3 100644 --- a/src/main/java/org/owasp/webgoat/plugins/PluginClassLoader.java +++ b/src/main/java/org/owasp/webgoat/plugins/PluginClassLoader.java @@ -1,15 +1,21 @@ package org.owasp.webgoat.plugins; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + public class PluginClassLoader extends ClassLoader { + private final Logger logger = LoggerFactory.getLogger(Plugin.class); private final byte[] classFile; - public PluginClassLoader(ClassLoader parent, byte[] classFile) { + public PluginClassLoader(ClassLoader parent, String nameOfClass, byte[] classFile) { super(parent); + logger.debug("Creating class loader for {}", nameOfClass); this.classFile = classFile; } public Class findClass(String name) { + logger.debug("Finding class " + name); return defineClass(name, classFile, 0, classFile.length); } diff --git a/src/main/java/org/owasp/webgoat/session/Course.java b/src/main/java/org/owasp/webgoat/session/Course.java index 0b792b866..b5644ac7b 100644 --- a/src/main/java/org/owasp/webgoat/session/Course.java +++ b/src/main/java/org/owasp/webgoat/session/Course.java @@ -18,7 +18,7 @@ import java.util.Collections; import java.util.Iterator; import java.util.LinkedList; import java.util.List; -import java.util.Map +import java.util.Map; import javax.servlet.ServletContext; import org.owasp.webgoat.HammerHead; @@ -304,12 +304,8 @@ public class Course { List plugins = new PluginsLoader(Paths.get(pluginPath), Paths.get(targetPath)).loadPlugins(true); for (Plugin plugin : plugins) { try { - Class c = plugin.getLesson(); - Object o = c.newInstance(); - - AbstractLesson lesson = (AbstractLesson) o; + AbstractLesson lesson = plugin.getLesson(); lesson.setWebgoatContext(webgoatContext); - lesson.update(properties); if (!lesson.getHidden()) { @@ -318,8 +314,12 @@ public class Course { for(Map.Entry lessonPlan : plugin.getLessonPlans().entrySet()) { lesson.setLessonPlanFileName(lessonPlan.getKey(), lessonPlan.getValue().toString()); } - lesson.setLessonSolutionFileName(plugin.getLessonSolutions().get("en").toString()); - lesson.setSourceFileName(plugin.getLessonSource().toString()); + if (plugin.getLessonSolution("en").isPresent()) { + lesson.setLessonSolutionFileName(plugin.getLessonSolution("en").toString()); + } + if (plugin.getLessonSource().isPresent()) { + lesson.setSourceFileName(plugin.getLessonSource().get().toString()); + } } catch (Exception e) { logger.error("Error in loadLessons: ", e); }