fix: 拒绝NapCat WebUI缺失索引会话更新

This commit is contained in:
sunlei 2026-06-24 14:17:57 +08:00
parent 0375fd4661
commit f16dd0050c
2 changed files with 37 additions and 2 deletions

View File

@ -63,7 +63,7 @@ if terminal[next["status"]] then
return {1, nextJson}
end
if indexValue and indexValue ~= ARGV[1] then
if indexValue ~= ARGV[1] then
return {0, "Gateway session is not active"}
end

View File

@ -217,7 +217,7 @@ class FakeRedis {
return [1, nextSessionJson];
}
if (indexValue && indexValue !== sessionId) {
if (indexValue !== sessionId) {
return [0, 'Gateway session is not active'];
}
@ -584,6 +584,41 @@ describe('NapcatWebuiGatewayRedisStore', () => {
});
});
it('rejects non-terminal updates when the user-account index is missing', async () => {
const redis = new FakeRedis();
const config = createConfig({ value: 1000 });
const store = new NapcatWebuiGatewayRedisStore(
redis as never,
config as never,
);
const session: NapcatWebuiGatewaySession = {
...createSessionInput(),
createdAt: 1000,
expiresAt: 61_000,
sessionId: 'session-missing-index',
status: 'created',
};
const sessionKey = `napcat:webui:session:${session.sessionId}`;
const indexKey = 'napcat:webui:user-account:admin-1:account-1';
await store.create(session);
redis.values.delete(indexKey);
redis.ttl.delete(indexKey);
await expect(
store.update(session.sessionId, {
activeAt: 2000,
expiresAt: 62_000,
lastSeenAt: 2000,
status: 'active',
}),
).rejects.toThrow('Gateway session is not active');
expect(redis.values.get(indexKey)).toBeUndefined();
expect(JSON.parse(redis.values.get(sessionKey) || '{}')).toMatchObject({
status: 'created',
});
});
it('keeps delayed old heartbeat and activation from reviving a replaced session', async () => {
const redis = new FakeRedis();
const currentTime = { value: 1000 };