diff --git a/services/auth/token.service.ts b/services/auth/token.service.ts index a4907a7..7985a74 100644 --- a/services/auth/token.service.ts +++ b/services/auth/token.service.ts @@ -9,6 +9,7 @@ import { EmailVerificationToken } from './auth.types'; import type { CouchDBDocument } from '../../types'; import { getDatabaseConfig } from '../../config/unified.config'; import { logger } from '../logging'; +import { encodeBase64 } from '../../utils/base64'; export interface PasswordResetToken { userId: string; @@ -42,14 +43,8 @@ function fromISO(date: string | Date): Date { return date instanceof Date ? date : new Date(date); } -function base64Auth(user: string, pass: string): string { - // btoa may not exist in some environments (e.g., Node). Fallback to Buffer. - if (typeof btoa !== 'undefined') { - return btoa(`${user}:${pass}`); - } - - return Buffer.from(`${user}:${pass}`).toString('base64'); -} +const base64Auth = (user: string, pass: string): string => + encodeBase64(`${user}:${pass}`); export class TokenService { private couchBaseUrl: string | null = null; diff --git a/services/database/ProductionDatabaseStrategy.ts b/services/database/ProductionDatabaseStrategy.ts index 7947025..6c6a2b7 100644 --- a/services/database/ProductionDatabaseStrategy.ts +++ b/services/database/ProductionDatabaseStrategy.ts @@ -12,6 +12,7 @@ import { AccountStatus } from '../auth/auth.constants'; import { DatabaseStrategy, DatabaseError } from './types'; import { getDatabaseConfig } from '../../config/unified.config'; import { logger } from '../logging'; +import { encodeBase64 } from '../../utils/base64'; export class ProductionDatabaseStrategy implements DatabaseStrategy { private baseUrl: string; @@ -22,7 +23,7 @@ export class ProductionDatabaseStrategy implements DatabaseStrategy { const dbConfig = getDatabaseConfig(); this.baseUrl = dbConfig.url; - this.auth = btoa(`${dbConfig.username}:${dbConfig.password}`); + this.auth = encodeBase64(`${dbConfig.username}:${dbConfig.password}`); logger.db.query('Initializing production database strategy', { url: dbConfig.url, diff --git a/services/mailgun.service.ts b/services/mailgun.service.ts index 35ba392..03427b2 100644 --- a/services/mailgun.service.ts +++ b/services/mailgun.service.ts @@ -7,6 +7,7 @@ import { getMailgunConfig, type MailgunConfig } from './mailgun.config'; import { getAppConfig } from '../config/unified.config'; import { logger } from './logging'; import { normalizeError } from '../utils/error'; +import { encodeBase64 } from '../utils/base64'; interface EmailTemplate { subject: string; @@ -146,7 +147,7 @@ export class MailgunService { { method: 'POST', headers: { - Authorization: `Basic ${btoa(`api:${this.config.apiKey}`)}`, + Authorization: `Basic ${encodeBase64(`api:${this.config.apiKey}`)}`, }, body: formData, } diff --git a/utils/base64.ts b/utils/base64.ts new file mode 100644 index 0000000..48787bc --- /dev/null +++ b/utils/base64.ts @@ -0,0 +1,7 @@ +export const encodeBase64 = (value: string): string => { + if (typeof btoa !== 'undefined') { + return btoa(value); + } + + return Buffer.from(value, 'utf-8').toString('base64'); +};