From 1b58dbe401b82a26b4d3b1019097c9117d56c945 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 17 Feb 2024 19:55:40 +0200 Subject: [PATCH] server-ts: Port etapi_tokens service --- src/becca/entities/betapi_token.ts | 10 +++++---- src/becca/entities/rows.ts | 4 ++-- src/etapi/auth.js | 2 +- src/etapi/etapi_utils.js | 2 +- src/routes/api/etapi_tokens.js | 2 +- src/routes/api/login.js | 2 +- src/routes/routes.js | 2 +- src/services/auth.js | 2 +- .../{etapi_tokens.js => etapi_tokens.ts} | 22 +++++++++---------- 9 files changed, 25 insertions(+), 23 deletions(-) rename src/services/{etapi_tokens.js => etapi_tokens.ts} (84%) diff --git a/src/becca/entities/betapi_token.ts b/src/becca/entities/betapi_token.ts index d128c1beb..a2219f6de 100644 --- a/src/becca/entities/betapi_token.ts +++ b/src/becca/entities/betapi_token.ts @@ -19,10 +19,10 @@ class BEtapiToken extends AbstractBeccaEntity { static get primaryKeyName() { return "etapiTokenId"; } static get hashedProperties() { return ["etapiTokenId", "name", "tokenHash", "utcDateCreated", "utcDateModified", "isDeleted"]; } - etapiTokenId!: string; + etapiTokenId?: string; name!: string; tokenHash!: string; - private _isDeleted!: boolean; + private _isDeleted?: boolean; constructor(row: EtapiTokenRow) { super(); @@ -36,7 +36,7 @@ class BEtapiToken extends AbstractBeccaEntity { } get isDeleted() { - return this._isDeleted; + return !!this._isDeleted; } updateFromRow(row: EtapiTokenRow) { @@ -74,7 +74,9 @@ class BEtapiToken extends AbstractBeccaEntity { super.beforeSaving(); - this.becca.etapiTokens[this.etapiTokenId] = this; + if (this.etapiTokenId) { + this.becca.etapiTokens[this.etapiTokenId] = this; + } } } diff --git a/src/becca/entities/rows.ts b/src/becca/entities/rows.ts index c372b30c3..3bd4cae67 100644 --- a/src/becca/entities/rows.ts +++ b/src/becca/entities/rows.ts @@ -46,12 +46,12 @@ export interface OptionRow { } export interface EtapiTokenRow { - etapiTokenId: string; + etapiTokenId?: string; name: string; tokenHash: string; utcDateCreated?: string; utcDateModified?: string; - isDeleted: boolean; + isDeleted?: boolean; } export interface BlobRow { diff --git a/src/etapi/auth.js b/src/etapi/auth.js index 835d016a1..7a3b258d8 100644 --- a/src/etapi/auth.js +++ b/src/etapi/auth.js @@ -1,7 +1,7 @@ const becca = require('../becca/becca'); const eu = require('./etapi_utils'); const passwordEncryptionService = require('../services/encryption/password_encryption'); -const etapiTokenService = require('../services/etapi_tokens.js'); +const etapiTokenService = require('../services/etapi_tokens'); function register(router, loginMiddleware) { eu.NOT_AUTHENTICATED_ROUTE(router, 'post', '/etapi/auth/login', loginMiddleware, (req, res, next) => { diff --git a/src/etapi/etapi_utils.js b/src/etapi/etapi_utils.js index 0ec013b20..b5928f4d7 100644 --- a/src/etapi/etapi_utils.js +++ b/src/etapi/etapi_utils.js @@ -2,7 +2,7 @@ const cls = require('../services/cls'); const sql = require('../services/sql'); const log = require('../services/log'); const becca = require('../becca/becca'); -const etapiTokenService = require('../services/etapi_tokens.js'); +const etapiTokenService = require('../services/etapi_tokens'); const config = require('../services/config'); const GENERIC_CODE = "GENERIC"; diff --git a/src/routes/api/etapi_tokens.js b/src/routes/api/etapi_tokens.js index 2c334643a..b0d29db3e 100644 --- a/src/routes/api/etapi_tokens.js +++ b/src/routes/api/etapi_tokens.js @@ -1,4 +1,4 @@ -const etapiTokenService = require('../../services/etapi_tokens.js'); +const etapiTokenService = require('../../services/etapi_tokens'); function getTokens() { const tokens = etapiTokenService.getTokens(); diff --git a/src/routes/api/login.js b/src/routes/api/login.js index d82462992..9cb0ec8bc 100644 --- a/src/routes/api/login.js +++ b/src/routes/api/login.js @@ -11,7 +11,7 @@ const eventService = require('../../services/events'); const sqlInit = require('../../services/sql_init'); const sql = require('../../services/sql'); const ws = require('../../services/ws'); -const etapiTokenService = require('../../services/etapi_tokens.js'); +const etapiTokenService = require('../../services/etapi_tokens'); function loginSync(req) { if (!sqlInit.schemaExists()) { diff --git a/src/routes/routes.js b/src/routes/routes.js index 02f69d5d9..a3ff51c8d 100644 --- a/src/routes/routes.js +++ b/src/routes/routes.js @@ -56,7 +56,7 @@ const keysRoute = require('./api/keys.js'); const backendLogRoute = require('./api/backend_log.js'); const statsRoute = require('./api/stats.js'); const fontsRoute = require('./api/fonts.js'); -const etapiTokensApiRoutes = require('./api/etapi_tokens.js'); +const etapiTokensApiRoutes = require('./api/etapi_tokens'); const relationMapApiRoute = require('./api/relation-map'); const otherRoute = require('./api/other.js'); const shareRoutes = require('../share/routes.js'); diff --git a/src/services/auth.js b/src/services/auth.js index bf8f770ac..aad4ab7d9 100644 --- a/src/services/auth.js +++ b/src/services/auth.js @@ -1,6 +1,6 @@ "use strict"; -const etapiTokenService = require('./etapi_tokens.js'); +const etapiTokenService = require('./etapi_tokens'); const log = require('./log'); const sqlInit = require('./sql_init'); const utils = require('./utils'); diff --git a/src/services/etapi_tokens.js b/src/services/etapi_tokens.ts similarity index 84% rename from src/services/etapi_tokens.js rename to src/services/etapi_tokens.ts index 1c4e0338e..a005b8901 100644 --- a/src/services/etapi_tokens.js +++ b/src/services/etapi_tokens.ts @@ -1,17 +1,17 @@ -const becca = require('../becca/becca'); -const utils = require('./utils'); -const BEtapiToken = require('../becca/entities/betapi_token'); -const crypto = require("crypto"); +import becca = require('../becca/becca'); +import utils = require('./utils'); +import BEtapiToken = require('../becca/entities/betapi_token'); +import crypto = require("crypto"); function getTokens() { return becca.getEtapiTokens(); } -function getTokenHash(token) { +function getTokenHash(token: crypto.BinaryLike) { return crypto.createHash('sha256').update(token).digest('base64'); } -function createToken(tokenName) { +function createToken(tokenName: string) { const token = utils.randomSecureToken(32); const tokenHash = getTokenHash(token); @@ -25,7 +25,7 @@ function createToken(tokenName) { }; } -function parseAuthToken(auth) { +function parseAuthToken(auth: string) { if (!auth) { return null; } @@ -64,7 +64,7 @@ function parseAuthToken(auth) { } } -function isValidAuthHeader(auth) { +function isValidAuthHeader(auth: string) { const parsed = parseAuthToken(auth); if (!parsed) { @@ -93,7 +93,7 @@ function isValidAuthHeader(auth) { } } -function renameToken(etapiTokenId, newName) { +function renameToken(etapiTokenId: string, newName: string) { const etapiToken = becca.getEtapiToken(etapiTokenId); if (!etapiToken) { @@ -104,7 +104,7 @@ function renameToken(etapiTokenId, newName) { etapiToken.save(); } -function deleteToken(etapiTokenId) { +function deleteToken(etapiTokenId: string) { const etapiToken = becca.getEtapiToken(etapiTokenId); if (!etapiToken) { @@ -114,7 +114,7 @@ function deleteToken(etapiTokenId) { etapiToken.markAsDeletedSimple(); } -module.exports = { +export = { getTokens, createToken, renameToken,