mirror of
https://github.com/Caraxi/mare.server.git
synced 2025-12-30 22:33:39 +01:00
* rework server responsibilities add remote configuration * start metrics only when compiled as not debug * add some more logging to discord bot * fixes of some casts * make metrics port configurable, minor fixes * add docker bullshit * md formatting * adjustments to docker stuff * fix docker json files, fix some stuff in discord bot, add /useradd for Discord bot * adjust docker configs and fix sharded.bat * fixes for logs, cache file provider repeat trying to open filestream Co-authored-by: rootdarkarchon <root.darkarchon@outlook.com>
55 lines
2.5 KiB
C#
55 lines
2.5 KiB
C#
using System.Security.Claims;
|
|
using Microsoft.AspNetCore.Authorization;
|
|
using Microsoft.AspNetCore.SignalR;
|
|
using MareSynchronosShared.Data;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using MareSynchronosServer.Services;
|
|
|
|
namespace MareSynchronosServer.RequirementHandlers;
|
|
|
|
public class UserRequirementHandler : AuthorizationHandler<UserRequirement, HubInvocationContext>
|
|
{
|
|
private readonly IClientIdentificationService identClient;
|
|
private readonly MareDbContext dbContext;
|
|
private readonly ILogger<UserRequirementHandler> logger;
|
|
|
|
public UserRequirementHandler(IClientIdentificationService identClient, MareDbContext dbContext, ILogger<UserRequirementHandler> logger)
|
|
{
|
|
this.identClient = identClient;
|
|
this.dbContext = dbContext;
|
|
this.logger = logger;
|
|
}
|
|
|
|
protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, UserRequirement requirement, HubInvocationContext resource)
|
|
{
|
|
var uid = context.User.Claims.SingleOrDefault(g => string.Equals(g.Type, ClaimTypes.NameIdentifier, StringComparison.Ordinal))?.Value;
|
|
var auth = context.User.Claims.SingleOrDefault(g => string.Equals(g.Type, ClaimTypes.Authentication, StringComparison.Ordinal))?.Value;
|
|
|
|
if (uid == null || auth == null) context.Fail();
|
|
|
|
if ((requirement.Requirements & UserRequirements.Identified) is UserRequirements.Identified)
|
|
{
|
|
var ident = identClient.GetCharacterIdentForUid(uid);
|
|
if (ident == null) context.Fail();
|
|
|
|
var isOnCurrent = identClient.IsOnCurrentServer(uid);
|
|
if (!isOnCurrent) identClient.MarkUserOnline(uid, ident);
|
|
}
|
|
|
|
if ((requirement.Requirements & UserRequirements.Administrator) is UserRequirements.Administrator)
|
|
{
|
|
var user = await dbContext.Users.AsNoTracking().SingleOrDefaultAsync(b => b.UID == uid).ConfigureAwait(false);
|
|
if (user == null || !user.IsAdmin) context.Fail();
|
|
logger.LogInformation("Admin {uid} authenticated", uid);
|
|
}
|
|
|
|
if ((requirement.Requirements & UserRequirements.Moderator) is UserRequirements.Moderator)
|
|
{
|
|
var user = await dbContext.Users.AsNoTracking().SingleOrDefaultAsync(b => b.UID == uid).ConfigureAwait(false);
|
|
if (user == null || !user.IsAdmin && !user.IsModerator) context.Fail();
|
|
logger.LogInformation("Admin/Moderator {uid} authenticated", uid);
|
|
}
|
|
|
|
context.Succeed(requirement);
|
|
}
|
|
}
|