Edit: /tmp/tsx-0/17887-3e7ce9aade39907ed8b57a0c4e898042b2626f8d (14820B)
{"code":"__filename=\"/opt/canhelp/node_modules/better-auth/dist/plugins/two-factor/backup-codes/index.mjs\";(()=>{\nvar __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf;var __hasOwnProp=Object.prototype.hasOwnProperty;var __name=(target,value)=>__defProp(target,\"name\",{value,configurable:true});var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:true})};var __copyProps=(to,from,except,desc)=>{if(from&&typeof from===\"object\"||typeof from===\"function\"){for(let key of __getOwnPropNames(from))if(!__hasOwnProp.call(to,key)&&key!==except)__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable})}return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,\"default\",{value:mod,enumerable:true}):target,mod));var __toCommonJS=mod=>__copyProps(__defProp({},\"__esModule\",{value:true}),mod);var backup_codes_exports={};__export(backup_codes_exports,{backupCode2fa:()=>backupCode2fa,generateBackupCodes:()=>generateBackupCodes});module.exports=__toCommonJS(backup_codes_exports);var import_schema=require(\"../../../db/schema.mjs\");var import_random=require(\"../../../crypto/random.mjs\");var import_crypto=require(\"../../../crypto/index.mjs\");var import_session=require(\"../../../api/routes/session.mjs\");var import_api=require(\"../../../api/index.mjs\");var import_error_code=require(\"../error-code.mjs\");var import_verify_two_factor=require(\"../verify-two-factor.mjs\");var import_error=require(\"@better-auth/core/error\");var import_json=require(\"@better-auth/core/utils/json\");var import_api2=require(\"@better-auth/core/api\");var z=__toESM(require(\"zod\"));function generateBackupCodesFn(options){return Array.from({length:options?.amount??10}).fill(null).map(()=>(0,import_random.generateRandomString)(options?.length??10,\"a-z\",\"0-9\",\"A-Z\")).map(code=>`${code.slice(0,5)}-${code.slice(5)}`)}__name(generateBackupCodesFn,\"generateBackupCodesFn\");async function generateBackupCodes(secret,options){const backupCodes=options?.customBackupCodesGenerate?options.customBackupCodesGenerate():generateBackupCodesFn(options);if(options?.storeBackupCodes===\"encrypted\")return{backupCodes,encryptedBackupCodes:await(0,import_crypto.symmetricEncrypt)({data:JSON.stringify(backupCodes),key:secret})};if(typeof options?.storeBackupCodes===\"object\"&&\"encrypt\"in options?.storeBackupCodes)return{backupCodes,encryptedBackupCodes:await options?.storeBackupCodes.encrypt(JSON.stringify(backupCodes))};return{backupCodes,encryptedBackupCodes:JSON.stringify(backupCodes)}}__name(generateBackupCodes,\"generateBackupCodes\");async function verifyBackupCode(data,key,options){const codes=await getBackupCodes(data.backupCodes,key,options);if(!codes)return{status:false,updated:null};return{status:codes.includes(data.code),updated:codes.filter(code=>code!==data.code)}}__name(verifyBackupCode,\"verifyBackupCode\");async function getBackupCodes(backupCodes,key,options){if(options?.storeBackupCodes===\"encrypted\")return(0,import_json.safeJSONParse)(await(0,import_crypto.symmetricDecrypt)({key,data:backupCodes}));if(typeof options?.storeBackupCodes===\"object\"&&\"decrypt\"in options?.storeBackupCodes)return(0,import_json.safeJSONParse)(await options?.storeBackupCodes.decrypt(backupCodes));return(0,import_json.safeJSONParse)(backupCodes)}__name(getBackupCodes,\"getBackupCodes\");const verifyBackupCodeBodySchema=z.object({code:z.string().meta({description:`A backup code to verify. Eg: \"123456\"`}),disableSession:z.boolean().meta({description:\"If true, the session cookie will not be set.\"}).optional(),trustDevice:z.boolean().meta({description:\"If true, the device will be trusted for 30 days. It'll be refreshed on every sign in request within this time. Eg: true\"}).optional()});const viewBackupCodesBodySchema=z.object({userId:z.coerce.string().meta({description:`The user ID to view all backup codes. Eg: \"user-id\"`})});const generateBackupCodesBodySchema=z.object({password:z.string().meta({description:\"The users password.\"})});const backupCode2fa=__name(opts=>{const twoFactorTable=\"twoFactor\";return{id:\"backup_code\",endpoints:{verifyBackupCode:(0,import_api2.createAuthEndpoint)(\"/two-factor/verify-backup-code\",{method:\"POST\",body:verifyBackupCodeBodySchema,metadata:{openapi:{description:\"Verify a backup code for two-factor authentication\",responses:{\"200\":{description:\"Backup code verified successfully\",content:{\"application/json\":{schema:{type:\"object\",properties:{user:{type:\"object\",properties:{id:{type:\"string\",description:\"Unique identifier of the user\"},email:{type:\"string\",format:\"email\",nullable:true,description:\"User's email address\"},emailVerified:{type:\"boolean\",nullable:true,description:\"Whether the email is verified\"},name:{type:\"string\",nullable:true,description:\"User's name\"},image:{type:\"string\",format:\"uri\",nullable:true,description:\"User's profile image URL\"},twoFactorEnabled:{type:\"boolean\",description:\"Whether two-factor authentication is enabled for the user\"},createdAt:{type:\"string\",format:\"date-time\",description:\"Timestamp when the user was created\"},updatedAt:{type:\"string\",format:\"date-time\",description:\"Timestamp when the user was last updated\"}},required:[\"id\",\"twoFactorEnabled\",\"createdAt\",\"updatedAt\"],description:\"The authenticated user object with two-factor details\"},session:{type:\"object\",properties:{token:{type:\"string\",description:\"Session token\"},userId:{type:\"string\",description:\"ID of the user associated with the session\"},createdAt:{type:\"string\",format:\"date-time\",description:\"Timestamp when the session was created\"},expiresAt:{type:\"string\",format:\"date-time\",description:\"Timestamp when the session expires\"}},required:[\"token\",\"userId\",\"createdAt\",\"expiresAt\"],description:\"The current session object, included unless disableSession is true\"}},required:[\"user\",\"session\"]}}}}}}}},async ctx=>{const{session,valid}=await(0,import_verify_two_factor.verifyTwoFactor)(ctx);const user=session.user;const twoFactor=await ctx.context.adapter.findOne({model:twoFactorTable,where:[{field:\"userId\",value:user.id}]});if(!twoFactor)throw import_error.APIError.from(\"BAD_REQUEST\",import_error_code.TWO_FACTOR_ERROR_CODES.BACKUP_CODES_NOT_ENABLED);const validate=await verifyBackupCode({backupCodes:twoFactor.backupCodes,code:ctx.body.code},ctx.context.secretConfig,opts);if(!validate.status)throw import_error.APIError.from(\"UNAUTHORIZED\",import_error_code.TWO_FACTOR_ERROR_CODES.INVALID_BACKUP_CODE);const updatedBackupCodes=await(0,import_crypto.symmetricEncrypt)({key:ctx.context.secretConfig,data:JSON.stringify(validate.updated)});if(!await ctx.context.adapter.update({model:twoFactorTable,update:{backupCodes:updatedBackupCodes},where:[{field:\"id\",value:twoFactor.id},{field:\"backupCodes\",value:twoFactor.backupCodes}]}))throw import_error.APIError.fromStatus(\"CONFLICT\",{message:\"Failed to verify backup code. Please try again.\"});if(!ctx.body.disableSession)return valid(ctx);return ctx.json({token:session.session?.token,user:(0,import_schema.parseUserOutput)(ctx.context.options,session.user)})}),generateBackupCodes:(0,import_api2.createAuthEndpoint)(\"/two-factor/generate-backup-codes\",{method:\"POST\",body:generateBackupCodesBodySchema,use:[import_session.sessionMiddleware],metadata:{openapi:{description:\"Generate new backup codes for two-factor authentication\",responses:{\"200\":{description:\"Backup codes generated successfully\",content:{\"application/json\":{schema:{type:\"object\",properties:{status:{type:\"boolean\",description:\"Indicates if the backup codes were generated successfully\",enum:[true]},backupCodes:{type:\"array\",items:{type:\"string\"},description:\"Array of generated backup codes in plain text\"}},required:[\"status\",\"backupCodes\"]}}}}}}}},async ctx=>{const user=ctx.context.session.user;if(!user.twoFactorEnabled)throw import_error.APIError.from(\"BAD_REQUEST\",import_error_code.TWO_FACTOR_ERROR_CODES.TWO_FACTOR_NOT_ENABLED);await ctx.context.password.checkPassword(user.id,ctx);const twoFactor=await ctx.context.adapter.findOne({model:twoFactorTable,where:[{field:\"userId\",value:user.id}]});if(!twoFactor)throw import_error.APIError.from(\"BAD_REQUEST\",import_error_code.TWO_FACTOR_ERROR_CODES.TWO_FACTOR_NOT_ENABLED);const backupCodes=await generateBackupCodes(ctx.context.secretConfig,opts);await ctx.context.adapter.update({model:twoFactorTable,update:{backupCodes:backupCodes.encryptedBackupCodes},where:[{field:\"id\",value:twoFactor.id}]});return ctx.json({status:true,backupCodes:backupCodes.backupCodes})}),viewBackupCodes:(0,import_api2.createAuthEndpoint)({method:\"POST\",body:viewBackupCodesBodySchema},async ctx=>{const twoFactor=await ctx.context.adapter.findOne({model:twoFactorTable,where:[{field:\"userId\",value:ctx.body.userId}]});if(!twoFactor)throw import_error.APIError.from(\"BAD_REQUEST\",import_error_code.TWO_FACTOR_ERROR_CODES.BACKUP_CODES_NOT_ENABLED);const decryptedBackupCodes=await getBackupCodes(twoFactor.backupCodes,ctx.context.secretConfig,opts);if(!decryptedBackupCodes)throw import_error.APIError.from(\"BAD_REQUEST\",import_error_code.TWO_FACTOR_ERROR_CODES.INVALID_BACKUP_CODE);return ctx.json({status:true,backupCodes:decryptedBackupCodes})})}}},\"backupCode2fa\");0&&(module.exports={backupCode2fa,generateBackupCodes});\n})()\n","warnings":[],"map":{"version":3,"mappings":"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","names":["import_api"],"ignoreList":[],"sources":["/opt/canhelp/node_modules/better-auth/dist/plugins/two-factor/backup-codes/index.mjs"],"sourcesContent":[null]}}