fix: Use forigen key contrail
This commit is contained in:
parent
b14dcd9d21
commit
0d0c1c15df
@ -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();
|
||||||
|
|||||||
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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; }
|
||||||
|
|||||||
@ -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; }
|
||||||
|
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user