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")]