diff --git a/src/main/java/org/owasp/webgoat/session/Screen.java b/src/main/java/org/owasp/webgoat/session/Screen.java
index ad58f8edb..0a85cd496 100644
--- a/src/main/java/org/owasp/webgoat/session/Screen.java
+++ b/src/main/java/org/owasp/webgoat/session/Screen.java
@@ -35,8 +35,8 @@ import org.owasp.webgoat.lessons.AbstractLesson;
*
* Getting Source ==============
*
- * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository
- * for free software projects.
+ * Source for this application is maintained at
+ * https://github.com/WebGoat/WebGoat, a repository for free software projects.
*
* For details, please see http://webgoat.github.io
*
@@ -202,12 +202,11 @@ public abstract class Screen {
}
- // TODO we could hook all forms here with javascript call to ajax forms plugin
+ // hook all the links
public String getContent() {
- String makeFormsAjax = "";
- // handle this on the page with js
- makeFormsAjax = "";
- return (content == null) ? "" : content.toString() + makeFormsAjax;
+ String makeAllAjax = "";
+ // need to do this here as some of the lessons render forms after submission of an ajax form
+ return (content == null) ? "" : content.toString() + makeAllAjax;
}
/**
diff --git a/src/main/webapp/WEB-INF/pages/main_new.jsp b/src/main/webapp/WEB-INF/pages/main_new.jsp
index 8eb9daed9..98e44b6b5 100644
--- a/src/main/webapp/WEB-INF/pages/main_new.jsp
+++ b/src/main/webapp/WEB-INF/pages/main_new.jsp
@@ -41,7 +41,7 @@
-
+
@@ -115,9 +115,9 @@
{{item.name}}
@@ -177,19 +177,19 @@
Cookies
-
-
- | |
-
-
-
- {{key}} |
- {{value}} |
-
-
-
-
-
+
+
+ | |
+
+
+
+ {{key}} |
+ {{value}} |
+
+
+
+
+
@@ -296,7 +296,7 @@
$(document).ready(function() {
//TODO merge appliction.js code into other js files
- app.init();
+ app.init();
});
// make all forms ajax forms
var options = {
@@ -354,7 +354,8 @@
// make any embedded forms ajaxy
goat.utils.showLessonCookiesAndParams();
goat.utils.makeFormsAjax();
- goat.utils.ajaxifyAttackHref(); //TODO find some way to hook scope for current menu. Likely needs larger refactor which is already started/stashed
+ // links are hooked with each lesson now (see Java class Screen.getContent())
+ //goat.utils.ajaxifyAttackHref(); //TODO find some way to hook scope for current menu. Likely needs larger refactor which is already started/stashed
//refresh menu
angular.element($('#leftside-navigation')).scope().renderMenu();
}
diff --git a/src/main/webapp/js/goatControllers.js b/src/main/webapp/js/goatControllers.js
index 8f9d28d47..6a1b47feb 100644
--- a/src/main/webapp/js/goatControllers.js
+++ b/src/main/webapp/js/goatControllers.js
@@ -8,170 +8,171 @@ var goatMenu = function($scope, $http, $modal, $log, $templateCache) {
$scope.cookies = [];
$scope.params = [];
$scope.renderMenu = function() {
- goat.data.loadMenu($http).then( //$http({method: 'GET', url: goatConstants.lessonService})
- function(menuData) {
- var menuItems = goat.utils.addMenuClasses(goatConstants.menuPrefix.concat(menuData.data));
- //top-tier 'categories'
- for (var i=0;i> id
- menuItems[i].children[j].children[k].id = goat.utils.makeId(menuItems[i].children[j].children[k].name);
- //menuItems[i].children[j].children[k].id = menuItems[i].children[j].children[k].name.replace(/\s|\(|\)/g,'');
- //handle selected Menu state
- if (menuItems[i].children[j].children[k].id === $scope.curMenuItemSelected) {
- menuItems[i].children[j].children[k].selectedClass = goatConstants.selectedMenuClass;
- menuItems[i].children[j].selectedClass = goatConstants.selectedMenuClass;
- }
- //handle complete state
- if (menuItems[i].children[j].children[k].complete) {
- menuItems[i].children[j].children[k].completeClass= goatConstants.lessonCompleteClass;
- } else {
- menuItems[i].children[j].children[k].completeClass= ''
- }
- }
- }
- }
- }
- }
- $scope.menuTopics = menuItems;
- //
- if ($scope.openMenu) {
- $('ul'+$scope.openMenu).show();
- }
-
- },
- function(error) {
- // TODO - handle this some way other than an alert
- console.error("Error rendering menu: " + error);
- }
- );
+ goat.data.loadMenu($http).then(//$http({method: 'GET', url: goatConstants.lessonService})
+ function(menuData) {
+ var menuItems = goat.utils.addMenuClasses(goatConstants.menuPrefix.concat(menuData.data));
+ //top-tier 'categories'
+ for (var i = 0; i < menuItems.length; i++) {
+ menuItems[i].id = goat.utils.makeId(menuItems[i].name);//TODO move the replace routine into util function
+ menuItems[i].displayClass = ($scope.openMenu === menuItems[i].id) ? goatConstants.keepOpenClass : '';
+ if (menuItems[i].children) {
+ for (var j = 0; j < menuItems[i].children.length; j++) {
+ menuItems[i].children[j].id = goat.utils.makeId(menuItems[i].children[j].name);
+ //handle selected Menu state
+ if (menuItems[i].children[j].id === $scope.curMenuItemSelected) {
+ menuItems[i].children[j].selectedClass = goatConstants.selectedMenuClass;
+ menuItems[i].selectedClass = goatConstants.selectedMenuClass;
+ }
+ //handle complete state
+ if (menuItems[i].children[j].complete) {
+ menuItems[i].children[j].completeClass = goatConstants.lessonCompleteClass;
+ } else {
+ menuItems[i].children[j].completeClass = '';
+ }
+ if (menuItems[i].children[j].children) {
+ for (var k = 0; k < menuItems[i].children[j].children.length; k++) {
+ //TODO make utility function for name >> id
+ menuItems[i].children[j].children[k].id = goat.utils.makeId(menuItems[i].children[j].children[k].name);
+ //menuItems[i].children[j].children[k].id = menuItems[i].children[j].children[k].name.replace(/\s|\(|\)/g,'');
+ //handle selected Menu state
+ if (menuItems[i].children[j].children[k].id === $scope.curMenuItemSelected) {
+ menuItems[i].children[j].children[k].selectedClass = goatConstants.selectedMenuClass;
+ menuItems[i].children[j].selectedClass = goatConstants.selectedMenuClass;
+ }
+ //handle complete state
+ if (menuItems[i].children[j].children[k].complete) {
+ menuItems[i].children[j].children[k].completeClass = goatConstants.lessonCompleteClass;
+ } else {
+ menuItems[i].children[j].children[k].completeClass = ''
+ }
+ }
+ }
+ }
+ }
+ }
+ $scope.menuTopics = menuItems;
+ //
+ if ($scope.openMenu) {
+ $('ul' + $scope.openMenu).show();
+ }
+
+ },
+ function(error) {
+ // TODO - handle this some way other than an alert
+ console.error("Error rendering menu: " + error);
+ }
+ );
};
- $scope.renderLesson = function(id,url,showControls) {//TODO convert to single object parameter
+ $scope.renderLesson = function(id, url, showControls) {//TODO convert to single object parameter
$scope.hintIndex = 0;
var curScope = $scope;
- $('.lessonHelp').hide();
- // clean up menus, mark selected
- $scope.curMenuItemSelected = id;
- goat.utils.highlightCurrentLessonMenu(id);
+ $('.lessonHelp').hide();
+ // clean up menus, mark selected
+ $scope.curMenuItemSelected = id;
+ goat.utils.highlightCurrentLessonMenu(id);
curScope.parameters = goat.utils.scrapeParams(url);
- // lesson content
- goat.data.loadLessonContent($http,url).then(
- function(reply) {
- goat.data.loadLessonTitle($http).then(
- function(reply) {
- $("#lessonTitle").text(reply.data);
- }
- );
- //TODO encode html or get angular js portion working
- $("#lesson_content").html(reply.data);
- //hook forms
- goat.utils.makeFormsAjax();// inject form?
- goat.utils.ajaxifyAttackHref();
- $('#leftside-navigation').height($('#main-content').height()+15)//TODO: get ride of fixed value (15)here
- //notifies goatLesson Controller of the less change
- $scope.$emit('lessonUpdate',{params:curScope.parameters,'showControls':showControls});
- }
- )
- $scope.renderMenu();
+ // lesson content
+ goat.data.loadLessonContent($http, url).then(
+ function(reply) {
+ goat.data.loadLessonTitle($http).then(
+ function(reply) {
+ $("#lessonTitle").text(reply.data);
+ }
+ );
+ //TODO encode html or get angular js portion working
+ $("#lesson_content").html(reply.data);
+ //hook forms
+ goat.utils.makeFormsAjax();// inject form?
+ // links are hooked with each lesson now (see Java class Screen.getContent())
+ //goat.utils.ajaxifyAttackHref();
+ $('#leftside-navigation').height($('#main-content').height() + 15)//TODO: get ride of fixed value (15)here
+ //notifies goatLesson Controller of the less change
+ $scope.$emit('lessonUpdate', {params: curScope.parameters, 'showControls': showControls});
+ }
+ )
+ $scope.renderMenu();
};
$scope.accordionMenu = function(id) {
- if ($('ul#'+id).attr('isOpen') == 0) {
- $scope.expandMe = true;
- } else {
- $('ul#'+id).slideUp(300).attr('isOpen',0);
- return;
- }
- $scope.openMenu = id;
- $('.lessonsAndStages').not('ul#'+id).slideUp(300).attr('isOpen',0);
- if ($scope.expandMe) {
- $('ul#'+id).slideDown(300).attr('isOpen',1);
- }
+ if ($('ul#' + id).attr('isOpen') == 0) {
+ $scope.expandMe = true;
+ } else {
+ $('ul#' + id).slideUp(300).attr('isOpen', 0);
+ return;
+ }
+ $scope.openMenu = id;
+ $('.lessonsAndStages').not('ul#' + id).slideUp(300).attr('isOpen', 0);
+ if ($scope.expandMe) {
+ $('ul#' + id).slideDown(300).attr('isOpen', 1);
+ }
}
$scope.renderMenu();
// runs on first loadcan be augmented later to '
// resume' for a given user ... currently kluged to start at fixed lesson
var url = 'attack?Screen=32&menu=5';
- angular.element($('#leftside-navigation')).scope().renderLesson(null,url);
+ angular.element($('#leftside-navigation')).scope().renderLesson(null, url);
}
/* lesson controller */
-var goatLesson = function($scope,$http,$log) {
+var goatLesson = function($scope, $http, $log) {
$('#hintsView').hide();
- // adjust menu to lessonContent size if necssary
- //cookies
-
- $scope.$on('lessonUpdate',function(params){
- $scope.parameters = arguments[1].params;
- $scope.showHints = (arguments[1].showControls && arguments[1].showControls.showHints);
- $scope.showSource = (arguments[1].showControls && arguments[1].showControls.showSource);
- curScope = $scope; //TODO .. update below, this curScope is probably not needed
- goat.data.loadCookies($http).then(
- function(resp) {
- curScope.cookies = resp.data;
- }
- );
- //hints
- curScope.hintIndex = 0;
- if ($scope.showHints) {
- goat.data.loadHints($http).then(
- function(resp) {
- curScope.hints = resp.data;
- if (curScope.hints.length > 0 && curScope.hints[0].hint.indexOf(goatConstants.noHints) === -1) {
- goat.utils.displayButton('showHintsBtn', true);
- } else {
- goat.utils.displayButton('showHintsBtn', false);
- }
- }
- );
- } else {
- $scope.hints = null;
- goat.utils.displayButton('showHintsBtn', false);
- }
- //source
- if ($scope.showSource) {
- goat.data.loadSource($http).then(
- function(resp) {
- curScope.source = resp.data;
- }
- );
- } else {
- $scope.source = goatConstants.noSourcePulled;
- }
-
- //plan
- goat.data.loadPlan($http).then(
- function(resp) {
- curScope.plan = resp.data;
- }
- );
- //solution
- goat.data.loadSolution($http).then(
- function(resp) {
- curScope.solution = resp.data;
- }
- );
- });
-
- //goat.utils.scrollToTop();
+ // adjust menu to lessonContent size if necssary
+ //cookies
+
+ $scope.$on('lessonUpdate', function(params) {
+ $scope.parameters = arguments[1].params;
+ $scope.showHints = (arguments[1].showControls && arguments[1].showControls.showHints);
+ $scope.showSource = (arguments[1].showControls && arguments[1].showControls.showSource);
+ curScope = $scope; //TODO .. update below, this curScope is probably not needed
+ goat.data.loadCookies($http).then(
+ function(resp) {
+ curScope.cookies = resp.data;
+ }
+ );
+ //hints
+ curScope.hintIndex = 0;
+ if ($scope.showHints) {
+ goat.data.loadHints($http).then(
+ function(resp) {
+ curScope.hints = resp.data;
+ if (curScope.hints.length > 0 && curScope.hints[0].hint.indexOf(goatConstants.noHints) === -1) {
+ goat.utils.displayButton('showHintsBtn', true);
+ } else {
+ goat.utils.displayButton('showHintsBtn', false);
+ }
+ }
+ );
+ } else {
+ $scope.hints = null;
+ goat.utils.displayButton('showHintsBtn', false);
+ }
+ //source
+ if ($scope.showSource) {
+ goat.data.loadSource($http).then(
+ function(resp) {
+ curScope.source = resp.data;
+ }
+ );
+ } else {
+ $scope.source = goatConstants.noSourcePulled;
+ }
+
+ //plan
+ goat.data.loadPlan($http).then(
+ function(resp) {
+ curScope.plan = resp.data;
+ }
+ );
+ //solution
+ goat.data.loadSolution($http).then(
+ function(resp) {
+ curScope.solution = resp.data;
+ }
+ );
+ });
+
+ //goat.utils.scrollToTop();
$scope.showLessonSource = function() {
@@ -216,42 +217,42 @@ var goatLesson = function($scope,$http,$log) {
$('.lessonHelp').hide();
$('#lesson_hint_row').show();
//goat.utils.scrollToHelp();
- //TODO
+ //TODO
$scope.curHint = $scope.hints[$scope.hintIndex].hint;
- //$scope.curHint = $sce.trustAsHtml($scope.hints[$scope.hintIndex].hint);
- //TODO get html binding workin in the UI ... in the meantime ...
- //$scope.renderCurHint();
+ //$scope.curHint = $sce.trustAsHtml($scope.hints[$scope.hintIndex].hint);
+ //TODO get html binding workin in the UI ... in the meantime ...
+ //$scope.renderCurHint();
$scope.manageHintButtons();
};
$scope.viewNextHint = function() {
$scope.hintIndex++;
$scope.curHint = $scope.hints[$scope.hintIndex].hint;
- $scope.renderCurHint();
+ $scope.renderCurHint();
$scope.manageHintButtons();
};
$scope.viewPrevHint = function() {
$scope.hintIndex--;
$scope.curHint = $scope.hints[$scope.hintIndex].hint;
- $scope.renderCurHint();
+ $scope.renderCurHint();
$scope.manageHintButtons();
};
-
+
$scope.renderCurHint = function() {
- $('#curHintContainer').html($scope.curHint);
+ $('#curHintContainer').html($scope.curHint);
}
$scope.hideHints = function() {
};
-
- $scope.restartLesson = function () {
- goat.data.loadRestart($http).then(
- function(resp) {
- angular.element($('#leftside-navigation')).scope().renderLesson(null,resp.data,{showSource:$scope.showSource,showHints:$scope.showHints});
- }
- )
+
+ $scope.restartLesson = function() {
+ goat.data.loadRestart($http).then(
+ function(resp) {
+ angular.element($('#leftside-navigation')).scope().renderLesson(null, resp.data, {showSource: $scope.showSource, showHints: $scope.showHints});
+ }
+ )
}
$scope.showAbout = function() {