Files
Umbraco-CMS/src/Umbraco.Web/Editors/UpdateCheckController.cs

87 lines
3.2 KiB
C#
Raw Normal View History

2018-06-29 19:52:40 +02:00
using System;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
2018-06-29 19:52:40 +02:00
using System.Web.Http.Filters;
using Semver;
2019-01-07 10:43:28 +01:00
using Umbraco.Core;
using Umbraco.Core.Composing;
2018-06-29 19:52:40 +02:00
using Umbraco.Core.Configuration;
using Umbraco.Core.Models;
using Umbraco.Core.Services;
2018-06-29 19:52:40 +02:00
using Umbraco.Web.Models;
using Umbraco.Web.Mvc;
namespace Umbraco.Web.Editors
{
[PluginController("UmbracoApi")]
public class UpdateCheckController : UmbracoAuthorizedJsonController
{
private readonly IUpgradeService _upgradeService;
public UpdateCheckController() { }
public UpdateCheckController(IUpgradeService upgradeService)
{
_upgradeService = upgradeService;
}
2018-06-29 19:52:40 +02:00
[UpdateCheckResponseFilter]
public async Task<UpgradeCheckResponse> GetCheck()
2018-06-29 19:52:40 +02:00
{
var updChkCookie = Request.Headers.GetCookies("UMB_UPDCHK").FirstOrDefault();
var updateCheckCookie = updChkCookie != null ? updChkCookie["UMB_UPDCHK"].Value : "";
2019-06-18 18:44:22 +02:00
if (GlobalSettings.VersionCheckPeriod > 0 && string.IsNullOrEmpty(updateCheckCookie) && Security.CurrentUser.IsAdmin())
2018-06-29 19:52:40 +02:00
{
try
{
var version = new SemVersion(UmbracoVersion.Current.Major, UmbracoVersion.Current.Minor,
UmbracoVersion.Current.Build, UmbracoVersion.Comment);
var result = await _upgradeService.CheckUpgrade(version);
2018-06-29 19:52:40 +02:00
return new UpgradeCheckResponse(result.UpgradeType, result.Comment, result.UpgradeUrl);
2018-06-29 19:52:40 +02:00
}
catch (System.Net.WebException)
{
//this occurs if the server is down or cannot be reached
return null;
}
catch (System.Web.Services.Protocols.SoapException)
{
//this occurs if the server has a timeout
return null;
}
2018-06-29 19:52:40 +02:00
}
return null;
}
/// <summary>
/// Adds the cookie response if it was successful
/// </summary>
/// <remarks>
/// A filter is required because we are returning an object from the get method and not an HttpResponseMessage
/// </remarks>
internal class UpdateCheckResponseFilter : ActionFilterAttribute
{
public override void OnActionExecuted(HttpActionExecutedContext context)
{
if (context.Response == null) return;
var objectContent = context.Response.Content as ObjectContent;
if (objectContent == null || objectContent.Value == null) return;
//there is a result, set the outgoing cookie
var cookie = new CookieHeaderValue("UMB_UPDCHK", "1")
{
Path = "/",
2019-01-07 10:43:28 +01:00
Expires = DateTimeOffset.Now.AddDays(Current.Configs.Global().VersionCheckPeriod),
2018-06-29 19:52:40 +02:00
HttpOnly = true,
2019-01-07 10:43:28 +01:00
Secure = Current.Configs.Global().UseHttps
2018-06-29 19:52:40 +02:00
};
context.Response.Headers.AddCookies(new[] { cookie });
}
}
}
}