diff --git a/js/apps/system/aardvark/frontend/js/templates/modalApplicationMount.ejs b/js/apps/system/aardvark/frontend/js/templates/modalApplicationMount.ejs index 8554e14b3e..7e81b598a6 100644 --- a/js/apps/system/aardvark/frontend/js/templates/modalApplicationMount.ejs +++ b/js/apps/system/aardvark/frontend/js/templates/modalApplicationMount.ejs @@ -42,6 +42,7 @@ + Collections*: diff --git a/js/apps/system/aardvark/frontend/js/views/applicationsView.js b/js/apps/system/aardvark/frontend/js/views/applicationsView.js index ef28774bf3..974d18ecdf 100644 --- a/js/apps/system/aardvark/frontend/js/views/applicationsView.js +++ b/js/apps/system/aardvark/frontend/js/views/applicationsView.js @@ -110,8 +110,8 @@ //fetch needed information, need client side verification //remove name handling on server side because not needed name = ""; - url = $('#repository').val(); - version = $('#tag').val(); + url = window.arangoHelper.escapeHtml($('#repository').val()); + version = window.arangoHelper.escapeHtml($('#tag').val()); if (version === '') { version = "master"; @@ -431,13 +431,19 @@ //fetch needed information, need client side verification //remove name handling on server side because not needed name = ""; - url = $('#repository').val(); - version = $('#tag').val(); + url = window.arangoHelper.escapeHtml($('#repository').val()); + version = window.arangoHelper.escapeHtml($('#tag').val()); if (version === '') { version = "master"; } + try { + Joi.assert(url, Joi.string().regex(/^[a-zA-Z0-9_\-]+\/[a-zA-Z0-9_\-]+$/)); + } catch (e) { + console.log(e.message); + return; + } //send server req through collection result = this.collection.installFoxxFromGithub(url, name, version); if (result.error === false) { @@ -542,7 +548,7 @@ try { _.each(config, function(opt, key) { var $el = $("#app_config_" + key); - var val = $el.val(); + var val = window.arangoHelper.escapeHtml($el.val()); if (opt.type === "boolean") { cfg[key] = $el.is(":checked"); return; @@ -586,7 +592,7 @@ } var self = this; this.collection.create({ - mount: $("#mount-point").val(), + mount: window.arangoHelper.escapeHtml($("#mount-point").val()), name: name, version: version, options: { @@ -651,12 +657,14 @@ generateNewFoxxApp: function() { var info = { - name: $("#new-app-name").val(), - collectionNames: _.pluck($('#new-app-collections').select2("data"), "text"), - authenticated: $("#new-app-name").val(), - author: $("#new-app-author").val(), - license: $("#new-app-license").val(), - description: $("#new-app-description").val() + name: window.arangoHelper.escapeHtml($("#new-app-name").val()), + collectionNames: _.map($('#new-app-collections').select2("data"), function(d) { + return window.arangoHelper.escapeHtml(d.text); + }), + authenticated: window.arangoHelper.escapeHtml($("#new-app-name").val()), + author: window.arangoHelper.escapeHtml($("#new-app-author").val()), + license: window.arangoHelper.escapeHtml($("#new-app-license").val()), + description: window.arangoHelper.escapeHtml($("#new-app-description").val()) }, self = this; $.post("templates/generate", JSON.stringify(info), function(a) { @@ -689,19 +697,89 @@ } }, + setGithubValidators: function() { + window.modalView.modalBindValidation({ + id: "repository", + validateInput: function() { + return [ + { + rule: Joi.string().required().regex(/^[a-zA-Z0-9_\-]+\/[a-zA-Z0-9_\-]+$/), + msg: "No valid github account and repository." + } + ]; + } + }); + }, + + setNewAppValidators: function() { + window.modalView.modalBindValidation({ + id: "new-app-author", + validateInput: function() { + return [ + { + rule: Joi.string().required().min(1), + msg: "Has to be non empty." + } + ]; + } + }); + + window.modalView.modalBindValidation({ + id: "new-app-name", + validateInput: function() { + return [ + { + rule: Joi.string().required().regex(/^[a-zA-Z]+$/), + msg: "Can only contain a to z or A to Z." + } + ]; + } + }); + + window.modalView.modalBindValidation({ + id: "new-app-description", + validateInput: function() { + return [ + { + rule: Joi.string().required().min(1), + msg: "Has to be non empty." + } + ]; + } + }); + + window.modalView.modalBindValidation({ + id: "new-app-license", + validateInput: function() { + return [ + { + rule: Joi.string().required().regex(/^[a-zA-Z]+$/), + msg: "Has to be non empty." + } + ]; + } + }); + }, + switchModalButton: function(event) { + window.modalView.clearValidators(); var openTab = $(event.currentTarget).attr("href").substr(1); var button = $("#modalButton1"); switch (openTab) { case "newApp": button.html("Generate"); button.prop("disabled", false); + this.setNewAppValidators(); break; case "appstore": button.html("Install"); button.prop("disabled", true); break; case "github": + this.setGithubValidators(); + button.html("Install"); + button.prop("disabled", false); + break; case "zip": button.html("Install"); button.prop("disabled", false); @@ -746,6 +824,7 @@ table.append(listTempl.render(app)); }); }); + this.setNewAppValidators(); } }); diff --git a/js/apps/system/aardvark/frontend/js/views/modalView.js b/js/apps/system/aardvark/frontend/js/views/modalView.js index 9eb4dede9c..b3ce9cf4b4 100644 --- a/js/apps/system/aardvark/frontend/js/views/modalView.js +++ b/js/apps/system/aardvark/frontend/js/views/modalView.js @@ -57,6 +57,7 @@ window.ModalView = Backbone.View.extend({ _validators: [], + _validateWatchers: [], baseTemplate: templateEngine.createTemplate("modalBase.ejs"), tableTemplate: templateEngine.createTemplate("modalTable.ejs"), el: "#modalPlaceholder", @@ -235,7 +236,7 @@ events) { var self = this, lastBtn, closeButtonFound = false; buttons = buttons || []; - this._validators = []; + this.clearValidators(); // Insert close as second from right if (buttons.length > 0) { buttons.forEach(function (b) { @@ -396,6 +397,7 @@ } }); this._validators.push(validCheck); + this._validateWatchers.push($el); } }, @@ -415,8 +417,16 @@ } }, - hide: function() { + clearValidators: function() { this._validators = []; + _.each(this._validateWatchers, function(w) { + w.unbind('keyup focusout'); + }); + this._validateWatchers = []; + }, + + hide: function() { + this.clearValidators(); $("#modal-dialog").modal("hide"); } });