From a8c71e52ecfad82c110af4952a9d9f1889b6d449 Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 13 Jun 2016 23:35:09 +0200 Subject: [PATCH] Ensures the min umbraco version is checked when installing packages that have the strict flag set. --- .../Configuration/UmbracoVersion.cs | 2 +- .../src/common/services/util.service.js | 58 ++++ .../views/install-local.controller.js | 42 ++- .../views/packager/views/install-local.html | 2 +- .../config/trees.Release.config | 7 +- src/Umbraco.Web.UI/config/trees.config | 5 +- .../Editors/PackageInstallController.cs | 29 +- .../Models/LocalPackageInstallModel.cs | 8 +- .../Models/PackageInstallResult.cs | 14 + .../Trees/DataTypeTreeController.cs | 2 +- .../Trees/PackagesTreeController.cs | 2 +- src/Umbraco.Web/Umbraco.Web.csproj | 1 + .../businesslogic/Packager/Installer.cs | 91 +++-- .../PackageInstance/PackageInstance.cs | 328 ++++-------------- 14 files changed, 286 insertions(+), 305 deletions(-) create mode 100644 src/Umbraco.Web/Models/PackageInstallResult.cs diff --git a/src/Umbraco.Core/Configuration/UmbracoVersion.cs b/src/Umbraco.Core/Configuration/UmbracoVersion.cs index 762d3da59c..8c2fe08dfd 100644 --- a/src/Umbraco.Core/Configuration/UmbracoVersion.cs +++ b/src/Umbraco.Core/Configuration/UmbracoVersion.cs @@ -24,7 +24,7 @@ namespace Umbraco.Core.Configuration /// Gets the version comment (like beta or RC). /// /// The version comment. - public static string CurrentComment { get { return ""; } } + public static string CurrentComment { get { return "beta"; } } // Get the version of the umbraco.dll by looking at a class in that dll // Had to do it like this due to medium trust issues, see: http://haacked.com/archive/2010/11/04/assembly-location-and-medium-trust.aspx diff --git a/src/Umbraco.Web.UI.Client/src/common/services/util.service.js b/src/Umbraco.Web.UI.Client/src/common/services/util.service.js index 9fbf2947af..30815027b0 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/util.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/util.service.js @@ -1,4 +1,62 @@ /*Contains multiple services for various helper tasks */ +function versionHelper() { + + return { + + //see: https://gist.github.com/TheDistantSea/8021359 + versionCompare: function(v1, v2, options) { + var lexicographical = options && options.lexicographical, + zeroExtend = options && options.zeroExtend, + v1parts = v1.split('.'), + v2parts = v2.split('.'); + + function isValidPart(x) { + return (lexicographical ? /^\d+[A-Za-z]*$/ : /^\d+$/).test(x); + } + + if (!v1parts.every(isValidPart) || !v2parts.every(isValidPart)) { + return NaN; + } + + if (zeroExtend) { + while (v1parts.length < v2parts.length) { + v1parts.push("0"); + } + while (v2parts.length < v1parts.length) { + v2parts.push("0"); + } + } + + if (!lexicographical) { + v1parts = v1parts.map(Number); + v2parts = v2parts.map(Number); + } + + for (var i = 0; i < v1parts.length; ++i) { + if (v2parts.length === i) { + return 1; + } + + if (v1parts[i] === v2parts[i]) { + continue; + } + else if (v1parts[i] > v2parts[i]) { + return 1; + } + else { + return -1; + } + } + + if (v1parts.length !== v2parts.length) { + return -1; + } + + return 0; + } + }; +} +angular.module('umbraco.services').factory('versionHelper', versionHelper); function packageHelper(assetsService, treeService, eventsService, $templateCache) { diff --git a/src/Umbraco.Web.UI.Client/src/views/packager/views/install-local.controller.js b/src/Umbraco.Web.UI.Client/src/views/packager/views/install-local.controller.js index 94f02ed9c6..5c1bf8584c 100644 --- a/src/Umbraco.Web.UI.Client/src/views/packager/views/install-local.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/packager/views/install-local.controller.js @@ -1,7 +1,7 @@ (function () { "use strict"; - function PackagesInstallLocalController($scope, $route, $location, Upload, umbRequestHelper, packageResource, $cookieStore) { + function PackagesInstallLocalController($scope, $route, $location, Upload, umbRequestHelper, packageResource, $cookieStore, versionHelper) { var vm = this; vm.state = "upload"; @@ -59,6 +59,28 @@ loadPackage(); vm.localPackage = data; + vm.localPackage.allowed = true; + + //now we need to determine if this package is compatible to be installed + if (vm.localPackage.umbracoVersion) { + //0 if the versions are equal + //a negative integer iff v1 < v2 + //a positive integer iff v1 > v2 + + //ensure we aren't comparing the pre-release value + var versionNumber = Umbraco.Sys.ServerVariables.application.version.split("-")[0]; + + var compare = versionHelper.versionCompare( + versionNumber, + vm.localPackage.umbracoVersion); + if (compare < 0) { + //this is not compatible! + vm.localPackage.allowed = false; + vm.installState.status = + "This package cannot be installed, it requires a minimum Umbraco version of " + + vm.localPackage.umbracoVersion; + } + } } }).error(function (evt, status, headers, config) { @@ -111,17 +133,21 @@ return packageResource.cleanUp(pack); }, installError) - .then(installComplete, installError); - } + .then(function (result) { - function installComplete() { - var url = window.location.href + "?installed=" + vm.localPackage.packageGuid; - $cookieStore.put("umbPackageInstallId", vm.localPackage.packageGuid); - window.location.reload(true); + if (result.postInstallationPath) { + window.location.href = url; + } + else { + var url = window.location.href + "?installed=" + vm.localPackage.packageGuid; + window.location.reload(true); + } + + }, installError); } function installError() { - + //TODO: Need to do something about this? } } diff --git a/src/Umbraco.Web.UI.Client/src/views/packager/views/install-local.html b/src/Umbraco.Web.UI.Client/src/views/packager/views/install-local.html index 9beb4aae2d..75a8101ace 100644 --- a/src/Umbraco.Web.UI.Client/src/views/packager/views/install-local.html +++ b/src/Umbraco.Web.UI.Client/src/views/packager/views/install-local.html @@ -87,7 +87,7 @@ {{ vm.localPackage.readme }} -
+