From 6be0ca949adeca799c87bd56e3241b02bd96b481 Mon Sep 17 00:00:00 2001 From: Samuel Elliott Date: Sun, 11 Feb 2024 21:51:34 +0000 Subject: [PATCH] Fix getting auth data from API proxy returns stale data --- src/cli/nso/http-server.ts | 8 ++++++-- src/common/auth/coral.ts | 2 ++ src/common/users.ts | 13 ++++++++++++- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/cli/nso/http-server.ts b/src/cli/nso/http-server.ts index 87fd5f4..4845082 100644 --- a/src/cli/nso/http-server.ts +++ b/src/cli/nso/http-server.ts @@ -7,7 +7,7 @@ import bodyParser from 'body-parser'; import type { Arguments as ParentArguments } from './index.js'; import CoralApi, { CoralApiInterface, CoralErrorResponse } from '../../api/coral.js'; import { Announcement, CoralStatus, CurrentUser, Friend, FriendCodeUrl, FriendCodeUser, Presence } from '../../api/coral-types.js'; -import { AuthPolicy, AuthToken, ZncPresenceEventStreamEvent } from '../../api/znc-proxy.js'; +import ZncProxyApi, { AuthPolicy, AuthToken, ZncPresenceEventStreamEvent } from '../../api/znc-proxy.js'; import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; @@ -319,7 +319,11 @@ class Server extends HttpServer { } async handleAuthRequest({user}: RequestDataWithUser) { - return user.data; + if (user.nso instanceof ZncProxyApi) { + return user.nso.fetch('/auth'); + } else { + return user.data; + } } async handleTokenRequest({policy, token}: RequestData) { diff --git a/src/common/auth/coral.ts b/src/common/auth/coral.ts index 48f0cd6..19ec2dd 100644 --- a/src/common/auth/coral.ts +++ b/src/common/auth/coral.ts @@ -157,6 +157,8 @@ async function renewToken( await storage.setItem('NsoToken.' + na_session_token, existingToken); renew_token_data.existingToken = existingToken; + + return existingToken; } catch (err) { await attempt?.recordError(err); diff --git a/src/common/users.ts b/src/common/users.ts index fbaa830..e713210 100644 --- a/src/common/users.ts +++ b/src/common/users.ts @@ -1,9 +1,10 @@ import * as crypto from 'node:crypto'; import * as persist from 'node-persist'; +import { Response } from 'undici'; import createDebug from '../util/debug.js'; import CoralApi, { CoralApiInterface, Result } from '../api/coral.js'; import ZncProxyApi from '../api/znc-proxy.js'; -import { Announcements, Friends, Friend, GetActiveEventResult, CoralSuccessResponse, WebService, WebServices } from '../api/coral-types.js'; +import { Announcements, Friends, Friend, GetActiveEventResult, CoralSuccessResponse, WebService, WebServices, CoralError } from '../api/coral-types.js'; import { getToken, SavedToken } from './auth/coral.js'; import type { Store } from '../app/main/index.js'; import { NintendoAccountUser } from '../api/na.js'; @@ -72,6 +73,16 @@ export default class Users { const user = new CoralUser(nso, data, announcements, friends, webservices, active_event); + if (nso instanceof CoralApi && nso.onTokenExpired) { + const renewToken = nso.onTokenExpired; + + nso.onTokenExpired = async (error?: CoralError, response?: Response) => { + const auth_data = await renewToken(error, response) as SavedToken; + user.data = auth_data; + return auth_data; + }; + } + if (store) { await maybeUpdateWebServicesListCache(cached_webservices, store, data.user, webservices); user.onUpdatedWebServices = webservices => {