using System; using System.Linq; using System.Security.Claims; using Jellyfin.Api.Constants; namespace Jellyfin.Api.Extensions; /// <summary> /// Extensions for <see cref="ClaimsPrincipal"/>. /// </summary> public static class ClaimsPrincipalExtensions { /// <summary> /// Get user id from claims. /// </summary> /// <param name="user">Current claims principal.</param> /// <returns>User id.</returns> public static Guid GetUserId(this ClaimsPrincipal user) { var value = GetClaimValue(user, InternalClaimTypes.UserId); return string.IsNullOrEmpty(value) ? default : Guid.Parse(value); } /// <summary> /// Get device id from claims. /// </summary> /// <param name="user">Current claims principal.</param> /// <returns>Device id.</returns> public static string? GetDeviceId(this ClaimsPrincipal user) => GetClaimValue(user, InternalClaimTypes.DeviceId); /// <summary> /// Get device from claims. /// </summary> /// <param name="user">Current claims principal.</param> /// <returns>Device.</returns> public static string? GetDevice(this ClaimsPrincipal user) => GetClaimValue(user, InternalClaimTypes.Device); /// <summary> /// Get client from claims. /// </summary> /// <param name="user">Current claims principal.</param> /// <returns>Client.</returns> public static string? GetClient(this ClaimsPrincipal user) => GetClaimValue(user, InternalClaimTypes.Client); /// <summary> /// Get version from claims. /// </summary> /// <param name="user">Current claims principal.</param> /// <returns>Version.</returns> public static string? GetVersion(this ClaimsPrincipal user) => GetClaimValue(user, InternalClaimTypes.Version); /// <summary> /// Get token from claims. /// </summary> /// <param name="user">Current claims principal.</param> /// <returns>Token.</returns> public static string? GetToken(this ClaimsPrincipal user) => GetClaimValue(user, InternalClaimTypes.Token); /// <summary> /// Gets a flag specifying whether the request is using an api key. /// </summary> /// <param name="user">Current claims principal.</param> /// <returns>The flag specifying whether the request is using an api key.</returns> public static bool GetIsApiKey(this ClaimsPrincipal user) { var claimValue = GetClaimValue(user, InternalClaimTypes.IsApiKey); return bool.TryParse(claimValue, out var parsedClaimValue) && parsedClaimValue; } private static string? GetClaimValue(in ClaimsPrincipal user, string name) => user.Claims.FirstOrDefault(claim => claim.Type.Equals(name, StringComparison.OrdinalIgnoreCase))?.Value; }