From d295174e537b0a4e5ebaea231627bf49543c8dd7 Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 24 Apr 2017 21:31:35 +1000 Subject: [PATCH] Updates JS to include the current umbraco version when requesting a package's details, updates the c# to use a new endpoint on OUR to ensure that the correct file is downloaded based on the umb version passed in. --- .../UmbracoSettings/RepositoryElement.cs | 3 +- .../ourpackagerrepository.resource.js | 2 +- .../Editors/PackageInstallController.cs | 2 +- .../Packager/Repositories/Repository.cs | 63 ++++++++-- .../Repositories/RepositoryWebservice.cs | 112 +++++++++++++++++- 5 files changed, 169 insertions(+), 13 deletions(-) diff --git a/src/Umbraco.Core/Configuration/UmbracoSettings/RepositoryElement.cs b/src/Umbraco.Core/Configuration/UmbracoSettings/RepositoryElement.cs index b7a1157c40..cf73a8f62c 100644 --- a/src/Umbraco.Core/Configuration/UmbracoSettings/RepositoryElement.cs +++ b/src/Umbraco.Core/Configuration/UmbracoSettings/RepositoryElement.cs @@ -38,8 +38,7 @@ namespace Umbraco.Core.Configuration.UmbracoSettings get { var prop = Properties["webserviceurl"]; - var repoUrl = this[prop] as ConfigurationElement; - return (repoUrl != null && repoUrl.ElementInformation.IsPresent); + return (string) prop.DefaultValue != (string) this[prop]; } } } diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/ourpackagerrepository.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/ourpackagerrepository.resource.js index 053aaf1394..37a8a9b2de 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/ourpackagerrepository.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/ourpackagerrepository.resource.js @@ -13,7 +13,7 @@ function ourPackageRepositoryResource($q, $http, umbDataFormatter, umbRequestHel getDetails: function (packageId) { return umbRequestHelper.resourcePromise( - $http.get(baseurl + "/" + packageId), + $http.get(baseurl + "/" + packageId + "?version=" + Umbraco.Sys.ServerVariables.application.version), 'Failed to get package details'); }, diff --git a/src/Umbraco.Web/Editors/PackageInstallController.cs b/src/Umbraco.Web/Editors/PackageInstallController.cs index b15bcd767e..d982d703cc 100644 --- a/src/Umbraco.Web/Editors/PackageInstallController.cs +++ b/src/Umbraco.Web/Editors/PackageInstallController.cs @@ -474,7 +474,7 @@ namespace Umbraco.Web.Editors //our repo guid using (var our = Repository.getByGuid("65194810-1f85-11dd-bd0b-0800200c9a66")) { - path = our.fetch(packageGuid, Security.CurrentUser.Id); + path = our.GetPackageFile(packageGuid, Security.CurrentUser.Id, UmbracoVersion.Current); } } diff --git a/src/umbraco.cms/businesslogic/Packager/Repositories/Repository.cs b/src/umbraco.cms/businesslogic/Packager/Repositories/Repository.cs index 3ffa0e9054..6faf9d519a 100644 --- a/src/umbraco.cms/businesslogic/Packager/Repositories/Repository.cs +++ b/src/umbraco.cms/businesslogic/Packager/Repositories/Repository.cs @@ -141,12 +141,12 @@ namespace umbraco.cms.businesslogic.packager.repositories return repository; } + + //shortcut method to download pack from repo and place it on the server... public string fetch(string packageGuid) { - return fetch(packageGuid, string.Empty); - } public string fetch(string packageGuid, int userId) @@ -158,6 +158,40 @@ namespace umbraco.cms.businesslogic.packager.repositories return fetch(packageGuid); } + /// + /// Used to get the correct package file from the repo for the current umbraco version + /// + /// + /// + /// + /// + public string GetPackageFile(string packageGuid, int userId, System.Version currentUmbracoVersion) + { + // log + Audit.Add(AuditTypes.PackagerInstall, + string.Format("Package {0} fetched from {1}", packageGuid, this.Guid), + userId, -1); + + var fileByteArray = Webservice.GetPackageFile(packageGuid, currentUmbracoVersion.ToString(3)); + + //successfull + if (fileByteArray.Length > 0) + { + // Check for package directory + if (Directory.Exists(IOHelper.MapPath(Settings.PackagerRoot)) == false) + Directory.CreateDirectory(IOHelper.MapPath(Settings.PackagerRoot)); + + using (var fs1 = new FileStream(IOHelper.MapPath(Settings.PackagerRoot + Path.DirectorySeparatorChar + packageGuid + ".umb"), FileMode.Create)) + { + fs1.Write(fileByteArray, 0, fileByteArray.Length); + fs1.Close(); + return "packages\\" + packageGuid + ".umb"; + } + } + + return ""; + } + public bool HasConnection() { @@ -199,22 +233,37 @@ namespace umbraco.cms.businesslogic.packager.repositories } } - + + + /// + /// This goes and fetches the Byte array for the package from OUR, but it's pretty strange + /// + /// + /// The package ID for the package file to be returned + /// + /// + /// This is a strange Umbraco version parameter - but it's not really an umbraco version, it's a special/odd version format like Version41 + /// but it's actually not used for the 7.5+ package installs so it's obsolete/unused. + /// + /// public string fetch(string packageGuid, string key) { byte[] fileByteArray = new byte[0]; if (key == string.Empty) - { + { + //SD: this is odd, not sure why it returns a different package depending on the legacy xml schema but I'll leave it for now if (UmbracoConfig.For.UmbracoSettings().Content.UseLegacyXmlSchema) - fileByteArray = this.Webservice.fetchPackage(packageGuid); + fileByteArray = Webservice.fetchPackage(packageGuid); else - fileByteArray = this.Webservice.fetchPackageByVersion(packageGuid, Version.Version41); + { + fileByteArray = Webservice.fetchPackageByVersion(packageGuid, Version.Version41); + } } else { - fileByteArray = this.Webservice.fetchProtectedPackage(packageGuid, key); + fileByteArray = Webservice.fetchProtectedPackage(packageGuid, key); } //successfull diff --git a/src/umbraco.cms/businesslogic/Packager/Repositories/RepositoryWebservice.cs b/src/umbraco.cms/businesslogic/Packager/Repositories/RepositoryWebservice.cs index ccf8566687..a2da17dd76 100644 --- a/src/umbraco.cms/businesslogic/Packager/Repositories/RepositoryWebservice.cs +++ b/src/umbraco.cms/businesslogic/Packager/Repositories/RepositoryWebservice.cs @@ -36,6 +36,8 @@ namespace umbraco.cms.businesslogic.packager.repositories private System.Threading.SendOrPostCallback authenticateOperationCompleted; + private System.Threading.SendOrPostCallback GetPackageFileOperationCompleted; + private System.Threading.SendOrPostCallback fetchPackageByVersionOperationCompleted; private System.Threading.SendOrPostCallback fetchPackageOperationCompleted; @@ -83,6 +85,9 @@ namespace umbraco.cms.businesslogic.packager.repositories /// public event authenticateCompletedEventHandler authenticateCompleted; + /// + public event GetPackageFileCompletedEventHandler GetPackageFileCompleted; + /// public event fetchPackageByVersionCompletedEventHandler fetchPackageByVersionCompleted; @@ -533,6 +538,76 @@ namespace umbraco.cms.businesslogic.packager.repositories } } + + + + + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://packages.umbraco.org/webservices/GetPackageFile", RequestNamespace = "http://packages.umbraco.org/webservices/", ResponseNamespace = "http://packages.umbraco.org/webservices/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + [return: System.Xml.Serialization.XmlElementAttribute(DataType = "base64Binary")] + public byte[] GetPackageFile(string packageGuid, string umbracoVersion) + { + object[] results = this.Invoke("GetPackageFile", new object[] { + packageGuid, + umbracoVersion}); + return ((byte[])(results[0])); + } + + /// + public System.IAsyncResult BeginfetchPackageByVersion(string packageGuid, string umbracoVersion, System.AsyncCallback callback, object asyncState) + { + return this.BeginInvoke("GetPackageFile", new object[] { + packageGuid, + umbracoVersion}, callback, asyncState); + } + + /// + public byte[] EndGetPackageFile(System.IAsyncResult asyncResult) + { + object[] results = this.EndInvoke(asyncResult); + return ((byte[])(results[0])); + } + + /// + public void GetPackageFileAsync(string packageGuid, string umbracoVersion) + { + this.GetPackageFileAsync(packageGuid, umbracoVersion, null); + } + + /// + public void GetPackageFileAsync(string packageGuid, string umbracoVersion, object userState) + { + if ((this.GetPackageFileOperationCompleted == null)) + { + this.GetPackageFileOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetPackageFileOperationCompleted); + } + this.InvokeAsync("GetPackageFile", new object[] { + packageGuid, + umbracoVersion}, this.GetPackageFileOperationCompleted, userState); + } + + private void OnGetPackageFileOperationCompleted(object arg) + { + if ((this.GetPackageFileCompleted != null)) + { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetPackageFileCompleted(this, new GetPackageFileCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + + + + + + + + + + + + /// [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://packages.umbraco.org/webservices/fetchPackageByVersion", RequestNamespace = "http://packages.umbraco.org/webservices/", ResponseNamespace = "http://packages.umbraco.org/webservices/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] [return: System.Xml.Serialization.XmlElementAttribute(DataType = "base64Binary")] @@ -1382,7 +1457,9 @@ namespace umbraco.cms.businesslogic.packager.repositories /// Version4, - /// + /// + /// This is apparently the version number we pass in for all installs + /// Version41, /// @@ -1682,9 +1759,40 @@ namespace umbraco.cms.businesslogic.packager.repositories } } + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.1")] - public delegate void fetchPackageByVersionCompletedEventHandler(object sender, fetchPackageByVersionCompletedEventArgs e); + public delegate void GetPackageFileCompletedEventHandler(object sender, GetPackageFileCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.1")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetPackageFileCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + + private object[] results; + + internal GetPackageFileCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public byte[] Result + { + get + { + this.RaiseExceptionIfNecessary(); + return ((byte[])(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.1")] + public delegate void fetchPackageByVersionCompletedEventHandler(object sender, fetchPackageByVersionCompletedEventArgs e); /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.1")]