diff --git a/src/Umbraco.Core/Configuration/UmbracoSettings/IRepository.cs b/src/Umbraco.Core/Configuration/UmbracoSettings/IRepository.cs index 052c23edd5..34730f3e45 100644 --- a/src/Umbraco.Core/Configuration/UmbracoSettings/IRepository.cs +++ b/src/Umbraco.Core/Configuration/UmbracoSettings/IRepository.cs @@ -8,6 +8,8 @@ namespace Umbraco.Core.Configuration.UmbracoSettings Guid Id { get; } string RepositoryUrl { get; } string WebServiceUrl { get; } - bool HasCustomWebServiceUrl { get; } + bool HasCustomWebServiceUrl { get; } + string RestApiUrl { get; } + bool HasCustomRestApiUrl { get; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Configuration/UmbracoSettings/RepositoryConfigExtensions.cs b/src/Umbraco.Core/Configuration/UmbracoSettings/RepositoryConfigExtensions.cs new file mode 100644 index 0000000000..e2c4283dc6 --- /dev/null +++ b/src/Umbraco.Core/Configuration/UmbracoSettings/RepositoryConfigExtensions.cs @@ -0,0 +1,19 @@ +using System; +using System.Linq; + +namespace Umbraco.Core.Configuration.UmbracoSettings +{ + public static class RepositoryConfigExtensions + { + //Our package repo + private static readonly Guid RepoGuid = new Guid("65194810-1f85-11dd-bd0b-0800200c9a66"); + + public static IRepository GetDefault(this IRepositoriesSection repos) + { + var found = repos.Repositories.FirstOrDefault(x => x.Id == RepoGuid); + if (found == null) + throw new InvalidOperationException("No default package repository found with id " + RepoGuid); + return found; + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Configuration/UmbracoSettings/RepositoryElement.cs b/src/Umbraco.Core/Configuration/UmbracoSettings/RepositoryElement.cs index b7a1157c40..69465f62da 100644 --- a/src/Umbraco.Core/Configuration/UmbracoSettings/RepositoryElement.cs +++ b/src/Umbraco.Core/Configuration/UmbracoSettings/RepositoryElement.cs @@ -38,8 +38,23 @@ 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]; + } + } + + [ConfigurationProperty("restapiurl", DefaultValue = "https://our.umbraco.org/webapi/packages/v1")] + public string RestApiUrl + { + get { return (string)base["restapiurl"]; } + set { base["restapiurl"] = value; } + } + + public bool HasCustomRestApiUrl + { + get + { + var prop = Properties["restapiurl"]; + return (string)prop.DefaultValue != (string)this[prop]; } } } diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index b22301bc8e..de81b7e519 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -274,6 +274,7 @@ + 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..f803d7edce 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 @@ -5,15 +5,14 @@ **/ function ourPackageRepositoryResource($q, $http, umbDataFormatter, umbRequestHelper) { - //var baseurl = "http://localhost:24292/webapi/packages/v1"; - var baseurl = "https://our.umbraco.org/webapi/packages/v1"; + var baseurl = Umbraco.Sys.ServerVariables.umbracoUrls.packagesRestApiBaseUrl; return { 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/BackOfficeController.cs b/src/Umbraco.Web/Editors/BackOfficeController.cs index 199ffd9bed..b93e2a408d 100644 --- a/src/Umbraco.Web/Editors/BackOfficeController.cs +++ b/src/Umbraco.Web/Editors/BackOfficeController.cs @@ -22,6 +22,7 @@ using Newtonsoft.Json.Linq; using Umbraco.Core; using Umbraco.Core.Cache; using Umbraco.Core.Configuration; +using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Manifest; @@ -224,6 +225,9 @@ namespace Umbraco.Web.Editors {"gridConfig", Url.Action("GetGridConfig", "BackOffice")}, {"serverVarsJs", Url.Action("Application", "BackOffice")}, //API URLs + { + "packagesRestApiBaseUrl", UmbracoConfig.For.UmbracoSettings().PackageRepositories.GetDefault().RestApiUrl + }, { "redirectUrlManagementApiBaseUrl", Url.GetUmbracoApiServiceBaseUrl( controller => controller.GetEnableState()) diff --git a/src/Umbraco.Web/Editors/PackageInstallController.cs b/src/Umbraco.Web/Editors/PackageInstallController.cs index f984eeb468..dce69c9d27 100644 --- a/src/Umbraco.Web/Editors/PackageInstallController.cs +++ b/src/Umbraco.Web/Editors/PackageInstallController.cs @@ -447,7 +447,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")]