using Bit.Core; using Microsoft.AspNetCore.Http; using System; using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; namespace Bit.Api.Middleware { public class CurrentContextMiddleware { private readonly RequestDelegate _next; public CurrentContextMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext httpContext, CurrentContext currentContext) { if(httpContext.User != null) { var claimsDict = httpContext.User.Claims .GroupBy(c => c.Type) .ToDictionary(c => c.Key, c => c.Select(v => v)); var clientId = GetClaimValue(claimsDict, "client_id"); var clientSubject = GetClaimValue(claimsDict, "client_sub"); if((clientId?.StartsWith("installation.") ?? false) && clientSubject != null) { Guid idGuid; if(Guid.TryParse(clientSubject, out idGuid)) { currentContext.InstallationId = idGuid; } } currentContext.DeviceIdentifier = GetClaimValue(claimsDict, "device"); if(claimsDict.ContainsKey("orgowner")) { currentContext.Organizations.AddRange(claimsDict["orgowner"].Select(c => new CurrentContext.CurrentContentOrganization { Id = new Guid(c.Value), Type = Core.Enums.OrganizationUserType.Owner })); } if(claimsDict.ContainsKey("orgadmin")) { currentContext.Organizations.AddRange(claimsDict["orgadmin"].Select(c => new CurrentContext.CurrentContentOrganization { Id = new Guid(c.Value), Type = Core.Enums.OrganizationUserType.Admin })); } if(claimsDict.ContainsKey("orguser")) { currentContext.Organizations.AddRange(claimsDict["orguser"].Select(c => new CurrentContext.CurrentContentOrganization { Id = new Guid(c.Value), Type = Core.Enums.OrganizationUserType.User })); } } if(currentContext.DeviceIdentifier == null && httpContext.Request.Headers.ContainsKey("Device-Identifier")) { currentContext.DeviceIdentifier = httpContext.Request.Headers["Device-Identifier"]; } await _next.Invoke(httpContext); } private string GetClaimValue(Dictionary> claims, string type) { if(!claims.ContainsKey(type)) { return null; } return claims[type].FirstOrDefault()?.Value; } } }