Compare commits

...

2 Commits

Author SHA1 Message Date
LittleSheep
1bb0012c40 🐛 Fix logout 2025-08-18 17:57:14 +08:00
LittleSheep
2cea391ebf 🐛 Fix logout session 2025-08-18 17:52:40 +08:00

View File

@@ -449,8 +449,7 @@ public class AccountService(
public async Task<AuthClient> UpdateDeviceName(Account account, string deviceId, string label) public async Task<AuthClient> UpdateDeviceName(Account account, string deviceId, string label)
{ {
var device = await db.AuthClients.FirstOrDefaultAsync( var device = await db.AuthClients.FirstOrDefaultAsync(c => c.DeviceId == deviceId && c.AccountId == account.Id
c => c.DeviceId == deviceId && c.AccountId == account.Id
); );
if (device is null) throw new InvalidOperationException("Device was not found."); if (device is null) throw new InvalidOperationException("Device was not found.");
@@ -470,54 +469,49 @@ public class AccountService(
.FirstOrDefaultAsync(); .FirstOrDefaultAsync();
if (session is null) throw new InvalidOperationException("Session was not found."); if (session is null) throw new InvalidOperationException("Session was not found.");
var sessions = await db.AuthSessions
.Include(s => s.Challenge)
.Where(s => s.AccountId == session.Id && s.Challenge.DeviceId == session.Challenge.DeviceId)
.ToListAsync();
if (session.Challenge.ClientId.HasValue) if (session.Challenge.ClientId.HasValue)
{ {
if (!await IsDeviceActive(session.Challenge.ClientId.Value)) if (!await IsDeviceActive(session.Challenge.ClientId.Value))
await pusher.UnsubscribePushNotificationsAsync(new UnsubscribePushNotificationsRequest() await pusher.UnsubscribePushNotificationsAsync(new UnsubscribePushNotificationsRequest()
{ DeviceId = session.Challenge.Client!.DeviceId } { DeviceId = session.Challenge.Client!.DeviceId }
); );
} }
// The current session should be included in the sessions' list // The current session should be included in the sessions' list
var now = SystemClock.Instance.GetCurrentInstant();
await db.AuthSessions await db.AuthSessions
.Include(s => s.Challenge) .Include(s => s.Challenge)
.Where(s => s.Challenge.DeviceId == session.Challenge.DeviceId) .Where(s => s.Challenge.DeviceId == session.Challenge.DeviceId)
.ExecuteDeleteAsync(); .ExecuteUpdateAsync(p => p.SetProperty(s => s.DeletedAt, s => now));
foreach (var item in sessions) await cache.RemoveAsync($"{AuthService.AuthCachePrefix}{session.Id}");
await cache.RemoveAsync($"{AuthService.AuthCachePrefix}{item.Id}");
} }
public async Task DeleteDevice(Account account, string deviceId) public async Task DeleteDevice(Account account, string deviceId)
{ {
var device = await db.AuthClients.FirstOrDefaultAsync( var device = await db.AuthClients.FirstOrDefaultAsync(c => c.DeviceId == deviceId && c.AccountId == account.Id
c => c.DeviceId == deviceId && c.AccountId == account.Id
); );
if (device is null) if (device is null)
throw new InvalidOperationException("Device not found."); throw new InvalidOperationException("Device not found.");
await pusher.UnsubscribePushNotificationsAsync( await pusher.UnsubscribePushNotificationsAsync(
new UnsubscribePushNotificationsRequest() { DeviceId = device.DeviceId } new UnsubscribePushNotificationsRequest { DeviceId = device.DeviceId }
); );
db.AuthClients.Remove(device);
await db.SaveChangesAsync();
var sessions = await db.AuthSessions var sessions = await db.AuthSessions
.Include(s => s.Challenge) .Include(s => s.Challenge)
.Where(s => s.Challenge.ClientId == device.Id) .Where(s => s.Challenge.ClientId == device.Id && s.AccountId == account.Id)
.ToListAsync(); .ToListAsync();
// The current session should be included in the sessions' list // The current session should be included in the sessions' list
var now = SystemClock.Instance.GetCurrentInstant();
await db.AuthSessions await db.AuthSessions
.Include(s => s.Challenge) .Include(s => s.Challenge)
.Where(s => s.Challenge.DeviceId == device.DeviceId) .Where(s => s.Challenge.DeviceId == device.DeviceId)
.ExecuteDeleteAsync(); .ExecuteUpdateAsync(p => p.SetProperty(s => s.DeletedAt, s => now));
db.AuthClients.Remove(device);
await db.SaveChangesAsync();
foreach (var item in sessions) foreach (var item in sessions)
await cache.RemoveAsync($"{AuthService.AuthCachePrefix}{item.Id}"); await cache.RemoveAsync($"{AuthService.AuthCachePrefix}{item.Id}");
@@ -689,4 +683,4 @@ public class AccountService(
await db.BulkInsertAsync(newProfiles); await db.BulkInsertAsync(newProfiles);
} }
} }
} }