From 20dd3ffb95cfc1011fb364fdd2ee7e47d3c84042 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Zubcevic?= Date: Wed, 20 Jul 2022 10:52:48 +0200 Subject: [PATCH] Lang switch (#1297) * language selector first steps * language german intro added * ascii doc lang attribute as additional option * removed some commented code * changed adoc resource loader to take into account the selected language * added readme * added lang test cases --- README_I18N.md | 34 ++ .../webgoat/LabelAndHintIntegrationTest.java | 40 ++ .../AsciiDoctorTemplateResolver.java | 53 +- .../webgoat/container/MvcConfiguration.java | 29 +- .../webgoat/container/WebSecurityConfig.java | 2 + .../webgoat/container/i18n/Language.java | 2 - .../resources/i18n/messages_de.properties | 11 +- .../documentation/Crypto_plan.adoc | 8 +- .../documentation/Introduction.adoc | 2 + .../documentation/Introduction_de.adoc | 18 + .../documentation/Introduction_fr.adoc | 18 + .../documentation/Introduction_nl.adoc | 18 + .../webgoat/static/css/img/cnlang.svg | 11 + .../webgoat/static/css/img/delang.svg | 5 + .../webgoat/static/css/img/enlang.svg | 7 + .../webgoat/static/css/img/eslang.svg | 547 ++++++++++++++++++ .../webgoat/static/css/img/frlang.svg | 7 + .../webgoat/static/css/img/nllang.svg | 5 + .../resources/webgoat/templates/main_new.html | 57 +- 19 files changed, 853 insertions(+), 21 deletions(-) create mode 100644 README_I18N.md create mode 100644 src/main/resources/lessons/webgoat_introduction/documentation/Introduction_de.adoc create mode 100644 src/main/resources/lessons/webgoat_introduction/documentation/Introduction_fr.adoc create mode 100644 src/main/resources/lessons/webgoat_introduction/documentation/Introduction_nl.adoc create mode 100644 src/main/resources/webgoat/static/css/img/cnlang.svg create mode 100644 src/main/resources/webgoat/static/css/img/delang.svg create mode 100644 src/main/resources/webgoat/static/css/img/enlang.svg create mode 100644 src/main/resources/webgoat/static/css/img/eslang.svg create mode 100644 src/main/resources/webgoat/static/css/img/frlang.svg create mode 100644 src/main/resources/webgoat/static/css/img/nllang.svg diff --git a/README_I18N.md b/README_I18N.md new file mode 100644 index 000000000..ef14f191b --- /dev/null +++ b/README_I18N.md @@ -0,0 +1,34 @@ +# Multi language support in WebGoat + +WebGoat is mainly written in English, but it does support multiple languages. + +## Default language selection + +1. Current supported languages are: en, fr, de, nl +2. The primary language is based on the language setting of the browser. +3. If the language is not in the list of supported language, the language is English +4. Once logged in, you can switch between the supported languages using a language dropdown menu on the main page + 1. After switching a language you are back at the Introduction page + +## Adding a new language + +The following steps are required when you want to add a new language + +1. Update [main_new.html](src/main/resources/webgoat/static/main_new.html) + 1. Add the parts for showing the flag and providing the correct value for the flag= parameter +2. +3. Add a flag image to src/main/resources/webgoat/static/css/img + 1. See the main_new.html for a link to download flag resources +4. Add a welcome page to the introduction lesson + 1. Copy Introduction_.adoc to Introduction_es.adoc (if in this case you want to add Spanish) + 2. Add a highlighted section that explains that most parts of WebGoat will still be in English and invite people to translate parts where it would be valuable +5. Translate the main labels + 1. Copy messages.properties to messages_es.properties (if in this case you want to add Spanish) + 2. Translate the label values +6. Optionally translate lessons by + 1. Adding lang specifc adoc files in documentation folder of the lesson + 2. Adding WebGoatLabels.properties of a specific language if you want to +7. Run mvn clean to see if the LabelAndHintIntegration test passes +8. Run WebGoat and verify that your own language and the other languages work as expected + +If you only want to translate more for a certain language, you only need to do step 4-8 diff --git a/src/it/java/org/owasp/webgoat/LabelAndHintIntegrationTest.java b/src/it/java/org/owasp/webgoat/LabelAndHintIntegrationTest.java index fb3b8488e..1f99c15e7 100644 --- a/src/it/java/org/owasp/webgoat/LabelAndHintIntegrationTest.java +++ b/src/it/java/org/owasp/webgoat/LabelAndHintIntegrationTest.java @@ -27,6 +27,46 @@ public class LabelAndHintIntegrationTest extends IntegrationTest { .get(url("service/labels.mvc")).then().statusCode(200).extract().jsonPath(); Assertions.assertEquals("Try again: but this time enter a value before hitting go.", jsonPath.getString(ESCAPE_JSON_PATH_CHAR+"http-basics.close"+ESCAPE_JSON_PATH_CHAR)); + + // check if lang parameter overrules Accept-Language parameter + jsonPath = RestAssured.given() + .when() + .relaxedHTTPSValidation() + .contentType(ContentType.JSON) + .header("Accept-Language","en") + .cookie("JSESSIONID", getWebGoatCookie()) + .get(url("service/labels.mvc?lang=nl")).then().statusCode(200).extract().jsonPath(); + Assertions.assertEquals("Gebruikersnaam", jsonPath.getString(ESCAPE_JSON_PATH_CHAR+"username"+ESCAPE_JSON_PATH_CHAR)); + + jsonPath = RestAssured.given() + .when() + .relaxedHTTPSValidation() + .contentType(ContentType.JSON) + .header("Accept-Language","en") + .cookie("JSESSIONID", getWebGoatCookie()) + .get(url("service/labels.mvc?lang=de")).then().statusCode(200).extract().jsonPath(); + Assertions.assertEquals("Benutzername", jsonPath.getString(ESCAPE_JSON_PATH_CHAR+"username"+ESCAPE_JSON_PATH_CHAR)); + + // check if invalid language returns english + jsonPath = RestAssured.given() + .when() + .relaxedHTTPSValidation() + .contentType(ContentType.JSON) + .header("Accept-Language","nl") + .cookie("JSESSIONID", getWebGoatCookie()) + .get(url("service/labels.mvc?lang=xx")).then().statusCode(200).extract().jsonPath(); + Assertions.assertEquals("Username", jsonPath.getString(ESCAPE_JSON_PATH_CHAR+"username"+ESCAPE_JSON_PATH_CHAR)); + + // check if invalid language returns english + jsonPath = RestAssured.given() + .when() + .relaxedHTTPSValidation() + .contentType(ContentType.JSON) + .header("Accept-Language","xx_YY") + .cookie("JSESSIONID", getWebGoatCookie()) + .get(url("service/labels.mvc")).then().statusCode(200).extract().jsonPath(); + Assertions.assertEquals("Username", jsonPath.getString(ESCAPE_JSON_PATH_CHAR+"username"+ESCAPE_JSON_PATH_CHAR)); + } @Test diff --git a/src/main/java/org/owasp/webgoat/container/AsciiDoctorTemplateResolver.java b/src/main/java/org/owasp/webgoat/container/AsciiDoctorTemplateResolver.java index 33e2b16a6..ebcc83fbe 100644 --- a/src/main/java/org/owasp/webgoat/container/AsciiDoctorTemplateResolver.java +++ b/src/main/java/org/owasp/webgoat/container/AsciiDoctorTemplateResolver.java @@ -31,26 +31,28 @@ package org.owasp.webgoat.container; +import io.undertow.util.Headers; import lombok.extern.slf4j.Slf4j; import org.asciidoctor.Asciidoctor; import org.asciidoctor.extension.JavaExtensionRegistry; -import org.owasp.webgoat.container.asciidoc.OperatingSystemMacro; -import org.owasp.webgoat.container.asciidoc.UsernameMacro; -import org.owasp.webgoat.container.asciidoc.WebGoatTmpDirMacro; -import org.owasp.webgoat.container.asciidoc.WebGoatVersionMacro; -import org.owasp.webgoat.container.asciidoc.WebWolfMacro; -import org.owasp.webgoat.container.asciidoc.WebWolfRootMacro; +import org.owasp.webgoat.container.asciidoc.*; +import org.owasp.webgoat.container.i18n.Language; import org.springframework.core.io.ResourceLoader; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import org.springframework.web.servlet.i18n.SessionLocaleResolver; import org.thymeleaf.IEngineConfiguration; import org.thymeleaf.templateresolver.FileTemplateResolver; import org.thymeleaf.templateresource.ITemplateResource; import org.thymeleaf.templateresource.StringTemplateResource; +import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.StringWriter; import java.util.HashMap; +import java.util.Locale; import java.util.Map; import java.util.Set; @@ -68,10 +70,13 @@ public class AsciiDoctorTemplateResolver extends FileTemplateResolver { private static final Asciidoctor asciidoctor = create(); private static final String PREFIX = "doc:"; + + private final Language language; private final ResourceLoader resourceLoader; - public AsciiDoctorTemplateResolver(ResourceLoader resourceLoader) { + public AsciiDoctorTemplateResolver(Language language, ResourceLoader resourceLoader) { this.resourceLoader = resourceLoader; + this.language = language; setResolvablePatterns(Set.of(PREFIX + "*")); } @@ -79,7 +84,7 @@ public class AsciiDoctorTemplateResolver extends FileTemplateResolver { protected ITemplateResource computeTemplateResource(IEngineConfiguration configuration, String ownerTemplate, String template, String resourceName, String characterEncoding, Map templateResolutionAttributes) { var templateName = resourceName.substring(PREFIX.length()); - try (InputStream is = resourceLoader.getResource("classpath:/" + templateName).getInputStream()) { + try (InputStream is = getInputStream(templateName)) { JavaExtensionRegistry extensionRegistry = asciidoctor.javaExtensionRegistry(); extensionRegistry.inlineMacro("webWolfLink", WebWolfMacro.class); extensionRegistry.inlineMacro("webWolfRootLink", WebWolfRootMacro.class); @@ -96,10 +101,26 @@ public class AsciiDoctorTemplateResolver extends FileTemplateResolver { } } + private InputStream getInputStream(String templateName) throws IOException { + if (resourceLoader.getResource("classpath:/" + computeResourceName(templateName, language.getLocale().getLanguage())).isFile()) { + return resourceLoader.getResource("classpath:/" + computeResourceName(templateName, language.getLocale().getLanguage())).getInputStream(); + } else { + return resourceLoader.getResource("classpath:/" + templateName).getInputStream(); + } + } + private String computeResourceName(String resourceName, String language) { + if (language.equals("en")) { + return resourceName; + } else { + return resourceName.replace(".adoc", "_".concat(language).concat(".adoc")); + } + } + private Map createAttributes() { Map attributes = new HashMap<>(); attributes.put("source-highlighter", "coderay"); attributes.put("backend", "xhtml"); + attributes.put("lang", determineLanguage()); attributes.put("icons", org.asciidoctor.Attributes.FONT_ICONS); Map options = new HashMap<>(); @@ -107,4 +128,20 @@ public class AsciiDoctorTemplateResolver extends FileTemplateResolver { return options; } + + private String determineLanguage() { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); + + Locale browserLocale = (Locale) request.getSession().getAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME); + if (null != browserLocale) { + return browserLocale.getLanguage(); + } else { + String langHeader = request.getHeader(Headers.ACCEPT_LANGUAGE_STRING); + if (null != langHeader) { + return langHeader.substring(0,2); + } else { + return "en"; + } + } + } } diff --git a/src/main/java/org/owasp/webgoat/container/MvcConfiguration.java b/src/main/java/org/owasp/webgoat/container/MvcConfiguration.java index 182fbffbe..69641a8e4 100644 --- a/src/main/java/org/owasp/webgoat/container/MvcConfiguration.java +++ b/src/main/java/org/owasp/webgoat/container/MvcConfiguration.java @@ -44,9 +44,11 @@ import org.springframework.core.io.ResourceLoader; import org.springframework.core.io.support.ResourcePatternResolver; import org.springframework.web.servlet.LocaleResolver; import org.springframework.web.servlet.ViewResolver; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; import org.springframework.web.servlet.i18n.SessionLocaleResolver; import org.thymeleaf.IEngineConfiguration; import org.thymeleaf.extras.springsecurity5.dialect.SpringSecurityDialect; @@ -143,8 +145,8 @@ public class MvcConfiguration implements WebMvcConfigurer { * Loads the lesson asciidoc. */ @Bean - public AsciiDoctorTemplateResolver asciiDoctorTemplateResolver(ResourceLoader resourceLoader) { - AsciiDoctorTemplateResolver resolver = new AsciiDoctorTemplateResolver(resourceLoader); + public AsciiDoctorTemplateResolver asciiDoctorTemplateResolver(Language language, ResourceLoader resourceLoader) { + AsciiDoctorTemplateResolver resolver = new AsciiDoctorTemplateResolver(language, resourceLoader); resolver.setCacheable(false); resolver.setOrder(1); resolver.setCharacterEncoding(UTF8); @@ -196,6 +198,24 @@ public class MvcConfiguration implements WebMvcConfigurer { return new Language(localeResolver); } + @Bean + public LocaleResolver localeResolver() { + SessionLocaleResolver localeResolver = new SessionLocaleResolver(); + return localeResolver; + } + + @Bean + public LocaleChangeInterceptor localeChangeInterceptor() { + LocaleChangeInterceptor lci = new LocaleChangeInterceptor(); + lci.setParamName("lang"); + return lci; + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(localeChangeInterceptor()); + } + @Bean public Messages messageSource(Language language) { Messages messages = new Messages(language); @@ -205,11 +225,6 @@ public class MvcConfiguration implements WebMvcConfigurer { return messages; } - @Bean - public LocaleResolver localeResolver() { - return new SessionLocaleResolver(); - } - @Bean public LabelDebugger labelDebugger() { return new LabelDebugger(); diff --git a/src/main/java/org/owasp/webgoat/container/WebSecurityConfig.java b/src/main/java/org/owasp/webgoat/container/WebSecurityConfig.java index aabcd257c..0339adc35 100644 --- a/src/main/java/org/owasp/webgoat/container/WebSecurityConfig.java +++ b/src/main/java/org/owasp/webgoat/container/WebSecurityConfig.java @@ -31,6 +31,7 @@ package org.owasp.webgoat.container; import lombok.AllArgsConstructor; +import org.owasp.webgoat.container.i18n.Language; import org.owasp.webgoat.container.users.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; @@ -43,6 +44,7 @@ import org.springframework.security.config.annotation.web.configuration.WebSecur import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.password.NoOpPasswordEncoder; +import org.springframework.web.servlet.i18n.SessionLocaleResolver; /** * Security configuration for WebGoat. diff --git a/src/main/java/org/owasp/webgoat/container/i18n/Language.java b/src/main/java/org/owasp/webgoat/container/i18n/Language.java index 96a039979..5b73e0755 100644 --- a/src/main/java/org/owasp/webgoat/container/i18n/Language.java +++ b/src/main/java/org/owasp/webgoat/container/i18n/Language.java @@ -29,7 +29,6 @@ import lombok.AllArgsConstructor; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.servlet.LocaleResolver; - import java.util.Locale; /** @@ -47,5 +46,4 @@ public class Language { public Locale getLocale() { return localeResolver.resolveLocale(((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest()); } - } diff --git a/src/main/resources/i18n/messages_de.properties b/src/main/resources/i18n/messages_de.properties index 3cb246153..13a8b1f2f 100644 --- a/src/main/resources/i18n/messages_de.properties +++ b/src/main/resources/i18n/messages_de.properties @@ -25,8 +25,17 @@ #General lesson.completed=Herzlichen Gl\u00fcckwunsch! Sie haben diese Lektion erfolgreich abgeschlossen. -RestartLesson=Lektion neu beginnen +assignment.solved=Herzlichen Gl\u00fcckwunsch! Sie haben diesen Auftrag erfolgreich abgeschlossen. +assignment.not.solved=Die L\u00f6sung ist nicht korrekt, versuchen Sie es erneut. + +reset.lesson=Lektion neu anfangen SolutionVideos=L\u00f6sungsvideos ErrorGenerating=Fehler beim Generieren von InvalidData=Ung\u00fcltige Daten Go!=Los gehts! +username=Benutzername +password=Passwort +password.confirm=Wiederhohl Passwort +sign.up=Anmelden +register.title=Registrieren + diff --git a/src/main/resources/lessons/cryptography/documentation/Crypto_plan.adoc b/src/main/resources/lessons/cryptography/documentation/Crypto_plan.adoc index 78af04907..39ce0b5c0 100644 --- a/src/main/resources/lessons/cryptography/documentation/Crypto_plan.adoc +++ b/src/main/resources/lessons/cryptography/documentation/Crypto_plan.adoc @@ -2,7 +2,13 @@ == Concept -This lesson explains different types of cryptography techniques that are commonly used in web applications. +ifeval::["{lang}" == "nl"] +Deze les behandelt verschillende cryptografische technieken die voorkomen in webapplicaties. +endif::[] + +ifeval::["{lang}" != "nl"] +This lesson explains different types of cryptography techniques that are commonly used in web applications. +endif::[] == Goals diff --git a/src/main/resources/lessons/webgoat_introduction/documentation/Introduction.adoc b/src/main/resources/lessons/webgoat_introduction/documentation/Introduction.adoc index 3a2e66421..f6eae592f 100644 --- a/src/main/resources/lessons/webgoat_introduction/documentation/Introduction.adoc +++ b/src/main/resources/lessons/webgoat_introduction/documentation/Introduction.adoc @@ -1,6 +1,8 @@ == What is WebGoat? --- +Welcome `username:user[]`! + WebGoat is a deliberately insecure application that allows interested developers just like you to _test vulnerabilities_ commonly found in Java-based applications that use common and popular open source components. diff --git a/src/main/resources/lessons/webgoat_introduction/documentation/Introduction_de.adoc b/src/main/resources/lessons/webgoat_introduction/documentation/Introduction_de.adoc new file mode 100644 index 000000000..c2927e637 --- /dev/null +++ b/src/main/resources/lessons/webgoat_introduction/documentation/Introduction_de.adoc @@ -0,0 +1,18 @@ +== Was ist WebGoat? +--- + +WebGoat ist eine Anwendung, die verschiedene Schwachstellen aus den OWASP Top 10 erklärt und testet. + +Es enthält Lektionen, Übungen und Herausforderungen (Challenges). Die Lektionen sind in verschiedene Kategorien unterteilt und enthalten Seiten mit Informationen und Übungen. Sie sollten die Herausforderungen zuletzt versuchen. Diese sind knifflig und enthalten keine Hinweise. + +Ziel von WebGoat ist es, alles rund um das Thema Websicherheit spielerisch zu lernen und zu erleben. Dies ist sowohl für Entwickler als auch für Tester geeignet. + +Fühlen Sie sich frei, WebGoat einem gründlichen Test zu unterziehen und Ihre Kenntnisse und Erfahrungen in diesem Bereich zu verbessern. + +Sie sollten versuchen, die WebGoat-Anwendungsübungen mit einer Hacking-Mentalität zu lösen. + +Danke für dein Interesse! + +*Das WebGoat-Team* + +#Die meisten Texte sind auf Englisch. Sie können die Sprache über das Dropdown im Menü wechseln. Sie sind auch herzlich eingeladen, Texte zu übersetzen um WebGoat zu verbesseren.# diff --git a/src/main/resources/lessons/webgoat_introduction/documentation/Introduction_fr.adoc b/src/main/resources/lessons/webgoat_introduction/documentation/Introduction_fr.adoc new file mode 100644 index 000000000..813065645 --- /dev/null +++ b/src/main/resources/lessons/webgoat_introduction/documentation/Introduction_fr.adoc @@ -0,0 +1,18 @@ +== Qu'est-ce que WebGoat +--- + +WebGoat est une application qui explique et teste diverses vulnérabilités du top 10 OWASP. + +Il contient des leçons, des exercices et des défis (Challenges). Les leçons sont divisées en plusieurs catégories et contiennent des pages contenant des informations et des exercices. Vous devriez essayer les défis en dernier. Ceux-ci sont délicats et ne contiennent aucun indice. + +Le but de WebGoat est d'apprendre et de tout expérimenter de manière ludique dans le domaine de la sécurité Web. Cela convient à la fois aux développeurs et aux testeurs. + +N'hésitez pas à faire passer un test approfondi à WebGoat et à améliorer vos connaissances et votre expérience dans ce domaine. + +Vous devriez essayer de résoudre les exercices d'application WebGoat avec un état d'esprit de piratage. + +Merci pour ton intérêt! + +*L'équipe WebGoat* + +#La plupart des textes sont en anglais. Vous pouvez changer de langue via la liste déroulante du menu. Vous êtes également cordialement invité à traduire des textes pour améliorer WebGoat.# diff --git a/src/main/resources/lessons/webgoat_introduction/documentation/Introduction_nl.adoc b/src/main/resources/lessons/webgoat_introduction/documentation/Introduction_nl.adoc new file mode 100644 index 000000000..702986c6f --- /dev/null +++ b/src/main/resources/lessons/webgoat_introduction/documentation/Introduction_nl.adoc @@ -0,0 +1,18 @@ +== Wat is WebGoat? +--- + +WebGoat is een applicatie die verschillende kwetsbaarheden uit de OWASP top 10 uitlegt en laat uittesten. + +Het bevat lessen, oefeningen en uitdagingen (de challenges). De lessen zijn onderverdeeld in een aantal categorien en daarin staan pagina's met informatie en oefeningen. De challenges moet je als laatste uitproberen. Deze zijn lastig en bevatten geen hints. + +De opzet van WebGoat is om spelenderwijs alles te leren en te ervaren op het gebied van web security. Dit is geschikt voor zowel ontwikkelaars als testers. + +Voel je vrij om WebGoat eens flink uit te testen en je kennis en ervaring op dit gebied te verbeteren. + +Je moet met een hacking mindset proberen de WebGoat applicatie oefeningen op te lossen. + +Bedankt voor je interesse! + +*Het team van WebGoat* + +#De meeste tekst is in het Engels. U kunt van taal wisselen via de dropdown in het menu. U bent ook van harte uitgenodigd om teksten te vertalen om WebGoat te verbeteren.# diff --git a/src/main/resources/webgoat/static/css/img/cnlang.svg b/src/main/resources/webgoat/static/css/img/cnlang.svg new file mode 100644 index 000000000..7f27dae03 --- /dev/null +++ b/src/main/resources/webgoat/static/css/img/cnlang.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/main/resources/webgoat/static/css/img/delang.svg b/src/main/resources/webgoat/static/css/img/delang.svg new file mode 100644 index 000000000..ccb5ff126 --- /dev/null +++ b/src/main/resources/webgoat/static/css/img/delang.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/main/resources/webgoat/static/css/img/enlang.svg b/src/main/resources/webgoat/static/css/img/enlang.svg new file mode 100644 index 000000000..b261273ec --- /dev/null +++ b/src/main/resources/webgoat/static/css/img/enlang.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/main/resources/webgoat/static/css/img/eslang.svg b/src/main/resources/webgoat/static/css/img/eslang.svg new file mode 100644 index 000000000..f9c9b4b32 --- /dev/null +++ b/src/main/resources/webgoat/static/css/img/eslang.svg @@ -0,0 +1,547 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/webgoat/static/css/img/frlang.svg b/src/main/resources/webgoat/static/css/img/frlang.svg new file mode 100644 index 000000000..dfa34e8c9 --- /dev/null +++ b/src/main/resources/webgoat/static/css/img/frlang.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/main/resources/webgoat/static/css/img/nllang.svg b/src/main/resources/webgoat/static/css/img/nllang.svg new file mode 100644 index 000000000..eb0e360f3 --- /dev/null +++ b/src/main/resources/webgoat/static/css/img/nllang.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/main/resources/webgoat/templates/main_new.html b/src/main/resources/webgoat/templates/main_new.html index 4546b7887..92c47fd65 100644 --- a/src/main/resources/webgoat/templates/main_new.html +++ b/src/main/resources/webgoat/templates/main_new.html @@ -24,7 +24,7 @@ - + WebGoat @@ -40,12 +40,15 @@
+ + +
+
+ + +
+ +
+
@@ -86,10 +137,12 @@
+ +