From 4a81106cf50388a48bdc6d4f52ca6217d1bdd7c2 Mon Sep 17 00:00:00 2001 From: naskya Date: Thu, 9 May 2024 21:49:56 +0900 Subject: [PATCH] chore (backend): remove generate-native-user-token --- packages/backend-rs/index.d.ts | 4 +++- packages/backend-rs/index.js | 5 +++-- packages/backend-rs/src/util/random.rs | 22 +++++++++++-------- .../api/common/generate-native-user-token.ts | 3 --- .../backend/src/server/api/common/signup.ts | 3 +-- .../src/server/api/endpoints/app/create.ts | 4 ++-- .../src/server/api/endpoints/auth/accept.ts | 6 ++--- .../api/endpoints/i/regenerate-token.ts | 3 +-- .../server/api/endpoints/miauth/gen-token.ts | 4 ++-- .../src/services/create-system-user.ts | 5 ++--- 10 files changed, 30 insertions(+), 29 deletions(-) delete mode 100644 packages/backend/src/server/api/common/generate-native-user-token.ts diff --git a/packages/backend-rs/index.d.ts b/packages/backend-rs/index.d.ts index b161473d9a..1133fad209 100644 --- a/packages/backend-rs/index.d.ts +++ b/packages/backend-rs/index.d.ts @@ -1304,4 +1304,6 @@ export function getTimestamp(id: string): number export function genId(): string /** Generate an ID using a specific datetime */ export function genIdAt(date: Date): string -export function secureRndstr(length?: number | undefined | null): string +/** Generate random string based on [thread_rng] and [Alphanumeric]. */ +export function generateSecureRandomString(length: number): string +export function generateUserToken(): string diff --git a/packages/backend-rs/index.js b/packages/backend-rs/index.js index 0d9938f9ed..287d4296fc 100644 --- a/packages/backend-rs/index.js +++ b/packages/backend-rs/index.js @@ -310,7 +310,7 @@ if (!nativeBinding) { throw new Error(`Failed to load native binding`) } -const { SECOND, MINUTE, HOUR, DAY, USER_ONLINE_THRESHOLD, USER_ACTIVE_THRESHOLD, FILE_TYPE_BROWSERSAFE, loadEnv, loadConfig, stringToAcct, acctToString, addNoteToAntenna, isBlockedServer, isSilencedServer, isAllowedServer, checkWordMute, getFullApAccount, isSelfHost, isSameOrigin, extractHost, toPuny, isUnicodeEmoji, sqlLikeEscape, safeForSql, formatMilliseconds, getImageSizeFromUrl, getNoteSummary, isSafeUrl, latestVersion, toMastodonId, fromMastodonId, fetchMeta, metaToPugArgs, nyaify, hashPassword, verifyPassword, isOldPasswordAlgorithm, decodeReaction, countReactions, toDbReaction, removeOldAttestationChallenges, AntennaSrcEnum, DriveFileUsageHintEnum, MutedNoteReasonEnum, NoteVisibilityEnum, NotificationTypeEnum, PageVisibilityEnum, PollNotevisibilityEnum, RelayStatusEnum, UserEmojimodpermEnum, UserProfileFfvisibilityEnum, UserProfileMutingnotificationtypesEnum, initializeRustLogger, fetchNodeinfo, nodeinfo_2_1, nodeinfo_2_0, Protocol, Inbound, Outbound, watchNote, unwatchNote, publishToChannelStream, ChatEvent, publishToChatStream, ChatIndexEvent, publishToChatIndexStream, publishToBroadcastStream, publishToGroupChatStream, publishToModerationStream, getTimestamp, genId, genIdAt, secureRndstr } = nativeBinding +const { SECOND, MINUTE, HOUR, DAY, USER_ONLINE_THRESHOLD, USER_ACTIVE_THRESHOLD, FILE_TYPE_BROWSERSAFE, loadEnv, loadConfig, stringToAcct, acctToString, addNoteToAntenna, isBlockedServer, isSilencedServer, isAllowedServer, checkWordMute, getFullApAccount, isSelfHost, isSameOrigin, extractHost, toPuny, isUnicodeEmoji, sqlLikeEscape, safeForSql, formatMilliseconds, getImageSizeFromUrl, getNoteSummary, isSafeUrl, latestVersion, toMastodonId, fromMastodonId, fetchMeta, metaToPugArgs, nyaify, hashPassword, verifyPassword, isOldPasswordAlgorithm, decodeReaction, countReactions, toDbReaction, removeOldAttestationChallenges, AntennaSrcEnum, DriveFileUsageHintEnum, MutedNoteReasonEnum, NoteVisibilityEnum, NotificationTypeEnum, PageVisibilityEnum, PollNotevisibilityEnum, RelayStatusEnum, UserEmojimodpermEnum, UserProfileFfvisibilityEnum, UserProfileMutingnotificationtypesEnum, initializeRustLogger, fetchNodeinfo, nodeinfo_2_1, nodeinfo_2_0, Protocol, Inbound, Outbound, watchNote, unwatchNote, publishToChannelStream, ChatEvent, publishToChatStream, ChatIndexEvent, publishToChatIndexStream, publishToBroadcastStream, publishToGroupChatStream, publishToModerationStream, getTimestamp, genId, genIdAt, generateSecureRandomString, generateUserToken } = nativeBinding module.exports.SECOND = SECOND module.exports.MINUTE = MINUTE @@ -384,4 +384,5 @@ module.exports.publishToModerationStream = publishToModerationStream module.exports.getTimestamp = getTimestamp module.exports.genId = genId module.exports.genIdAt = genIdAt -module.exports.secureRndstr = secureRndstr +module.exports.generateSecureRandomString = generateSecureRandomString +module.exports.generateUserToken = generateUserToken diff --git a/packages/backend-rs/src/util/random.rs b/packages/backend-rs/src/util/random.rs index 61edbf11cf..4251a7c232 100644 --- a/packages/backend-rs/src/util/random.rs +++ b/packages/backend-rs/src/util/random.rs @@ -1,7 +1,8 @@ use rand::{distributions::Alphanumeric, thread_rng, Rng}; /// Generate random string based on [thread_rng] and [Alphanumeric]. -pub fn gen_string(length: u16) -> String { +#[crate::export] +pub fn generate_secure_random_string(length: u16) -> String { thread_rng() .sample_iter(Alphanumeric) .take(length.into()) @@ -9,9 +10,9 @@ pub fn gen_string(length: u16) -> String { .collect() } -#[crate::export(js_name = "secureRndstr")] -pub fn native_random_str(length: Option) -> String { - gen_string(length.unwrap_or(32)) +#[crate::export] +pub fn generate_user_token() -> String { + generate_secure_random_string(16) } #[cfg(test)] @@ -19,14 +20,17 @@ mod unit_test { use pretty_assertions::{assert_eq, assert_ne}; use std::thread; - use super::gen_string; + use super::generate_secure_random_string; #[test] fn can_generate_unique_strings() { - assert_eq!(gen_string(16).len(), 16); - assert_ne!(gen_string(16), gen_string(16)); - let s1 = thread::spawn(|| gen_string(16)); - let s2 = thread::spawn(|| gen_string(16)); + assert_eq!(generate_secure_random_string(16).len(), 16); + assert_ne!( + generate_secure_random_string(16), + generate_secure_random_string(16) + ); + let s1 = thread::spawn(|| generate_secure_random_string(16)); + let s2 = thread::spawn(|| generate_secure_random_string(16)); assert_ne!(s1.join().unwrap(), s2.join().unwrap()); } } diff --git a/packages/backend/src/server/api/common/generate-native-user-token.ts b/packages/backend/src/server/api/common/generate-native-user-token.ts deleted file mode 100644 index 495a1150d2..0000000000 --- a/packages/backend/src/server/api/common/generate-native-user-token.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { secureRndstr } from "backend-rs"; - -export default () => secureRndstr(16); diff --git a/packages/backend/src/server/api/common/signup.ts b/packages/backend/src/server/api/common/signup.ts index 40b59c8ed5..67f06ac4e1 100644 --- a/packages/backend/src/server/api/common/signup.ts +++ b/packages/backend/src/server/api/common/signup.ts @@ -1,10 +1,9 @@ import { generateKeyPair } from "node:crypto"; -import generateUserToken from "./generate-native-user-token.js"; import { User } from "@/models/entities/user.js"; import { Users, UsedUsernames } from "@/models/index.js"; import { UserProfile } from "@/models/entities/user-profile.js"; import { IsNull } from "typeorm"; -import { genId, hashPassword, toPuny } from "backend-rs"; +import { genId, generateUserToken, hashPassword, toPuny } from "backend-rs"; import { UserKeypair } from "@/models/entities/user-keypair.js"; import { UsedUsername } from "@/models/entities/used-username.js"; import { db } from "@/db/postgre.js"; diff --git a/packages/backend/src/server/api/endpoints/app/create.ts b/packages/backend/src/server/api/endpoints/app/create.ts index 0d52d5fbcf..0d580d1535 100644 --- a/packages/backend/src/server/api/endpoints/app/create.ts +++ b/packages/backend/src/server/api/endpoints/app/create.ts @@ -1,6 +1,6 @@ import define from "@/server/api/define.js"; import { Apps } from "@/models/index.js"; -import { genId, secureRndstr } from "backend-rs"; +import { genId, generateSecureRandomString } from "backend-rs"; import { unique } from "@/prelude/array.js"; export const meta = { @@ -40,7 +40,7 @@ export default define(meta, paramDef, async (ps, user) => { includeSecret: true, }); // Generate secret - const secret = secureRndstr(32); + const secret = generateSecureRandomString(32); // for backward compatibility const permission = unique( diff --git a/packages/backend/src/server/api/endpoints/auth/accept.ts b/packages/backend/src/server/api/endpoints/auth/accept.ts index f14fa5529e..3bdc9e18b5 100644 --- a/packages/backend/src/server/api/endpoints/auth/accept.ts +++ b/packages/backend/src/server/api/endpoints/auth/accept.ts @@ -2,7 +2,7 @@ import * as crypto from "node:crypto"; import define from "@/server/api/define.js"; import { ApiError } from "@/server/api/error.js"; import { AuthSessions, AccessTokens, Apps } from "@/models/index.js"; -import { genId, secureRndstr } from "backend-rs"; +import { genId, generateSecureRandomString } from "backend-rs"; export const meta = { tags: ["auth"], @@ -37,10 +37,10 @@ export default define(meta, paramDef, async (ps, user) => { } // Generate access token - const accessToken = secureRndstr(32); + const accessToken = generateSecureRandomString(32); // Fetch exist access token - const exist = await AccessTokens.exist({ + const exist = await AccessTokens.exists({ where: { appId: session.appId, userId: user.id, diff --git a/packages/backend/src/server/api/endpoints/i/regenerate-token.ts b/packages/backend/src/server/api/endpoints/i/regenerate-token.ts index fd3023ab7a..4b1b3450af 100644 --- a/packages/backend/src/server/api/endpoints/i/regenerate-token.ts +++ b/packages/backend/src/server/api/endpoints/i/regenerate-token.ts @@ -3,10 +3,9 @@ import { publishMainStream, publishUserEvent, } from "@/services/stream.js"; -import generateUserToken from "@/server/api/common/generate-native-user-token.js"; import define from "@/server/api/define.js"; import { Users, UserProfiles } from "@/models/index.js"; -import { verifyPassword } from "backend-rs"; +import { generateUserToken, verifyPassword } from "backend-rs"; export const meta = { requireCredential: true, diff --git a/packages/backend/src/server/api/endpoints/miauth/gen-token.ts b/packages/backend/src/server/api/endpoints/miauth/gen-token.ts index d1527c51cf..ba46ca6088 100644 --- a/packages/backend/src/server/api/endpoints/miauth/gen-token.ts +++ b/packages/backend/src/server/api/endpoints/miauth/gen-token.ts @@ -1,6 +1,6 @@ import define from "@/server/api/define.js"; import { AccessTokens } from "@/models/index.js"; -import { genId, secureRndstr } from "backend-rs"; +import { genId, generateSecureRandomString } from "backend-rs"; export const meta = { tags: ["auth"], @@ -43,7 +43,7 @@ export const paramDef = { export default define(meta, paramDef, async (ps, user) => { // Generate access token - const accessToken = secureRndstr(32); + const accessToken = generateSecureRandomString(32); const now = new Date(); diff --git a/packages/backend/src/services/create-system-user.ts b/packages/backend/src/services/create-system-user.ts index 802c59b288..d13d5a7bda 100644 --- a/packages/backend/src/services/create-system-user.ts +++ b/packages/backend/src/services/create-system-user.ts @@ -1,10 +1,9 @@ import { v4 as uuid } from "uuid"; -import generateNativeUserToken from "@/server/api/common/generate-native-user-token.js"; import { genRsaKeyPair } from "@/misc/gen-key-pair.js"; import { User } from "@/models/entities/user.js"; import { UserProfile } from "@/models/entities/user-profile.js"; import { IsNull } from "typeorm"; -import { genId, hashPassword } from "backend-rs"; +import { generateUserToken, genId, hashPassword } from "backend-rs"; import { UserKeypair } from "@/models/entities/user-keypair.js"; import { UsedUsername } from "@/models/entities/used-username.js"; import { db } from "@/db/postgre.js"; @@ -16,7 +15,7 @@ export async function createSystemUser(username: string) { const hash = hashPassword(password); // Generate secret - const secret = generateNativeUserToken(); + const secret = generateUserToken(); const keyPair = await genRsaKeyPair(4096);