From c96366b647814385aaf5bab4a3fe2f343819aadd Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 10 Jul 2019 21:26:22 -0600 Subject: [PATCH] Logout upstream as well (best effort) --- src/api/controllers/AccountController.ts | 8 ++++++-- src/db/models/UserScalarToken.ts | 11 ++++++++++- src/scalar/ScalarClient.ts | 7 +++---- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/api/controllers/AccountController.ts b/src/api/controllers/AccountController.ts index e6aefa3..0fb7f69 100644 --- a/src/api/controllers/AccountController.ts +++ b/src/api/controllers/AccountController.ts @@ -112,9 +112,13 @@ export default class AccountController { * @returns {Promise<*>} Resolves when complete. */ public async logout(user: IMSCUser): Promise { - // TODO: Create a link to upstream tokens to log them out too - const tokens = await UserScalarToken.findAll({where: {scalarToken: user.token}}); + const tokens = await UserScalarToken.findAll({where: {scalarToken: user.token}, include: [Upstream]}); for (const token of tokens) { + if (token.upstream) { + LogService.info("AccountController", "Logging user out of upstream"); + const client = new ScalarClient(token.upstream, ScalarClient.KIND_MATRIX_V1); + await client.logout(token.scalarToken); + } await token.destroy(); } Cache.for(CACHE_SCALAR_ACCOUNTS).clear(); diff --git a/src/db/models/UserScalarToken.ts b/src/db/models/UserScalarToken.ts index 8cfc29f..62e71f3 100644 --- a/src/db/models/UserScalarToken.ts +++ b/src/db/models/UserScalarToken.ts @@ -1,5 +1,11 @@ import { - AllowNull, AutoIncrement, BelongsTo, Column, ForeignKey, Model, PrimaryKey, + AllowNull, + AutoIncrement, + BelongsTo, + Column, + ForeignKey, + Model, + PrimaryKey, Table } from "sequelize-typescript"; import User from "./User"; @@ -33,4 +39,7 @@ export default class UserScalarToken extends Model { @Column @ForeignKey(() => Upstream) upstreamId?: number; + + @BelongsTo(() => Upstream) + upstream: Upstream; } \ No newline at end of file diff --git a/src/scalar/ScalarClient.ts b/src/scalar/ScalarClient.ts index bd57e72..3db7700 100644 --- a/src/scalar/ScalarClient.ts +++ b/src/scalar/ScalarClient.ts @@ -4,7 +4,6 @@ import * as request from "request"; import { LogService } from "matrix-js-snippets"; import Upstream from "../db/models/Upstream"; import { SCALAR_API_VERSION } from "../utils/common-constants"; -import * as url from "url"; const REGISTER_ROUTE = "/register"; const ACCOUNT_INFO_ROUTE = "/account"; @@ -30,8 +29,8 @@ export class ScalarClient { }, }; } else { - const parsed = url.parse(this.upstream.scalarUrl); - parsed.path = '/_matrix/integrations/v1' + (path === ACCOUNT_INFO_ROUTE ? path : `${ACCOUNT_INFO_ROUTE}${path}`); + const parsed = new URL(this.upstream.scalarUrl); + parsed.pathname = '/_matrix/integrations/v1' + (path === ACCOUNT_INFO_ROUTE ? path : `${ACCOUNT_INFO_ROUTE}${path}`); const headers = {}; if (token) headers['Authorization'] = `Bearer ${token}`; @@ -110,7 +109,7 @@ export class ScalarClient { LogService.error("ScalarClient", err); reject(err); } else if (res.statusCode !== 200) { - LogService.error("ScalarClient", "Got status code " + res.statusCode + " while getting information for token"); + LogService.error("ScalarClient", "Got status code " + res.statusCode + " while logging out token"); reject(res.statusCode); } else { resolve(res.body);