diff --git a/src/smapi.ts b/src/smapi.ts index f8db8e2..920fafb 100644 --- a/src/smapi.ts +++ b/src/smapi.ts @@ -423,17 +423,31 @@ function bindSmapiSoapServiceToExpress( E.chain((credentials) => { // Check if token/key is associated with a user const smapiToken = sonosSoap.getCredentialsForToken(credentials.loginToken.token); - if (!smapiToken || smapiToken.key !== credentials.loginToken.key) { - return E.left(new InvalidTokenError("Token not associated with any user")); + if (!smapiToken) { + return E.left(new InvalidTokenError("Token not found")); } + + // If credentials don't have a key, use the stored one + const effectiveKey = credentials.loginToken.key || smapiToken.key; + + if (smapiToken.key !== effectiveKey) { + return E.left(new InvalidTokenError("Token key mismatch")); + } + return pipe( smapiAuthTokens.verify({ token: credentials.loginToken.token, - key: credentials.loginToken.key, + key: effectiveKey, }), E.map((serviceToken) => ({ serviceToken, - credentials, + credentials: { + ...credentials, + loginToken: { + ...credentials.loginToken, + key: effectiveKey, + }, + }, })) ); }), diff --git a/src/smapi_token_store.ts b/src/smapi_token_store.ts index 95b5cb4..2a10760 100644 --- a/src/smapi_token_store.ts +++ b/src/smapi_token_store.ts @@ -68,6 +68,13 @@ export class FileSmapiTokenStore implements SmapiTokenStore { private saveToFile(): void { try { + // Ensure the directory exists before writing + const dir = path.dirname(this.filePath); + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir, { recursive: true }); + logger.info(`Created token storage directory: ${dir}`); + } + const data = JSON.stringify(this.tokens, null, 2); fs.writeFileSync(this.filePath, data, "utf8"); logger.debug(`Saved ${Object.keys(this.tokens).length} token(s) to ${this.filePath}`);