diff --git a/cms/djangoapps/contentstore/features/transcripts.feature b/cms/djangoapps/contentstore/features/transcripts.feature index 165ce0ea91..dad9cbb49e 100644 --- a/cms/djangoapps/contentstore/features/transcripts.feature +++ b/cms/djangoapps/contentstore/features/transcripts.feature @@ -22,8 +22,8 @@ Feature: Video Component Editor And I edit the component #User inputs html5 links with equal extension - And I enter a "https://domain.org/123.webm" source to field number 1 - And I enter a "https://domain.org/456.webm" source to field number 2 + And I enter a "123.webm" source to field number 1 + And I enter a "456.webm" source to field number 2 Then I see error message "file_type" # Currently we are working with 2nd field. It means, that if 2nd field # contain incorrect value, 1st and 3rd fields should be disabled until @@ -35,8 +35,6 @@ Feature: Video Component Editor #User input URL with incorrect format And I enter a "htt://link.c" source to field number 1 Then I see error message "url_format" - And I enter a "http://domain.org/123.mp4" source to field number 1 - Then I see error message "url_format" # Currently we are working with 1st field. It means, that if 1st field # contain incorrect value, 2nd and 3rd fields should be disabled until # 1st field will be filled by correct correct value @@ -122,7 +120,7 @@ Feature: Video Component Editor Given I have created a Video component And I edit the component - And I enter a "https://domain.org/t_not_exist.mp4" source to field number 1 + And I enter a "t_not_exist.mp4" source to field number 1 Then I see status message "not found" And I see value "" in the field "HTML5 Transcript" @@ -131,7 +129,7 @@ Feature: Video Component Editor Given I have created a Video component with subtitles "t_not_exist" And I edit the component - And I enter a "https://domain.org/t_not_exist.mp4" source to field number 1 + And I enter a "t_not_exist.mp4" source to field number 1 Then I see status message "found" And I see value "t_not_exist" in the field "HTML5 Transcript" @@ -143,7 +141,7 @@ Feature: Video Component Editor And I enter a "http://youtu.be/t_not_exist" source to field number 1 Then I see status message "found" - And I enter a "https://domain.org/test_video_name.mp4" source to field number 2 + And I enter a "test_video_name.mp4" source to field number 2 Then I see status message "found" And I see value "t_not_exist" in the field "HTML5 Transcript" @@ -158,7 +156,7 @@ Feature: Video Component Editor And I click transcript button "import" Then I see status message "found" - And I enter a "https://domain.org/t_not_exist.mp4" source to field number 2 + And I enter a "t_not_exist.mp4" source to field number 2 Then I see status message "found" And I see value "t__eq_exist" in the field "HTML5 Transcript" @@ -172,12 +170,12 @@ Feature: Video Component Editor And I see button "import" And I see button "upload_new_timed_transcripts" - And I enter a "https://domain.org/t_not_exist.mp4" source to field number 2 + And I enter a "t_not_exist.mp4" source to field number 2 Then I see status message "not found" And I see button "import" And I see button "upload_new_timed_transcripts" - And I enter a "https://domain.org/t_not_exist.webm" source to field number 3 + And I enter a "t_not_exist.webm" source to field number 3 Then I see status message "not found" And I see button "import" And I see button "upload_new_timed_transcripts" @@ -190,11 +188,11 @@ Feature: Video Component Editor Then I see status message "not found" And I see button "disabled_download_to_edit" And I see button "upload_new_timed_transcripts" - And I enter a "https://domain.org/t_not_exist.mp4" source to field number 2 + And I enter a "t_not_exist.mp4" source to field number 2 Then I see status message "not found" And I see button "upload_new_timed_transcripts" And I see button "disabled_download_to_edit" - And I enter a "https://domain.org/t_not_exist.webm" source to field number 3 + And I enter a "t_not_exist.webm" source to field number 3 Then I see status message "not found" And I see button "disabled_download_to_edit" And I see button "upload_new_timed_transcripts" @@ -211,12 +209,12 @@ Feature: Video Component Editor Then I see status message "found" And I see button "upload_new_timed_transcripts" - And I enter a "https://domain.org/t_not_exist.mp4" source to field number 2 + And I enter a "t_not_exist.mp4" source to field number 2 Then I see status message "found" And I see button "download_to_edit" And I see button "upload_new_timed_transcripts" - And I enter a "https://domain.org/t_not_exist.webm" source to field number 3 + And I enter a "t_not_exist.webm" source to field number 3 Then I see status message "found" And I see button "download_to_edit" And I see button "upload_new_timed_transcripts" @@ -231,12 +229,12 @@ Feature: Video Component Editor And I see button "disabled_download_to_edit" And I see button "upload_new_timed_transcripts" - And I enter a "https://domain.org/t_not_exist.mp4" source to field number 2 + And I enter a "t_not_exist.mp4" source to field number 2 Then I see status message "not found" And I see button "disabled_download_to_edit" And I see button "upload_new_timed_transcripts" - And I enter a "https://domain.org/t_neq_exist.webm" source to field number 3 + And I enter a "t_neq_exist.webm" source to field number 3 Then I see status message "found" And I see button "download_to_edit" And I see button "upload_new_timed_transcripts" @@ -251,12 +249,12 @@ Feature: Video Component Editor And I see button "import" And I see button "upload_new_timed_transcripts" - And I enter a "https://domain.org/t_not_exist.mp4" source to field number 2 + And I enter a "t_not_exist.mp4" source to field number 2 Then I see status message "not found" And I see button "import" And I see button "upload_new_timed_transcripts" - And I enter a "https://domain.org/t_neq_exist.webm" source to field number 3 + And I enter a "t_neq_exist.webm" source to field number 3 Then I see status message "not found" And I see button "import" And I see button "upload_new_timed_transcripts" @@ -271,12 +269,12 @@ Feature: Video Component Editor And I see button "import" And I see button "upload_new_timed_transcripts" - And I enter a "https://domain.org/t_neq_exist.mp4" source to field number 2 + And I enter a "t_neq_exist.mp4" source to field number 2 Then I see status message "not found" And I see button "import" And I see button "upload_new_timed_transcripts" - And I enter a "https://domain.org/t_not_exist.webm" source to field number 3 + And I enter a "t_not_exist.webm" source to field number 3 Then I see status message "not found" And I see button "import" And I see button "upload_new_timed_transcripts" @@ -293,12 +291,12 @@ Feature: Video Component Editor Then I see status message "found" And I see button "upload_new_timed_transcripts" - And I enter a "https://domain.org/t_neq_exist.mp4" source to field number 2 + And I enter a "t_neq_exist.mp4" source to field number 2 Then I see status message "found" And I see button "download_to_edit" And I see button "upload_new_timed_transcripts" - And I enter a "https://domain.org/t_not_exist.webm" source to field number 3 + And I enter a "t_not_exist.webm" source to field number 3 Then I see status message "found" And I see button "download_to_edit" And I see button "upload_new_timed_transcripts" @@ -315,12 +313,12 @@ Feature: Video Component Editor Then I see status message "found" And I see button "upload_new_timed_transcripts" - And I enter a "https://domain.org/t_not_exist.mp4" source to field number 2 + And I enter a "t_not_exist.mp4" source to field number 2 Then I see status message "found" And I see button "download_to_edit" And I see button "upload_new_timed_transcripts" - And I enter a "https://domain.org/t_neq_exist.webm" source to field number 3 + And I enter a "t_neq_exist.webm" source to field number 3 Then I see status message "found" And I see button "download_to_edit" And I see button "upload_new_timed_transcripts" @@ -330,7 +328,7 @@ Feature: Video Component Editor Given I have created a Video component with subtitles "t__eq_exist" And I edit the component - And I enter a "https://domain.org/t__eq_exist.mp4" source to field number 1 + And I enter a "t__eq_exist.mp4" source to field number 1 Then I see status message "found" And I see button "download_to_edit" And I see button "upload_new_timed_transcripts" @@ -345,7 +343,7 @@ Feature: Video Component Editor And I see button "download_to_edit" And I see button "upload_new_timed_transcripts" - And I enter a "https://domain.org/test_transcripts.webm" source to field number 3 + And I enter a "test_transcripts.webm" source to field number 3 Then I see status message "found" #20 @@ -353,7 +351,7 @@ Feature: Video Component Editor Given I have created a Video component with subtitles "t_not_exist" And I edit the component - And I enter a "https://domain.org/test_transcripts.mp4" source to field number 1 + And I enter a "test_transcripts.mp4" source to field number 1 Then I see status message "not found" And I see button "download_to_edit" And I see button "upload_new_timed_transcripts" @@ -361,7 +359,7 @@ Feature: Video Component Editor Then I see status message "uploaded_successfully" And I see value "test_transcripts" in the field "HTML5 Transcript" - And I enter a "https://domain.org/t_not_exist.webm" source to field number 2 + And I enter a "t_not_exist.webm" source to field number 2 Then I see status message "replace" And I see choose button "test_transcripts.mp4" number 1 @@ -374,7 +372,7 @@ Feature: Video Component Editor Given I have created a Video component with subtitles "t_not_exist" And I edit the component - And I enter a "https://domain.org/t_not_exist.mp4" source to field number 1 + And I enter a "t_not_exist.mp4" source to field number 1 Then I see status message "found" And I see button "download_to_edit" And I see button "upload_new_timed_transcripts" @@ -383,13 +381,13 @@ Feature: Video Component Editor And I save changes And I edit the component - And I enter a "https://domain.org/video_name_2.mp4" source to field number 1 + And I enter a "video_name_2.mp4" source to field number 1 Then I see status message "use existing" And I see button "use_existing" And I click transcript button "use_existing" And I see value "video_name_2" in the field "HTML5 Transcript" - And I enter a "https://domain.org/video_name_3.mp4" source to field number 1 + And I enter a "video_name_3.mp4" source to field number 1 Then I see status message "use existing" And I see button "use_existing" And I click transcript button "use_existing" @@ -400,7 +398,7 @@ Feature: Video Component Editor Given I have created a Video component with subtitles "t_not_exist" And I edit the component - And I enter a "https://domain.org/t_not_exist.mp4" source to field number 1 + And I enter a "t_not_exist.mp4" source to field number 1 Then I see status message "found" And I see button "download_to_edit" And I see button "upload_new_timed_transcripts" @@ -409,17 +407,17 @@ Feature: Video Component Editor And I save changes And I edit the component - And I enter a "https://domain.org/video_name_2.mp4" source to field number 1 + And I enter a "video_name_2.mp4" source to field number 1 Then I see status message "use existing" And I see button "use_existing" And I click transcript button "use_existing" And I see value "video_name_2" in the field "HTML5 Transcript" - And I enter a "https://domain.org/video_name_3.mp4" source to field number 1 + And I enter a "video_name_3.mp4" source to field number 1 Then I see status message "use existing" And I see button "use_existing" - And I enter a "https://domain.org/video_name_4.mp4" source to field number 1 + And I enter a "video_name_4.mp4" source to field number 1 Then I see status message "use existing" And I see button "use_existing" And I click transcript button "use_existing" @@ -430,7 +428,7 @@ Feature: Video Component Editor Given I have created a Video component with subtitles "t_not_exist" And I edit the component - And I enter a "https://domain.org/t_not_exist.mp4" source to field number 1 + And I enter a "t_not_exist.mp4" source to field number 1 Then I see status message "found" And I see button "download_to_edit" And I see button "upload_new_timed_transcripts" @@ -438,11 +436,11 @@ Feature: Video Component Editor And I save changes And I edit the component - And I enter a "https://domain.org/video_name_2.mp4" source to field number 1 + And I enter a "video_name_2.mp4" source to field number 1 Then I see status message "use existing" And I see button "use_existing" - And I enter a "https://domain.org/video_name_3.webm" source to field number 2 + And I enter a "video_name_3.webm" source to field number 2 Then I see status message "use existing" And I see button "use_existing" And I click transcript button "use_existing" @@ -453,7 +451,7 @@ Feature: Video Component Editor Given I have created a Video component And I edit the component - And I enter a "https://domain.org/video_name_1.mp4" source to field number 1 + And I enter a "video_name_1.mp4" source to field number 1 And I see status message "not found" And I upload the transcripts file "test_transcripts.srt" Then I see status message "uploaded_successfully" @@ -473,7 +471,7 @@ Feature: Video Component Editor Given I have created a Video component And I edit the component - And I enter a "https://domain.org/video_name_1.mp4" source to field number 1 + And I enter a "video_name_1.mp4" source to field number 1 Then I see status message "not found" #26 @@ -481,10 +479,10 @@ Feature: Video Component Editor Given I have created a Video component And I edit the component - And I enter a "https://domain.org/video_name_1.mp4" source to field number 1 + And I enter a "video_name_1.mp4" source to field number 1 And I see status message "not found" - And I enter a "https://domain.org/video_name_2.webm" source to field number 2 + And I enter a "video_name_2.webm" source to field number 2 And I see status message "not found" And I upload the transcripts file "test_transcripts.srt" Then I see status message "uploaded_successfully" @@ -520,7 +518,7 @@ Feature: Video Component Editor Then I see status message "not found" And I see button "upload_new_timed_transcripts" - And I enter a "https://domain.org/video_name_1.mp4" source to field number 2 + And I enter a "video_name_1.mp4" source to field number 2 Then I see status message "not found" And I see button "upload_new_timed_transcripts" @@ -540,7 +538,7 @@ Feature: Video Component Editor Given I have created a Video component with subtitles "t_not_exist" And I edit the component - And I enter a "https://domain.org/video_name_1.mp4" source to field number 1 + And I enter a "video_name_1.mp4" source to field number 1 Then I see status message "not found" And I open tab "Advanced" @@ -558,7 +556,7 @@ Feature: Video Component Editor Given I have created a Video component And I edit the component - And I enter a "https://domain.org/video_name_1.mp4" source to field number 1 + And I enter a "video_name_1.mp4" source to field number 1 Then I see status message "not found" And I upload the transcripts file "chinese_transcripts.srt" @@ -572,7 +570,7 @@ Feature: Video Component Editor Given I have created a Video component with subtitles "t_not_exist" And I edit the component - And I enter a "https://domain.org/video_name_1.mp4" source to field number 1 + And I enter a "video_name_1.mp4" source to field number 1 Then I see status message "not found" And I open tab "Advanced" @@ -592,7 +590,7 @@ Feature: Video Component Editor Given I have created a Video component with subtitles "t_not_exist" And I edit the component - And I enter a "https://domain.org/t_not_exist.mp4" source to field number 1 + And I enter a "t_not_exist.mp4" source to field number 1 Then I see status message "found" And I open tab "Advanced" @@ -612,7 +610,7 @@ Feature: Video Component Editor Given I have created a Video component with subtitles "t_not_exist" And I edit the component - And I enter a "https://domain.org/t_not_exist.mp4" source to field number 1 + And I enter a "t_not_exist.mp4" source to field number 1 Then I see status message "found" And I save changes @@ -635,7 +633,7 @@ Feature: Video Component Editor Given I have created a Video component with subtitles "t_not_exist" And I edit the component - And I enter a "https://domain.org/video_name_1.mp4" source to field number 1 + And I enter a "video_name_1.mp4" source to field number 1 Then I see status message "not found" And I upload the transcripts file "chinese_transcripts.srt" diff --git a/cms/djangoapps/contentstore/views/item.py b/cms/djangoapps/contentstore/views/item.py index 34c22ca1bd..e10f4f84c7 100644 --- a/cms/djangoapps/contentstore/views/item.py +++ b/cms/djangoapps/contentstore/views/item.py @@ -2,9 +2,8 @@ import logging from uuid import uuid4 -from requests.packages.urllib3.util import parse_url -from django.core.exceptions import PermissionDenied, ValidationError +from django.core.exceptions import PermissionDenied from django.contrib.auth.decorators import login_required from xmodule.modulestore import Location @@ -108,17 +107,6 @@ def save_item(request): except ValueError: return JsonResponse({"error": "Invalid data"}, 400) field.write_to(existing_item, value) - - - if existing_item.category == 'video': - - allowedSchemes = ['https'] - # The entire site is served from https, so browsers with good - # security will reject non-https URLs anyway. - # Also, following video module specific code is here, because front-end - # metadata fields doesn't support validation. - if metadata_key == 'html5_sources' and not all([parse_url(u).scheme in allowedSchemes for u in value]): - raise ValidationError(u'HTML5 video sources support following protocols: {0}.'.format(' '.join(allowedSchemes))) # Save the data that we've just changed to the underlying # MongoKeyValueStore before we update the mongo datastore. existing_item.save() diff --git a/cms/static/js/views/transcripts/utils.js b/cms/static/js/views/transcripts/utils.js index 4e40be333d..7965d0b9e3 100644 --- a/cms/static/js/views/transcripts/utils.js +++ b/cms/static/js/views/transcripts/utils.js @@ -145,8 +145,7 @@ define(["jquery", "underscore", "jquery.ajaxQueue"], function($, _) { } var link = document.createElement('a'), - allowedProtocols = ['https'], - match, protocol; + match; link.href = url; match = link.pathname @@ -154,8 +153,7 @@ define(["jquery", "underscore", "jquery.ajaxQueue"], function($, _) { .pop() .match(/(.+)\.(mp4|webm)$/); - protocol = link.protocol.slice(0, -1); - if (match && $.inArray(protocol, allowedProtocols) !== -1) { + if (match) { cache[url] = { video: match[1], type: match[2] diff --git a/cms/static/js_spec/transcripts/editor_spec.js b/cms/static/js_spec/transcripts/editor_spec.js index b8b839ddd4..b451466975 100644 --- a/cms/static/js_spec/transcripts/editor_spec.js +++ b/cms/static/js_spec/transcripts/editor_spec.js @@ -18,8 +18,8 @@ function ($, Backbone, _, Utils, Editor, MetadataView, MetadataModel, MetadataCo type: MetadataModel.VIDEO_LIST_TYPE, value: [ 'http://youtu.be/12345678901', - 'https://domain.com/video.mp4', - 'https://domain.com/video.webm' + 'video.mp4', + 'video.webm' ] }, DisplayNameEntry = { @@ -116,10 +116,7 @@ function ($, Backbone, _, Utils, Editor, MetadataView, MetadataModel, MetadataCo help: 'A list of html5 sources.', options: [], type: MetadataModel.LIST_TYPE, - value: [ - 'https://domain.com/default.mp4', - 'https://domain.com/default.webm' - ] + value: ['default.mp4', 'default.webm'] }, youtubeEntry = { @@ -172,14 +169,17 @@ function ($, Backbone, _, Utils, Editor, MetadataView, MetadataModel, MetadataCo }, "Defaults never loaded", 1000); runs(function() { - var displayNameValue = collection[0].getValue(), - videoUrlValue = collection[1].getValue(); + + var displayNameValue = collection[0].getValue(); + var videoUrlValue = collection[1].getValue(); + expect(displayNameValue).toBe('default'); expect(videoUrlValue).toEqual([ 'http://youtu.be/OEoXaMPEzfM', - 'https://domain.com/default.mp4', - 'https://domain.com/default.webm' + 'default.mp4', + 'default.webm' ]); + }); }); it('If metadataCollection is not defined', function () { @@ -190,8 +190,8 @@ function ($, Backbone, _, Utils, Editor, MetadataView, MetadataModel, MetadataCo expect(videoUrlValue).toEqual([ 'http://youtu.be/12345678901', - 'https://domain.com/video.mp4', - 'https://domain.com/video.webm' + 'video.mp4', + 'video.webm' ]); }); @@ -202,8 +202,8 @@ function ($, Backbone, _, Utils, Editor, MetadataView, MetadataModel, MetadataCo model.setValue([ '12345678', - 'https://domain.com/default.mp4', - 'https://domain.com/default.webm' + 'default.mp4', + 'default.webm' ]); transcripts.syncBasicTab(metadataCollection, metadataView); @@ -213,8 +213,8 @@ function ($, Backbone, _, Utils, Editor, MetadataView, MetadataModel, MetadataCo expect(videoUrlValue).toEqual([ '', - 'https://domain.com/default.mp4', - 'https://domain.com/default.webm' + 'default.mp4', + 'default.webm' ]); }); }); @@ -232,16 +232,16 @@ function ($, Backbone, _, Utils, Editor, MetadataView, MetadataModel, MetadataCo runs(function() { - var displayNameValue = collection[0].getValue(), - subValue = collection[1].getValue(), - html5SourcesValue = collection[2].getValue(), - youtubeValue = collection[3].getValue(); + var displayNameValue = collection[0].getValue(); + var subValue = collection[1].getValue(); + var html5SourcesValue = collection[2].getValue(); + var youtubeValue = collection[3].getValue(); expect(displayNameValue).toBe('display value'); expect(subValue).toBe('default'); expect(html5SourcesValue).toEqual([ - 'https://domain.com/video.mp4', - 'https://domain.com/video.webm' + 'video.mp4', + 'video.webm' ]); expect(youtubeValue).toBe('12345678901'); }); @@ -259,8 +259,8 @@ function ($, Backbone, _, Utils, Editor, MetadataView, MetadataModel, MetadataCo expect(displayNameValue).toBe('default'); expect(subValue).toBe('default'); expect(html5SourcesValue).toEqual([ - 'https://domain.com/default.mp4', - 'https://domain.com/default.webm' + 'default.mp4', + 'default.webm' ]); expect(youtubeValue).toBe('OEoXaMPEzfM'); }); @@ -269,8 +269,8 @@ function ($, Backbone, _, Utils, Editor, MetadataView, MetadataModel, MetadataCo var model = transcripts.collection.models[1]; model.setValue([ - 'https://domain.com/video.mp4', - 'https://domain.com/video.webm' + 'video.mp4', + 'video.webm' ]); transcripts.syncAdvancedTab(metadataCollection); @@ -280,8 +280,8 @@ function ($, Backbone, _, Utils, Editor, MetadataView, MetadataModel, MetadataCo youtubeValue = collection[3].getValue(); expect(html5SourcesValue).toEqual([ - 'https://domain.com/video.mp4', - 'https://domain.com/video.webm' + 'video.mp4', + 'video.webm' ]); expect(youtubeValue).toBe(''); }); diff --git a/cms/static/js_spec/transcripts/utils_spec.js b/cms/static/js_spec/transcripts/utils_spec.js index 5a884de291..1ae746269c 100644 --- a/cms/static/js_spec/transcripts/utils_spec.js +++ b/cms/static/js_spec/transcripts/utils_spec.js @@ -24,13 +24,17 @@ function ($, _, Utils, _str) { } (videoId)), html5FileName = 'file_name', - html5LinksList = (function (videoName) { + html5LinksList = (function (videoName) { var videoTypes = ['mp4', 'webm'], links = [ - 'https://somelink.com/%s.%s?param=1¶m=2#hash', - 'https://somelink.com/%s.%s#hash', - 'https://somelink.com/%s.%s?param=1¶m=2', - 'https://somelink.com/%s.%s' + 'http://somelink.com/%s.%s?param=1¶m=2#hash', + 'http://somelink.com/%s.%s#hash', + 'http://somelink.com/%s.%s?param=1¶m=2', + 'http://somelink.com/%s.%s', + 'ftp://somelink.com/%s.%s', + 'https://somelink.com/%s.%s', + 'somelink.com/%s.%s', + '%s.%s' ], data = {}; @@ -186,12 +190,7 @@ function ($, _, Utils, _str) { 'http://google.com/somevideo_mp4', 'http://google.com/somevideo:mp4', 'http://google.com/somevideo', - 'http://google.com/somevideo.webm_', - 'http://somelink.com/video_name.mp4?param=1¶m=2#hash', - 'http://somelink.com/video_name.webm', - 'ftp://somelink.com/video_name.mp4', - 'somelink.com/video_name.webm', - 'video_name.mp4' + 'http://google.com/somevideo.webm_' ]; $.each(html5WrongUrls, function (index, link) { diff --git a/cms/static/js_spec/transcripts/videolist_spec.js b/cms/static/js_spec/transcripts/videolist_spec.js index 2560bdfcbf..468e9bd84b 100644 --- a/cms/static/js_spec/transcripts/videolist_spec.js +++ b/cms/static/js_spec/transcripts/videolist_spec.js @@ -41,9 +41,9 @@ function ($, _, Utils, VideoList, MessageManager, MetadataView, MetadataModel, A options: [], type: MetadataModel.VIDEO_LIST_TYPE, value: [ - 'https://youtu.be/12345678901', - 'https://domain.com/video.mp4', - 'https://domain.com/video.webm' + 'http://youtu.be/12345678901', + 'video.mp4', + 'video.webm' ] }, response = JSON.stringify({ @@ -408,8 +408,8 @@ function ($, _, Utils, VideoList, MessageManager, MetadataView, MetadataModel, A view.setValueInEditor([ 'http://youtu.be/12345678901', - 'https://domain.com/video.mp4', - 'https://domain.com/video' + 'video.mp4', + 'video' ]); expect(view).assertIsCorrectVideoList(value); });