1
0

fix: Use forigen key contrail

This commit is contained in:
Ca2didi 2025-04-30 18:20:39 +08:00
parent b14dcd9d21
commit 0d0c1c15df
5 changed files with 28 additions and 23 deletions

View File

@ -103,7 +103,7 @@ public class AuthenticationController(
var exp = DateTime.UtcNow.AddDays(tokenService.RefreshTokenLifeTime); var exp = DateTime.UtcNow.AddDays(tokenService.RefreshTokenLifeTime);
var refKey = new AppUserRefreshKey var refKey = new AppUserRefreshKey
{ {
UserId = user.Id, User = user,
RefreshToken = refreshToken, RefreshToken = refreshToken,
ExpireIn = exp, ExpireIn = exp,
}; };
@ -139,7 +139,7 @@ public class AuthenticationController(
// Find valid expired refresh token // Find valid expired refresh token
var refreshToken = principal.FindFirst(FlawlessClaimsType.RefreshToken)?.Value; var refreshToken = principal.FindFirst(FlawlessClaimsType.RefreshToken)?.Value;
var tk = await set.FirstOrDefaultAsync(k => k.RefreshToken == refreshToken && k.UserId.ToString() == user.Id.ToString()); var tk = await set.FirstOrDefaultAsync(k => k.RefreshToken == refreshToken && k.User == user);
if (tk == null) return BadRequest(new FailedResponse("Token is ban. Please login again.")); if (tk == null) return BadRequest(new FailedResponse("Token is ban. Please login again."));
// Renew keys // Renew keys
@ -152,7 +152,7 @@ public class AuthenticationController(
set.Remove(tk); set.Remove(tk);
set.Add(new AppUserRefreshKey set.Add(new AppUserRefreshKey
{ {
UserId = user.Id, User = user,
RefreshToken = refreshToken, RefreshToken = refreshToken,
ExpireIn = exp, ExpireIn = exp,
}); });
@ -174,7 +174,7 @@ public class AuthenticationController(
u.RenewSecurityStamp(); u.RenewSecurityStamp();
// Do not let tokens can be refresh // Do not let tokens can be refresh
await dbContext.RefreshTokens.Where(k => k.UserId == u.Id).ExecuteDeleteAsync(); await dbContext.RefreshTokens.Where(k => k.User == u).ExecuteDeleteAsync();
await dbContext.SaveChangesAsync(); await dbContext.SaveChangesAsync();
return Ok(); return Ok();

View File

@ -173,7 +173,7 @@ public class RepositoryInnieController(
var grantIssue = await ValidateRepositoryAsync(userName, repositoryName, user, RepositoryRole.Owner); var grantIssue = await ValidateRepositoryAsync(userName, repositoryName, user, RepositoryRole.Owner);
if (grantIssue is not Repository rp) return (IActionResult) grantIssue; if (grantIssue is not Repository rp) return (IActionResult) grantIssue;
await webhookService.AddWebhookAsync(rp.Id, request.TargetUrl, request.EventType, request.Secret); await webhookService.AddWebhookAsync(rp, request.TargetUrl, request.EventType, request.Secret);
return Created(); return Created();
} }
@ -184,7 +184,7 @@ public class RepositoryInnieController(
var grantIssue = await ValidateRepositoryAsync(userName, repositoryName, user, RepositoryRole.Developer); var grantIssue = await ValidateRepositoryAsync(userName, repositoryName, user, RepositoryRole.Developer);
if (grantIssue is not Repository rp) return (ActionResult) grantIssue; if (grantIssue is not Repository rp) return (ActionResult) grantIssue;
return Ok(await webhookService.GetWebhooksAsync(rp.Id)); return Ok(await webhookService.GetWebhooksAsync(rp));
} }
[HttpPost("webhooks/{webhookId}/toggle")] [HttpPost("webhooks/{webhookId}/toggle")]
@ -194,7 +194,7 @@ public class RepositoryInnieController(
var grantIssue = await ValidateRepositoryAsync(userName, repositoryName, user, RepositoryRole.Owner); var grantIssue = await ValidateRepositoryAsync(userName, repositoryName, user, RepositoryRole.Owner);
if (grantIssue is not Repository rp) return (ActionResult) grantIssue; if (grantIssue is not Repository rp) return (ActionResult) grantIssue;
await webhookService.ToggleWebhookAsync(rp.Id, webhookId, activate); await webhookService.ToggleWebhookAsync(rp, webhookId, activate);
return Ok(); return Ok();
} }
@ -205,7 +205,7 @@ public class RepositoryInnieController(
var grantIssue = await ValidateRepositoryAsync(userName, repositoryName, user, RepositoryRole.Owner); var grantIssue = await ValidateRepositoryAsync(userName, repositoryName, user, RepositoryRole.Owner);
if (grantIssue is not Repository rp) return (ActionResult) grantIssue; if (grantIssue is not Repository rp) return (ActionResult) grantIssue;
await webhookService.DeleteWebhookAsync(rp.Id, webhookId); await webhookService.DeleteWebhookAsync(rp, webhookId);
return NoContent(); return NoContent();
} }

View File

@ -9,7 +9,7 @@ public class AppUserRefreshKey
public required string RefreshToken { get; set; } public required string RefreshToken { get; set; }
[Required] [Required]
public required Guid UserId { get; set; } public required AppUser User { get; set; }
[Required] [Required]
public required DateTime ExpireIn { get; set; } public required DateTime ExpireIn { get; set; }

View File

@ -8,7 +8,7 @@ public class Webhook
[Key] [Key]
public int Id { get; set; } public int Id { get; set; }
public required Guid RepositoryId { get; set; } public required Repository Repository { get; set; }
public required string TargetUrl { get; set; } public required string TargetUrl { get; set; }

View File

@ -14,14 +14,13 @@ public class WebhookService(
IHttpClientFactory httpFactory, IHttpClientFactory httpFactory,
ILogger<WebhookService> logger) ILogger<WebhookService> logger)
{ {
public async Task AddWebhookAsync(Guid repoId, string targetUrl, WebhookEventType eventType, string? secret) public async Task AddWebhookAsync(Repository repo, string targetUrl, WebhookEventType eventType, string? secret)
{ {
// 新增参数校验
if (string.IsNullOrWhiteSpace(targetUrl) || !Uri.TryCreate(targetUrl, UriKind.Absolute, out _)) if (string.IsNullOrWhiteSpace(targetUrl) || !Uri.TryCreate(targetUrl, UriKind.Absolute, out _))
throw new ArgumentException("No valid target URL provided"); throw new ArgumentException("No valid target URL provided");
var webhook = new Webhook { var webhook = new Webhook {
RepositoryId = repoId, Repository = repo,
TargetUrl = targetUrl, TargetUrl = targetUrl,
EventType = eventType, EventType = eventType,
Secret = secret, Secret = secret,
@ -32,10 +31,13 @@ public class WebhookService(
await context.SaveChangesAsync(); await context.SaveChangesAsync();
} }
public async Task ToggleWebhookAsync(Guid repoId, int webhookId, bool activated) public async Task ToggleWebhookAsync(Repository repo, int webhookId, bool activated)
{ {
var hook = await context.Webhooks.FindAsync(webhookId); var hook = await context.Webhooks
if (hook == null || hook.RepositoryId != repoId) return; .Include(x => x.Repository)
.FirstOrDefaultAsync(x => x.Id == webhookId);
if (hook == null || hook.Repository != repo) return;
if (hook.IsActive == activated) return; if (hook.IsActive == activated) return;
@ -44,28 +46,31 @@ public class WebhookService(
await context.SaveChangesAsync(); await context.SaveChangesAsync();
} }
public async Task DeleteWebhookAsync(Guid repoId, int webhookId) public async Task DeleteWebhookAsync(Repository repo, int webhookId)
{ {
var hook = await context.Webhooks.FindAsync(webhookId); var hook = await context.Webhooks
if (hook == null || hook.RepositoryId != repoId) return; .Include(x => x.Repository)
.FirstOrDefaultAsync(x => x.Id == webhookId);
if (hook == null || hook.Repository != repo) return;
context.Webhooks.Remove(hook); context.Webhooks.Remove(hook);
await context.SaveChangesAsync(); await context.SaveChangesAsync();
} }
public async Task<IEnumerable<Webhook>> GetWebhooksAsync(Guid repoId) public async Task<IEnumerable<Webhook>> GetWebhooksAsync(Repository repo)
{ {
return await context.Webhooks return await context.Webhooks
.Where(w => w.RepositoryId == repoId) .Where(w => w.Repository == repo)
.ToListAsync(); .ToListAsync();
} }
public async Task TriggerWebhooksAsync(Guid repoId, WebhookEventType eventType, object payload) public async Task TriggerWebhooksAsync(Repository repo, WebhookEventType eventType, object payload)
{ {
if (!settings.UseWebHook) return; if (!settings.UseWebHook) return;
var hooks = await context.Webhooks var hooks = await context.Webhooks
.Where(w => w.RepositoryId == repoId && w.EventType == eventType && w.IsActive) .Where(w => w.Repository == repo && w.EventType == eventType && w.IsActive)
.ToListAsync(); .ToListAsync();
using var client = httpFactory.CreateClient(); using var client = httpFactory.CreateClient();