From 1d7ecb0627f78ec15b3856d784a67abedbb06536 Mon Sep 17 00:00:00 2001 From: Bruce Mayhew Date: Fri, 6 Feb 2015 08:49:06 -0500 Subject: [PATCH] moved global properties from lessons to container, added loading of global properties to course, updated SqlInjection lesson --- mvn-debug | 2 ++ .../webgoat/plugins/PluginExtractor.java | 6 ++--- .../webgoat/plugins/PluginFileUtils.java | 15 +++++++++++++ .../owasp/webgoat/plugins/PluginsLoader.java | 21 ++++++++++-------- .../org/owasp/webgoat/session/Course.java | 20 +++++++++++++---- .../container/i18n/WebGoatLabels.properties | 7 ++++++ .../i18n/WebGoatLabels_de.properties | 7 ++++++ .../i18n/WebGoatLabels_fr.properties | 7 ++++++ .../i18n/WebGoatLabels_ru.properties | 7 ++++++ src/main/webapp/plugin_lessons/ReadMe.txt | 1 + .../plugin_lessons/SqlStringInjection-1.0.jar | Bin 442341 -> 441695 bytes 11 files changed, 77 insertions(+), 16 deletions(-) create mode 100755 mvn-debug create mode 100644 src/main/webapp/container/i18n/WebGoatLabels.properties create mode 100644 src/main/webapp/container/i18n/WebGoatLabels_de.properties create mode 100644 src/main/webapp/container/i18n/WebGoatLabels_fr.properties create mode 100644 src/main/webapp/container/i18n/WebGoatLabels_ru.properties create mode 100644 src/main/webapp/plugin_lessons/ReadMe.txt diff --git a/mvn-debug b/mvn-debug new file mode 100755 index 000000000..066900f60 --- /dev/null +++ b/mvn-debug @@ -0,0 +1,2 @@ +export MAVEN_OPTS="-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000" +mvn $@ diff --git a/src/main/java/org/owasp/webgoat/plugins/PluginExtractor.java b/src/main/java/org/owasp/webgoat/plugins/PluginExtractor.java index a9a2f1043..89723304f 100644 --- a/src/main/java/org/owasp/webgoat/plugins/PluginExtractor.java +++ b/src/main/java/org/owasp/webgoat/plugins/PluginExtractor.java @@ -49,8 +49,8 @@ public class PluginExtractor { return FileVisitResult.CONTINUE; } }); - } catch (IOException io) { - new Plugin.PluginLoadingFailure(format("Unable to extract: %s", pluginArchive.getFileName()), io); + } catch (Exception e) { + new Plugin.PluginLoadingFailure(format("Unable to extract: %s", pluginArchive.getFileName()), e); } } @@ -62,7 +62,7 @@ public class PluginExtractor { return this.files; } - private FileSystem createZipFileSystem() throws IOException { + private FileSystem createZipFileSystem() throws Exception { final URI uri = URI.create("jar:file:" + pluginArchive.toUri().getPath()); return FileSystems.newFileSystem(uri, new HashMap()); } diff --git a/src/main/java/org/owasp/webgoat/plugins/PluginFileUtils.java b/src/main/java/org/owasp/webgoat/plugins/PluginFileUtils.java index c0390539c..758119f0e 100644 --- a/src/main/java/org/owasp/webgoat/plugins/PluginFileUtils.java +++ b/src/main/java/org/owasp/webgoat/plugins/PluginFileUtils.java @@ -2,8 +2,11 @@ package org.owasp.webgoat.plugins; import java.io.IOException; +import java.nio.file.DirectoryStream; import java.nio.file.Files; import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; public class PluginFileUtils { @@ -27,5 +30,17 @@ public class PluginFileUtils { } return p; } + + public static List getFilesInDirectory( Path directory) throws IOException + { + List files = new ArrayList<>(); + DirectoryStream dirStream; + dirStream = Files.newDirectoryStream(directory); + for (Path entry : dirStream) { + files.add(entry); + } + dirStream.close(); + return files; + } } diff --git a/src/main/java/org/owasp/webgoat/plugins/PluginsLoader.java b/src/main/java/org/owasp/webgoat/plugins/PluginsLoader.java index 87ffc3669..6201f6542 100644 --- a/src/main/java/org/owasp/webgoat/plugins/PluginsLoader.java +++ b/src/main/java/org/owasp/webgoat/plugins/PluginsLoader.java @@ -14,7 +14,8 @@ import java.util.List; public class PluginsLoader implements Runnable { - private final Logger logger = LoggerFactory.getLogger(this.getClass()); + protected static final String WEBGOAT_PLUGIN_EXTENSION = "jar"; + private final Logger logger = LoggerFactory.getLogger(this.getClass()); private final Path pluginSource; private Path pluginTarget; @@ -31,14 +32,16 @@ public class PluginsLoader implements Runnable { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { try { - PluginFileUtils.createDirsIfNotExists(pluginTarget); - PluginExtractor extractor = new PluginExtractor(file); - extractor.extract(pluginTarget); - Plugin plugin = new Plugin(pluginTarget); - plugin.loadClasses(extractor.getClasses()); - plugin.loadFiles(extractor.getFiles(), reload); - plugin.rewritePaths(pluginTarget); - plugins.add(plugin); + if (PluginFileUtils.fileEndsWith(file, WEBGOAT_PLUGIN_EXTENSION)) { + PluginFileUtils.createDirsIfNotExists(pluginTarget); + PluginExtractor extractor = new PluginExtractor(file); + extractor.extract(pluginTarget); + Plugin plugin = new Plugin(pluginTarget); + plugin.loadClasses(extractor.getClasses()); + plugin.loadFiles(extractor.getFiles(), reload); + plugin.rewritePaths(pluginTarget); + plugins.add(plugin); + } } catch (Plugin.PluginLoadingFailure e) { logger.error("Unable to load plugin, continue loading others..."); } diff --git a/src/main/java/org/owasp/webgoat/session/Course.java b/src/main/java/org/owasp/webgoat/session/Course.java index 6f4abd4e5..24a06a9d2 100644 --- a/src/main/java/org/owasp/webgoat/session/Course.java +++ b/src/main/java/org/owasp/webgoat/session/Course.java @@ -4,11 +4,13 @@ import org.owasp.webgoat.HammerHead; import org.owasp.webgoat.lessons.AbstractLesson; import org.owasp.webgoat.lessons.Category; import org.owasp.webgoat.plugins.Plugin; +import org.owasp.webgoat.plugins.PluginFileUtils; import org.owasp.webgoat.plugins.PluginsLoader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.ServletContext; + import java.io.File; import java.io.IOException; import java.nio.file.Path; @@ -175,7 +177,7 @@ public class Course { List roles = new ArrayList(); roles.add(AbstractLesson.USER_ROLE); // Category 0 is the admin function. We want the first real category - // to be returned. This is noramally the General category and the Http Basics lesson + // to be returned. This is normally the General category and the Http Basics lesson return ((AbstractLesson) getLessons((Category) getCategories().get(0), roles).get(0)); } @@ -281,7 +283,7 @@ public class Course { return null; } - private void loadLessionFromPlugin(ServletContext context) { + private void loadLessonFromPlugin(ServletContext context) { context.getContextPath(); logger.debug("Loading plugins into cache"); String pluginPath = context.getRealPath("plugin_lessons"); @@ -290,8 +292,18 @@ public class Course { logger.error("Plugins directory {} not found", pluginPath); return; } + + // Do a one time load of the container properties + String containerPath = context.getRealPath("container//i18n"); + Plugin theContainer = new Plugin(Paths.get(targetPath)); + try { + theContainer.loadFiles(PluginFileUtils.getFilesInDirectory(Paths.get(containerPath)), false); + } catch (IOException io) { + logger.error("Error loading container properties: ", io); + } + Path pluginDirectory = Paths.get(pluginPath); - List plugins = new PluginsLoader(Paths.get(pluginPath), Paths.get(targetPath)).loadPlugins(false); + List plugins = new PluginsLoader(Paths.get(pluginPath), Paths.get(targetPath)).loadPlugins(true); for (Plugin plugin : plugins) { try { Class c = plugin.getLesson(); @@ -326,7 +338,7 @@ public class Course { public void loadCourses(WebgoatContext webgoatContext, ServletContext context, String path) { logger.info("Loading courses: " + path); this.webgoatContext = webgoatContext; - loadLessionFromPlugin(context); + loadLessonFromPlugin(context); } } diff --git a/src/main/webapp/container/i18n/WebGoatLabels.properties b/src/main/webapp/container/i18n/WebGoatLabels.properties new file mode 100644 index 000000000..1f622dd2f --- /dev/null +++ b/src/main/webapp/container/i18n/WebGoatLabels.properties @@ -0,0 +1,7 @@ +#General +LessonCompleted=Congratulations. You have successfully completed this lesson. +RestartLesson=Restart this Lesson +SolutionVideos=Solution Videos +ErrorGenerating=Error generating +InvalidData=Invalid Data +Go!=Go! diff --git a/src/main/webapp/container/i18n/WebGoatLabels_de.properties b/src/main/webapp/container/i18n/WebGoatLabels_de.properties new file mode 100644 index 000000000..ea2065e0c --- /dev/null +++ b/src/main/webapp/container/i18n/WebGoatLabels_de.properties @@ -0,0 +1,7 @@ +#General +LessonCompleted=Herzlichen Gl\u00fcckwunsch! Sie haben diese Lektion erfolgreich abgeschlossen. +RestartLesson=Lektion neu beginnen +SolutionVideos=L\u00f6sungsvideos +ErrorGenerating=Fehler beim Generieren von +InvalidData=Ung\u00fcltige Daten +Go!=Los gehts! diff --git a/src/main/webapp/container/i18n/WebGoatLabels_fr.properties b/src/main/webapp/container/i18n/WebGoatLabels_fr.properties new file mode 100644 index 000000000..ebc86bb21 --- /dev/null +++ b/src/main/webapp/container/i18n/WebGoatLabels_fr.properties @@ -0,0 +1,7 @@ +#General +LessonCompleted=F\u00e9licitations. Vous avez termin\u00e9 cette le\u00e7on avec succ\u00e9s. +RestartLesson=Recommencer cette le\u00e7on +SolutionVideos=Solution vid\u00e9os +ErrorGenerating=Error generating +InvalidData=Donn\u00e9e invalide +Go!=Go! diff --git a/src/main/webapp/container/i18n/WebGoatLabels_ru.properties b/src/main/webapp/container/i18n/WebGoatLabels_ru.properties new file mode 100644 index 000000000..0c3b80ca0 --- /dev/null +++ b/src/main/webapp/container/i18n/WebGoatLabels_ru.properties @@ -0,0 +1,7 @@ +#General +LessonCompleted=\u041f\u043e\u0437\u0434\u0440\u0430\u0432\u043b\u044f\u044e. \u0412\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u043e\u0448\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0439 \u0443\u0440\u043e\u043a. +RestartLesson=\u041d\u0430\u0447\u0430\u043b\u044c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 +SolutionVideos=\u0412\u0438\u0434\u0435\u043e \u0441 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c +ErrorGenerating=\u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 +InvalidData=\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 +Go!=\u0412\u043f\u0435\u0440\u0451\u0434! diff --git a/src/main/webapp/plugin_lessons/ReadMe.txt b/src/main/webapp/plugin_lessons/ReadMe.txt new file mode 100644 index 000000000..101910ac2 --- /dev/null +++ b/src/main/webapp/plugin_lessons/ReadMe.txt @@ -0,0 +1 @@ +Lesson plugins stored under this directory. \ No newline at end of file diff --git a/src/main/webapp/plugin_lessons/SqlStringInjection-1.0.jar b/src/main/webapp/plugin_lessons/SqlStringInjection-1.0.jar index d032bb12c83105b20d667668f6eeee58ec384881..707d626f9a106f917bac335ae6692f0d34a20bcb 100644 GIT binary patch delta 13257 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