From 599f36fdb8a7a44bae38f8e72d5754f0476a66de Mon Sep 17 00:00:00 2001 From: Nanne Baars Date: Sat, 8 Apr 2017 10:31:56 +0200 Subject: [PATCH] Challenge 2 JavaScript is working --- .../owasp/webgoat/plugin/ShopEndpoint.java | 51 +++++++++---------- .../webgoat/plugin/SolutionConstants.java | 2 +- .../src/main/resources/html/Challenge.html | 33 ++++++++---- .../src/main/resources/js/challenge2.js | 43 +++++++++++----- .../resources/lessonPlans/en/Challenge_2.adoc | 1 + 5 files changed, 78 insertions(+), 52 deletions(-) create mode 100644 webgoat-lessons/challenge/src/main/resources/lessonPlans/en/Challenge_2.adoc diff --git a/webgoat-lessons/challenge/src/main/java/org/owasp/webgoat/plugin/ShopEndpoint.java b/webgoat-lessons/challenge/src/main/java/org/owasp/webgoat/plugin/ShopEndpoint.java index fc0323613..cc1f2bc3f 100644 --- a/webgoat-lessons/challenge/src/main/java/org/owasp/webgoat/plugin/ShopEndpoint.java +++ b/webgoat-lessons/challenge/src/main/java/org/owasp/webgoat/plugin/ShopEndpoint.java @@ -3,13 +3,14 @@ package org.owasp.webgoat.plugin; import com.beust.jcommander.internal.Lists; import lombok.AllArgsConstructor; import lombok.Getter; -import org.apache.commons.lang3.RandomStringUtils; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.Optional; import static org.owasp.webgoat.plugin.SolutionConstants.SUPER_COUPON_CODE; @@ -18,54 +19,50 @@ import static org.owasp.webgoat.plugin.SolutionConstants.SUPER_COUPON_CODE; * @since 4/6/17. */ @RestController +@RequestMapping("challenge-store") public class ShopEndpoint { @AllArgsConstructor - private class CouponCodes { + private class CheckoutCodes { @Getter - private List codes = Lists.newArrayList(); + private List codes = Lists.newArrayList(); - public boolean contains(String code) { - return codes.stream().anyMatch(c -> c.getCode().equals(code)); + public Optional get(String code) { + return codes.stream().filter(c -> c.getCode().equals(code)).findFirst(); } } @AllArgsConstructor @Getter - private class CouponCode { + private class CheckoutCode { private String code; private int discount; } - private CouponCodes couponCodes; + private CheckoutCodes checkoutCodes; public ShopEndpoint() { - List codes = Lists.newArrayList(); - for (int i = 0; i < 9; i++) { - codes.add(new CouponCode(RandomStringUtils.random(10), i * 100)); - } - this.couponCodes = new CouponCodes(codes); + List codes = Lists.newArrayList(); + codes.add(new CheckoutCode("pre-order-webgoat", 25)); + codes.add(new CheckoutCode("pre-order-owasp", 25)); + codes.add(new CheckoutCode("pre-order-webgoat-owasp", 50)); + this.checkoutCodes = new CheckoutCodes(codes); } - @GetMapping(value = "/coupons/{user}", produces = MediaType.APPLICATION_JSON_VALUE) - public CouponCodes getDiscountCodes(@PathVariable String user) { - if ("Tom".equals(user)) { - return couponCodes; + @GetMapping(value = "/coupons/{code}", produces = MediaType.APPLICATION_JSON_VALUE) + public CheckoutCode getDiscountCode(@PathVariable String code) { + if (SUPER_COUPON_CODE.equals(code)) { + return new CheckoutCode(SUPER_COUPON_CODE, 100); } - return null; - } - - @GetMapping(value = "/coupons/valid/{code}", produces = MediaType.APPLICATION_JSON_VALUE) - public boolean isValidCouponCode(@PathVariable String code) { - return couponCodes.contains(code); + return checkoutCodes.get(code).orElse(new CheckoutCode("no", 0)); } @GetMapping(value = "/coupons", produces = MediaType.APPLICATION_JSON_VALUE) - public CouponCodes coupons() { - List all = Lists.newArrayList(); - all.addAll(this.couponCodes.getCodes()); - all.add(new CouponCode(SUPER_COUPON_CODE, 100)); - return new CouponCodes(all); + public CheckoutCodes all() { + List all = Lists.newArrayList(); + all.addAll(this.checkoutCodes.getCodes()); + all.add(new CheckoutCode(SUPER_COUPON_CODE, 100)); + return new CheckoutCodes(all); } } diff --git a/webgoat-lessons/challenge/src/main/java/org/owasp/webgoat/plugin/SolutionConstants.java b/webgoat-lessons/challenge/src/main/java/org/owasp/webgoat/plugin/SolutionConstants.java index 5450e02ae..d881875d9 100644 --- a/webgoat-lessons/challenge/src/main/java/org/owasp/webgoat/plugin/SolutionConstants.java +++ b/webgoat-lessons/challenge/src/main/java/org/owasp/webgoat/plugin/SolutionConstants.java @@ -9,6 +9,6 @@ package org.owasp.webgoat.plugin; public interface SolutionConstants { String PASSWORD = "!!webgoat_admin_1234!!"; - String SUPER_COUPON_CODE = "get_if_for_free"; + String SUPER_COUPON_CODE = "get_it_for_free"; } diff --git a/webgoat-lessons/challenge/src/main/resources/html/Challenge.html b/webgoat-lessons/challenge/src/main/resources/html/Challenge.html index 59de297d1..8c9bbc78d 100644 --- a/webgoat-lessons/challenge/src/main/resources/html/Challenge.html +++ b/webgoat-lessons/challenge/src/main/resources/html/Challenge.html @@ -7,6 +7,7 @@
+
@@ -54,8 +55,8 @@
-
+
@@ -66,23 +67,23 @@
-

Samsung Galaxy S8 Plus 64GB Android Phone

-
Manufacturer Samsung · - (5054 reviews) +

Samsung Galaxy S8 Plus Android Phone

+
Samsung · + (124421 reviews)
PRICE
-

US $899

+

US $899

COLOR
-
-
+
+
@@ -90,8 +91,8 @@ CAPACITY
-
16 GB
-
32 GB
+
64 GB
+
128 GB
@@ -100,11 +101,23 @@
- +
+
+
+ CHECKOUT CODE +
+ + + + +
+