diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/ClientStorageController.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/ClientStorageController.cs index 4649d9873..607dd1564 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/ClientStorageController.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/ClientStorageController.cs @@ -8,19 +8,29 @@ using Orchard.MediaLibrary.Services; using Orchard.MediaLibrary.ViewModels; using Orchard.Themes; using Orchard.UI.Admin; +using Orchard.MediaLibrary.Models; +using Orchard.Localization; +using System.Linq; namespace Orchard.MediaLibrary.Controllers { [Admin, Themed(false)] public class ClientStorageController : Controller { private readonly IMediaLibraryService _mediaLibraryService; - private readonly IContentManager _contentManager; - public ClientStorageController(IMediaLibraryService mediaManagerService, IContentManager contentManager) { + public ClientStorageController(IMediaLibraryService mediaManagerService, IOrchardServices orchardServices) { _mediaLibraryService = mediaManagerService; - _contentManager = contentManager; + Services = orchardServices; + + T = NullLocalizer.Instance; } + public IOrchardServices Services { get; set; } + public Localizer T { get; set; } + public ActionResult Index(string folderPath, string type) { + if (!Services.Authorizer.Authorize(Permissions.ManageMediaContent, T("Cannot manage media"))) { + return new HttpUnauthorizedResult(); + } var viewModel = new ImportMediaViewModel { FolderPath = folderPath, @@ -32,7 +42,15 @@ namespace Orchard.MediaLibrary.Controllers { [HttpPost] public ActionResult Upload(string folderPath, string type) { + if (!Services.Authorizer.Authorize(Permissions.ManageMediaContent, T("Cannot manage media"))) { + return new HttpUnauthorizedResult(); + } + var statuses = new List(); + var settings = Services.WorkContext.CurrentSite.As(); + var allowedExtensions = (settings.UploadAllowedFileTypeWhitelist ?? "") + .Split(new [] { ',' }, StringSplitOptions.RemoveEmptyEntries) + .Where(x => x.StartsWith(".")); // Loop through each file in the request for (int i = 0; i < HttpContext.Request.Files.Count; i++) { @@ -45,8 +63,19 @@ namespace Orchard.MediaLibrary.Controllers { filename = "clipboard.png"; } + // skip file if the allowed extensions is defined and doesn't match + if(allowedExtensions.Any()) { + if(!allowedExtensions.Any(e => filename.EndsWith(e, StringComparison.OrdinalIgnoreCase))) { + statuses.Add(new { + error = T("This file type is not allowed: {0}", Path.GetExtension(filename)).Text, + progress = 1.0, + }); + continue; + } + } + var mediaPart = _mediaLibraryService.ImportMedia(file.InputStream, folderPath, filename, type); - _contentManager.Create(mediaPart); + Services.ContentManager.Create(mediaPart); statuses.Add(new { id = mediaPart.Id, diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Handlers/MediaLibrarySettingsPartHandler.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Handlers/MediaLibrarySettingsPartHandler.cs new file mode 100644 index 000000000..2b11e965f --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Handlers/MediaLibrarySettingsPartHandler.cs @@ -0,0 +1,23 @@ +using Orchard.ContentManagement; +using Orchard.ContentManagement.Handlers; +using Orchard.Localization; +using Orchard.MediaLibrary.Models; + +namespace Orchard.MediaLibrary.Handlers { + public class MediaLibrarySettingsPartHandler : ContentHandler { + public MediaLibrarySettingsPartHandler() { + T = NullLocalizer.Instance; + Filters.Add(new ActivatingFilter("Site")); + Filters.Add(new TemplateFilterForPart("MediaLibrarySettings", "Parts/MediaLibrary.MediaLibrarySettings", "media")); + } + + public Localizer T { get; set; } + + protected override void GetItemMetadata(GetContentItemMetadataContext context) { + if (context.ContentItem.ContentType != "Site") + return; + base.GetItemMetadata(context); + context.Metadata.EditorGroupInfo.Add(new GroupInfo(T("Media"))); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Models/MediaLibrarySettingsPart.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Models/MediaLibrarySettingsPart.cs new file mode 100644 index 000000000..e1bd50624 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Models/MediaLibrarySettingsPart.cs @@ -0,0 +1,14 @@ +using Orchard.ContentManagement; + +namespace Orchard.MediaLibrary.Models { + public class MediaLibrarySettingsPart : ContentPart { + + /// + /// Gets or sets the list of file extensions that can be uploaded + /// + public string UploadAllowedFileTypeWhitelist { + get { return this.Retrieve(x => x.UploadAllowedFileTypeWhitelist); } + set { this.Store(x => x.UploadAllowedFileTypeWhitelist, value); } + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Orchard.MediaLibrary.csproj b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Orchard.MediaLibrary.csproj index 0de418c55..5cc81bb4b 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Orchard.MediaLibrary.csproj +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Orchard.MediaLibrary.csproj @@ -107,6 +107,8 @@ + + @@ -381,6 +383,9 @@ + + + 10.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/ClientStorage/Index.cshtml b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/ClientStorage/Index.cshtml index 533b70f31..d663070d9 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/ClientStorage/Index.cshtml +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/ClientStorage/Index.cshtml @@ -49,7 +49,7 @@ function transferViewModel(filename, size) { var self = this; - + self.filename = filename; self.size = size; self.label = ko.observable(); @@ -60,7 +60,7 @@ function clientStorageViewModel() { var self = this; - + self.transfers = ko.observableArray([]); self.upload = function(file) { @@ -69,7 +69,7 @@ return transfer; }; } - + var viewModel = new clientStorageViewModel(); ko.applyBindings(viewModel); @@ -81,7 +81,7 @@ $('#fileupload > input').click(function(event) { event.stopPropagation(); }); - + // Add drag-n-drop HTML5 support $('#fileupload').fileupload({ url: '@Url.Action("Upload", "ClientStorage")', @@ -103,7 +103,7 @@ // See the basic file upload widget for more information: add: function (e, data) { var self = $(this); - + if (!data.files.length) { return; } @@ -113,8 +113,8 @@ var file = data.files[i]; data.context = viewModel.upload(file); } - - + + data.submit(); }, // Callback for upload progress events: @@ -134,9 +134,15 @@ }, done: function(e, data) { var result = data.result[0]; + + if (result.error) { + data.context.label(result.error); + return; + } + data.context.label('@HttpUtility.JavaScriptStringEncode(T("Loading thumbnail...").Text)'); - - + + var url = '@HttpUtility.JavaScriptStringEncode(Url.Action("MediaItem", "Admin"))/' + result.id + '?displayType=Thumbnail'; $.ajax({ diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/EditorTemplates/Parts/MediaLibrary.MediaLibrarySettings.cshtml b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/EditorTemplates/Parts/MediaLibrary.MediaLibrarySettings.cshtml new file mode 100644 index 000000000..77ebf5a49 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/EditorTemplates/Parts/MediaLibrary.MediaLibrarySettings.cshtml @@ -0,0 +1,13 @@ +@model Orchard.MediaLibrary.Models.MediaLibrarySettingsPart + +
+ @T("Media Library") +
+ + @Html.TextBoxFor(m => m.UploadAllowedFileTypeWhitelist, new { @class = "text large"}) + @T("A comma separated list of file extensions, e.g., \".jpg, .avi, .txt\". Leave empty to accept any file types.") +
+
+ + +