[fix] Exception capture mechanism
This commit is contained in:
20
.idea/.idea.Abyss/.idea/workspace.xml
generated
20
.idea/.idea.Abyss/.idea/workspace.xml
generated
@@ -10,19 +10,10 @@
|
||||
</component>
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="bf317275-3039-49bb-a475-725a800a0cce" name="Changes" comment="">
|
||||
<change afterPath="$PROJECT_DIR$/Abyss/Components/Controllers/Middleware/BadRequestExceptionMiddleware.cs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.idea/.idea.Abyss/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/.idea.Abyss/.idea/workspace.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/Abyss/Abyss.csproj" beforeDir="false" afterPath="$PROJECT_DIR$/Abyss/Abyss.csproj" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/Abyss/Components/Controllers/Media/LiveController.cs" beforeDir="false" afterPath="$PROJECT_DIR$/Abyss/Components/Controllers/Media/LiveController.cs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/Abyss/Components/Controllers/Media/VideoController.cs" beforeDir="false" afterPath="$PROJECT_DIR$/Abyss/Components/Controllers/Media/VideoController.cs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/Abyss/Components/Controllers/Security/UserController.cs" beforeDir="false" afterPath="$PROJECT_DIR$/Abyss/Components/Controllers/Security/UserController.cs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/Abyss/Components/Services/ResourceService.cs" beforeDir="false" afterPath="$PROJECT_DIR$/Abyss/Components/Services/ResourceService.cs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/Abyss/Components/Services/TaskService.cs" beforeDir="false" afterPath="$PROJECT_DIR$/Abyss/Components/Services/TaskService.cs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/Abyss/Components/Services/UserService.cs" beforeDir="false" afterPath="$PROJECT_DIR$/Abyss/Components/Services/UserService.cs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/Abyss/Components/Static/Helpers.cs" beforeDir="false" afterPath="$PROJECT_DIR$/Abyss/Components/Static/Helpers.cs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/Abyss/Model/ResourceAttribute.cs" beforeDir="false" afterPath="$PROJECT_DIR$/Abyss/Model/ResourceAttribute.cs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/Abyss/Model/Task.cs" beforeDir="false" afterPath="$PROJECT_DIR$/Abyss/Model/Task.cs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/Abyss/Model/User.cs" beforeDir="false" afterPath="$PROJECT_DIR$/Abyss/Model/User.cs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/Abyss/Model/UserCreating.cs" beforeDir="false" afterPath="$PROJECT_DIR$/Abyss/Model/UserCreating.cs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/Abyss/Program.cs" beforeDir="false" afterPath="$PROJECT_DIR$/Abyss/Program.cs" afterDir="false" />
|
||||
</list>
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
@@ -47,7 +38,14 @@
|
||||
<setting file="file://$APPLICATION_CONFIG_DIR$/resharper-host/DecompilerCache/decompiler/f09ccaeb94c34c2299acd3efee0facee1a400/81/137b58b4/Key.cs" root0="FORCE_HIGHLIGHTING" />
|
||||
<setting file="file://$PROJECT_DIR$/Abyss/Components/Controllers/AbyssController.cs" root0="FORCE_HIGHLIGHTING" />
|
||||
<setting file="file://$PROJECT_DIR$/Abyss/Components/Controllers/Media/LiveController.cs" root0="FORCE_HIGHLIGHTING" />
|
||||
<setting file="file://$PROJECT_DIR$/Abyss/Components/Controllers/Middleware/BadRequestExceptionMiddleware.cs" root0="FORCE_HIGHLIGHTING" />
|
||||
<setting file="file://$PROJECT_DIR$/Abyss/Components/Controllers/Security/UserController.cs" root0="FORCE_HIGHLIGHTING" />
|
||||
<setting file="mock:///home/acite/embd/WebProjects/Abyss/Abyss/Components/Controllers/Security/UserController.cs" root0="SKIP_HIGHLIGHTING" />
|
||||
<setting file="mock:///home/acite/embd/WebProjects/Abyss/Abyss/Components/Controllers/Security/UserController.cs" root0="SKIP_HIGHLIGHTING" />
|
||||
<setting file="mock:///home/acite/embd/WebProjects/Abyss/Abyss/Components/Controllers/Security/UserController.cs" root0="SKIP_HIGHLIGHTING" />
|
||||
<setting file="mock:///home/acite/embd/WebProjects/Abyss/Abyss/Components/Controllers/Security/UserController.cs" root0="SKIP_HIGHLIGHTING" />
|
||||
<setting file="mock:///home/acite/embd/WebProjects/Abyss/Abyss/Components/Controllers/Security/UserController.cs" root0="SKIP_HIGHLIGHTING" />
|
||||
<setting file="mock:///home/acite/embd/WebProjects/Abyss/Abyss/Components/Controllers/Security/UserController.cs" root0="SKIP_HIGHLIGHTING" />
|
||||
<setting file="file://$PROJECT_DIR$/Abyss/Components/Controllers/Task/TaskController.cs" root0="FORCE_HIGHLIGHTING" />
|
||||
<setting file="file://$PROJECT_DIR$/Abyss/Components/Services/AbyssService.cs" root0="FORCE_HIGHLIGHTING" />
|
||||
<setting file="file://$PROJECT_DIR$/Abyss/Components/Services/ConfigureService.cs" root0="FORCE_HIGHLIGHTING" />
|
||||
@@ -226,7 +224,7 @@
|
||||
<workItem from="1758040123892" duration="21000" />
|
||||
<workItem from="1758040188148" duration="1000" />
|
||||
<workItem from="1758049713959" duration="86000" />
|
||||
<workItem from="1758084310862" duration="14054000" />
|
||||
<workItem from="1758084310862" duration="16767000" />
|
||||
</task>
|
||||
<servers />
|
||||
</component>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Diagnostics;
|
||||
|
||||
using Abyss.Components.Services;
|
||||
using Abyss.Components.Static;
|
||||
using Abyss.Components.Tools;
|
||||
@@ -15,7 +15,6 @@ using Task = System.Threading.Tasks.Task;
|
||||
public class VideoController(ILogger<VideoController> logger, ResourceService rs, ConfigureService config) : BaseController
|
||||
{
|
||||
private ILogger<VideoController> _logger = logger;
|
||||
|
||||
public readonly string VideoFolder = Path.Combine(config.MediaRoot, "Videos");
|
||||
|
||||
[HttpPost("init")]
|
||||
@@ -78,8 +77,6 @@ public class VideoController(ILogger<VideoController> logger, ResourceService rs
|
||||
[HttpPost("{klass}/bulkquery")]
|
||||
public async Task<IActionResult> QueryBulk([FromQuery] string token, [FromBody] string[] id, [FromRoute] string klass)
|
||||
{
|
||||
List<string> result = new List<string>();
|
||||
|
||||
var db = id.Select(x => Helpers.SafePathCombine(VideoFolder, [klass, x, "summary.json"])).ToArray();
|
||||
if(db.Any(x => x == null))
|
||||
return BadRequest();
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
namespace Abyss.Components.Controllers.Middleware;
|
||||
|
||||
public class BadRequestExceptionMiddleware(RequestDelegate next, ILogger<BadRequestExceptionMiddleware> logger)
|
||||
{
|
||||
public async System.Threading.Tasks.Task Invoke(HttpContext context)
|
||||
{
|
||||
try
|
||||
{
|
||||
await next(context);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
logger.LogError(ex.Message);
|
||||
context.Response.StatusCode = StatusCodes.Status400BadRequest;
|
||||
await context.Response.WriteAsync("Bad Request");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
// UserController.cs
|
||||
|
||||
using System.Text.RegularExpressions;
|
||||
@@ -13,16 +12,16 @@ namespace Abyss.Components.Controllers.Security;
|
||||
[ApiController]
|
||||
[Route("api/[controller]")]
|
||||
[EnableRateLimiting("Fixed")]
|
||||
public class UserController(UserService user, ILogger<UserController> logger) : BaseController
|
||||
public class UserController(UserService userService, ILogger<UserController> logger) : BaseController
|
||||
{
|
||||
private readonly ILogger<UserController> _logger = logger;
|
||||
private readonly UserService _user = user;
|
||||
private readonly UserService _userService = userService;
|
||||
|
||||
[HttpGet("{user}")]
|
||||
public async Task<IActionResult> Challenge(string user)
|
||||
{
|
||||
var c = await _user.Challenge(user);
|
||||
if(c == null)
|
||||
var c = await _userService.Challenge(user);
|
||||
if (c == null)
|
||||
return StatusCode(403, new { message = "Access forbidden" });
|
||||
|
||||
return Ok(c);
|
||||
@@ -31,17 +30,16 @@ public class UserController(UserService user, ILogger<UserController> logger) :
|
||||
[HttpPost("{user}")]
|
||||
public async Task<IActionResult> Challenge(string user, [FromBody] ChallengeResponse response)
|
||||
{
|
||||
var r = await _user.Verify(user, response.Response, Ip);
|
||||
if(r == null)
|
||||
var r = await _userService.Verify(user, response.Response, Ip);
|
||||
if (r == null)
|
||||
return StatusCode(403, new { message = "Access forbidden" });
|
||||
|
||||
return Ok(r);
|
||||
}
|
||||
|
||||
[HttpPost("validate")]
|
||||
public IActionResult Validate(string token)
|
||||
{
|
||||
var u = _user.Validate(token, Ip);
|
||||
var u = _userService.Validate(token, Ip);
|
||||
if (u == -1)
|
||||
{
|
||||
return StatusCode(401, new { message = "Invalid" });
|
||||
@@ -53,13 +51,13 @@ public class UserController(UserService user, ILogger<UserController> logger) :
|
||||
[HttpPost("destroy")]
|
||||
public IActionResult Destroy(string token)
|
||||
{
|
||||
var u = _user.Validate(token, Ip);
|
||||
var u = _userService.Validate(token, Ip);
|
||||
if (u == -1)
|
||||
{
|
||||
return StatusCode(401, new { message = "Invalid" });
|
||||
}
|
||||
|
||||
_user.Destroy(token);
|
||||
_userService.Destroy(token);
|
||||
return Ok("Success");
|
||||
}
|
||||
|
||||
@@ -67,46 +65,46 @@ public class UserController(UserService user, ILogger<UserController> logger) :
|
||||
public async Task<IActionResult> Create(string user, [FromBody] UserCreating creating)
|
||||
{
|
||||
// Valid token
|
||||
var r = await _user.Verify(user, creating.Response, Ip);
|
||||
if(r == null)
|
||||
var r = await _userService.Verify(user, creating.Response, Ip);
|
||||
if (r == null)
|
||||
return StatusCode(403, new { message = "Denied" });
|
||||
|
||||
// User exists ?
|
||||
var cu = await _user.QueryUser(creating.Name);
|
||||
if(cu != null)
|
||||
var cu = await _userService.QueryUser(creating.Name);
|
||||
if (cu != null)
|
||||
return StatusCode(403, new { message = "Denied" });
|
||||
|
||||
// Valid username string
|
||||
if(!IsAlphanumeric(creating.Name))
|
||||
if (!IsAlphanumeric(creating.Name))
|
||||
return StatusCode(403, new { message = "Denied" });
|
||||
|
||||
// Valid parent && Privilege
|
||||
var ou = await _user.QueryUser(_user.Validate(r, Ip));
|
||||
if(creating.Privilege > ou?.Privilege || ou == null)
|
||||
var ou = await _userService.QueryUser(_userService.Validate(r, Ip));
|
||||
if (creating.Privilege > ou?.Privilege || ou == null)
|
||||
return StatusCode(403, new { message = "Denied" });
|
||||
|
||||
await _user.CreateUser(new User
|
||||
await _userService.CreateUser(new User
|
||||
{
|
||||
Username = creating.Name,
|
||||
ParentId = ou.Uuid,
|
||||
Privilege = creating.Privilege,
|
||||
PublicKey = creating.PublicKey,
|
||||
} );
|
||||
});
|
||||
|
||||
_user.Destroy(r);
|
||||
_userService.Destroy(r);
|
||||
return Ok("Success");
|
||||
}
|
||||
|
||||
[HttpGet("{user}/open")]
|
||||
public async Task<IActionResult> Open(string user, [FromQuery] string token, [FromQuery] string? bindIp = null)
|
||||
{
|
||||
var caller = _user.Validate(token, Ip);
|
||||
var caller = _userService.Validate(token, Ip);
|
||||
if (caller != 1)
|
||||
{
|
||||
return StatusCode(403, new { message = "Access forbidden" });
|
||||
}
|
||||
|
||||
var target = await _user.QueryUser(user);
|
||||
var target = await _userService.QueryUser(user);
|
||||
if (target == null)
|
||||
{
|
||||
return StatusCode(404, new { message = "User not found" });
|
||||
@@ -114,9 +112,10 @@ public class UserController(UserService user, ILogger<UserController> logger) :
|
||||
|
||||
var ipToBind = string.IsNullOrWhiteSpace(bindIp) ? Ip : bindIp;
|
||||
|
||||
var t = _user.CreateToken(target.Uuid, ipToBind, TimeSpan.FromHours(1));
|
||||
var t = _userService.CreateToken(target.Uuid, ipToBind, TimeSpan.FromHours(1));
|
||||
|
||||
_logger.LogInformation("Root created 1h token for {User}, bound to {BindIp}, request from {ReqIp}", user, ipToBind, Ip);
|
||||
_logger.LogInformation("Root created 1h token for {User}, bound to {BindIp}, request from {ReqIp}", user,
|
||||
ipToBind, Ip);
|
||||
return Ok(new { token = t, user, boundIp = ipToBind });
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.Threading.RateLimiting;
|
||||
using Abyss.Components.Controllers.Middleware;
|
||||
using Abyss.Components.Controllers.Task;
|
||||
using Abyss.Components.Services;
|
||||
using Microsoft.AspNetCore.RateLimiting;
|
||||
@@ -41,6 +42,7 @@ public class Program
|
||||
var app = builder.Build();
|
||||
|
||||
// app.UseHttpsRedirection();
|
||||
app.UseMiddleware<BadRequestExceptionMiddleware>();
|
||||
app.UseAuthorization();
|
||||
app.MapControllers();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user