diff --git a/core/client/components/gh-upload-modal.js b/core/client/components/gh-upload-modal.js index 4512c8b1be..d297c26e30 100644 --- a/core/client/components/gh-upload-modal.js +++ b/core/client/components/gh-upload-modal.js @@ -1,5 +1,6 @@ import ModalDialog from 'ghost/components/gh-modal-dialog'; import upload from 'ghost/assets/lib/uploader'; +import cajaSanitizers from 'ghost/utils/caja-sanitizers'; var UploadModal = ModalDialog.extend({ layoutName: 'components/gh-modal-dialog', @@ -8,6 +9,16 @@ var UploadModal = ModalDialog.extend({ this._super(); upload.call(this.$('.js-drop-zone'), {fileStorage: this.get('config.fileStorage')}); }, + keyDown: function () { + this.setErrorState(false); + }, + setErrorState: function (state) { + if (state) { + this.$('.js-upload-url').addClass('error'); + } else { + this.$('.js-upload-url').removeClass('error'); + } + }, confirm: { reject: { func: function () { // The function called on rejection @@ -18,15 +29,23 @@ var UploadModal = ModalDialog.extend({ }, accept: { buttonClass: 'btn btn-blue right', - text: 'Save', // The accept button texttext: 'Save' + text: 'Save', // The accept button text: 'Save' func: function () { - var imageType = 'model.' + this.get('imageType'); + var imageType = 'model.' + this.get('imageType'), + value; if (this.$('.js-upload-url').val()) { - this.set(imageType, this.$('.js-upload-url').val()); + value = this.$('.js-upload-url').val(); + + if (!Ember.isEmpty(value) && !cajaSanitizers.url(value)) { + this.setErrorState(true); + return {message: 'Image URI is not valid'}; + } } else { - this.set(imageType, this.$('.js-upload-target').attr('src')); + value = this.$('.js-upload-target').attr('src'); } + + this.set(imageType, value); return true; } } @@ -37,12 +56,17 @@ var UploadModal = ModalDialog.extend({ this.sendAction(); }, confirm: function (type) { - var func = this.get('confirm.' + type + '.func'); + var result, + func = this.get('confirm.' + type + '.func'); + if (typeof func === 'function') { - func.apply(this); + result = func.apply(this); + } + + if (!result.message) { + this.sendAction(); + this.sendAction('confirm' + type); } - this.sendAction(); - this.sendAction('confirm' + type); } } });