using System ;
using System.Threading.Tasks ;
using MediaBrowser.Controller.Configuration ;
using Microsoft.AspNetCore.Cors.Infrastructure ;
using Microsoft.AspNetCore.Http ;
namespace Jellyfin.Server.Configuration
{
/// <summary>
/// Cors policy provider.
/// </summary>
public class CorsPolicyProvider : ICorsPolicyProvider
{
private readonly IServerConfigurationManager _serverConfigurationManager ;
/// <summary>
/// Initializes a new instance of the <see cref="CorsPolicyProvider"/> class.
/// </summary>
/// <param name="serverConfigurationManager">Instance of the <see cref="IServerConfigurationManager"/> interface.</param>
public CorsPolicyProvider ( IServerConfigurationManager serverConfigurationManager )
{
_serverConfigurationManager = serverConfigurationManager ;
}
/// <inheritdoc />
public Task < CorsPolicy ? > GetPolicyAsync ( HttpContext context , string? policyName )
{
var corsHosts = _serverConfigurationManager . Configuration . CorsHosts ;
var builder = new CorsPolicyBuilder ( )
. AllowAnyMethod ( )
. AllowAnyHeader ( ) ;
// No hosts configured or only default configured.
if ( corsHosts . Length = = 0
| | ( corsHosts . Length = = 1
& & string . Equals ( corsHosts [ 0 ] , CorsConstants . AnyOrigin , StringComparison . Ordinal ) ) )
{
builder . AllowAnyOrigin ( ) ;
}
else
{
builder . WithOrigins ( corsHosts )
. AllowCredentials ( ) ;
}
return Task . FromResult < CorsPolicy ? > ( builder . Build ( ) ) ;
}
}
}