2020-12-06 09:13:29 +01:00
|
|
|
// Copyright (c) Umbraco.
|
|
|
|
|
// See LICENSE for more details.
|
|
|
|
|
|
|
|
|
|
using System.Threading.Tasks;
|
2020-12-03 10:01:46 +01:00
|
|
|
using Microsoft.AspNetCore.Authorization;
|
2020-11-24 00:37:26 +11:00
|
|
|
using Microsoft.AspNetCore.Http;
|
2020-12-06 09:13:29 +01:00
|
|
|
using Microsoft.Extensions.Primitives;
|
2021-02-18 11:06:02 +01:00
|
|
|
using Umbraco.Cms.Core.Models;
|
|
|
|
|
using Umbraco.Cms.Core.Security;
|
|
|
|
|
using Umbraco.Cms.Core.Services;
|
2020-11-24 00:37:26 +11:00
|
|
|
|
2021-02-18 11:06:02 +01:00
|
|
|
namespace Umbraco.Cms.Web.BackOffice.Authorization
|
2020-11-24 00:37:26 +11:00
|
|
|
{
|
2020-12-06 09:13:29 +01:00
|
|
|
/// <summary>
|
|
|
|
|
/// Used to authorize if the user has the correct permission access to the media for the media id specified in a query string.
|
|
|
|
|
/// </summary>
|
2020-12-03 10:01:46 +01:00
|
|
|
public class MediaPermissionsQueryStringHandler : PermissionsQueryStringHandler<MediaPermissionsQueryStringRequirement>
|
2020-11-24 00:37:26 +11:00
|
|
|
{
|
|
|
|
|
private readonly MediaPermissions _mediaPermissions;
|
|
|
|
|
|
2020-12-06 09:13:29 +01:00
|
|
|
/// <summary>
|
|
|
|
|
/// Initializes a new instance of the <see cref="MediaPermissionsQueryStringHandler"/> class.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="backOfficeSecurityAccessor">Accessor for back-office security.</param>
|
|
|
|
|
/// <param name="httpContextAccessor">Accessor for the HTTP context of the current request.</param>
|
|
|
|
|
/// <param name="entityService">Service for entity operations.</param>
|
|
|
|
|
/// <param name="mediaPermissions">Helper for media authorization checks.</param>
|
2020-11-24 00:42:52 +11:00
|
|
|
public MediaPermissionsQueryStringHandler(
|
2020-12-06 09:13:29 +01:00
|
|
|
IBackOfficeSecurityAccessor backOfficeSecurityAccessor,
|
2020-11-24 00:37:26 +11:00
|
|
|
IHttpContextAccessor httpContextAccessor,
|
2020-11-24 11:56:53 +11:00
|
|
|
IEntityService entityService,
|
2020-11-24 00:37:26 +11:00
|
|
|
MediaPermissions mediaPermissions)
|
2020-12-06 09:13:29 +01:00
|
|
|
: base(backOfficeSecurityAccessor, httpContextAccessor, entityService) => _mediaPermissions = mediaPermissions;
|
2020-11-24 00:37:26 +11:00
|
|
|
|
2020-12-06 09:13:29 +01:00
|
|
|
/// <inheritdoc/>
|
2020-11-26 17:25:43 +11:00
|
|
|
protected override Task<bool> IsAuthorized(AuthorizationHandlerContext context, MediaPermissionsQueryStringRequirement requirement)
|
2020-11-24 00:37:26 +11:00
|
|
|
{
|
2020-12-06 09:13:29 +01:00
|
|
|
if (!HttpContextAccessor.HttpContext.Request.Query.TryGetValue(requirement.QueryStringName, out StringValues routeVal))
|
2020-11-24 00:37:26 +11:00
|
|
|
{
|
2020-12-03 10:01:46 +01:00
|
|
|
// Must succeed this requirement since we cannot process it.
|
2020-11-26 17:25:43 +11:00
|
|
|
return Task.FromResult(true);
|
2020-11-24 00:37:26 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var argument = routeVal.ToString();
|
2020-12-03 10:01:46 +01:00
|
|
|
|
|
|
|
|
if (!TryParseNodeId(argument, out int nodeId))
|
2020-11-24 00:37:26 +11:00
|
|
|
{
|
2020-12-03 10:01:46 +01:00
|
|
|
// Must succeed this requirement since we cannot process it.
|
|
|
|
|
return Task.FromResult(true);
|
2020-11-24 00:37:26 +11:00
|
|
|
}
|
|
|
|
|
|
2020-12-06 09:13:29 +01:00
|
|
|
MediaPermissions.MediaAccess permissionResult = _mediaPermissions.CheckPermissions(
|
|
|
|
|
BackOfficeSecurityAccessor.BackOfficeSecurity.CurrentUser,
|
2020-11-24 00:37:26 +11:00
|
|
|
nodeId,
|
2020-12-06 09:13:29 +01:00
|
|
|
out IMedia mediaItem);
|
2020-11-24 00:37:26 +11:00
|
|
|
|
|
|
|
|
if (mediaItem != null)
|
|
|
|
|
{
|
2020-12-03 10:01:46 +01:00
|
|
|
// Store the media item in request cache so it can be resolved in the controller without re-looking it up.
|
|
|
|
|
HttpContextAccessor.HttpContext.Items[typeof(IMedia).ToString()] = mediaItem;
|
2020-11-24 00:37:26 +11:00
|
|
|
}
|
|
|
|
|
|
2020-11-26 17:25:43 +11:00
|
|
|
return permissionResult switch
|
|
|
|
|
{
|
|
|
|
|
MediaPermissions.MediaAccess.Denied => Task.FromResult(false),
|
|
|
|
|
_ => Task.FromResult(true),
|
|
|
|
|
};
|
2020-12-06 09:13:29 +01:00
|
|
|
}
|
2020-11-24 00:37:26 +11:00
|
|
|
}
|
|
|
|
|
}
|