UNPKG

@lucidcms/core

Version:

The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.

1 lines 5.58 kB
{"version":3,"file":"check-update-password.mjs","names":["constants"],"sources":["../../../../src/services/account/checks/check-update-password.ts"],"sourcesContent":["import { scrypt } from \"@noble/hashes/scrypt.js\";\nimport constants from \"../../../constants/constants.js\";\nimport { copy } from \"../../../libs/i18n/index.js\";\nimport { decrypt } from \"../../../utils/helpers/encrypt-decrypt.js\";\nimport generateSecret from \"../../../utils/helpers/generate-secret.js\";\nimport type { ServiceFn } from \"../../../utils/services/types.js\";\n\nconst checkPassed = (value: string | undefined) => {\n\treturn value !== undefined && value.trim() !== \"\";\n};\n\nconst checkUpdatePassword: ServiceFn<\n\t[\n\t\t{\n\t\t\tencryptedSecret: string;\n\t\t\tpassword: string; // the users hashed password\n\t\t\tcurrentPassword?: string;\n\t\t\tnewPassword?: string;\n\t\t\tpasswordConfirmation?: string;\n\t\t\tencryptionKey: string;\n\t\t},\n\t],\n\t{\n\t\tnewPassword: string | undefined;\n\t\ttriggerPasswordReset: boolean | undefined;\n\t\tencryptSecret: string | undefined;\n\t}\n> = async (_, data) => {\n\tlet newPassword: string | undefined;\n\tlet triggerPasswordReset: boolean | undefined;\n\n\t// if current password is undefined/empty, and new password is passed\n\tif (\n\t\tcheckPassed(data.newPassword) &&\n\t\tcheckPassed(data.currentPassword) === false\n\t) {\n\t\treturn {\n\t\t\terror: {\n\t\t\t\ttype: \"basic\",\n\t\t\t\tmessage: copy(\"server:core.input.provide.current.password\"),\n\t\t\t\tstatus: 400,\n\t\t\t\terrors: {\n\t\t\t\t\tcurrentPassword: {\n\t\t\t\t\t\tcode: \"required\",\n\t\t\t\t\t\tmessage: copy(\"server:core.input.provide.current.password\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\n\t// if current password is passed, but new password is not\n\tif (\n\t\tcheckPassed(data.currentPassword) &&\n\t\tcheckPassed(data.newPassword) === false\n\t) {\n\t\treturn {\n\t\t\terror: {\n\t\t\t\ttype: \"basic\",\n\t\t\t\tmessage: copy(\"server:core.input.provide.new.password\"),\n\t\t\t\tstatus: 400,\n\t\t\t\terrors: {\n\t\t\t\t\tnewPassword: {\n\t\t\t\t\t\tcode: \"required\",\n\t\t\t\t\t\tmessage: copy(\"server:core.input.provide.new.password\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\n\tif (!checkPassed(data.newPassword) && !checkPassed(data.currentPassword)) {\n\t\treturn {\n\t\t\terror: undefined,\n\t\t\tdata: {\n\t\t\t\tnewPassword: newPassword,\n\t\t\t\ttriggerPasswordReset: triggerPasswordReset,\n\t\t\t\tencryptSecret: undefined,\n\t\t\t},\n\t\t};\n\t}\n\n\t// if new password does not match password confirmation\n\tif (data.newPassword !== data.passwordConfirmation) {\n\t\treturn {\n\t\t\terror: {\n\t\t\t\ttype: \"basic\",\n\t\t\t\tmessage: copy(\"server:core.input.ensure.passwords.match\"),\n\t\t\t\tstatus: 400,\n\t\t\t\terrors: {\n\t\t\t\t\tpasswordConfirmation: {\n\t\t\t\t\t\tcode: \"invalid\",\n\t\t\t\t\t\tmessage: copy(\"server:core.input.ensure.passwords.match\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\n\tconst decryptedSecret = decrypt(data.encryptedSecret, data.encryptionKey);\n\tconst currentPasswordHash = Buffer.from(\n\t\tscrypt(data.currentPassword as string, decryptedSecret, constants.scrypt),\n\t).toString(\"base64\");\n\n\tconst passwordValid = currentPasswordHash === data.password;\n\n\tif (!passwordValid) {\n\t\treturn {\n\t\t\terror: {\n\t\t\t\ttype: \"basic\",\n\t\t\t\tmessage: copy(\"server:core.input.ensure.password.is.correct\"),\n\t\t\t\tstatus: 400,\n\t\t\t\terrors: {\n\t\t\t\t\tcurrentPassword: {\n\t\t\t\t\t\tcode: \"invalid\",\n\t\t\t\t\t\tmessage: copy(\"server:core.input.ensure.password.is.correct\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\n\tconst { secret, encryptSecret } = generateSecret(data.encryptionKey);\n\n\tnewPassword = Buffer.from(\n\t\tscrypt(data.newPassword as string, secret, constants.scrypt),\n\t).toString(\"base64\");\n\n\ttriggerPasswordReset = false as const;\n\n\treturn {\n\t\terror: undefined,\n\t\tdata: {\n\t\t\tnewPassword: newPassword,\n\t\t\ttriggerPasswordReset: triggerPasswordReset,\n\t\t\tencryptSecret: encryptSecret,\n\t\t},\n\t};\n};\n\nexport default checkUpdatePassword;\n"],"mappings":"mRAOA,MAAM,EAAe,GACb,IAAU,IAAA,IAAa,EAAM,KAAK,IAAM,GAG1C,EAgBF,MAAO,EAAG,IAAS,CACtB,IAAI,EACA,EAGJ,GACC,EAAY,EAAK,WAAW,GAC5B,EAAY,EAAK,eAAe,IAAM,GAEtC,MAAO,CACN,MAAO,CACN,KAAM,QACN,QAAS,EAAK,4CAA4C,EAC1D,OAAQ,IACR,OAAQ,CACP,gBAAiB,CAChB,KAAM,WACN,QAAS,EAAK,4CAA4C,CAC3D,CACD,CACD,EACA,KAAM,IAAA,EACP,EAID,GACC,EAAY,EAAK,eAAe,GAChC,EAAY,EAAK,WAAW,IAAM,GAElC,MAAO,CACN,MAAO,CACN,KAAM,QACN,QAAS,EAAK,wCAAwC,EACtD,OAAQ,IACR,OAAQ,CACP,YAAa,CACZ,KAAM,WACN,QAAS,EAAK,wCAAwC,CACvD,CACD,CACD,EACA,KAAM,IAAA,EACP,EAGD,GAAI,CAAC,EAAY,EAAK,WAAW,GAAK,CAAC,EAAY,EAAK,eAAe,EACtE,MAAO,CACN,MAAO,IAAA,GACP,KAAM,CACQ,cACS,uBACtB,cAAe,IAAA,EAChB,CACD,EAID,GAAI,EAAK,cAAgB,EAAK,qBAC7B,MAAO,CACN,MAAO,CACN,KAAM,QACN,QAAS,EAAK,0CAA0C,EACxD,OAAQ,IACR,OAAQ,CACP,qBAAsB,CACrB,KAAM,UACN,QAAS,EAAK,0CAA0C,CACzD,CACD,CACD,EACA,KAAM,IAAA,EACP,EAGD,IAAM,EAAkB,EAAQ,EAAK,gBAAiB,EAAK,aAAa,EAOxE,GAN4B,OAAO,KAClC,EAAO,EAAK,gBAA2B,EAAiBA,EAAU,MAAM,CACzE,CAAC,CAAC,SAAS,QAE6B,IAAM,EAAK,SAGlD,MAAO,CACN,MAAO,CACN,KAAM,QACN,QAAS,EAAK,8CAA8C,EAC5D,OAAQ,IACR,OAAQ,CACP,gBAAiB,CAChB,KAAM,UACN,QAAS,EAAK,8CAA8C,CAC7D,CACD,CACD,EACA,KAAM,IAAA,EACP,EAGD,GAAM,CAAE,SAAQ,iBAAkB,EAAe,EAAK,aAAa,EAQnE,MANA,GAAc,OAAO,KACpB,EAAO,EAAK,YAAuB,EAAQA,EAAU,MAAM,CAC5D,CAAC,CAAC,SAAS,QAAQ,EAEnB,EAAuB,GAEhB,CACN,MAAO,IAAA,GACP,KAAM,CACQ,cACS,uBACP,eAChB,CACD,CACD"}