@kyro-cms/core 0.4.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api-handler.cjs +5 -5
- package/dist/api-handler.js +4 -4
- package/dist/bootstrap-GPXZWJXU.cjs +31 -0
- package/dist/{bootstrap-O5UGUTYU.cjs.map → bootstrap-GPXZWJXU.cjs.map} +1 -1
- package/dist/bootstrap-LI3Q7ROO.js +6 -0
- package/dist/{bootstrap-DGJ3N7SO.js.map → bootstrap-LI3Q7ROO.js.map} +1 -1
- package/dist/{chunk-BQ2T4WRS.js → chunk-6R37DO2Z.js} +3 -3
- package/dist/{chunk-BQ2T4WRS.js.map → chunk-6R37DO2Z.js.map} +1 -1
- package/dist/{chunk-YMG55RSX.js → chunk-7DSDEVBA.js} +5 -5
- package/dist/chunk-7DSDEVBA.js.map +1 -0
- package/dist/{chunk-JYGIFBBS.cjs → chunk-ALAAPA3U.cjs} +6 -6
- package/dist/{chunk-JYGIFBBS.cjs.map → chunk-ALAAPA3U.cjs.map} +1 -1
- package/dist/{chunk-FWGHXRRI.cjs → chunk-FG4PAYML.cjs} +4 -4
- package/dist/{chunk-FWGHXRRI.cjs.map → chunk-FG4PAYML.cjs.map} +1 -1
- package/dist/{chunk-3FW6WVVP.cjs → chunk-JINGZG7I.cjs} +6 -5
- package/dist/chunk-JINGZG7I.cjs.map +1 -0
- package/dist/{chunk-SAMZQVC2.js → chunk-QSVSNOKK.js} +3 -3
- package/dist/{chunk-SAMZQVC2.js.map → chunk-QSVSNOKK.js.map} +1 -1
- package/dist/{chunk-OJBK3JYF.js → chunk-RCRCW2TQ.js} +4 -4
- package/dist/{chunk-OJBK3JYF.js.map → chunk-RCRCW2TQ.js.map} +1 -1
- package/dist/{chunk-RYDGMBIG.js → chunk-SCRAGYNM.js} +4 -4
- package/dist/chunk-SCRAGYNM.js.map +1 -0
- package/dist/{chunk-M4GFA2UQ.cjs → chunk-V3423DUL.cjs} +9 -9
- package/dist/{chunk-M4GFA2UQ.cjs.map → chunk-V3423DUL.cjs.map} +1 -1
- package/dist/{chunk-DLHUQO25.cjs → chunk-XKVPPGLX.cjs} +5 -4
- package/dist/chunk-XKVPPGLX.cjs.map +1 -0
- package/dist/cli/index.cjs +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/drizzle/index.cjs +5 -5
- package/dist/drizzle/index.js +1 -1
- package/dist/index.cjs +59 -58
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +9 -9
- package/dist/index.js.map +1 -1
- package/dist/rest/index.cjs +5 -5
- package/dist/rest/index.js +3 -3
- package/package.json +3 -1
- package/dist/bootstrap-DGJ3N7SO.js +0 -6
- package/dist/bootstrap-O5UGUTYU.cjs +0 -31
- package/dist/chunk-3FW6WVVP.cjs.map +0 -1
- package/dist/chunk-DLHUQO25.cjs.map +0 -1
- package/dist/chunk-RYDGMBIG.js.map +0 -1
- package/dist/chunk-YMG55RSX.js.map +0 -1
|
@@ -5,10 +5,12 @@ var bcrypt = require('bcryptjs');
|
|
|
5
5
|
var crypto = require('crypto');
|
|
6
6
|
var fs = require('fs');
|
|
7
7
|
var path = require('path');
|
|
8
|
+
var Database = require('better-sqlite3');
|
|
8
9
|
|
|
9
10
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
11
|
|
|
11
12
|
var bcrypt__default = /*#__PURE__*/_interopDefault(bcrypt);
|
|
13
|
+
var Database__default = /*#__PURE__*/_interopDefault(Database);
|
|
12
14
|
|
|
13
15
|
// src/config/ConfigService.ts
|
|
14
16
|
var ConfigService = class _ConfigService {
|
|
@@ -1064,8 +1066,7 @@ var SQLiteAuthAdapter = class {
|
|
|
1064
1066
|
if (dir && dir !== ".") {
|
|
1065
1067
|
fs.mkdirSync(dir, { recursive: true });
|
|
1066
1068
|
}
|
|
1067
|
-
|
|
1068
|
-
this.db = new DatabaseSync(this.path);
|
|
1069
|
+
this.db = new Database__default.default(this.path);
|
|
1069
1070
|
this.db.exec(`PRAGMA busy_timeout = ${this.busyTimeout}`);
|
|
1070
1071
|
this.db.exec("PRAGMA journal_mode = WAL");
|
|
1071
1072
|
this.db.exec("PRAGMA synchronous = NORMAL");
|
|
@@ -1742,5 +1743,5 @@ exports.ConfigService = ConfigService;
|
|
|
1742
1743
|
exports.EmailTransport = EmailTransport;
|
|
1743
1744
|
exports.PasswordPolicy = PasswordPolicy;
|
|
1744
1745
|
exports.SQLiteAuthAdapter = SQLiteAuthAdapter;
|
|
1745
|
-
//# sourceMappingURL=chunk-
|
|
1746
|
-
//# sourceMappingURL=chunk-
|
|
1746
|
+
//# sourceMappingURL=chunk-XKVPPGLX.cjs.map
|
|
1747
|
+
//# sourceMappingURL=chunk-XKVPPGLX.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config/ConfigService.ts","../src/auth/nodemailer-transport.ts","../src/auth/security/password-policy.ts","../src/auth/sqlite-adapter.ts"],"names":["settings","dirname","mkdirSync","Database","randomBytes","bcrypt"],"mappings":"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","file":"chunk-XKVPPGLX.cjs","sourcesContent":["import { eq } from \"drizzle-orm\";\nimport { settings as settingsSchema } from \"../database/drizzle/schema/settings.js\";\n\nexport interface S3CompatibleConfig {\n bucket?: string;\n region?: string;\n accessKeyId?: string;\n secretAccessKey?: string;\n endpoint?: string;\n cdnUrl?: string;\n prefix?: string;\n}\n\nexport interface R2Config {\n accountId?: string;\n accessKeyId?: string;\n secretAccessKey?: string;\n bucket?: string;\n cdnUrl?: string;\n prefix?: string;\n publicDevUrl?: string;\n}\n\nexport interface GCSConfig {\n bucket?: string;\n projectId?: string;\n clientEmail?: string;\n privateKey?: string;\n cdnUrl?: string;\n prefix?: string;\n}\n\nexport interface BackblazeConfig {\n bucket?: string;\n accountId?: string;\n applicationKeyId?: string;\n applicationKey?: string;\n cdnUrl?: string;\n prefix?: string;\n}\n\nexport interface BunnyConfig {\n storageZone?: string;\n apiKey?: string;\n cdnUrl?: string;\n prefix?: string;\n}\n\nexport interface FTPConfig {\n host?: string;\n port?: number;\n user?: string;\n password?: string;\n secure?: boolean;\n baseUrl?: string;\n prefix?: string;\n}\n\nexport interface StorageConfig {\n type: string;\n s3: S3CompatibleConfig;\n r2: R2Config;\n gcs: GCSConfig;\n digitalocean: S3CompatibleConfig;\n backblaze: BackblazeConfig;\n wasabi: S3CompatibleConfig;\n bunny: BunnyConfig;\n ftp: FTPConfig;\n cloudinary: {\n cloudName?: string;\n apiKey?: string;\n apiSecret?: string;\n folder?: string;\n };\n imgix: {\n domain?: string;\n signKey?: string;\n };\n local: {\n uploadDir?: string;\n baseUrl?: string;\n };\n}\n\nexport interface EmailConfig {\n provider?: string;\n host?: string;\n port?: number;\n secure?: boolean;\n user?: string;\n pass?: string;\n from?: string;\n fromName?: string;\n replyTo?: string;\n}\n\nexport class ConfigService {\n private db: any;\n private cache: Record<string, string> = {};\n private static readonly SENSITIVE_KEYS = [\n \"storage.s3.secret_access_key\",\n \"storage.r2.secret_access_key\",\n \"storage.gcs.private_key\",\n \"storage.backblaze.application_key\",\n \"storage.wasabi.secret_access_key\",\n \"storage.ftp.password\",\n \"storage.bunny.api_key\",\n \"storage.cloudinary.api_secret\",\n \"storage.imgix.sign_key\",\n \"email.smtp.pass\",\n \"auth.jwt_secret\",\n \"auth.github_secret\",\n \"auth.google_secret\",\n \"auth.app_secret\",\n \"database.url\",\n \"redis.url\",\n \"auth.admin_password\",\n ];\n\n constructor(db: any) {\n this.db = db;\n }\n\n /**\n * Initialize the service by loading all settings from the database\n */\n async load(): Promise<void> {\n try {\n if (typeof this.db?.select === \"function\") {\n const allSettings = await this.db.select().from(settingsSchema);\n this.cache = allSettings.reduce((acc: any, row: any) => {\n acc[row.key] = row.value;\n return acc;\n }, {});\n } else {\n await this.loadFromGlobals();\n }\n } catch (error) {\n console.warn(\n \"ConfigService: Could not load settings from database, using environment fallbacks.\",\n error,\n );\n }\n }\n\n /**\n * Load settings from the _globals_storage-settings table (SQLite fallback)\n * Maps nested global structure to flat key-value cache\n */\n private async loadFromGlobals(): Promise<void> {\n try {\n const row = this.db\n .prepare(`SELECT * FROM \"_globals_storage-settings\" LIMIT 1`)\n .get() as any;\n\n if (!row) return;\n\n const parseJSON = (val: any) => {\n if (!val) return null;\n if (typeof val === \"string\") {\n try {\n return JSON.parse(val);\n } catch {\n return null;\n }\n }\n return val;\n };\n\n const provider = row.provider || \"local\";\n this.cache[\"storage.type\"] = provider === \"aws\" ? \"s3\" : provider;\n\n if (provider === \"local\") {\n const local = parseJSON(row.local);\n this.cache[\"storage.local.dir\"] =\n local?.uploadDir || \"./public/uploads\";\n this.cache[\"storage.local.url\"] = local?.baseUrl || \"/uploads\";\n }\n\n if (provider === \"aws\") {\n const aws = parseJSON(row.aws);\n this.cache[\"storage.s3.bucket\"] = aws?.bucket || \"\";\n this.cache[\"storage.s3.region\"] = aws?.region || \"us-east-1\";\n this.cache[\"storage.s3.access_key_id\"] = aws?.accessKeyId || \"\";\n this.cache[\"storage.s3.secret_access_key\"] = aws?.secretAccessKey || \"\";\n this.cache[\"storage.s3.endpoint\"] = aws?.endpoint || \"\";\n this.cache[\"storage.s3.cdn_url\"] = aws?.cdnUrl || \"\";\n this.cache[\"storage.s3.prefix\"] = aws?.prefix || \"\";\n }\n\n if (provider === \"r2\") {\n const r2 = parseJSON(row.r2);\n this.cache[\"storage.r2.account_id\"] = r2?.accountId || \"\";\n this.cache[\"storage.r2.access_key_id\"] = r2?.accessKeyId || \"\";\n this.cache[\"storage.r2.secret_access_key\"] = r2?.secretAccessKey || \"\";\n this.cache[\"storage.r2.bucket\"] = r2?.bucket || \"\";\n this.cache[\"storage.r2.cdn_url\"] = r2?.cdnUrl || \"\";\n this.cache[\"storage.r2.prefix\"] = r2?.prefix || \"\";\n }\n\n if (provider === \"cloudinary\") {\n const cloudinary = parseJSON(row.cloudinary);\n this.cache[\"storage.cloudinary.cloud_name\"] =\n cloudinary?.cloudName || \"\";\n this.cache[\"storage.cloudinary.api_key\"] = cloudinary?.apiKey || \"\";\n this.cache[\"storage.cloudinary.api_secret\"] =\n cloudinary?.apiSecret || \"\";\n this.cache[\"storage.cloudinary.folder\"] = cloudinary?.folder || \"\";\n }\n\n if (provider === \"ftp\") {\n const ftp = parseJSON(row.ftp);\n this.cache[\"storage.ftp.host\"] = ftp?.host || \"\";\n this.cache[\"storage.ftp.port\"] = String(ftp?.port || \"21\");\n this.cache[\"storage.ftp.user\"] = ftp?.user || \"\";\n this.cache[\"storage.ftp.password\"] = ftp?.password || \"\";\n this.cache[\"storage.ftp.secure\"] = ftp?.secure ? \"true\" : \"false\";\n this.cache[\"storage.ftp.base_url\"] = ftp?.baseUrl || \"\";\n this.cache[\"storage.ftp.prefix\"] = ftp?.prefix || \"\";\n }\n } catch (error) {\n console.warn(\"ConfigService: Could not load from globals table:\", error);\n }\n }\n\n /**\n * Get a settings value with environment fallback\n */\n get(key: string, envKey?: string, defaultValue?: string): string | undefined {\n // 1. Check database cache\n if (this.cache[key]) return this.cache[key];\n\n // 2. Check environment variable\n if (envKey && process.env[envKey]) return process.env[envKey];\n\n // 3. Return default\n return defaultValue;\n }\n\n /**\n * Get storage configuration\n */\n getStorageConfig(): StorageConfig {\n return {\n type: this.get(\"storage.type\", \"STORAGE_TYPE\", \"local\")!,\n s3: {\n bucket: this.get(\"storage.s3.bucket\", \"STORAGE_BUCKET\"),\n region: this.get(\"storage.s3.region\", \"STORAGE_REGION\", \"us-east-1\"),\n accessKeyId: this.get(\n \"storage.s3.access_key_id\",\n \"STORAGE_ACCESS_KEY_ID\",\n ),\n secretAccessKey: this.get(\n \"storage.s3.secret_access_key\",\n \"STORAGE_SECRET_ACCESS_KEY\",\n ),\n endpoint: this.get(\"storage.s3.endpoint\", \"STORAGE_ENDPOINT\"),\n cdnUrl: this.get(\"storage.s3.cdn_url\", \"STORAGE_CDN_URL\"),\n prefix: this.get(\"storage.s3.prefix\", \"STORAGE_PREFIX\"),\n },\n r2: {\n accountId: this.get(\"storage.r2.account_id\", \"R2_ACCOUNT_ID\"),\n accessKeyId: this.get(\"storage.r2.access_key_id\", \"R2_ACCESS_KEY_ID\"),\n secretAccessKey: this.get(\n \"storage.r2.secret_access_key\",\n \"R2_SECRET_ACCESS_KEY\",\n ),\n bucket: this.get(\"storage.r2.bucket\", \"R2_BUCKET\"),\n cdnUrl: this.get(\"storage.r2.cdn_url\", \"R2_CDN_URL\"),\n prefix: this.get(\"storage.r2.prefix\", \"R2_PREFIX\"),\n },\n gcs: {\n bucket: this.get(\"storage.gcs.bucket\", \"GCS_BUCKET\"),\n projectId: this.get(\"storage.gcs.project_id\", \"GCS_PROJECT_ID\"),\n clientEmail: this.get(\"storage.gcs.client_email\", \"GCS_CLIENT_EMAIL\"),\n privateKey: this.get(\"storage.gcs.private_key\", \"GCS_PRIVATE_KEY\"),\n cdnUrl: this.get(\"storage.gcs.cdn_url\", \"GCS_CDN_URL\"),\n prefix: this.get(\"storage.gcs.prefix\", \"GCS_PREFIX\"),\n },\n digitalocean: {\n bucket: this.get(\"storage.digitalocean.bucket\", \"DO_BUCKET\"),\n region: this.get(\"storage.digitalocean.region\", \"DO_REGION\", \"nyc3\"),\n accessKeyId: this.get(\n \"storage.digitalocean.access_key_id\",\n \"DO_ACCESS_KEY_ID\",\n ),\n secretAccessKey: this.get(\n \"storage.digitalocean.secret_access_key\",\n \"DO_SECRET_ACCESS_KEY\",\n ),\n cdnUrl: this.get(\"storage.digitalocean.cdn_url\", \"DO_CDN_URL\"),\n prefix: this.get(\"storage.digitalocean.prefix\", \"DO_PREFIX\"),\n },\n backblaze: {\n bucket: this.get(\"storage.backblaze.bucket\", \"BB_BUCKET\"),\n accountId: this.get(\"storage.backblaze.account_id\", \"BB_ACCOUNT_ID\"),\n applicationKeyId: this.get(\n \"storage.backblaze.application_key_id\",\n \"BB_APPLICATION_KEY_ID\",\n ),\n applicationKey: this.get(\n \"storage.backblaze.application_key\",\n \"BB_APPLICATION_KEY\",\n ),\n cdnUrl: this.get(\"storage.backblaze.cdn_url\", \"BB_CDN_URL\"),\n prefix: this.get(\"storage.backblaze.prefix\", \"BB_PREFIX\"),\n },\n wasabi: {\n bucket: this.get(\"storage.wasabi.bucket\", \"WASABI_BUCKET\"),\n region: this.get(\"storage.wasabi.region\", \"WASABI_REGION\", \"us-east-1\"),\n accessKeyId: this.get(\n \"storage.wasabi.access_key_id\",\n \"WASABI_ACCESS_KEY_ID\",\n ),\n secretAccessKey: this.get(\n \"storage.wasabi.secret_access_key\",\n \"WASABI_SECRET_ACCESS_KEY\",\n ),\n cdnUrl: this.get(\"storage.wasabi.cdn_url\", \"WASABI_CDN_URL\"),\n prefix: this.get(\"storage.wasabi.prefix\", \"WASABI_PREFIX\"),\n },\n bunny: {\n storageZone: this.get(\n \"storage.bunny.storage_zone\",\n \"BUNNY_STORAGE_ZONE\",\n ),\n apiKey: this.get(\"storage.bunny.api_key\", \"BUNNY_API_KEY\"),\n cdnUrl: this.get(\"storage.bunny.cdn_url\", \"BUNNY_CDN_URL\"),\n prefix: this.get(\"storage.bunny.prefix\", \"BUNNY_PREFIX\"),\n },\n ftp: {\n host: this.get(\"storage.ftp.host\", \"FTP_HOST\"),\n port: parseInt(this.get(\"storage.ftp.port\", \"FTP_PORT\", \"21\")!, 10),\n user: this.get(\"storage.ftp.user\", \"FTP_USER\"),\n password: this.get(\"storage.ftp.password\", \"FTP_PASSWORD\"),\n secure: this.get(\"storage.ftp.secure\", \"FTP_SECURE\") === \"true\",\n baseUrl: this.get(\"storage.ftp.base_url\", \"FTP_BASE_URL\"),\n prefix: this.get(\"storage.ftp.prefix\", \"FTP_PREFIX\"),\n },\n cloudinary: {\n cloudName: this.get(\n \"storage.cloudinary.cloud_name\",\n \"CLOUDINARY_CLOUD_NAME\",\n ),\n apiKey: this.get(\"storage.cloudinary.api_key\", \"CLOUDINARY_API_KEY\"),\n apiSecret: this.get(\n \"storage.cloudinary.api_secret\",\n \"CLOUDINARY_API_SECRET\",\n ),\n folder: this.get(\"storage.cloudinary.folder\", \"CLOUDINARY_FOLDER\"),\n },\n imgix: {\n domain: this.get(\"storage.imgix.domain\", \"IMGIX_DOMAIN\"),\n signKey: this.get(\"storage.imgix.sign_key\", \"IMGIX_SIGN_KEY\"),\n },\n local: {\n uploadDir: this.get(\"storage.local.dir\", \"STORAGE_LOCAL_DIR\"),\n baseUrl: this.get(\"storage.local.url\", \"STORAGE_LOCAL_URL\", \"/uploads\"),\n },\n };\n }\n\n /**\n * Get email configuration\n */\n getEmailConfig(): EmailConfig {\n return {\n provider: this.get(\"email.provider\", \"EMAIL_PROVIDER\", \"smtp\"),\n host: this.get(\"email.smtp.host\", \"SMTP_HOST\"),\n port: parseInt(this.get(\"email.smtp.port\", \"SMTP_PORT\", \"587\")!, 10),\n secure: this.get(\"email.smtp.secure\", \"SMTP_SECURE\") === \"true\",\n user: this.get(\"email.smtp.user\", \"SMTP_USER\"),\n pass: this.get(\"email.smtp.pass\", \"SMTP_PASS\"),\n from: this.get(\"email.smtp.from\", \"SMTP_FROM\", \"noreply@example.com\"),\n fromName: this.get(\"email.smtp.from_name\", \"SMTP_FROM_NAME\", \"Kyro CMS\"),\n replyTo: this.get(\"email.smtp.reply_to\", \"SMTP_REPLY_TO\"),\n };\n }\n\n /**\n * Mask sensitive values for display\n */\n maskSensitive(key: string, value: string | undefined): string | undefined {\n if (!value) return value;\n if (ConfigService.SENSITIVE_KEYS.includes(key)) {\n return \"********\";\n }\n return value;\n }\n\n /**\n * Update a setting in the database\n */\n async set(key: string, value: string, description?: string): Promise<void> {\n await this.db\n .insert(settingsSchema)\n .values({\n key,\n value,\n description,\n updatedAt: new Date(),\n })\n .onConflictDoUpdate({\n target: [settingsSchema.key],\n set: { value, description, updatedAt: new Date() },\n });\n this.cache[key] = value;\n }\n}\n","import type { Transporter, SentMessageInfo } from \"nodemailer\";\n\nexport interface EmailConfig {\n provider: \"smtp\" | \"resend\" | \"sendgrid\" | \"mailgun\" | \"ses\";\n from: string;\n fromName?: string;\n replyTo?: string;\n smtp?: {\n host: string;\n port: number;\n secure: boolean;\n auth: {\n user: string;\n pass: string;\n };\n };\n resend?: {\n apiKey: string;\n };\n sendgrid?: {\n apiKey: string;\n };\n mailgun?: {\n apiKey: string;\n domain: string;\n region?: \"us\" | \"eu\";\n };\n ses?: {\n accessKeyId: string;\n secretAccessKey: string;\n region: string;\n };\n}\n\nexport interface EmailOptions {\n to: string | string[];\n subject: string;\n html: string;\n text?: string;\n replyTo?: string;\n}\n\nexport interface EmailTemplates {\n verifyEmail: (\n link: string,\n userName?: string,\n ) => { subject: string; html: string; text: string };\n resetPassword: (\n link: string,\n userName?: string,\n ) => { subject: string; html: string; text: string };\n welcome: (userName?: string) => {\n subject: string;\n html: string;\n text: string;\n };\n accountLocked: (\n attempts: number,\n duration: number,\n userName?: string,\n ) => { subject: string; html: string; text: string };\n passwordChanged: (userName?: string) => {\n subject: string;\n html: string;\n text: string;\n };\n newLogin: (\n location: string,\n time: string,\n userName?: string,\n ) => { subject: string; html: string; text: string };\n}\n\nconst defaultTemplates: EmailTemplates = {\n verifyEmail: (link, userName = \"User\") => ({\n subject: \"Verify your email address\",\n html: `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>Verify Email</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; }\n .container { max-width: 600px; margin: 0 auto; padding: 20px; }\n .button { display: inline-block; padding: 12px 24px; background: #0b1222; color: white; text-decoration: none; border-radius: 6px; font-weight: 600; }\n .footer { margin-top: 30px; font-size: 12px; color: #666; }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <h1>Welcome, ${userName}!</h1>\n <p>Please verify your email address by clicking the button below:</p>\n <p style=\"text-align: center; margin: 30px 0;\">\n <a href=\"${link}\" class=\"button\">Verify Email</a>\n </p>\n <p>Or copy and paste this link into your browser:</p>\n <p style=\"word-break: break-all; color: #666;\">${link}</p>\n <p>This link will expire in 24 hours.</p>\n <div class=\"footer\">\n <p>If you didn't create an account, you can safely ignore this email.</p>\n </div>\n </div>\n </body>\n </html>\n `,\n text: `Welcome ${userName}!\\n\\nPlease verify your email by clicking this link: ${link}\\n\\nThis link will expire in 24 hours.\\n\\nIf you didn't create an account, you can safely ignore this email.`,\n }),\n\n resetPassword: (link, userName = \"User\") => ({\n subject: \"Reset your password\",\n html: `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>Reset Password</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; }\n .container { max-width: 600px; margin: 0 auto; padding: 20px; }\n .button { display: inline-block; padding: 12px 24px; background: #dc2626; color: white; text-decoration: none; border-radius: 6px; font-weight: 600; }\n .warning { background: #fef3c7; border: 1px solid #f59e0b; padding: 12px; border-radius: 6px; margin: 20px 0; }\n .footer { margin-top: 30px; font-size: 12px; color: #666; }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <h1>Password Reset Request</h1>\n <p>Hello ${userName},</p>\n <p>We received a request to reset your password. Click the button below to create a new password:</p>\n <p style=\"text-align: center; margin: 30px 0;\">\n <a href=\"${link}\" class=\"button\">Reset Password</a>\n </p>\n <p>Or copy and paste this link into your browser:</p>\n <p style=\"word-break: break-all; color: #666;\">${link}</p>\n <div class=\"warning\">\n <strong>⚠️ Important:</strong> This link will expire in 1 hour. If you didn't request a password reset, please ignore this email or contact support if you have concerns.\n </div>\n <div class=\"footer\">\n <p>For security reasons, please don't share this email with anyone.</p>\n </div>\n </div>\n </body>\n </html>\n `,\n text: `Password Reset Request\\n\\nHello ${userName},\\n\\nWe received a request to reset your password. Click this link to create a new password: ${link}\\n\\nThis link will expire in 1 hour.\\n\\nIf you didn't request a password reset, please ignore this email.`,\n }),\n\n welcome: (userName = \"User\") => ({\n subject: \"Welcome to Kyro CMS\",\n html: `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>Welcome</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; }\n .container { max-width: 600px; margin: 0 auto; padding: 20px; }\n .button { display: inline-block; padding: 12px 24px; background: #0b1222; color: white; text-decoration: none; border-radius: 6px; font-weight: 600; }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <h1>Welcome to Kyro CMS, ${userName}!</h1>\n <p>Your account has been created successfully.</p>\n <p>You can now:</p>\n <ul>\n <li>Manage your content collections</li>\n <li>Upload and organize media</li>\n <li>Configure settings</li>\n <li>And much more...</li>\n </ul>\n <p style=\"text-align: center; margin: 30px 0;\">\n <a href=\"#\" class=\"button\">Get Started</a>\n </p>\n <p>If you have any questions, feel free to reach out to our support team.</p>\n </div>\n </body>\n </html>\n `,\n text: `Welcome to Kyro CMS, ${userName}!\\n\\nYour account has been created successfully.\\n\\nYou can now:\\n- Manage your content collections\\n- Upload and organize media\\n- Configure settings\\n- And much more...\\n\\nGet started by logging into your dashboard.`,\n }),\n\n accountLocked: (attempts, duration, userName = \"User\") => ({\n subject: \"Account Security Alert - Account Locked\",\n html: `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>Account Locked</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; }\n .container { max-width: 600px; margin: 0 auto; padding: 20px; }\n .alert { background: #fef2f2; border: 1px solid #ef4444; padding: 16px; border-radius: 8px; margin: 20px 0; }\n .footer { margin-top: 30px; font-size: 12px; color: #666; }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <h1>Account Security Alert</h1>\n <p>Hello ${userName},</p>\n <div class=\"alert\">\n <p><strong>⚠️ Your account has been temporarily locked due to multiple failed login attempts.</strong></p>\n <p>Failed attempts: ${attempts}</p>\n <p>Lockout duration: ${Math.round(duration / 60000)} minutes</p>\n </div>\n <p>Your account will automatically unlock after the lockout period expires.</p>\n <p>If this wasn't you, we recommend:</p>\n <ul>\n <li>Using a strong, unique password</li>\n <li>Enabling two-factor authentication (coming soon)</li>\n <li>Reviewing your recent account activity</li>\n </ul>\n <div class=\"footer\">\n <p>If you need immediate assistance, please contact support.</p>\n </div>\n </div>\n </body>\n </html>\n `,\n text: `Account Security Alert\\n\\nHello ${userName},\\n\\nYour account has been temporarily locked due to multiple failed login attempts (${attempts}).\\n\\nLockout duration: ${Math.round(duration / 60000)} minutes\\n\\nYour account will automatically unlock after this period.\\n\\nIf this wasn't you, we recommend using a strong, unique password.`,\n }),\n\n passwordChanged: (userName = \"User\") => ({\n subject: \"Your password has been changed\",\n html: `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>Password Changed</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; }\n .container { max-width: 600px; margin: 0 auto; padding: 20px; }\n .info { background: #f0fdf4; border: 1px solid #22c55e; padding: 12px; border-radius: 6px; margin: 20px 0; }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <h1>Password Changed</h1>\n <p>Hello ${userName},</p>\n <div class=\"info\">\n <p>Your password was recently changed.</p>\n </div>\n <p>If you did this, you can safely ignore this email.</p>\n <p><strong>If you didn't change your password</strong>, please contact our support team immediately as your account may have been compromised.</p>\n </div>\n </body>\n </html>\n `,\n text: `Password Changed\\n\\nHello ${userName},\\n\\nYour password was recently changed.\\n\\nIf you did this, you can safely ignore this email.\\n\\nIf you didn't change your password, please contact support immediately.`,\n }),\n\n newLogin: (location, time, userName = \"User\") => ({\n subject: \"New login to your account\",\n html: `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>New Login</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; }\n .container { max-width: 600px; margin: 0 auto; padding: 20px; }\n .info-box { background: #f8fafc; border: 1px solid #e2e8f0; padding: 16px; border-radius: 8px; margin: 20px 0; }\n .footer { margin-top: 30px; font-size: 12px; color: #666; }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <h1>New Login Detected</h1>\n <p>Hello ${userName},</p>\n <p>We detected a new login to your account:</p>\n <div class=\"info-box\">\n <p><strong>Location:</strong> ${location}</p>\n <p><strong>Time:</strong> ${time}</p>\n </div>\n <p><strong>If this was you</strong>, no action is needed.</p>\n <p><strong>If this wasn't you</strong>, your account may be compromised. Please:</p>\n <ol>\n <li>Change your password immediately</li>\n <li>Review your recent account activity</li>\n <li>Contact support if needed</li>\n </ol>\n <div class=\"footer\">\n <p>This is an automated security notification.</p>\n </div>\n </div>\n </body>\n </html>\n `,\n text: `New Login Detected\\n\\nHello ${userName},\\n\\nWe detected a new login to your account:\\n\\nLocation: ${location}\\nTime: ${time}\\n\\nIf this wasn't you, please change your password immediately and contact support.`,\n }),\n};\n\nimport { ConfigService } from \"../config/ConfigService.js\";\n\nexport class EmailTransport {\n private transporter?: Transporter<SentMessageInfo>;\n private config: EmailConfig;\n private templates: EmailTemplates;\n private transporterInitialized: boolean = false;\n\n constructor(config: EmailConfig, templates?: Partial<EmailTemplates>) {\n this.config = config;\n this.templates = { ...defaultTemplates, ...templates };\n }\n\n private async ensureTransporter(): Promise<Transporter<SentMessageInfo>> {\n if (this.transporterInitialized) {\n return this.transporter!;\n }\n\n const { default: nodemailer } = await import(\"nodemailer\");\n\n if (this.config.provider === \"smtp\" && this.config.smtp) {\n this.transporter = nodemailer.createTransport({\n host: this.config.smtp.host,\n port: this.config.smtp.port,\n secure: this.config.smtp.secure,\n auth: this.config.smtp.auth,\n });\n } else if (this.config.provider === \"ses\" && this.config.ses) {\n this.transporter = nodemailer.createTransport({\n host: `email-smtp.${this.config.ses.region}.amazonaws.com`,\n port: 587,\n secure: false,\n auth: {\n user: this.config.ses.accessKeyId,\n pass: this.config.ses.secretAccessKey,\n },\n });\n }\n\n this.transporterInitialized = true;\n return this.transporter!;\n }\n\n async send(options: EmailOptions): Promise<any> {\n const { provider, from, fromName, replyTo: configReplyTo } = this.config;\n const fromFull = `\"${fromName || \"Kyro CMS\"}\" <${from}>`;\n const replyTo = options.replyTo || configReplyTo;\n\n console.log(`[EmailTransport] Sending email via ${provider}...`);\n console.log(\n `[EmailTransport] To: ${Array.isArray(options.to) ? options.to.join(\", \") : options.to}`,\n );\n console.log(`[EmailTransport] Subject: ${options.subject}`);\n\n try {\n let result;\n switch (provider) {\n case \"smtp\":\n case \"ses\":\n {\n const transporter = await this.ensureTransporter();\n if (!transporter)\n throw new Error(`${provider} transporter not initialized`);\n result = await transporter.sendMail({\n from: fromFull,\n to: Array.isArray(options.to)\n ? options.to.join(\", \")\n : options.to,\n subject: options.subject,\n html: options.html,\n text: options.text,\n replyTo,\n });\n }\n break;\n\n case \"resend\":\n result = await this.sendViaResend(fromFull, options, replyTo);\n break;\n\n case \"sendgrid\":\n result = await this.sendViaSendGrid(fromFull, options, replyTo);\n break;\n\n case \"mailgun\":\n result = await this.sendViaMailgun(fromFull, options, replyTo);\n break;\n\n default:\n throw new Error(`Unsupported email provider: ${provider}`);\n }\n console.log(`[EmailTransport] Success! Provider response received.`);\n return result;\n } catch (error: any) {\n console.error(`[EmailTransport] FAILED to send email:`, error.message);\n if (error.response) {\n console.error(\n `[EmailTransport] Provider Error Detail:`,\n JSON.stringify(error.response, null, 2),\n );\n }\n throw error;\n }\n }\n\n private async sendViaResend(\n from: string,\n options: EmailOptions,\n replyTo?: string,\n ) {\n const apiKey = this.config.resend?.apiKey;\n if (!apiKey) throw new Error(\"Resend API Key missing\");\n\n const body = {\n from,\n to: options.to,\n subject: options.subject,\n html: options.html,\n text: options.text,\n reply_to: replyTo,\n };\n\n console.log(`[EmailTransport] Calling Resend API...`);\n const resp = await fetch(\"https://api.resend.com/emails\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n });\n\n if (!resp.ok) {\n const error = await resp.json();\n throw new Error(`Resend Error: ${JSON.stringify(error)}`);\n }\n return resp.json();\n }\n\n private async sendViaSendGrid(\n from: string,\n options: EmailOptions,\n replyTo?: string,\n ) {\n const apiKey = this.config.sendgrid?.apiKey;\n if (!apiKey) throw new Error(\"SendGrid API Key missing\");\n\n const body = {\n personalizations: [\n {\n to: Array.isArray(options.to)\n ? options.to.map((email) => ({ email }))\n : [{ email: options.to }],\n },\n ],\n from: {\n email: from.match(/<(.+)>/)?.[1] || from,\n name: from.match(/\"(.+)\"/)?.[1],\n },\n subject: options.subject,\n content: [\n { type: \"text/plain\", value: options.text || \"\" },\n { type: \"text/html\", value: options.html },\n ],\n reply_to: replyTo ? { email: replyTo } : undefined,\n };\n\n console.log(`[EmailTransport] Calling SendGrid API...`);\n const resp = await fetch(\"https://api.sendgrid.com/v3/mail/send\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n });\n\n if (!resp.ok) {\n const error = await resp.json();\n throw new Error(`SendGrid Error: ${JSON.stringify(error)}`);\n }\n return { success: true };\n }\n\n private async sendViaMailgun(\n from: string,\n options: EmailOptions,\n replyTo?: string,\n ) {\n const { apiKey, domain, region } = this.config.mailgun || {};\n if (!apiKey || !domain) throw new Error(\"Mailgun config missing\");\n\n const base = region === \"eu\" ? \"api.eu.mailgun.net\" : \"api.mailgun.net\";\n const auth = btoa(`api:${apiKey}`);\n\n const formData = new URLSearchParams();\n formData.append(\"from\", from);\n const to = Array.isArray(options.to) ? options.to.join(\", \") : options.to;\n formData.append(\"to\", to);\n formData.append(\"subject\", options.subject);\n formData.append(\"html\", options.html);\n if (options.text) formData.append(\"text\", options.text);\n if (replyTo) formData.append(\"h:Reply-To\", replyTo);\n\n console.log(`[EmailTransport] Calling Mailgun API (${region || \"us\"})...`);\n const resp = await fetch(`https://${base}/v3/${domain}/messages`, {\n method: \"POST\",\n headers: {\n Authorization: `Basic ${auth}`,\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: formData,\n });\n\n if (!resp.ok) {\n const error = await resp.json();\n throw new Error(`Mailgun Error: ${JSON.stringify(error)}`);\n }\n return resp.json();\n }\n\n getTemplates(): EmailTemplates {\n return this.templates;\n }\n\n async verifyConnection(): Promise<boolean> {\n if (this.config.provider === \"smtp\" || this.config.provider === \"ses\") {\n try {\n const transporter = await this.ensureTransporter();\n if (transporter) {\n await transporter.verify();\n return true;\n }\n } catch {\n return false;\n }\n }\n return !!(\n this.config.resend?.apiKey ||\n this.config.sendgrid?.apiKey ||\n this.config.mailgun?.apiKey\n );\n }\n\n static async fromConfig(db: any): Promise<EmailTransport | null> {\n const configService = new ConfigService(db);\n await configService.load();\n const config = configService.getEmailConfig();\n\n if (!config.provider) {\n return this.fromEnv();\n }\n\n const transformed: EmailConfig = {\n provider: (config.provider as any) || \"smtp\",\n from: config.from || \"noreply@example.com\",\n fromName: config.fromName,\n replyTo: config.replyTo,\n smtp:\n config.provider === \"smtp\"\n ? {\n host: config.host || \"\",\n port: config.port || 587,\n secure: config.secure || false,\n auth: { user: config.user || \"\", pass: config.pass || \"\" },\n }\n : undefined,\n resend:\n config.provider === \"resend\"\n ? { apiKey: config.pass || \"\" }\n : undefined,\n sendgrid:\n config.provider === \"sendgrid\"\n ? { apiKey: config.pass || \"\" }\n : undefined,\n mailgun:\n config.provider === \"mailgun\"\n ? {\n apiKey: config.pass || \"\",\n domain: config.host || \"\",\n region: (config.secure ? \"eu\" : \"us\") as any,\n }\n : undefined,\n ses:\n config.provider === \"ses\"\n ? {\n accessKeyId: config.user || \"\",\n secretAccessKey: config.pass || \"\",\n region: config.host || \"us-east-1\",\n }\n : undefined,\n };\n\n return new EmailTransport(transformed);\n }\n\n static fromEnv(): EmailTransport | null {\n const provider = (process.env.EMAIL_PROVIDER as any) || \"smtp\";\n const from =\n process.env.SMTP_FROM ||\n process.env.DEFAULT_FROM ||\n \"noreply@example.com\";\n const fromName = process.env.SMTP_FROM_NAME || \"Kyro CMS\";\n const replyTo = process.env.SMTP_REPLY_TO;\n\n if (provider === \"smtp\") {\n const host = process.env.SMTP_HOST;\n const user = process.env.SMTP_USER;\n const pass = process.env.SMTP_PASS;\n if (!host || !user || !pass) return null;\n\n return new EmailTransport({\n provider: \"smtp\",\n from,\n fromName,\n replyTo,\n smtp: {\n host,\n port: parseInt(process.env.SMTP_PORT || \"587\", 10),\n secure: process.env.SMTP_SECURE === \"true\",\n auth: { user, pass },\n },\n });\n }\n\n if (provider === \"resend\") {\n const apiKey = process.env.RESEND_API_KEY || process.env.SMTP_PASS;\n if (!apiKey) return null;\n return new EmailTransport({\n provider: \"resend\",\n from,\n fromName,\n replyTo,\n resend: { apiKey },\n });\n }\n\n if (provider === \"sendgrid\") {\n const apiKey = process.env.SENDGRID_API_KEY || process.env.SMTP_PASS;\n if (!apiKey) return null;\n return new EmailTransport({\n provider: \"sendgrid\",\n from,\n fromName,\n replyTo,\n sendgrid: { apiKey },\n });\n }\n\n if (provider === \"mailgun\") {\n const apiKey = process.env.MAILGUN_API_KEY || process.env.SMTP_PASS;\n const domain = process.env.MAILGUN_DOMAIN || process.env.SMTP_HOST;\n if (!apiKey || !domain) return null;\n return new EmailTransport({\n provider: \"mailgun\",\n from,\n fromName,\n replyTo,\n mailgun: {\n apiKey,\n domain,\n region: (process.env.MAILGUN_REGION ||\n (process.env.SMTP_SECURE === \"true\" ? \"eu\" : \"us\")) as any,\n },\n });\n }\n\n if (provider === \"ses\") {\n const accessKeyId =\n process.env.AWS_ACCESS_KEY_ID || process.env.SMTP_USER;\n const secretAccessKey =\n process.env.AWS_SECRET_ACCESS_KEY || process.env.SMTP_PASS;\n const region =\n process.env.AWS_REGION || process.env.SMTP_HOST || \"us-east-1\";\n if (!accessKeyId || !secretAccessKey) return null;\n return new EmailTransport({\n provider: \"ses\",\n from,\n fromName,\n replyTo,\n ses: { accessKeyId, secretAccessKey, region },\n });\n }\n\n return null;\n }\n}\n","export interface PasswordPolicyConfig {\n minLength: number;\n requireUppercase: boolean;\n requireLowercase: boolean;\n requireNumbers: boolean;\n requireSpecialChars: boolean;\n preventReuse: number;\n maxLength?: number;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\nexport const DEFAULT_PASSWORD_POLICY: PasswordPolicyConfig = {\n minLength: 12,\n requireUppercase: true,\n requireLowercase: true,\n requireNumbers: true,\n requireSpecialChars: true,\n preventReuse: 5,\n maxLength: 128,\n};\n\nexport class PasswordPolicy {\n private config: PasswordPolicyConfig;\n\n constructor(config: Partial<PasswordPolicyConfig> = {}) {\n this.config = { ...DEFAULT_PASSWORD_POLICY, ...config };\n }\n\n validate(password: string): ValidationResult {\n const errors: string[] = [];\n\n if (this.config.maxLength && password.length > this.config.maxLength) {\n errors.push(\n `Password must not exceed ${this.config.maxLength} characters`,\n );\n }\n\n if (password.length < this.config.minLength) {\n errors.push(\n `Password must be at least ${this.config.minLength} characters`,\n );\n }\n\n if (this.config.requireUppercase && !/[A-Z]/.test(password)) {\n errors.push(\"Password must contain at least one uppercase letter\");\n }\n\n if (this.config.requireLowercase && !/[a-z]/.test(password)) {\n errors.push(\"Password must contain at least one lowercase letter\");\n }\n\n if (this.config.requireNumbers && !/[0-9]/.test(password)) {\n errors.push(\"Password must contain at least one number\");\n }\n\n if (\n this.config.requireSpecialChars &&\n !/[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]/.test(password)\n ) {\n errors.push(\"Password must contain at least one special character\");\n }\n\n const commonPasswords = [\n \"password\",\n \"123456\",\n \"12345678\",\n \"qwerty\",\n \"abc123\",\n \"monkey\",\n \"1234567\",\n \"letmein\",\n \"trustno1\",\n \"dragon\",\n \"baseball\",\n \"iloveyou\",\n \"master\",\n \"sunshine\",\n \"ashley\",\n \"football\",\n \"password1\",\n \"shadow\",\n \"123123\",\n \"654321\",\n ];\n\n if (commonPasswords.includes(password.toLowerCase())) {\n errors.push(\n \"This password is too common. Please choose a more secure password\",\n );\n }\n\n if (/^[a-zA-Z]+$/.test(password) || /^[0-9]+$/.test(password)) {\n errors.push(\n \"Password must contain a mix of letters, numbers, and/or special characters\",\n );\n }\n\n if (/(.)\\1{2,}/.test(password)) {\n errors.push(\n \"Password must not contain more than 2 consecutive identical characters\",\n );\n }\n\n if (\n /^(012|123|234|345|456|567|678|789|890|098|987|876|765|654|543|432|321|210)+$/i.test(\n password,\n )\n ) {\n errors.push(\"Password must not contain sequential numbers or letters\");\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n\n async checkReuse(\n passwordHash: string,\n history: string[],\n verifyFn: (password: string, hash: string) => Promise<boolean>,\n ): Promise<ValidationResult> {\n return {\n valid: true,\n errors: [],\n };\n }\n\n async isInHistory(\n password: string,\n history: string[],\n verifyFn: (password: string, hash: string) => Promise<boolean>,\n ): Promise<boolean> {\n for (const hash of history) {\n if (await verifyFn(password, hash)) {\n return true;\n }\n }\n return false;\n }\n\n generatePassword(length: number = 16): string {\n const uppercase = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n const lowercase = \"abcdefghijklmnopqrstuvwxyz\";\n const numbers = \"0123456789\";\n const special = \"!@#$%^&*()_+-=[]{}|;:,.<>?\";\n\n let password = \"\";\n\n password += uppercase[Math.floor(Math.random() * uppercase.length)];\n password += lowercase[Math.floor(Math.random() * lowercase.length)];\n password += numbers[Math.floor(Math.random() * numbers.length)];\n password += special[Math.floor(Math.random() * special.length)];\n\n const allChars = uppercase + lowercase + numbers + special;\n for (let i = password.length; i < length; i++) {\n password += allChars[Math.floor(Math.random() * allChars.length)];\n }\n\n return password\n .split(\"\")\n .sort(() => Math.random() - 0.5)\n .join(\"\");\n }\n\n getStrength(password: string): {\n score: number;\n label: string;\n feedback: string[];\n } {\n let score = 0;\n const feedback: string[] = [];\n\n if (password.length >= 8) score += 1;\n if (password.length >= 12) score += 1;\n if (password.length >= 16) score += 1;\n\n if (/[a-z]/.test(password)) score += 1;\n if (/[A-Z]/.test(password)) score += 1;\n if (/[0-9]/.test(password)) score += 1;\n if (/[!@#$%^&*()_+\\-=\\[\\]{}|;:,.<>?]/.test(password)) score += 1;\n\n if (password.length > 8) score += 1;\n if (password.length > 12) score += 1;\n\n const uniqueChars = new Set(password).size;\n if (uniqueChars > 6) score += 1;\n if (uniqueChars > 10) score += 1;\n\n let label: string;\n if (score <= 3) {\n label = \"Weak\";\n feedback.push(\"Add more characters\");\n feedback.push(\"Include uppercase and lowercase letters\");\n } else if (score <= 5) {\n label = \"Fair\";\n feedback.push(\"Add special characters\");\n feedback.push(\"Consider making it longer\");\n } else if (score <= 7) {\n label = \"Good\";\n feedback.push(\"Consider making it longer for extra security\");\n } else {\n label = \"Strong\";\n }\n\n return { score, label, feedback };\n }\n\n setConfig(config: Partial<PasswordPolicyConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n getConfig(): PasswordPolicyConfig {\n return { ...this.config };\n }\n}\n","import bcrypt from \"bcryptjs\";\nimport { randomBytes } from \"crypto\";\nimport { mkdirSync } from \"fs\";\nimport { dirname } from \"path\";\nimport Database from \"better-sqlite3\";\nimport type { AuthAdapter, AuthUser, Session, UserRole } from \"./types.js\";\nimport type { AuditLog, AuditLogFilter } from \"./security/audit-log.js\";\n\nexport interface SQLiteAuthAdapterOptions {\n path?: string;\n db?: any;\n saltRounds?: number;\n busyTimeout?: number;\n walAutoCheckpoint?: number;\n cacheSize?: number;\n mmapSize?: number;\n}\n\nconst DEFAULT_BUSY_TIMEOUT = 5000;\nconst DEFAULT_WAL_CHECKPOINT = 1000;\nconst DEFAULT_CACHE_SIZE = -64000;\nconst DEFAULT_MMAP_SIZE = 268435456;\n\nexport class SQLiteAuthAdapter implements AuthAdapter {\n private db: any = null;\n private path: string;\n private saltRounds: number;\n private externalDb: boolean;\n private busyTimeout: number;\n private walAutoCheckpoint: number;\n private cacheSize: number;\n private mmapSize: number;\n\n private preparedStatements: Map<string, any> = new Map();\n\n constructor(options: SQLiteAuthAdapterOptions = {}) {\n this.path = options.path || \"./data/auth.db\";\n this.saltRounds = options.saltRounds || 12;\n this.externalDb = !!options.db;\n this.busyTimeout = options.busyTimeout ?? DEFAULT_BUSY_TIMEOUT;\n this.walAutoCheckpoint =\n options.walAutoCheckpoint ?? DEFAULT_WAL_CHECKPOINT;\n this.cacheSize = options.cacheSize ?? DEFAULT_CACHE_SIZE;\n this.mmapSize = options.mmapSize ?? DEFAULT_MMAP_SIZE;\n\n if (options.db) {\n this.db = options.db;\n }\n }\n\n async connect(): Promise<void> {\n if (this.db) return;\n\n const dir = dirname(this.path);\n if (dir && dir !== \".\") {\n mkdirSync(dir, { recursive: true });\n }\n\n this.db = new Database(this.path);\n this.db.exec(`PRAGMA busy_timeout = ${this.busyTimeout}`);\n\n this.db.exec(\"PRAGMA journal_mode = WAL\");\n this.db.exec(\"PRAGMA synchronous = NORMAL\");\n this.db.exec(\"PRAGMA cache_size = \" + this.cacheSize);\n this.db.exec(\"PRAGMA mmap_size = \" + this.mmapSize);\n this.db.exec(\"PRAGMA wal_autocheckpoint = \" + this.walAutoCheckpoint);\n this.db.exec(\"PRAGMA foreign_keys = ON\");\n this.db.exec(\"PRAGMA temp_store = MEMORY\");\n\n this.ensureTables();\n this.prepareStatements();\n }\n\n async disconnect(): Promise<void> {\n if (this.db && !this.externalDb) {\n this.db.exec(\"PRAGMA wal_checkpoint(TRUNCATE)\");\n this.db.close();\n this.db = null;\n this.preparedStatements.clear();\n }\n }\n\n private async ensureConnected(): Promise<any> {\n if (!this.db) {\n await this.connect();\n }\n if (!this.db) {\n throw new Error(\"Failed to connect to SQLite database\");\n }\n return this.db;\n }\n\n private ensureTables(): void {\n if (!this.db) return;\n\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS kyro_users (\n id TEXT PRIMARY KEY,\n name TEXT,\n email TEXT UNIQUE NOT NULL,\n password_hash TEXT NOT NULL,\n role TEXT NOT NULL DEFAULT 'customer',\n tenant_id TEXT,\n email_verified INTEGER DEFAULT 0,\n locked INTEGER DEFAULT 0,\n last_login TEXT,\n failed_login_attempts INTEGER DEFAULT 0,\n locked_until TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS kyro_sessions (\n id TEXT PRIMARY KEY,\n user_id TEXT NOT NULL,\n token TEXT NOT NULL,\n refresh_token TEXT,\n expires_at TEXT NOT NULL,\n created_at TEXT NOT NULL,\n ip_address TEXT,\n user_agent TEXT,\n FOREIGN KEY (user_id) REFERENCES kyro_users(id) ON DELETE CASCADE\n );\n\n CREATE TABLE IF NOT EXISTS kyro_password_history (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n user_id TEXT NOT NULL,\n password_hash TEXT NOT NULL,\n created_at TEXT NOT NULL,\n FOREIGN KEY (user_id) REFERENCES kyro_users(id) ON DELETE CASCADE\n );\n\n CREATE TABLE IF NOT EXISTS kyro_rate_limits (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n key TEXT NOT NULL,\n window_start INTEGER NOT NULL,\n count INTEGER NOT NULL DEFAULT 1,\n UNIQUE(key, window_start)\n );\n\n CREATE TABLE IF NOT EXISTS kyro_lockouts (\n user_id TEXT PRIMARY KEY,\n attempts INTEGER NOT NULL DEFAULT 0,\n last_attempt INTEGER,\n locked_at INTEGER,\n locked_until INTEGER\n );\n\n CREATE TABLE IF NOT EXISTS kyro_audit_logs (\n id TEXT PRIMARY KEY,\n timestamp TEXT NOT NULL,\n action TEXT NOT NULL,\n user_id TEXT,\n user_email TEXT,\n role TEXT,\n resource TEXT NOT NULL,\n resource_id TEXT,\n ip_address TEXT,\n user_agent TEXT,\n success INTEGER NOT NULL,\n error TEXT,\n metadata TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n );\n\n CREATE INDEX IF NOT EXISTS idx_kyro_users_email ON kyro_users(email);\n CREATE INDEX IF NOT EXISTS idx_kyro_sessions_user_id ON kyro_sessions(user_id);\n CREATE INDEX IF NOT EXISTS idx_kyro_sessions_token ON kyro_sessions(token);\n CREATE INDEX IF NOT EXISTS idx_kyro_sessions_refresh_token ON kyro_sessions(refresh_token);\n CREATE INDEX IF NOT EXISTS idx_kyro_sessions_expires ON kyro_sessions(expires_at);\n CREATE INDEX IF NOT EXISTS idx_kyro_password_history_user_id ON kyro_password_history(user_id);\n CREATE INDEX IF NOT EXISTS idx_kyro_rate_limits_key ON kyro_rate_limits(key);\n CREATE INDEX IF NOT EXISTS idx_kyro_rate_limits_window ON kyro_rate_limits(window_start);\n CREATE INDEX IF NOT EXISTS idx_kyro_lockouts_locked_until ON kyro_lockouts(locked_until);\n CREATE INDEX IF NOT EXISTS idx_kyro_audit_logs_timestamp ON kyro_audit_logs(timestamp);\n CREATE INDEX IF NOT EXISTS idx_kyro_audit_logs_action ON kyro_audit_logs(action);\n CREATE INDEX IF NOT EXISTS idx_kyro_audit_logs_user_id ON kyro_audit_logs(user_id);\n CREATE INDEX IF NOT EXISTS idx_kyro_audit_logs_resource ON kyro_audit_logs(resource);\n `);\n\n try {\n this.db.exec(`ALTER TABLE kyro_users ADD COLUMN name TEXT`);\n } catch {\n // Column already exists, ignore\n }\n }\n\n private prepareStatements(): void {\n if (!this.db) return;\n\n this.preparedStatements.set(\n \"findUserByEmail\",\n this.db.prepare(\"SELECT * FROM kyro_users WHERE email = ?\"),\n );\n this.preparedStatements.set(\n \"findUserById\",\n this.db.prepare(\"SELECT * FROM kyro_users WHERE id = ?\"),\n );\n this.preparedStatements.set(\n \"findSessionByToken\",\n this.db.prepare(\"SELECT * FROM kyro_sessions WHERE token = ?\"),\n );\n this.preparedStatements.set(\n \"findSessionByRefreshToken\",\n this.db.prepare(\"SELECT * FROM kyro_sessions WHERE refresh_token = ?\"),\n );\n this.preparedStatements.set(\n \"deleteSession\",\n this.db.prepare(\"DELETE FROM kyro_sessions WHERE id = ? OR token = ?\"),\n );\n this.preparedStatements.set(\n \"deleteUserSessions\",\n this.db.prepare(\"DELETE FROM kyro_sessions WHERE user_id = ?\"),\n );\n this.preparedStatements.set(\n \"countUsers\",\n this.db.prepare(\"SELECT COUNT(*) as count FROM kyro_users\"),\n );\n this.preparedStatements.set(\n \"deleteUser\",\n this.db.prepare(\"DELETE FROM kyro_users WHERE id = ?\"),\n );\n this.preparedStatements.set(\n \"findUsersPaginated\",\n this.db.prepare(\n \"SELECT * FROM kyro_users ORDER BY created_at DESC LIMIT ? OFFSET ?\",\n ),\n );\n this.preparedStatements.set(\n \"findUsersWithSearch\",\n this.db.prepare(\n \"SELECT * FROM kyro_users WHERE email LIKE ? ORDER BY created_at DESC LIMIT ? OFFSET ?\",\n ),\n );\n this.preparedStatements.set(\n \"countUsersWithSearch\",\n this.db.prepare(\n \"SELECT COUNT(*) as count FROM kyro_users WHERE email LIKE ?\",\n ),\n );\n this.preparedStatements.set(\n \"getPasswordHistory\",\n this.db.prepare(\n \"SELECT password_hash FROM kyro_password_history WHERE user_id = ? ORDER BY created_at DESC LIMIT ?\",\n ),\n );\n this.preparedStatements.set(\n \"addPasswordHistory\",\n this.db.prepare(\n \"INSERT INTO kyro_password_history (user_id, password_hash, created_at) VALUES (?, ?, ?)\",\n ),\n );\n this.preparedStatements.set(\n \"trimPasswordHistory\",\n this.db.prepare(\n `DELETE FROM kyro_password_history WHERE id IN (\n SELECT id FROM kyro_password_history WHERE user_id = ? ORDER BY created_at DESC LIMIT -1 OFFSET 5\n )`,\n ),\n );\n this.preparedStatements.set(\n \"deleteExpiredSessions\",\n this.db.prepare(\"DELETE FROM kyro_sessions WHERE expires_at < ?\"),\n );\n this.preparedStatements.set(\n \"cleanupOldAuditLogs\",\n this.db.prepare(\"DELETE FROM kyro_audit_logs WHERE timestamp < ?\"),\n );\n this.preparedStatements.set(\n \"cleanupExpiredLockouts\",\n this.db.prepare(\n \"UPDATE kyro_lockouts SET attempts = 0, locked_at = NULL, locked_until = NULL WHERE locked_until < ?\",\n ),\n );\n this.preparedStatements.set(\n \"getLockout\",\n this.db.prepare(\"SELECT * FROM kyro_lockouts WHERE user_id = ?\"),\n );\n this.preparedStatements.set(\n \"upsertLockout\",\n this.db.prepare(`\n INSERT INTO kyro_lockouts (user_id, attempts, last_attempt, locked_at, locked_until)\n VALUES (?, ?, ?, ?, ?)\n ON CONFLICT(user_id) DO UPDATE SET\n attempts = excluded.attempts,\n last_attempt = excluded.last_attempt,\n locked_at = excluded.locked_at,\n locked_until = excluded.locked_until\n `),\n );\n this.preparedStatements.set(\n \"resetLockout\",\n this.db.prepare(\n \"UPDATE kyro_lockouts SET attempts = 0, locked_at = NULL, locked_until = NULL WHERE user_id = ?\",\n ),\n );\n }\n\n private stmt(name: string): any {\n const stmt = this.preparedStatements.get(name);\n if (!stmt) throw new Error(`Prepared statement not found: ${name}`);\n return stmt;\n }\n\n async cleanupExpiredSessions(): Promise<number> {\n await this.ensureConnected();\n const result = this.stmt(\"deleteExpiredSessions\").run(\n new Date().toISOString(),\n );\n return result.changes;\n }\n\n async cleanupOldAuditLogs(retentionDays: number = 30): Promise<number> {\n await this.ensureConnected();\n const cutoff = new Date(\n Date.now() - retentionDays * 24 * 60 * 60 * 1000,\n ).toISOString();\n const result = this.stmt(\"cleanupOldAuditLogs\").run(cutoff);\n return result.changes;\n }\n\n async getStats(): Promise<{\n userCount: number;\n activeSessionCount: number;\n auditLogCount: number;\n }> {\n await this.ensureConnected();\n\n const userCount = (this.stmt(\"countUsers\").get() as { count: number })\n .count;\n\n const activeSessionCount = (\n this.db!.prepare(\n \"SELECT COUNT(*) as count FROM kyro_sessions WHERE expires_at > ?\",\n ).get(new Date().toISOString()) as { count: number }\n ).count;\n\n const auditLogCount = (\n this.db!.prepare(\n \"SELECT COUNT(*) as count FROM kyro_audit_logs\",\n ).get() as { count: number }\n ).count;\n\n return { userCount, activeSessionCount, auditLogCount };\n }\n\n async createUser(data: {\n email: string;\n password: string;\n name?: string;\n role?: UserRole;\n tenantId?: string;\n }): Promise<AuthUser> {\n await this.ensureConnected();\n\n const id = randomBytes(16).toString(\"hex\");\n const now = new Date().toISOString();\n const passwordHash = await this.hashPassword(data.password);\n\n const user: AuthUser = {\n id,\n name: data.name,\n email: data.email.toLowerCase(),\n passwordHash,\n role: (data.role || \"customer\") as UserRole,\n tenantId: data.tenantId,\n createdAt: now,\n updatedAt: now,\n };\n\n this.db!.prepare(\n `INSERT INTO kyro_users (id, name, email, password_hash, role, tenant_id, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n id,\n user.name || null,\n user.email,\n user.passwordHash,\n user.role,\n user.tenantId,\n now,\n now,\n );\n\n return user;\n }\n\n async findUserByEmail(email: string): Promise<AuthUser | null> {\n await this.ensureConnected();\n\n const row = this.stmt(\"findUserByEmail\").get(email.toLowerCase()) as\n | Record<string, unknown>\n | undefined;\n\n if (!row) return null;\n return this.rowToUser(row);\n }\n\n async findUserById(userId: string): Promise<AuthUser | null> {\n await this.ensureConnected();\n\n const row = this.stmt(\"findUserById\").get(userId) as\n | Record<string, unknown>\n | undefined;\n\n if (!row) return null;\n return this.rowToUser(row);\n }\n\n async updateUser(\n userId: string,\n data: Partial<AuthUser>,\n ): Promise<AuthUser | null> {\n await this.ensureConnected();\n\n const existing = await this.findUserById(userId);\n if (!existing) return null;\n\n const updates: string[] = [];\n const values: unknown[] = [];\n\n if (data.email !== undefined) {\n updates.push(\"email = ?\");\n values.push(data.email.toLowerCase());\n }\n if (data.name !== undefined) {\n updates.push(\"name = ?\");\n values.push(data.name);\n }\n if (data.passwordHash !== undefined) {\n updates.push(\"password_hash = ?\");\n values.push(data.passwordHash);\n }\n if (data.role !== undefined) {\n updates.push(\"role = ?\");\n values.push(data.role);\n }\n if (data.tenantId !== undefined) {\n updates.push(\"tenant_id = ?\");\n values.push(data.tenantId);\n }\n if (data.emailVerified !== undefined) {\n updates.push(\"email_verified = ?\");\n values.push(data.emailVerified ? 1 : 0);\n }\n if (data.locked !== undefined) {\n updates.push(\"locked = ?\");\n values.push(data.locked ? 1 : 0);\n }\n if (data.lastLogin !== undefined) {\n updates.push(\"last_login = ?\");\n values.push(data.lastLogin);\n }\n if (data.failedLoginAttempts !== undefined) {\n updates.push(\"failed_login_attempts = ?\");\n values.push(data.failedLoginAttempts);\n }\n\n updates.push(\"updated_at = ?\");\n values.push(new Date().toISOString());\n\n values.push(userId);\n\n this.db!.prepare(\n `UPDATE kyro_users SET ${updates.join(\", \")} WHERE id = ?`,\n ).run(...values);\n\n return this.findUserById(userId);\n }\n\n async deleteUser(userId: string): Promise<boolean> {\n await this.ensureConnected();\n\n const result = this.stmt(\"deleteUser\").run(userId);\n return result.changes > 0;\n }\n\n async hashPassword(password: string): Promise<string> {\n return bcrypt.hash(password, this.saltRounds);\n }\n\n async verifyPassword(\n email: string,\n password: string,\n ): Promise<AuthUser | null> {\n await this.ensureConnected();\n const user = await this.findUserByEmail(email);\n if (!user) return null;\n const stored = this.db!.prepare(\n \"SELECT password_hash FROM kyro_users WHERE id = ?\",\n ).get(user.id) as { password_hash: string } | undefined;\n if (!stored?.password_hash) return null;\n const valid = await bcrypt.compare(password, stored.password_hash);\n return valid ? user : null;\n }\n\n async createSession(\n userId: string,\n data: {\n ipAddress?: string;\n userAgent?: string;\n } = {},\n ): Promise<Session> {\n await this.ensureConnected();\n\n const id = randomBytes(32).toString(\"hex\");\n const token = randomBytes(32).toString(\"base64url\");\n const refreshToken = randomBytes(32).toString(\"base64url\");\n const now = new Date();\n const expiresAt = new Date(now.getTime() + 86400000).toISOString();\n\n const session: Session = {\n id,\n userId,\n token,\n refreshToken,\n expiresAt,\n createdAt: now.toISOString(),\n ipAddress: data.ipAddress,\n userAgent: data.userAgent,\n };\n\n this.db!.prepare(\n `INSERT INTO kyro_sessions (id, user_id, token, refresh_token, expires_at, created_at, ip_address, user_agent)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n session.id,\n session.userId,\n session.token,\n session.refreshToken,\n session.expiresAt,\n session.createdAt,\n session.ipAddress,\n session.userAgent,\n );\n\n return session;\n }\n\n async findSessionByToken(token: string): Promise<Session | null> {\n await this.ensureConnected();\n\n const row = this.stmt(\"findSessionByToken\").get(token) as\n | Record<string, unknown>\n | undefined;\n\n if (!row) return null;\n return this.rowToSession(row);\n }\n\n async findSessionByRefreshToken(\n refreshToken: string,\n ): Promise<Session | null> {\n await this.ensureConnected();\n\n const row = this.stmt(\"findSessionByRefreshToken\").get(refreshToken) as\n | Record<string, unknown>\n | undefined;\n\n if (!row) return null;\n return this.rowToSession(row);\n }\n\n async deleteSession(sessionId: string): Promise<boolean> {\n await this.ensureConnected();\n\n const result = this.stmt(\"deleteSession\").run(sessionId, sessionId);\n return result.changes > 0;\n }\n\n async deleteUserSessions(userId: string): Promise<number> {\n await this.ensureConnected();\n\n const result = this.stmt(\"deleteUserSessions\").run(userId);\n return result.changes;\n }\n\n async hasAnyUsers(): Promise<boolean> {\n await this.ensureConnected();\n\n const row = this.stmt(\"countUsers\").get() as { count: number };\n return row.count > 0;\n }\n\n async findUsers(\n options: {\n page?: number;\n limit?: number;\n search?: string;\n } = {},\n ): Promise<{ users: AuthUser[]; total: number }> {\n await this.ensureConnected();\n\n const page = options.page ?? 1;\n const limit = options.limit ?? 10;\n const offset = (page - 1) * limit;\n const search = options.search;\n\n let total: number;\n let rows: Record<string, unknown>[];\n\n if (search) {\n const searchPattern = `%${search}%`;\n total = (\n this.stmt(\"countUsersWithSearch\").get(searchPattern) as {\n count: number;\n }\n ).count;\n rows = this.stmt(\"findUsersWithSearch\").all(\n searchPattern,\n limit,\n offset,\n ) as Record<string, unknown>[];\n } else {\n total = (this.stmt(\"countUsers\").get() as { count: number }).count;\n rows = this.stmt(\"findUsersPaginated\").all(limit, offset) as Record<\n string,\n unknown\n >[];\n }\n\n return {\n users: rows.map((row) => this.rowToUser(row)),\n total,\n };\n }\n\n async addPasswordToHistory(\n userId: string,\n passwordHash: string,\n ): Promise<void> {\n await this.ensureConnected();\n\n this.stmt(\"addPasswordHistory\").run(\n userId,\n passwordHash,\n new Date().toISOString(),\n );\n this.stmt(\"trimPasswordHistory\").run(userId);\n }\n\n async getPasswordHistory(\n userId: string,\n count: number = 5,\n ): Promise<string[]> {\n await this.ensureConnected();\n\n const rows = this.stmt(\"getPasswordHistory\").all(userId, count) as Array<{\n password_hash: string;\n }>;\n\n return rows.map((r) => r.password_hash);\n }\n\n async isPasswordInHistory(\n password: string,\n userId: string,\n historyCount: number = 5,\n ): Promise<boolean> {\n const history = await this.getPasswordHistory(userId, historyCount);\n for (const hash of history) {\n if (await bcrypt.compare(password, hash)) {\n return true;\n }\n }\n return false;\n }\n\n async recordFailedAttempt(userId: string): Promise<void> {\n await this.ensureConnected();\n\n const now = Date.now();\n const lockout = this.stmt(\"getLockout\").get(userId) as\n | { attempts: number; locked_until: number | null }\n | undefined;\n\n const attempts = (lockout?.attempts || 0) + 1;\n const lockedUntil =\n attempts >= 5 ? now + 15 * 60 * 1000 : lockout?.locked_until || null;\n\n this.stmt(\"upsertLockout\").run(\n userId,\n attempts,\n now,\n lockedUntil !== null ? now : null,\n lockedUntil,\n );\n }\n\n async resetAttempts(userId: string): Promise<void> {\n await this.ensureConnected();\n this.stmt(\"resetLockout\").run(userId);\n }\n\n async checkLockout(userId: string): Promise<{\n locked: boolean;\n attemptsRemaining: number;\n lockedUntil?: Date;\n totalAttempts: number;\n }> {\n await this.ensureConnected();\n\n this.stmt(\"cleanupExpiredLockouts\").run(Date.now());\n\n const lockout = this.stmt(\"getLockout\").get(userId) as\n | { attempts: number; locked_until: number | null }\n | undefined;\n\n if (!lockout) {\n return {\n locked: false,\n attemptsRemaining: 5,\n totalAttempts: 0,\n };\n }\n\n if (lockout.locked_until !== null && lockout.locked_until > Date.now()) {\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil: new Date(lockout.locked_until),\n totalAttempts: lockout.attempts,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, 5 - lockout.attempts),\n totalAttempts: lockout.attempts,\n };\n }\n\n async logAudit(data: {\n action: string;\n userId?: string;\n userEmail?: string;\n role?: string;\n resource: string;\n resourceId?: string;\n ipAddress?: string;\n userAgent?: string;\n success: boolean;\n error?: string;\n metadata?: Record<string, unknown>;\n }): Promise<string> {\n await this.ensureConnected();\n\n const id = randomBytes(16).toString(\"hex\");\n const timestamp = new Date().toISOString();\n\n this.db!.prepare(\n `INSERT INTO kyro_audit_logs (\n id, timestamp, action, user_id, user_email, role, resource, resource_id,\n ip_address, user_agent, success, error, metadata, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n id,\n timestamp,\n data.action,\n data.userId || null,\n data.userEmail || null,\n data.role || null,\n data.resource,\n data.resourceId || null,\n data.ipAddress || null,\n data.userAgent || null,\n data.success ? 1 : 0,\n data.error || null,\n data.metadata ? JSON.stringify(data.metadata) : null,\n new Date().toISOString(),\n );\n\n return id;\n }\n\n async queryAuditLogs(\n options: {\n action?: string;\n userId?: string;\n resource?: string;\n success?: boolean;\n startDate?: Date;\n endDate?: Date;\n limit?: number;\n offset?: number;\n } = {},\n ): Promise<{\n logs: Array<{\n id: string;\n timestamp: Date;\n action: string;\n userId?: string;\n userEmail?: string;\n resource: string;\n resourceId?: string;\n ipAddress?: string;\n userAgent?: string;\n success: boolean;\n error?: string;\n metadata?: Record<string, unknown>;\n }>;\n total: number;\n }> {\n await this.ensureConnected();\n\n const conditions: string[] = [];\n const params: unknown[] = [];\n\n if (options.action) {\n conditions.push(\"action = ?\");\n params.push(options.action);\n }\n if (options.userId) {\n conditions.push(\"user_id = ?\");\n params.push(options.userId);\n }\n if (options.resource) {\n conditions.push(\"resource = ?\");\n params.push(options.resource);\n }\n if (options.success !== undefined) {\n conditions.push(\"success = ?\");\n params.push(options.success ? 1 : 0);\n }\n if (options.startDate) {\n conditions.push(\"timestamp >= ?\");\n params.push(options.startDate.toISOString());\n }\n if (options.endDate) {\n conditions.push(\"timestamp <= ?\");\n params.push(options.endDate.toISOString());\n }\n\n const where =\n conditions.length > 0 ? \"WHERE \" + conditions.join(\" AND \") : \"\";\n const limit = options.limit || 50;\n const offset = options.offset || 0;\n\n const totalResult = this.db!.prepare(\n `SELECT COUNT(*) as count FROM kyro_audit_logs ${where}`,\n ).get(...params) as { count: number };\n\n const rows = this.db!.prepare(\n `SELECT * FROM kyro_audit_logs ${where} ORDER BY timestamp DESC LIMIT ? OFFSET ?`,\n ).all(...params, limit, offset) as Array<Record<string, unknown>>;\n\n return {\n total: totalResult.count,\n logs: rows.map((row) => ({\n id: row.id as string,\n timestamp: new Date(row.timestamp as string),\n action: row.action as string,\n userId: (row.user_id as string) || undefined,\n userEmail: (row.user_email as string) || undefined,\n resource: row.resource as string,\n resourceId: (row.resource_id as string) || undefined,\n ipAddress: (row.ip_address as string) || undefined,\n userAgent: (row.user_agent as string) || undefined,\n success: (row.success as number) === 1,\n error: (row.error as string) || undefined,\n metadata: row.metadata ? JSON.parse(row.metadata as string) : undefined,\n })),\n };\n }\n\n private rowToUser(row: Record<string, unknown>): AuthUser {\n return {\n id: row.id as string,\n name: (row.name as string) || undefined,\n email: row.email as string,\n passwordHash: row.password_hash as string,\n role: row.role as UserRole,\n tenantId: row.tenant_id as string | undefined,\n emailVerified: (row.email_verified as number) === 1,\n locked: (row.locked as number) === 1,\n lastLogin: row.last_login as string | undefined,\n failedLoginAttempts: (row.failed_login_attempts as number) || 0,\n createdAt: row.created_at as string,\n updatedAt: row.updated_at as string,\n };\n }\n\n private rowToSession(row: Record<string, unknown>): Session {\n return {\n id: row.id as string,\n userId: row.user_id as string,\n token: row.token as string,\n refreshToken: row.refresh_token as string | undefined,\n expiresAt: row.expires_at as string,\n createdAt: row.created_at as string,\n ipAddress: row.ip_address as string | undefined,\n userAgent: row.user_agent as string | undefined,\n };\n }\n\n async findAuditLogs(\n filter: AuditLogFilter,\n ): Promise<{ logs: AuditLog[]; total: number }> {\n const result = await this.queryAuditLogs({\n action: filter.action as string | undefined,\n userId: filter.userId,\n resource: filter.resource,\n success: filter.success,\n startDate: filter.startDate,\n endDate: filter.endDate,\n limit: filter.limit,\n offset: filter.offset,\n });\n return {\n logs: result.logs.map((log) => ({\n ...log,\n action: log.action as AuditLog[\"action\"],\n })),\n total: result.total,\n };\n }\n\n async createAuditLog(\n data: Omit<AuditLog, \"id\" | \"timestamp\">,\n ): Promise<AuditLog> {\n const id = await this.logAudit({\n action: data.action,\n userId: data.userId,\n userEmail: data.userEmail,\n role: data.role,\n resource: data.resource,\n resourceId: data.resourceId,\n ipAddress: data.ipAddress,\n userAgent: data.userAgent,\n success: data.success,\n error: data.error,\n metadata: data.metadata,\n });\n const row = this.db\n ?.prepare(\"SELECT * FROM kyro_audit_logs WHERE id = ?\")\n .get(id) as Record<string, unknown> | undefined;\n return {\n ...data,\n id,\n timestamp: row ? new Date(row.timestamp as string) : new Date(),\n };\n }\n}\n"]}
|
package/dist/cli/index.cjs
CHANGED
|
@@ -354,7 +354,7 @@ authCommand.command("bootstrap").description("Create initial admin user").option
|
|
|
354
354
|
console.log(` Email: ${options.email}`);
|
|
355
355
|
console.log(` Role: ${options.role}`);
|
|
356
356
|
try {
|
|
357
|
-
const { bootstrapAdmin } = await import('../bootstrap-
|
|
357
|
+
const { bootstrapAdmin } = await import('../bootstrap-GPXZWJXU.cjs');
|
|
358
358
|
const { PostgresAuthAdapter } = await import('../postgres-auth-adapter-Z463NYJZ.cjs');
|
|
359
359
|
const { drizzle } = await import('drizzle-orm/postgres-js');
|
|
360
360
|
const { default: postgres } = await import('postgres');
|
package/dist/cli/index.js
CHANGED
|
@@ -351,7 +351,7 @@ authCommand.command("bootstrap").description("Create initial admin user").option
|
|
|
351
351
|
console.log(` Email: ${options.email}`);
|
|
352
352
|
console.log(` Role: ${options.role}`);
|
|
353
353
|
try {
|
|
354
|
-
const { bootstrapAdmin } = await import('../bootstrap-
|
|
354
|
+
const { bootstrapAdmin } = await import('../bootstrap-LI3Q7ROO.js');
|
|
355
355
|
const { PostgresAuthAdapter } = await import('../postgres-auth-adapter-7F3ECO7I.js');
|
|
356
356
|
const { drizzle } = await import('drizzle-orm/postgres-js');
|
|
357
357
|
const { default: postgres } = await import('postgres');
|
package/dist/drizzle/index.cjs
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
var chunk3ZZPZYCM_cjs = require('../chunk-3ZZPZYCM.cjs');
|
|
4
4
|
var chunkIX3ABYKZ_cjs = require('../chunk-IX3ABYKZ.cjs');
|
|
5
5
|
require('../chunk-WQBRWOQT.cjs');
|
|
6
|
-
var
|
|
6
|
+
var chunkJINGZG7I_cjs = require('../chunk-JINGZG7I.cjs');
|
|
7
7
|
require('../chunk-KOCTZKPV.cjs');
|
|
8
8
|
require('../chunk-G7VZBCD6.cjs');
|
|
9
9
|
|
|
@@ -31,19 +31,19 @@ Object.defineProperty(exports, "PostgresAuthAdapter", {
|
|
|
31
31
|
});
|
|
32
32
|
Object.defineProperty(exports, "createDatabase", {
|
|
33
33
|
enumerable: true,
|
|
34
|
-
get: function () { return
|
|
34
|
+
get: function () { return chunkJINGZG7I_cjs.createDatabase; }
|
|
35
35
|
});
|
|
36
36
|
Object.defineProperty(exports, "genId", {
|
|
37
37
|
enumerable: true,
|
|
38
|
-
get: function () { return
|
|
38
|
+
get: function () { return chunkJINGZG7I_cjs.genId; }
|
|
39
39
|
});
|
|
40
40
|
Object.defineProperty(exports, "runMigrations", {
|
|
41
41
|
enumerable: true,
|
|
42
|
-
get: function () { return
|
|
42
|
+
get: function () { return chunkJINGZG7I_cjs.runMigrations; }
|
|
43
43
|
});
|
|
44
44
|
Object.defineProperty(exports, "seedDefaultRoles", {
|
|
45
45
|
enumerable: true,
|
|
46
|
-
get: function () { return
|
|
46
|
+
get: function () { return chunkJINGZG7I_cjs.seedDefaultRoles; }
|
|
47
47
|
});
|
|
48
48
|
//# sourceMappingURL=index.cjs.map
|
|
49
49
|
//# sourceMappingURL=index.cjs.map
|
package/dist/drizzle/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { DrizzleAdapter, collectionToDrizzleSchema, createDrizzleAdapter, fieldToDrizzleType } from '../chunk-C4JJEE42.js';
|
|
2
2
|
export { PostgresAuthAdapter } from '../chunk-DBUYB32X.js';
|
|
3
3
|
import '../chunk-WOWUL7ZY.js';
|
|
4
|
-
export { createDatabase, genId, runMigrations, seedDefaultRoles } from '../chunk-
|
|
4
|
+
export { createDatabase, genId, runMigrations, seedDefaultRoles } from '../chunk-7DSDEVBA.js';
|
|
5
5
|
import '../chunk-A4USRVTQ.js';
|
|
6
6
|
import '../chunk-Z6ZWNWWR.js';
|
|
7
7
|
//# sourceMappingURL=index.js.map
|