:drunk: No idea what did AI did
This commit is contained in:
122
DysonNetwork.Pass/Features/Auth/Models/AuthChallenge.cs
Normal file
122
DysonNetwork.Pass/Features/Auth/Models/AuthChallenge.cs
Normal file
@ -0,0 +1,122 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
using DysonNetwork.Common.Models.Auth;
|
||||
using DysonNetwork.Pass.Models;
|
||||
using NetTopologySuite.Geometries;
|
||||
using NodaTime;
|
||||
|
||||
namespace DysonNetwork.Pass.Features.Auth.Models;
|
||||
|
||||
public class AuthChallenge : ModelBase
|
||||
{
|
||||
[Required]
|
||||
public Guid AccountId { get; set; }
|
||||
|
||||
[ForeignKey(nameof(AccountId))]
|
||||
[JsonIgnore]
|
||||
public virtual Account Account { get; set; } = null!;
|
||||
|
||||
[Required]
|
||||
[Column(TypeName = "varchar(50)")]
|
||||
public AuthChallengeType Type { get; set; }
|
||||
|
||||
[Required]
|
||||
[Column(TypeName = "varchar(50)")]
|
||||
public AuthChallengePlatform Platform { get; set; }
|
||||
|
||||
public Instant? ExpiredAt { get; set; }
|
||||
|
||||
[Required]
|
||||
public int StepRemain { get; set; } = 1;
|
||||
|
||||
[Required]
|
||||
public int StepTotal { get; set; } = 1;
|
||||
|
||||
[Required]
|
||||
public int FailedAttempts { get; set; } = 0;
|
||||
|
||||
[MaxLength(128)]
|
||||
public string? IpAddress { get; set; }
|
||||
|
||||
[MaxLength(512)]
|
||||
public string? UserAgent { get; set; }
|
||||
|
||||
[MaxLength(256)]
|
||||
public string? DeviceId { get; set; }
|
||||
|
||||
[MaxLength(1024)]
|
||||
public string? Nonce { get; set; }
|
||||
|
||||
[Column(TypeName = "jsonb")]
|
||||
public JsonDocument? BlacklistFactors { get; set; }
|
||||
|
||||
[Column(TypeName = "jsonb")]
|
||||
public JsonDocument? Audiences { get; set; }
|
||||
|
||||
[Column(TypeName = "jsonb")]
|
||||
public JsonDocument? Scopes { get; set; }
|
||||
|
||||
[NotMapped]
|
||||
public Point? Location { get; set; }
|
||||
|
||||
// Navigation property for AuthSession
|
||||
[JsonIgnore]
|
||||
public virtual ICollection<AuthSession> Sessions { get; set; } = new List<AuthSession>();
|
||||
|
||||
public bool IsExpired() => ExpiredAt != null && SystemClock.Instance.GetCurrentInstant() >= ExpiredAt.Value;
|
||||
|
||||
public bool CanAttempt(int maxAttempts = 5) => !IsExpired() && FailedAttempts < maxAttempts;
|
||||
|
||||
public void RecordAttempt()
|
||||
{
|
||||
if (IsExpired())
|
||||
return;
|
||||
|
||||
FailedAttempts++;
|
||||
}
|
||||
|
||||
public void UpdateStep(int step, int totalSteps)
|
||||
{
|
||||
StepRemain = step;
|
||||
StepTotal = totalSteps;
|
||||
}
|
||||
|
||||
public void UpdateExpiration(Instant? expiresAt)
|
||||
{
|
||||
ExpiredAt = expiresAt;
|
||||
}
|
||||
|
||||
public void UpdateBlacklistFactors(IEnumerable<string> factors)
|
||||
{
|
||||
BlacklistFactors = JsonSerializer.SerializeToDocument(factors);
|
||||
}
|
||||
|
||||
public void UpdateAudiences(IEnumerable<string> audiences)
|
||||
{
|
||||
Audiences = JsonSerializer.SerializeToDocument(audiences);
|
||||
}
|
||||
|
||||
public void UpdateScopes(IEnumerable<string> scopes)
|
||||
{
|
||||
Scopes = JsonSerializer.SerializeToDocument(scopes);
|
||||
}
|
||||
|
||||
public void UpdateLocation(double? latitude, double? longitude)
|
||||
{
|
||||
if (latitude.HasValue && longitude.HasValue)
|
||||
{
|
||||
Location = new Point(longitude.Value, latitude.Value) { SRID = 4326 };
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateDeviceInfo(string? ipAddress, string? userAgent, string? deviceId = null)
|
||||
{
|
||||
IpAddress = ipAddress;
|
||||
UserAgent = userAgent;
|
||||
DeviceId = deviceId;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user