From feab2de260fc64d240900b8392a9bc6b6efa6ccd Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 5 Mar 2014 22:42:51 +1100 Subject: [PATCH] Fixes up the starter kit installer in the back office with it's legacy implementation. Adds some handy methods for webapi routing for areas. --- .../UmbracoInstall/InstallerRestService.aspx | 1 - .../InstallerRestService.aspx.cs | 126 ------------------ .../InstallerRestService.aspx.designer.cs | 15 --- .../Legacy/LoadStarterKits.ascx.cs | 3 +- .../UmbracoInstall/Legacy/StepUserControl.cs | 20 --- .../Legacy/loadStarterKits.ascx | 4 +- .../Areas/UmbracoInstall/Title.ascx | 3 - .../Areas/UmbracoInstall/Title.ascx.cs | 12 -- .../UmbracoInstall/Title.ascx.designer.cs | 15 --- src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 19 --- .../developer/Packages/StarterKits.aspx.cs | 4 +- .../Installer/js/PackageInstaller.js | 12 +- .../AreaRegistrationContextExtensions.cs | 28 ++++ .../Install/Controllers/InstallController.cs | 2 +- .../Controllers/InstallPackageController.cs | 64 ++++----- .../Install/Models/InstallPackageModel.cs | 23 ++++ src/Umbraco.Web/Install/UmbracoInstallArea.cs | 23 ++-- src/Umbraco.Web/Mvc/BackOfficeArea.cs | 10 +- src/Umbraco.Web/RouteCollectionExtensions.cs | 33 ++++- src/Umbraco.Web/Umbraco.Web.csproj | 3 + .../AngularJsonOnlyConfigurationAttribute.cs | 24 ++++ .../WebApi/HttpControllerContextExtensions.cs | 18 --- src/Umbraco.Web/WebBootManager.cs | 23 +--- 23 files changed, 170 insertions(+), 315 deletions(-) delete mode 100644 src/Umbraco.Web.UI/Areas/UmbracoInstall/InstallerRestService.aspx delete mode 100644 src/Umbraco.Web.UI/Areas/UmbracoInstall/InstallerRestService.aspx.cs delete mode 100644 src/Umbraco.Web.UI/Areas/UmbracoInstall/InstallerRestService.aspx.designer.cs delete mode 100644 src/Umbraco.Web.UI/Areas/UmbracoInstall/Legacy/StepUserControl.cs delete mode 100644 src/Umbraco.Web.UI/Areas/UmbracoInstall/Title.ascx delete mode 100644 src/Umbraco.Web.UI/Areas/UmbracoInstall/Title.ascx.cs delete mode 100644 src/Umbraco.Web.UI/Areas/UmbracoInstall/Title.ascx.designer.cs create mode 100644 src/Umbraco.Web/AreaRegistrationContextExtensions.cs create mode 100644 src/Umbraco.Web/Install/Models/InstallPackageModel.cs create mode 100644 src/Umbraco.Web/WebApi/AngularJsonOnlyConfigurationAttribute.cs diff --git a/src/Umbraco.Web.UI/Areas/UmbracoInstall/InstallerRestService.aspx b/src/Umbraco.Web.UI/Areas/UmbracoInstall/InstallerRestService.aspx deleted file mode 100644 index cf38b78a70..0000000000 --- a/src/Umbraco.Web.UI/Areas/UmbracoInstall/InstallerRestService.aspx +++ /dev/null @@ -1 +0,0 @@ -<%@ Page Language="C#" AutoEventWireup="True" CodeBehind="InstallerRestService.aspx.cs" Inherits="Umbraco.Web.UI.Install.InstallerRestService" %> \ No newline at end of file diff --git a/src/Umbraco.Web.UI/Areas/UmbracoInstall/InstallerRestService.aspx.cs b/src/Umbraco.Web.UI/Areas/UmbracoInstall/InstallerRestService.aspx.cs deleted file mode 100644 index 7c1acebea5..0000000000 --- a/src/Umbraco.Web.UI/Areas/UmbracoInstall/InstallerRestService.aspx.cs +++ /dev/null @@ -1,126 +0,0 @@ -using System; -using System.Configuration; -using System.Security.Authentication; -using System.Web; -using System.Web.Script.Serialization; -using System.Web.Script.Services; -using System.Web.Services; -using Umbraco.Core; -using Umbraco.Core.Logging; -using Umbraco.Web.Install; -using umbraco; -using umbraco.businesslogic.Exceptions; - -namespace Umbraco.Web.UI.Install -{ - public partial class InstallerRestService : System.Web.UI.Page - { - protected void Page_Load(object sender, EventArgs e) - { - LogHelper.Info(string.Format("Hitting Page_Load on InstallerRestService.aspx for the requested '{0}' feed", Request.QueryString["feed"])); - - // Stop Caching in IE - Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache); - - // Stop Caching in Firefox - Response.Cache.SetNoStore(); - - string feed = Request.QueryString["feed"]; - string url = "http://our.umbraco.org/html/twitter"; - - if (feed == "progress") - { - Response.ContentType = "application/json"; - //Response.Write(InstallHelper.GetProgress()); - } - else - { - if (feed == "blogs") - url = "http://our.umbraco.org/html/blogs"; - - if (feed == "sitebuildervids") - url = "http://umbraco.org/feeds/videos/site-builder-foundation-html"; - - if (feed == "developervids") - url = "http://umbraco.org/feeds/videos/developer-foundation-html"; - - string xmlResponse = library.GetXmlDocumentByUrl(url).Current.OuterXml; - - if (!xmlResponse.Contains("System.Net.WebException")) - { - Response.Write(library.GetXmlDocumentByUrl(url).Current.OuterXml); - } - else - { - Response.Write("We can't connect to umbraco.tv right now. Click Set up your new website above to continue."); - } - } - } - - - [WebMethod] - [ScriptMethod(ResponseFormat = ResponseFormat.Json)] - public static string Install() - { - //if its not configured then we can continue - if (ApplicationContext.Current == null || ApplicationContext.Current.IsConfigured) - { - throw new AuthenticationException("The application is already configured"); - } - - LogHelper.Info("Running 'Install' service"); - - var result = ApplicationContext.Current.DatabaseContext.CreateDatabaseSchemaAndData(); - - if (result.RequiresUpgrade == false) - { - HandleConnectionStrings(); - } - - var js = new JavaScriptSerializer(); - var jsonResult = js.Serialize(result); - return jsonResult; - } - - [WebMethod] - [ScriptMethod(ResponseFormat = ResponseFormat.Json)] - public static string Upgrade() - { - //if its not configured then we can continue - if (ApplicationContext.Current == null || ApplicationContext.Current.IsConfigured) - { - throw new AuthenticationException("The application is already configured"); - } - - LogHelper.Info("Running 'Upgrade' service"); - - var result = ApplicationContext.Current.DatabaseContext.UpgradeSchemaAndData(); - - HandleConnectionStrings(); - - //After upgrading we must restart the app pool - the reason is because PetaPoco caches a lot of the mapping logic - // and after we upgrade a db, some of the mapping needs to be updated so we restart the app pool to clear it's cache or - // else we can end up with YSODs - ApplicationContext.Current.RestartApplicationPool(new HttpContextWrapper(HttpContext.Current)); - - var js = new JavaScriptSerializer(); - var jsonResult = js.Serialize(result); - return jsonResult; - } - - private static void HandleConnectionStrings() - { - // Remove legacy umbracoDbDsn configuration setting if it exists and connectionstring also exists - if (ConfigurationManager.ConnectionStrings[Core.Configuration.GlobalSettings.UmbracoConnectionName] != null) - { - Core.Configuration.GlobalSettings.RemoveSetting(Core.Configuration.GlobalSettings.UmbracoConnectionName); - } - else - { - var ex = new ArgumentNullException(string.Format("ConfigurationManager.ConnectionStrings[{0}]", Core.Configuration.GlobalSettings.UmbracoConnectionName), "Install / upgrade did not complete successfully, umbracoDbDSN was not set in the connectionStrings section"); - LogHelper.Error("", ex); - throw ex; - } - } - } -} \ No newline at end of file diff --git a/src/Umbraco.Web.UI/Areas/UmbracoInstall/InstallerRestService.aspx.designer.cs b/src/Umbraco.Web.UI/Areas/UmbracoInstall/InstallerRestService.aspx.designer.cs deleted file mode 100644 index 02541e7b03..0000000000 --- a/src/Umbraco.Web.UI/Areas/UmbracoInstall/InstallerRestService.aspx.designer.cs +++ /dev/null @@ -1,15 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Umbraco.Web.UI.Install { - - - public partial class InstallerRestService { - } -} diff --git a/src/Umbraco.Web.UI/Areas/UmbracoInstall/Legacy/LoadStarterKits.ascx.cs b/src/Umbraco.Web.UI/Areas/UmbracoInstall/Legacy/LoadStarterKits.ascx.cs index f150c942ae..013cd28c00 100644 --- a/src/Umbraco.Web.UI/Areas/UmbracoInstall/Legacy/LoadStarterKits.ascx.cs +++ b/src/Umbraco.Web.UI/Areas/UmbracoInstall/Legacy/LoadStarterKits.ascx.cs @@ -26,7 +26,8 @@ namespace Umbraco.Web.UI.Install.Steps.Skinning //Get the URL for the package install service base url var umbracoPath = Core.Configuration.GlobalSettings.UmbracoMvcArea; var urlHelper = new UrlHelper(Context.Request.RequestContext); - PackageInstallServiceBaseUrl = urlHelper.Action("Index", "InstallPackage", new { area = umbracoPath }); + //PackageInstallServiceBaseUrl = urlHelper.Action("Index", "InstallPackage", new { area = "UmbracoInstall" }); + PackageInstallServiceBaseUrl = urlHelper.GetUmbracoApiService("Index", "InstallPackage", "UmbracoInstall"); } /// diff --git a/src/Umbraco.Web.UI/Areas/UmbracoInstall/Legacy/StepUserControl.cs b/src/Umbraco.Web.UI/Areas/UmbracoInstall/Legacy/StepUserControl.cs deleted file mode 100644 index 9f690c3238..0000000000 --- a/src/Umbraco.Web.UI/Areas/UmbracoInstall/Legacy/StepUserControl.cs +++ /dev/null @@ -1,20 +0,0 @@ -//using System; -//using System.Web.UI; -//using Umbraco.Web.Install; - -//namespace Umbraco.Web.UI.Install.Steps -//{ -// public abstract class StepUserControl : UserControl -// { -// protected string GetCurrentStep() -// { -// var defaultPage = (Default) Page; -// return defaultPage.step.Value; -// } - -// //protected virtual void GotoNextStep(object sender, EventArgs e) -// //{ -// // InstallHelper.RedirectToNextStep(Page, GetCurrentStep()); -// //} -// } -//} \ No newline at end of file diff --git a/src/Umbraco.Web.UI/Areas/UmbracoInstall/Legacy/loadStarterKits.ascx b/src/Umbraco.Web.UI/Areas/UmbracoInstall/Legacy/loadStarterKits.ascx index 6ad0d173f9..987abaff0b 100644 --- a/src/Umbraco.Web.UI/Areas/UmbracoInstall/Legacy/loadStarterKits.ascx +++ b/src/Umbraco.Web.UI/Areas/UmbracoInstall/Legacy/loadStarterKits.ascx @@ -55,9 +55,9 @@ - + <%-- No thanks, do not install a starterkit! - + --%> diff --git a/src/Umbraco.Web.UI/Areas/UmbracoInstall/Title.ascx b/src/Umbraco.Web.UI/Areas/UmbracoInstall/Title.ascx deleted file mode 100644 index 3bcec8e343..0000000000 --- a/src/Umbraco.Web.UI/Areas/UmbracoInstall/Title.ascx +++ /dev/null @@ -1,3 +0,0 @@ -<%@ Control Language="C#" AutoEventWireup="True" CodeBehind="Title.ascx.cs" Inherits="Umbraco.Web.UI.Install.Title" %> -<%@ Import Namespace="Umbraco.Core.Configuration" %> -Umbraco <%=UmbracoVersion.Current.ToString(3)%> <%=UmbracoVersion.CurrentComment%> Configuration Wizard \ No newline at end of file diff --git a/src/Umbraco.Web.UI/Areas/UmbracoInstall/Title.ascx.cs b/src/Umbraco.Web.UI/Areas/UmbracoInstall/Title.ascx.cs deleted file mode 100644 index c52fedc17f..0000000000 --- a/src/Umbraco.Web.UI/Areas/UmbracoInstall/Title.ascx.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; -using Umbraco.Web.UI.Pages; - -namespace Umbraco.Web.UI.Install -{ - public partial class Title : System.Web.UI.UserControl - { - } -} \ No newline at end of file diff --git a/src/Umbraco.Web.UI/Areas/UmbracoInstall/Title.ascx.designer.cs b/src/Umbraco.Web.UI/Areas/UmbracoInstall/Title.ascx.designer.cs deleted file mode 100644 index 65fb4f16e9..0000000000 --- a/src/Umbraco.Web.UI/Areas/UmbracoInstall/Title.ascx.designer.cs +++ /dev/null @@ -1,15 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Umbraco.Web.UI.Install { - - - public partial class Title { - } -} diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index 5ba5f8cf1c..5f41b320ce 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -314,9 +314,6 @@ loadStarterKits.ascx - - ASPXCodeBehind - noNodes.aspx ASPXCodeBehind @@ -325,20 +322,6 @@ noNodes.aspx ASPXCodeBehind - - InstallerRestService.aspx - ASPXCodeBehind - - - InstallerRestService.aspx - - - Title.ascx - ASPXCodeBehind - - - Title.ascx - True @@ -1676,8 +1659,6 @@ - - diff --git a/src/Umbraco.Web.UI/umbraco/developer/Packages/StarterKits.aspx.cs b/src/Umbraco.Web.UI/umbraco/developer/Packages/StarterKits.aspx.cs index e5cb1acc7d..a4eca93c84 100644 --- a/src/Umbraco.Web.UI/umbraco/developer/Packages/StarterKits.aspx.cs +++ b/src/Umbraco.Web.UI/umbraco/developer/Packages/StarterKits.aspx.cs @@ -62,7 +62,7 @@ namespace Umbraco.Web.UI.Umbraco.Developer.Packages private void ShowStarterKits() { - if (Directory.Exists(Server.MapPath(SystemDirectories.Install)) == false) + if (Directory.Exists(Server.MapPath("~/Areas/UmbracoInstall/Legacy")) == false) { InstallationDirectoryNotAvailable.Visible = true; StarterKitNotInstalled.Visible = false; @@ -71,7 +71,7 @@ namespace Umbraco.Web.UI.Umbraco.Developer.Packages } - var starterkitsctrl = (LoadStarterKits)LoadControl(SystemDirectories.Install + "/steps/Skinning/loadStarterKits.ascx"); + var starterkitsctrl = (LoadStarterKits)LoadControl("~/Areas/UmbracoInstall/Legacy/loadStarterKits.ascx"); ph_starterkits.Controls.Add(starterkitsctrl); diff --git a/src/Umbraco.Web.UI/umbraco_client/Installer/js/PackageInstaller.js b/src/Umbraco.Web.UI/umbraco_client/Installer/js/PackageInstaller.js index 16b5fb4b8d..4183987752 100644 --- a/src/Umbraco.Web.UI/umbraco_client/Installer/js/PackageInstaller.js +++ b/src/Umbraco.Web.UI/umbraco_client/Installer/js/PackageInstaller.js @@ -165,13 +165,7 @@ self._setProgress(r.percentage, r.message); //install business logic self.installBusinessLogic(); - } - else if (r && !r.success) { - //hasn't completed restarted, re-poll in 2 seconds - setTimeout(function() { - self.pollForRestart(); - }, 2000); - } + } else { self._showServerError("The server did not respond"); } @@ -186,7 +180,7 @@ data: "{'kitGuid': '" + self._packageId + "', 'manifestId': '" + self._manifestId + "', 'packageFile': '" + encodeURIComponent(self._packageFile) + "'}", url: self._opts.baseUrl + '/InstallBusinessLogic', success: function (r) { - if (r && r.success) { + if (r) { //set the progress self._setProgress(r.percentage, r.message); //cleanup install @@ -206,7 +200,7 @@ data: "{'kitGuid': '" + self._packageId + "', 'manifestId': '" + self._manifestId + "', 'packageFile': '" + encodeURIComponent(self._packageFile) + "'}", url: self._opts.baseUrl + '/CleanupInstallation', success: function (r) { - if (r && r.success) { + if (r) { //set the progress self._setProgress(r.percentage, r.message); //installation complete! diff --git a/src/Umbraco.Web/AreaRegistrationContextExtensions.cs b/src/Umbraco.Web/AreaRegistrationContextExtensions.cs new file mode 100644 index 0000000000..a3b4c53e36 --- /dev/null +++ b/src/Umbraco.Web/AreaRegistrationContextExtensions.cs @@ -0,0 +1,28 @@ +using System.Web.Http; +using System.Web.Mvc; +using System.Web.Routing; + +namespace Umbraco.Web +{ + internal static class AreaRegistrationContextExtensions + { + public static Route MapHttpRoute(this AreaRegistrationContext context, string name, string url, object defaults, string[] namespaces) + { + var apiRoute = context.Routes.MapHttpRoute( + name, + url, + defaults); + + //web api routes don't set the data tokens object + if (apiRoute.DataTokens == null) + { + apiRoute.DataTokens = new RouteValueDictionary(); + } + apiRoute.DataTokens.Add("area", context.AreaName); + apiRoute.DataTokens.Add("Namespaces", namespaces); //look in this namespace to create the controller + apiRoute.DataTokens.Add("UseNamespaceFallback", false); //Don't look anywhere else except this namespace! + + return apiRoute; + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Install/Controllers/InstallController.cs b/src/Umbraco.Web/Install/Controllers/InstallController.cs index ada14bfe76..5606d0d5b3 100644 --- a/src/Umbraco.Web/Install/Controllers/InstallController.cs +++ b/src/Umbraco.Web/Install/Controllers/InstallController.cs @@ -57,7 +57,7 @@ namespace Umbraco.Web.Install.Controllers } //gen the install base url - ViewBag.InstallApiBaseUrl = Url.GetUmbracoApiService("GetSetup", "InstallApi", "install").TrimEnd("GetSetup"); + ViewBag.InstallApiBaseUrl = Url.GetUmbracoApiService("GetSetup", "InstallApi", "UmbracoInstall").TrimEnd("GetSetup"); //get the base umbraco folder ViewBag.UmbracoBaseFolder = IOHelper.ResolveUrl(SystemDirectories.Umbraco); diff --git a/src/Umbraco.Web/Install/Controllers/InstallPackageController.cs b/src/Umbraco.Web/Install/Controllers/InstallPackageController.cs index 723f41b6e7..08507af2b8 100644 --- a/src/Umbraco.Web/Install/Controllers/InstallPackageController.cs +++ b/src/Umbraco.Web/Install/Controllers/InstallPackageController.cs @@ -8,6 +8,7 @@ using System.Web.Http; using Newtonsoft.Json.Linq; using umbraco; using Umbraco.Core; +using Umbraco.Web.Install.Models; using Umbraco.Web.WebApi; namespace Umbraco.Web.Install.Controllers @@ -20,6 +21,7 @@ namespace Umbraco.Web.Install.Controllers /// is a bit of a mess currently. /// [HttpInstallAuthorize] + [AngularJsonOnlyConfiguration] [Obsolete("This is only used for the legacy way of installing starter kits in the back office")] public class InstallPackageController : ApiController { @@ -42,37 +44,38 @@ namespace Umbraco.Web.Install.Controllers /// Empty action, useful for retrieving the base url for this controller /// /// + [HttpGet] public HttpResponseMessage Index() { throw new NotImplementedException(); } - /// - /// Connects to the repo, downloads the package and creates the manifest - /// - /// - /// - [HttpPost] - public HttpResponseMessage DownloadPackageFiles(Guid kitGuid) + /// + /// Connects to the repo, downloads the package and creates the manifest + /// + /// + /// + [HttpPost] + public HttpResponseMessage DownloadPackageFiles(InstallPackageModel model) { var repo = global::umbraco.cms.businesslogic.packager.repositories.Repository.getByGuid(RepoGuid); if (repo == null) { return Json( new {success = false, error = "No repository found with id " + RepoGuid}, - HttpStatusCode.BadGateway); + HttpStatusCode.OK); } if (repo.HasConnection() == false) { return Json( new { success = false, error = "cannot_connect" }, - HttpStatusCode.BadGateway); + HttpStatusCode.OK); } var installer = new global::umbraco.cms.businesslogic.packager.Installer(); - var tempFile = installer.Import(repo.fetch(kitGuid.ToString())); + var tempFile = installer.Import(repo.fetch(model.KitGuid.ToString())); installer.LoadConfig(tempFile); - var pId = installer.CreateManifest(tempFile, kitGuid.ToString(), RepoGuid); + var pId = installer.CreateManifest(tempFile, model.KitGuid.ToString(), RepoGuid); return Json(new { success = true, @@ -88,17 +91,17 @@ namespace Umbraco.Web.Install.Controllers /// /// [HttpPost] - public HttpResponseMessage InstallPackageFiles(Guid kitGuid, int manifestId, string packageFile) + public HttpResponseMessage InstallPackageFiles(InstallPackageModel model) { - packageFile = HttpUtility.UrlDecode(packageFile); + model.PackageFile = HttpUtility.UrlDecode(model.PackageFile); var installer = new global::umbraco.cms.businesslogic.packager.Installer(); - installer.LoadConfig(packageFile); - installer.InstallFiles(manifestId, packageFile); + installer.LoadConfig(model.PackageFile); + installer.InstallFiles(model.ManifestId, model.PackageFile); return Json(new { success = true, - manifestId, - packageFile, + model.ManifestId, + model.PackageFile, percentage = 20, message = "Installing starter kit files" }, HttpStatusCode.OK); @@ -134,7 +137,8 @@ namespace Umbraco.Web.Install.Controllers return Json(new { - percentage = 30 + percentage = 30, + success = true, }, HttpStatusCode.OK); } @@ -143,17 +147,17 @@ namespace Umbraco.Web.Install.Controllers /// /// [HttpPost] - public HttpResponseMessage InstallBusinessLogic(Guid kitGuid, int manifestId, string packageFile) + public HttpResponseMessage InstallBusinessLogic(InstallPackageModel model) { - packageFile = HttpUtility.UrlDecode(packageFile); + model.PackageFile = HttpUtility.UrlDecode(model.PackageFile); var installer = new global::umbraco.cms.businesslogic.packager.Installer(); - installer.LoadConfig(packageFile); - installer.InstallBusinessLogic(manifestId, packageFile); + installer.LoadConfig(model.PackageFile); + installer.InstallBusinessLogic(model.ManifestId, model.PackageFile); return Json(new { success = true, - manifestId, - packageFile, + model.ManifestId, + model.PackageFile, percentage = 70, message = "Installing starter kit files" }, HttpStatusCode.OK); @@ -164,20 +168,20 @@ namespace Umbraco.Web.Install.Controllers /// /// [HttpPost] - public HttpResponseMessage CleanupInstallation(Guid kitGuid, int manifestId, string packageFile) + public HttpResponseMessage CleanupInstallation(InstallPackageModel model) { - packageFile = HttpUtility.UrlDecode(packageFile); + model.PackageFile = HttpUtility.UrlDecode(model.PackageFile); var installer = new global::umbraco.cms.businesslogic.packager.Installer(); - installer.LoadConfig(packageFile); - installer.InstallCleanUp(manifestId, packageFile); + installer.LoadConfig(model.PackageFile); + installer.InstallCleanUp(model.ManifestId, model.PackageFile); library.RefreshContent(); return Json(new { success = true, - manifestId, - packageFile, + model.ManifestId, + model.PackageFile, percentage = 100, message = "Starter kit has been installed" }, HttpStatusCode.OK); diff --git a/src/Umbraco.Web/Install/Models/InstallPackageModel.cs b/src/Umbraco.Web/Install/Models/InstallPackageModel.cs new file mode 100644 index 0000000000..01eb368b6a --- /dev/null +++ b/src/Umbraco.Web/Install/Models/InstallPackageModel.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace Umbraco.Web.Install.Models +{ + + [Obsolete("This is only used for the obsolete controller InstallPackageController")] + [DataContract(Name = "installPackage", Namespace = "")] + public class InstallPackageModel + { + [DataMember(Name = "kitGuid")] + public Guid KitGuid { get; set; } + [DataMember(Name = "manifestId")] + public int ManifestId { get; set; } + [DataMember(Name = "packageFile")] + public string PackageFile { get; set; } + + } +} diff --git a/src/Umbraco.Web/Install/UmbracoInstallArea.cs b/src/Umbraco.Web/Install/UmbracoInstallArea.cs index 971e6141af..6077a93782 100644 --- a/src/Umbraco.Web/Install/UmbracoInstallArea.cs +++ b/src/Umbraco.Web/Install/UmbracoInstallArea.cs @@ -28,19 +28,20 @@ namespace Umbraco.Web.Install "Install", new { controller = "Install", action = "Index", id = UrlParameter.Optional }, new[] { typeof(InstallController).Namespace }); - - var apiRoute = context.Routes.MapHttpRoute( + + //TODO: We can remove this when we re-build the back office package installer + //Create the install routes + context.MapHttpRoute( + "Umbraco_install_packages", + "Install/PackageInstaller/{action}/{id}", + new { controller = "InstallPackage", action = "Index", id = UrlParameter.Optional }, + new[] { typeof(InstallPackageController).Namespace }); + + context.MapHttpRoute( "umbraco-install-api", "install/api/{action}/{id}", - new { controller = "InstallApi", action = "Status", id = RouteParameter.Optional }); - //web api routes don't set the data tokens object - if (apiRoute.DataTokens == null) - { - apiRoute.DataTokens = new RouteValueDictionary(); - } - apiRoute.DataTokens.Add("area", "Install"); - apiRoute.DataTokens.Add("Namespaces", new[] { typeof(InstallApiController).Namespace }); //look in this namespace to create the controller - apiRoute.DataTokens.Add("UseNamespaceFallback", false); //Don't look anywhere else except this namespace! + new {controller = "InstallApi", action = "Status", id = RouteParameter.Optional}, + new[] {typeof (InstallApiController).Namespace}); } public override string AreaName diff --git a/src/Umbraco.Web/Mvc/BackOfficeArea.cs b/src/Umbraco.Web/Mvc/BackOfficeArea.cs index 0b625c4780..68afc3fc39 100644 --- a/src/Umbraco.Web/Mvc/BackOfficeArea.cs +++ b/src/Umbraco.Web/Mvc/BackOfficeArea.cs @@ -36,15 +36,7 @@ namespace Umbraco.Web.Mvc id = @"[a-zA-Z]*" }, new[] {typeof (BackOfficeController).Namespace}); - - //TODO: We can remove this when we re-build the back office package installer - //Create the install routes - context.MapRoute( - "Umbraco_install_packages", - "Install/PackageInstaller/{action}/{id}", - new { controller = "InstallPackage", action = "Index", id = UrlParameter.Optional }, - new[] { typeof(InstallPackageController).Namespace }); - + //Create the REST/web/script service routes context.MapRoute( "Umbraco_web_services", diff --git a/src/Umbraco.Web/RouteCollectionExtensions.cs b/src/Umbraco.Web/RouteCollectionExtensions.cs index e0950e99b2..1d94eaef61 100644 --- a/src/Umbraco.Web/RouteCollectionExtensions.cs +++ b/src/Umbraco.Web/RouteCollectionExtensions.cs @@ -3,11 +3,38 @@ using System.Collections.Generic; using System.Linq; using System.Web.Mvc; using System.Web.Routing; +using System.Web.Http; namespace Umbraco.Web { - internal static class RouteCollectionExtensions + internal static class RouteCollectionExtensions { + /// + /// Routes a webapi controller with namespaces + /// + /// + /// + /// + /// + /// + /// + public static Route MapHttpRoute(this RouteCollection routes, string name, string url, object defaults, string[] namespaces) + { + var apiRoute = routes.MapHttpRoute( + name, + url, + defaults); + + //web api routes don't set the data tokens object + if (apiRoute.DataTokens == null) + { + apiRoute.DataTokens = new RouteValueDictionary(); + } + apiRoute.DataTokens.Add("Namespaces", namespaces); //look in this namespace to create the controller + apiRoute.DataTokens.Add("UseNamespaceFallback", false); //Don't look anywhere else except this namespace! + + return apiRoute; + } public static void IgnoreStandardExclusions(this RouteCollection routes) { @@ -43,11 +70,11 @@ namespace Umbraco.Web /// /// public static void RegisterArea(this RouteCollection routes) - where T : AreaRegistration + where T : AreaRegistration, new() { // instantiate the area registration - var area = Activator.CreateInstance(); + var area = new T(); // create a context, which is just the name and routes collection var context = new AreaRegistrationContext(area.AreaName, routes); diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index d42ac02de7..1b6ff368d9 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -269,6 +269,7 @@ Properties\SolutionInfo.cs + @@ -320,6 +321,7 @@ + @@ -483,6 +485,7 @@ Reference.map + diff --git a/src/Umbraco.Web/WebApi/AngularJsonOnlyConfigurationAttribute.cs b/src/Umbraco.Web/WebApi/AngularJsonOnlyConfigurationAttribute.cs new file mode 100644 index 0000000000..d45da2c712 --- /dev/null +++ b/src/Umbraco.Web/WebApi/AngularJsonOnlyConfigurationAttribute.cs @@ -0,0 +1,24 @@ +using System; +using System.Linq; +using System.Net.Http.Formatting; +using System.Web.Http.Controllers; + +namespace Umbraco.Web.WebApi +{ + /// + /// Applying this attribute to any webapi controller will ensure that it only contains one json formatter compatible with the angular json vulnerability prevention. + /// + public class AngularJsonOnlyConfigurationAttribute : Attribute, IControllerConfiguration + { + public void Initialize(HttpControllerSettings controllerSettings, HttpControllerDescriptor controllerDescriptor) + { + //remove all json/xml formatters then add our custom one + var toRemove = controllerSettings.Formatters.Where(t => (t is JsonMediaTypeFormatter) || (t is XmlMediaTypeFormatter)).ToList(); + foreach (var r in toRemove) + { + controllerSettings.Formatters.Remove(r); + } + controllerSettings.Formatters.Add(new AngularJsonMediaTypeFormatter()); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/WebApi/HttpControllerContextExtensions.cs b/src/Umbraco.Web/WebApi/HttpControllerContextExtensions.cs index f8f8203f8d..a7e7160ae2 100644 --- a/src/Umbraco.Web/WebApi/HttpControllerContextExtensions.cs +++ b/src/Umbraco.Web/WebApi/HttpControllerContextExtensions.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Linq; using System.Net.Http; -using System.Net.Http.Formatting; using System.Runtime.Remoting.Contexts; using System.Threading; using System.Threading.Tasks; @@ -113,21 +112,4 @@ namespace Umbraco.Web.WebApi // controllerContext.Configuration.Formatters.Add(new AngularJsonMediaTypeFormatter()); //} } - - /// - /// Applying this attribute to any webapi controller will ensure that it only contains one json formatter compatible with the angular json vulnerability prevention. - /// - public class AngularJsonOnlyConfigurationAttribute : Attribute, IControllerConfiguration - { - public void Initialize(HttpControllerSettings controllerSettings, HttpControllerDescriptor controllerDescriptor) - { - //remove all json/xml formatters then add our custom one - var toRemove = controllerSettings.Formatters.Where(t => (t is JsonMediaTypeFormatter) || (t is XmlMediaTypeFormatter)).ToList(); - foreach (var r in toRemove) - { - controllerSettings.Formatters.Remove(r); - } - controllerSettings.Formatters.Add(new AngularJsonMediaTypeFormatter()); - } - } } \ No newline at end of file diff --git a/src/Umbraco.Web/WebBootManager.cs b/src/Umbraco.Web/WebBootManager.cs index 66df6272cf..ab31fba02d 100644 --- a/src/Umbraco.Web/WebBootManager.cs +++ b/src/Umbraco.Web/WebBootManager.cs @@ -201,27 +201,15 @@ namespace Umbraco.Web defaultRoute.RouteHandler = new RenderRouteHandler(ControllerBuilder.Current.GetControllerFactory()); //register install routes - RouteInstallArea(); + RouteTable.Routes.RegisterArea(); //register all back office routes - RouteBackOfficeArea(); + RouteTable.Routes.RegisterArea(); //plugin controllers must come first because the next route will catch many things RoutePluginControllers(); } - - private void RouteInstallArea() - { - var installArea = new UmbracoInstallArea(); - RouteTable.Routes.RegisterArea(installArea); - } - - private void RouteBackOfficeArea() - { - var backOfficeArea = new BackOfficeArea(); - RouteTable.Routes.RegisterArea(backOfficeArea); - } - + private void RoutePluginControllers() { var umbracoPath = GlobalSettings.UmbracoMvcArea; @@ -271,14 +259,13 @@ namespace Umbraco.Web var route = RouteTable.Routes.MapHttpRoute( string.Format("umbraco-{0}-{1}", "api", meta.ControllerName), routePath, - new { controller = meta.ControllerName, id = UrlParameter.Optional }); + new { controller = meta.ControllerName, id = UrlParameter.Optional }, + new[] { meta.ControllerNamespace }); //web api routes don't set the data tokens object if (route.DataTokens == null) { route.DataTokens = new RouteValueDictionary(); } - route.DataTokens.Add("Namespaces", new[] { meta.ControllerNamespace }); //look in this namespace to create the controller - route.DataTokens.Add("UseNamespaceFallback", false); //Don't look anywhere else except this namespace! route.DataTokens.Add("umbraco", "api"); //ensure the umbraco token is set } private void RouteLocalSurfaceController(Type controller, string umbracoPath)