diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Commands/PackagingCommands.cs b/src/Orchard.Web/Modules/Orchard.Packaging/Commands/PackagingCommands.cs index ab28b9676..4c6590819 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Commands/PackagingCommands.cs +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Commands/PackagingCommands.cs @@ -64,6 +64,9 @@ namespace Orchard.Packaging.Commands { try { _packageManager.Install(packageId, Version, Path.GetFullPath(location), ApplicationPath); } + catch (OrchardException e) { + Context.Output.WriteLine(T("Could not install the package: {0}", e.Message)); + } catch(Exception e) { // Exceptions area thrown by NuGet as error messages Context.Output.WriteLine(HttpUtility.HtmlDecode(T("Could not install the package: {0}", e.Message).Text)); diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Controllers/PackagingServicesController.cs b/src/Orchard.Web/Modules/Orchard.Packaging/Controllers/PackagingServicesController.cs index 5decf5b4d..3cbb0c6c6 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Controllers/PackagingServicesController.cs +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Controllers/PackagingServicesController.cs @@ -2,7 +2,6 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Web; using System.Web.Hosting; using System.Web.Mvc; using NuGet; @@ -12,6 +11,7 @@ using Orchard.FileSystems.AppData; using Orchard.Localization; using Orchard.Modules.Services; using Orchard.Mvc.Extensions; +using Orchard.Packaging.Extensions; using Orchard.Packaging.Services; using Orchard.Packaging.ViewModels; using Orchard.Recipes.Models; @@ -20,7 +20,6 @@ using Orchard.Security; using Orchard.Themes; using Orchard.UI.Admin; using Orchard.UI.Notify; -using Orchard.Utility.Extensions; using IPackageManager = Orchard.Packaging.Services.IPackageManager; using PackageBuilder = Orchard.Packaging.Services.PackageBuilder; @@ -32,7 +31,6 @@ namespace Orchard.Packaging.Controllers { private readonly IPackageManager _packageManager; private readonly IPackagingSourceManager _packagingSourceManager; private readonly IAppDataFolderRoot _appDataFolderRoot; - private readonly INotifier _notifier; private readonly IModuleService _moduleService; private readonly IRecipeHarvester _recipeHarvester; private readonly IRecipeManager _recipeManager; @@ -41,18 +39,16 @@ namespace Orchard.Packaging.Controllers { ShellSettings shellSettings, IPackageManager packageManager, IPackagingSourceManager packagingSourceManager, - INotifier notifier, IAppDataFolderRoot appDataFolderRoot, IOrchardServices services, IModuleService moduleService) - : this(shellSettings, packageManager, packagingSourceManager, notifier, appDataFolderRoot, services, moduleService, null, null) { + : this(shellSettings, packageManager, packagingSourceManager, appDataFolderRoot, services, moduleService, null, null) { } public PackagingServicesController( ShellSettings shellSettings, IPackageManager packageManager, IPackagingSourceManager packagingSourceManager, - INotifier notifier, IAppDataFolderRoot appDataFolderRoot, IOrchardServices services, IModuleService moduleService, @@ -61,7 +57,6 @@ namespace Orchard.Packaging.Controllers { _shellSettings = shellSettings; _packageManager = packageManager; - _notifier = notifier; _appDataFolderRoot = appDataFolderRoot; _moduleService = moduleService; _recipeHarvester = recipeHarvester; @@ -103,7 +98,7 @@ namespace Orchard.Packaging.Controllers { if (_shellSettings.Name != ShellSettings.DefaultName || !Services.Authorizer.Authorize(StandardPermissions.SiteOwner, T("Not authorized to add sources"))) return new HttpUnauthorizedResult(); - var source = _packagingSourceManager.GetSources().Where(s => s.Id == sourceId).FirstOrDefault(); + var source = _packagingSourceManager.GetSources().FirstOrDefault(s => s.Id == sourceId); if (source == null) { return HttpNotFound(); } @@ -119,47 +114,58 @@ namespace Orchard.Packaging.Controllers { IPackageRepository packageRepository = PackageRepositoryFactory.Default.CreateRepository(new PackageSource(source.FeedUrl, "Default")); IPackage package = packageRepository.FindPackage(packageId); - ExtensionDescriptor extensionDescriptor = _packageManager.GetExtensionDescriptor(package, packageInfo.ExtensionType); + ExtensionDescriptor extensionDescriptor = package.GetExtensionDescriptor(packageInfo.ExtensionType); return InstallPackageDetails(extensionDescriptor, redirectUrl); } } - catch (Exception) { - Services.Notifier.Error(T("Package installation failed.")); - } + catch (OrchardException e) { + Services.Notifier.Error(T("Package installation failed: {0}", e.Message)); + return View("InstallPackageFailed"); + } + catch (Exception) { + Services.Notifier.Error(T("Package installation failed.")); + return View("InstallPackageFailed"); + } - return Redirect(redirectUrl); + return Redirect(redirectUrl); } public ActionResult InstallLocally(string redirectUrl) { if (_shellSettings.Name != ShellSettings.DefaultName || !Services.Authorizer.Authorize(StandardPermissions.SiteOwner, T("Not authorized to install packages"))) return new HttpUnauthorizedResult(); - if (Request.Files == null || - Request.Files.Count == 0 || - string.IsNullOrWhiteSpace(Request.Files.Get(0).FileName)) { + var httpPostedFileBase = Request.Files.Get(0); + if (httpPostedFileBase == null + || Request.Files.Count == 0 + || string.IsNullOrWhiteSpace(httpPostedFileBase.FileName)) { throw new OrchardException(T("Select a file to upload.")); } try { - HttpPostedFileBase file = Request.Files.Get(0); - string fullFileName = Path.Combine(_appDataFolderRoot.RootFolder, Path.GetFileName(file.FileName)).Replace(Path.DirectorySeparatorChar, '/'); - file.SaveAs(fullFileName); - ZipPackage package = new ZipPackage(fullFileName); + string fullFileName = Path.Combine(_appDataFolderRoot.RootFolder, Path.GetFileName(httpPostedFileBase.FileName)).Replace(Path.DirectorySeparatorChar, '/'); + httpPostedFileBase.SaveAs(fullFileName); + var package = new ZipPackage(fullFileName); PackageInfo packageInfo = _packageManager.Install(package, _appDataFolderRoot.RootFolder, HostingEnvironment.MapPath("~/")); - ExtensionDescriptor extensionDescriptor = _packageManager.GetExtensionDescriptor(package, packageInfo.ExtensionType); + ExtensionDescriptor extensionDescriptor = package.GetExtensionDescriptor(packageInfo.ExtensionType); System.IO.File.Delete(fullFileName); if (DefaultExtensionTypes.IsTheme(extensionDescriptor.ExtensionType)) { Services.Notifier.Information(T("The theme has been successfully installed. It can be enabled in the \"Themes\" page accessible from the menu.")); - } else if (DefaultExtensionTypes.IsModule(extensionDescriptor.ExtensionType)) { + } + else if (DefaultExtensionTypes.IsModule(extensionDescriptor.ExtensionType)) { Services.Notifier.Information(T("The module has been successfully installed.")); return InstallPackageDetails(extensionDescriptor, redirectUrl); } } + catch (OrchardException e) { + Services.Notifier.Error(T("Package uploading and installation failed: ", e.Message)); + return View("InstallPackageFailed"); + } catch (Exception) { Services.Notifier.Error(T("Package uploading and installation failed.")); + return View("InstallPackageFailed"); } return Redirect(redirectUrl); diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Extensions/PackageExtensions.cs b/src/Orchard.Web/Modules/Orchard.Packaging/Extensions/PackageExtensions.cs index 33aebcfff..96ebc0501 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Extensions/PackageExtensions.cs +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Extensions/PackageExtensions.cs @@ -1,4 +1,8 @@ -using NuGet; +using System; +using System.IO; +using System.Linq; +using NuGet; +using Orchard.Environment.Extensions.Folders; using Orchard.Environment.Extensions.Models; using Orchard.Packaging.Models; @@ -41,5 +45,27 @@ namespace Orchard.Packaging.Extensions { packageId.Substring(Services.PackagingSourceManager.GetExtensionPrefix(DefaultExtensionTypes.Theme).Length) : packageId.Substring(Services.PackagingSourceManager.GetExtensionPrefix(DefaultExtensionTypes.Module).Length); } + + + public static ExtensionDescriptor GetExtensionDescriptor(this IPackage package, string extensionType) { + IPackageFile packageFile = package.GetFiles().FirstOrDefault(file => { + var fileName = Path.GetFileName(file.Path); + return fileName != null && fileName.Equals( + DefaultExtensionTypes.IsModule(extensionType) ? "module.txt" : "theme.txt", + StringComparison.OrdinalIgnoreCase); + }); + + if (packageFile != null) { + var directoryName = Path.GetDirectoryName(packageFile.Path); + if (directoryName != null) { + string extensionId = Path.GetFileName(directoryName.TrimEnd('/', '\\')); + using (var streamReader = new StreamReader(packageFile.GetStream())) { + return ExtensionHarvester.GetDescriptorForExtension("", extensionId, extensionType, streamReader.ReadToEnd()); + } + } + } + + return null; + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Orchard.Packaging.csproj b/src/Orchard.Web/Modules/Orchard.Packaging/Orchard.Packaging.csproj index 904c15566..71fb5c29f 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Orchard.Packaging.csproj +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Orchard.Packaging.csproj @@ -51,6 +51,7 @@ 3.5 + False ..\..\..\..\lib\aspnetmvc\System.Web.Mvc.dll @@ -173,7 +174,9 @@ - + + +