From 0d48b83e821c7975b8aba15a94c0329ea927789c Mon Sep 17 00:00:00 2001 From: nbaars Date: Fri, 2 Jan 2015 15:06:03 +0100 Subject: [PATCH] Also extract html files (cherry picked from commit 2933b79) --- .../org/owasp/webgoat/plugins/Plugin.java | 38 +++++++--- .../webgoat/plugins/PluginExtractor.java | 7 +- .../org/owasp/webgoat/session/Course.java | 72 +++++++++++++------ src/main/resources/log4j.properties | 5 ++ 4 files changed, 91 insertions(+), 31 deletions(-) diff --git a/src/main/java/org/owasp/webgoat/plugins/Plugin.java b/src/main/java/org/owasp/webgoat/plugins/Plugin.java index 9d462ef6c..3d25d84e3 100644 --- a/src/main/java/org/owasp/webgoat/plugins/Plugin.java +++ b/src/main/java/org/owasp/webgoat/plugins/Plugin.java @@ -2,13 +2,18 @@ package org.owasp.webgoat.plugins; import org.owasp.webgoat.lessons.AbstractLesson; +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.StandardOpenOption; +import java.util.Arrays; +import java.util.List; public class Plugin { private final Class lesson; - private final String lessonPlanHtml; - private final String lessonSolutionHtml; + private final Path pluginDirectory; public static class Builder { @@ -36,19 +41,23 @@ public class Plugin { } public Plugin build() { - return new Plugin(this.lesson, null, null); + return new Plugin(this.lesson, pluginDirectory); } } - public Plugin(Class lesson, String lessonPlanHtml, String lessonSolutionHtml) { + public Plugin(Class lesson, Path pluginDirectory) { this.lesson = lesson; - this.lessonPlanHtml = lessonPlanHtml; - this.lessonSolutionHtml = lessonSolutionHtml; + this.pluginDirectory = pluginDirectory; } - public String getLessonPlanHtml() { - return lessonPlanHtml; + Path lesson_plans = this.pluginDirectory.resolve("lesson_plans"); + try { + Files.readAllLines(lesson_plans.resolve(this.lesson.getSimpleName() + ".html"), Charset.defaultCharset()); + } catch (IOException e) { + e.printStackTrace(); + } + return lesson_plans.resolve(this.lesson.getSimpleName() + ".html").toFile().toString(); } public Class getLesson() { @@ -56,6 +65,17 @@ public class Plugin { } public String getLessonSolutionHtml() { - return lessonSolutionHtml; + return null; + //return lessonSolutionHtml; } + + public static void main(String[] args) throws Exception { + Path tempDir = Files.createTempDirectory("tempfiles"); + + Path tempFile = Files.createTempFile(tempDir, "tempfiles", ".tmp"); + List lines = Arrays.asList("Line1", "Line2"); + Files.write(tempFile, lines, Charset.defaultCharset(), StandardOpenOption.WRITE); + + System.out.printf("Wrote text to temporary file %s%n", tempFile.toString()); +} } diff --git a/src/main/java/org/owasp/webgoat/plugins/PluginExtractor.java b/src/main/java/org/owasp/webgoat/plugins/PluginExtractor.java index c3422b3fd..4d21e56c2 100644 --- a/src/main/java/org/owasp/webgoat/plugins/PluginExtractor.java +++ b/src/main/java/org/owasp/webgoat/plugins/PluginExtractor.java @@ -12,12 +12,15 @@ import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; -import java.nio.file.StandardCopyOption; import java.nio.file.attribute.BasicFileAttributes; import java.util.HashMap; /** * Extract the zip file and place the files in a temp directory + * + * TODO: should only do the extraction of the zip file return should be the base directory of the extracted + * plugin. The PluginLoader should take care of the loading + * */ public class PluginExtractor { @@ -46,7 +49,7 @@ public class PluginExtractor { Files.copy(file, bos); pluginBuilder.loadClass(file.toString(), bos.toByteArray()); } - Files.copy(file, tempDirectory, StandardCopyOption.REPLACE_EXISTING); + // Files.copy(file, tempDirectory.resolve(file.getFileName()), StandardCopyOption.REPLACE_EXISTING); return FileVisitResult.CONTINUE; } }); diff --git a/src/main/java/org/owasp/webgoat/session/Course.java b/src/main/java/org/owasp/webgoat/session/Course.java index 3cbbe60d6..1338c5630 100644 --- a/src/main/java/org/owasp/webgoat/session/Course.java +++ b/src/main/java/org/owasp/webgoat/session/Course.java @@ -1,32 +1,24 @@ package org.owasp.webgoat.session; -import java.io.File; -import java.io.IOException; -import java.net.URI; -import java.nio.file.FileVisitResult; -import java.nio.file.FileVisitor; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.attribute.BasicFileAttributes; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Set; -import java.util.LinkedList; -import javax.servlet.ServletContext; - 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.PluginExtractor; import org.owasp.webgoat.plugins.PluginsLoader; -import org.owasp.webgoat.util.WebGoatI18N; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.servlet.ServletContext; +import java.io.File; +import java.io.IOException; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; + /** * ************************************************************************************************* *

@@ -334,16 +326,56 @@ public class Course { if (lesson.getHidden() == false) { lessons.add(lesson); } - + lesson.setLessonSolutionFileName(plugin.getLessonPlanHtml()); } catch (Exception e) { logger.error("Error in loadLessons: ", e); } } } + /** + * For each lesson, set the source file and lesson file + */ + private void loadResourcesFromPlugin() { + for (AbstractLesson lesson : lessons) { + logger.info("Loading resources for lesson -> " + lesson.getName()); + String className = lesson.getClass().getName(); + String classFile = getSourceFile(className); + logger.info("Lesson classname: " + className); + logger.info("Lesson java file: " + classFile); + + for (String absoluteFile : files) { + String fileName = getFileName(absoluteFile); + //logger.debug("Course: looking at file: " + absoluteFile); + + if (absoluteFile.endsWith(classFile)) { + logger.info("Set source file for " + classFile); + lesson.setSourceFileName(absoluteFile); + } + + if (absoluteFile.startsWith("/lesson_plans") && absoluteFile.endsWith(".html") && className + .endsWith(fileName)) { + logger.info( + "setting lesson plan file " + absoluteFile + " for lesson " + lesson.getClass().getName()); + logger.info("fileName: " + fileName + " == className: " + className); + String language = getLanguageFromFileName("/lesson_plans", absoluteFile); + lesson.setLessonPlanFileName(language, absoluteFile); + } + if (absoluteFile.startsWith("/lesson_solutions") && absoluteFile.endsWith(".html") && className + .endsWith(fileName)) { + logger.info( + "setting lesson solution file " + absoluteFile + " for lesson " + lesson.getClass().getName()); + logger.info("fileName: " + fileName + " == className: " + className); + lesson.setLessonSolutionFileName(absoluteFile); + } + } + } + } + /** * Instantiate all the lesson objects into a cache * + * @deprecated should be removed if everything is loaded with plugins * @param path */ private void loadLessons(String path) { diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties index 734eb76c8..8ed0e8ef3 100644 --- a/src/main/resources/log4j.properties +++ b/src/main/resources/log4j.properties @@ -13,6 +13,11 @@ log4j.appender.MAIN_LOG.append=true # a little less spring output log4j.category.org.springframework = INFO +log4j.appender.default.out=org.apache.log4j.ConsoleAppender +log4j.appender.default.out.threeshold=DEBUG +log4j.appender.default.out.layout=org.apache.log4j.PatternLayout +log4j.appender.default.out.layout.ConversionPattern=%-5p %c: %m%n + # ERROR log4j.appender.ERROR_LOG=org.apache.log4j.RollingFileAppender log4j.appender.ERROR_LOG.File=${catalina.home}/logs/webgoat_error.log