payload 4.0.0-internal.ea6e8f8 → 4.0.0-internal.ee5d8bd
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/admin/adapters/router.d.ts +1 -1
- package/dist/admin/adapters/router.d.ts.map +1 -1
- package/dist/admin/adapters/router.js.map +1 -1
- package/dist/admin/forms/Diff.d.ts +0 -4
- package/dist/admin/forms/Diff.d.ts.map +1 -1
- package/dist/admin/forms/Diff.js.map +1 -1
- package/dist/admin/forms/Form.d.ts +0 -2
- package/dist/admin/forms/Form.d.ts.map +1 -1
- package/dist/admin/forms/Form.js.map +1 -1
- package/dist/admin/initAdminContext.d.ts.map +1 -1
- package/dist/admin/initAdminContext.js +0 -10
- package/dist/admin/initAdminContext.js.map +1 -1
- package/dist/auth/createAuthToken.d.ts +26 -0
- package/dist/auth/createAuthToken.d.ts.map +1 -0
- package/dist/auth/createAuthToken.js +39 -0
- package/dist/auth/createAuthToken.js.map +1 -0
- package/dist/auth/endpoints/refresh.d.ts.map +1 -1
- package/dist/auth/endpoints/refresh.js +2 -1
- package/dist/auth/endpoints/refresh.js.map +1 -1
- package/dist/auth/getFieldsToSign.js.map +1 -1
- package/dist/auth/loginWithCookie.d.ts.map +1 -1
- package/dist/auth/loginWithCookie.js +1 -0
- package/dist/auth/loginWithCookie.js.map +1 -1
- package/dist/auth/operations/local/login.d.ts.map +1 -1
- package/dist/auth/operations/local/login.js +1 -0
- package/dist/auth/operations/local/login.js.map +1 -1
- package/dist/auth/operations/login.d.ts +2 -0
- package/dist/auth/operations/login.d.ts.map +1 -1
- package/dist/auth/operations/login.js +6 -19
- package/dist/auth/operations/login.js.map +1 -1
- package/dist/auth/operations/refresh.d.ts +8 -0
- package/dist/auth/operations/refresh.d.ts.map +1 -1
- package/dist/auth/operations/refresh.js +50 -19
- package/dist/auth/operations/refresh.js.map +1 -1
- package/dist/auth/operations/resetPassword.d.ts.map +1 -1
- package/dist/auth/operations/resetPassword.js +54 -20
- package/dist/auth/operations/resetPassword.js.map +1 -1
- package/dist/auth/refreshAuthToken.d.ts +32 -0
- package/dist/auth/refreshAuthToken.d.ts.map +1 -0
- package/dist/auth/refreshAuthToken.js +113 -0
- package/dist/auth/refreshAuthToken.js.map +1 -0
- package/dist/auth/serverFunctions/cookies.js.map +1 -1
- package/dist/auth/serverFunctions/login.js.map +1 -1
- package/dist/auth/sessions.d.ts +9 -2
- package/dist/auth/sessions.d.ts.map +1 -1
- package/dist/auth/sessions.js +6 -5
- package/dist/auth/sessions.js.map +1 -1
- package/dist/auth/types.d.ts +25 -1
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/auth/types.js.map +1 -1
- package/dist/cli/commands/data/utilities.d.ts +1 -1
- package/dist/cli/commands/data/utilities.d.ts.map +1 -1
- package/dist/cli/commands/data/utilities.js.map +1 -1
- package/dist/cli/defineCLICommand.js +1 -1
- package/dist/cli/defineCLICommand.js.map +1 -1
- package/dist/collections/config/client.d.ts +1 -1
- package/dist/collections/config/client.d.ts.map +1 -1
- package/dist/collections/config/client.js +0 -1
- package/dist/collections/config/client.js.map +1 -1
- package/dist/collections/config/defaults.d.ts +2 -0
- package/dist/collections/config/defaults.d.ts.map +1 -1
- package/dist/collections/config/defaults.js +4 -0
- package/dist/collections/config/defaults.js.map +1 -1
- package/dist/collections/config/sanitize.d.ts.map +1 -1
- package/dist/collections/config/sanitize.js +3 -0
- package/dist/collections/config/sanitize.js.map +1 -1
- package/dist/collections/config/sanitizeCompoundIndexes.d.ts.map +1 -1
- package/dist/collections/config/sanitizeCompoundIndexes.js +0 -9
- package/dist/collections/config/sanitizeCompoundIndexes.js.map +1 -1
- package/dist/collections/config/types.d.ts +4 -21
- package/dist/collections/config/types.d.ts.map +1 -1
- package/dist/collections/config/types.js.map +1 -1
- package/dist/collections/dataloader.d.ts +1 -10
- package/dist/collections/dataloader.d.ts.map +1 -1
- package/dist/collections/dataloader.js +6 -14
- package/dist/collections/dataloader.js.map +1 -1
- package/dist/collections/operations/create.d.ts.map +1 -1
- package/dist/collections/operations/create.js +0 -13
- package/dist/collections/operations/create.js.map +1 -1
- package/dist/collections/operations/delete.d.ts.map +1 -1
- package/dist/collections/operations/delete.js +121 -638
- package/dist/collections/operations/delete.js.map +1 -1
- package/dist/collections/operations/deleteByID.d.ts.map +1 -1
- package/dist/collections/operations/deleteByID.js +32 -238
- package/dist/collections/operations/deleteByID.js.map +1 -1
- package/dist/collections/operations/findByID.d.ts.map +1 -1
- package/dist/collections/operations/findByID.js +0 -6
- package/dist/collections/operations/findByID.js.map +1 -1
- package/dist/collections/operations/findDistinct.d.ts.map +1 -1
- package/dist/collections/operations/findDistinct.js +6 -7
- package/dist/collections/operations/findDistinct.js.map +1 -1
- package/dist/collections/operations/findVersionByID.d.ts.map +1 -1
- package/dist/collections/operations/findVersionByID.js +7 -0
- package/dist/collections/operations/findVersionByID.js.map +1 -1
- package/dist/collections/operations/findVersions.d.ts.map +1 -1
- package/dist/collections/operations/findVersions.js +5 -0
- package/dist/collections/operations/findVersions.js.map +1 -1
- package/dist/collections/operations/local/count.d.ts +4 -9
- package/dist/collections/operations/local/count.d.ts.map +1 -1
- package/dist/collections/operations/local/count.js.map +1 -1
- package/dist/collections/operations/local/countVersions.d.ts +0 -4
- package/dist/collections/operations/local/countVersions.d.ts.map +1 -1
- package/dist/collections/operations/local/countVersions.js.map +1 -1
- package/dist/collections/operations/local/create.d.ts +4 -9
- package/dist/collections/operations/local/create.d.ts.map +1 -1
- package/dist/collections/operations/local/create.js.map +1 -1
- package/dist/collections/operations/local/delete.d.ts +4 -9
- package/dist/collections/operations/local/delete.d.ts.map +1 -1
- package/dist/collections/operations/local/delete.js.map +1 -1
- package/dist/collections/operations/local/duplicate.d.ts +0 -5
- package/dist/collections/operations/local/duplicate.d.ts.map +1 -1
- package/dist/collections/operations/local/duplicate.js.map +1 -1
- package/dist/collections/operations/local/find.d.ts +4 -9
- package/dist/collections/operations/local/find.d.ts.map +1 -1
- package/dist/collections/operations/local/find.js.map +1 -1
- package/dist/collections/operations/local/findByID.d.ts +4 -9
- package/dist/collections/operations/local/findByID.d.ts.map +1 -1
- package/dist/collections/operations/local/findByID.js.map +1 -1
- package/dist/collections/operations/local/findDistinct.d.ts +0 -5
- package/dist/collections/operations/local/findDistinct.d.ts.map +1 -1
- package/dist/collections/operations/local/findDistinct.js.map +1 -1
- package/dist/collections/operations/local/findVersionByID.d.ts +0 -5
- package/dist/collections/operations/local/findVersionByID.d.ts.map +1 -1
- package/dist/collections/operations/local/findVersionByID.js.map +1 -1
- package/dist/collections/operations/local/findVersions.d.ts +0 -5
- package/dist/collections/operations/local/findVersions.d.ts.map +1 -1
- package/dist/collections/operations/local/findVersions.js.map +1 -1
- package/dist/collections/operations/local/restoreVersion.d.ts +0 -5
- package/dist/collections/operations/local/restoreVersion.d.ts.map +1 -1
- package/dist/collections/operations/local/restoreVersion.js.map +1 -1
- package/dist/collections/operations/local/update.d.ts +4 -9
- package/dist/collections/operations/local/update.d.ts.map +1 -1
- package/dist/collections/operations/local/update.js.map +1 -1
- package/dist/collections/operations/renameFile.js +1 -1
- package/dist/collections/operations/renameFile.js.map +1 -1
- package/dist/collections/operations/restoreVersion.d.ts.map +1 -1
- package/dist/collections/operations/restoreVersion.js +76 -157
- package/dist/collections/operations/restoreVersion.js.map +1 -1
- package/dist/collections/operations/update.d.ts.map +1 -1
- package/dist/collections/operations/update.js +171 -357
- package/dist/collections/operations/update.js.map +1 -1
- package/dist/collections/operations/updateByID.d.ts +0 -15
- package/dist/collections/operations/updateByID.d.ts.map +1 -1
- package/dist/collections/operations/updateByID.js +60 -265
- package/dist/collections/operations/updateByID.js.map +1 -1
- package/dist/collections/operations/utilities/buildBeforeOperation.d.ts.map +1 -1
- package/dist/collections/operations/utilities/buildBeforeOperation.js +0 -7
- package/dist/collections/operations/utilities/buildBeforeOperation.js.map +1 -1
- package/dist/collections/operations/utilities/update.d.ts +1 -14
- package/dist/collections/operations/utilities/update.d.ts.map +1 -1
- package/dist/collections/operations/utilities/update.js +20 -92
- package/dist/collections/operations/utilities/update.js.map +1 -1
- package/dist/collections/operations/validate.js +4 -4
- package/dist/collections/operations/validate.js.map +1 -1
- package/dist/config/client.d.ts +1 -3
- package/dist/config/client.d.ts.map +1 -1
- package/dist/config/client.js +1 -9
- package/dist/config/client.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +1 -0
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/definePlugin.js.map +1 -1
- package/dist/config/sanitize.d.ts.map +1 -1
- package/dist/config/sanitize.js +2 -40
- package/dist/config/sanitize.js.map +1 -1
- package/dist/config/types.d.ts +13 -21
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/database/defaultCopy.d.ts.map +1 -1
- package/dist/database/defaultCopy.js +0 -1
- package/dist/database/defaultCopy.js.map +1 -1
- package/dist/database/types.d.ts +4 -75
- package/dist/database/types.d.ts.map +1 -1
- package/dist/database/types.js.map +1 -1
- package/dist/exports/build-config.d.ts +9 -0
- package/dist/exports/build-config.d.ts.map +1 -0
- package/dist/exports/build-config.js +38 -0
- package/dist/exports/build-config.js.map +1 -0
- package/dist/exports/shared.d.ts +0 -2
- package/dist/exports/shared.d.ts.map +1 -1
- package/dist/exports/shared.js +0 -2
- package/dist/exports/shared.js.map +1 -1
- package/dist/fields/baseFields/authorship/index.d.ts +1 -2
- package/dist/fields/baseFields/authorship/index.d.ts.map +1 -1
- package/dist/fields/baseFields/authorship/index.js +0 -12
- package/dist/fields/baseFields/authorship/index.js.map +1 -1
- package/dist/fields/config/client.js.map +1 -1
- package/dist/fields/config/reservedFieldNames.d.ts.map +1 -1
- package/dist/fields/config/reservedFieldNames.js.map +1 -1
- package/dist/fields/config/types.d.ts.map +1 -1
- package/dist/fields/config/types.js.map +1 -1
- package/dist/fields/hooks/afterChange/promise.js.map +1 -1
- package/dist/fields/hooks/afterRead/index.d.ts +0 -8
- package/dist/fields/hooks/afterRead/index.d.ts.map +1 -1
- package/dist/fields/hooks/afterRead/index.js +2 -6
- package/dist/fields/hooks/afterRead/index.js.map +1 -1
- package/dist/fields/hooks/afterRead/promise.d.ts +1 -3
- package/dist/fields/hooks/afterRead/promise.d.ts.map +1 -1
- package/dist/fields/hooks/afterRead/promise.js +17 -41
- package/dist/fields/hooks/afterRead/promise.js.map +1 -1
- package/dist/fields/hooks/afterRead/relationshipPopulationPromise.d.ts.map +1 -1
- package/dist/fields/hooks/afterRead/relationshipPopulationPromise.js +0 -2
- package/dist/fields/hooks/afterRead/relationshipPopulationPromise.js.map +1 -1
- package/dist/fields/hooks/afterRead/traverseFields.d.ts +1 -3
- package/dist/fields/hooks/afterRead/traverseFields.d.ts.map +1 -1
- package/dist/fields/hooks/afterRead/traverseFields.js +2 -4
- package/dist/fields/hooks/afterRead/traverseFields.js.map +1 -1
- package/dist/fields/hooks/afterRead/virtualFieldPopulationPromise.d.ts.map +1 -1
- package/dist/fields/hooks/afterRead/virtualFieldPopulationPromise.js +0 -3
- package/dist/fields/hooks/afterRead/virtualFieldPopulationPromise.js.map +1 -1
- package/dist/fields/hooks/beforeChange/flattenValidationData.d.ts +14 -0
- package/dist/fields/hooks/beforeChange/flattenValidationData.d.ts.map +1 -0
- package/dist/fields/hooks/beforeChange/flattenValidationData.js +36 -0
- package/dist/fields/hooks/beforeChange/flattenValidationData.js.map +1 -0
- package/dist/fields/hooks/beforeChange/promise.d.ts +2 -1
- package/dist/fields/hooks/beforeChange/promise.d.ts.map +1 -1
- package/dist/fields/hooks/beforeChange/promise.js +96 -22
- package/dist/fields/hooks/beforeChange/promise.js.map +1 -1
- package/dist/fields/hooks/beforeChange/traverseFields.d.ts +2 -1
- package/dist/fields/hooks/beforeChange/traverseFields.d.ts.map +1 -1
- package/dist/fields/hooks/beforeChange/traverseFields.js +2 -1
- package/dist/fields/hooks/beforeChange/traverseFields.js.map +1 -1
- package/dist/fields/hooks/beforeValidate/promise.d.ts.map +1 -1
- package/dist/fields/hooks/beforeValidate/promise.js +0 -8
- package/dist/fields/hooks/beforeValidate/promise.js.map +1 -1
- package/dist/fields/validations.d.ts.map +1 -1
- package/dist/fields/validations.js +4 -1
- package/dist/fields/validations.js.map +1 -1
- package/dist/globals/config/types.d.ts +2 -6
- package/dist/globals/config/types.d.ts.map +1 -1
- package/dist/globals/config/types.js.map +1 -1
- package/dist/globals/operations/countGlobalVersions.d.ts.map +1 -1
- package/dist/globals/operations/countGlobalVersions.js +0 -7
- package/dist/globals/operations/countGlobalVersions.js.map +1 -1
- package/dist/globals/operations/findOne.d.ts.map +1 -1
- package/dist/globals/operations/findOne.js +0 -7
- package/dist/globals/operations/findOne.js.map +1 -1
- package/dist/globals/operations/findVersionByID.d.ts.map +1 -1
- package/dist/globals/operations/findVersionByID.js +6 -6
- package/dist/globals/operations/findVersionByID.js.map +1 -1
- package/dist/globals/operations/findVersions.d.ts.map +1 -1
- package/dist/globals/operations/findVersions.js +4 -6
- package/dist/globals/operations/findVersions.js.map +1 -1
- package/dist/globals/operations/local/countVersions.d.ts +0 -5
- package/dist/globals/operations/local/countVersions.d.ts.map +1 -1
- package/dist/globals/operations/local/countVersions.js.map +1 -1
- package/dist/globals/operations/local/findOne.d.ts +0 -5
- package/dist/globals/operations/local/findOne.d.ts.map +1 -1
- package/dist/globals/operations/local/findOne.js.map +1 -1
- package/dist/globals/operations/local/findVersionByID.d.ts +0 -5
- package/dist/globals/operations/local/findVersionByID.d.ts.map +1 -1
- package/dist/globals/operations/local/findVersionByID.js.map +1 -1
- package/dist/globals/operations/local/findVersions.d.ts +0 -5
- package/dist/globals/operations/local/findVersions.d.ts.map +1 -1
- package/dist/globals/operations/local/findVersions.js.map +1 -1
- package/dist/globals/operations/local/restoreVersion.d.ts +0 -5
- package/dist/globals/operations/local/restoreVersion.d.ts.map +1 -1
- package/dist/globals/operations/local/restoreVersion.js.map +1 -1
- package/dist/globals/operations/local/update.d.ts +0 -5
- package/dist/globals/operations/local/update.d.ts.map +1 -1
- package/dist/globals/operations/local/update.js +18 -61
- package/dist/globals/operations/local/update.js.map +1 -1
- package/dist/globals/operations/restoreVersion.d.ts +2 -3
- package/dist/globals/operations/restoreVersion.d.ts.map +1 -1
- package/dist/globals/operations/restoreVersion.js +24 -61
- package/dist/globals/operations/restoreVersion.js.map +1 -1
- package/dist/globals/operations/update.d.ts.map +1 -1
- package/dist/globals/operations/update.js +8 -86
- package/dist/globals/operations/update.js.map +1 -1
- package/dist/globals/operations/validate.js +1 -1
- package/dist/globals/operations/validate.js.map +1 -1
- package/dist/hierarchy/addHierarchyToCollection.d.ts.map +1 -1
- package/dist/hierarchy/addHierarchyToCollection.js +32 -21
- package/dist/hierarchy/addHierarchyToCollection.js.map +1 -1
- package/dist/hierarchy/createFolderField.js.map +1 -1
- package/dist/hierarchy/getInitialTreeData.d.ts +1 -3
- package/dist/hierarchy/getInitialTreeData.d.ts.map +1 -1
- package/dist/hierarchy/getInitialTreeData.js +1 -4
- package/dist/hierarchy/getInitialTreeData.js.map +1 -1
- package/dist/hierarchy/resolveHierarchyCollections.js +9 -3
- package/dist/hierarchy/resolveHierarchyCollections.js.map +1 -1
- package/dist/hierarchy/utils/computePaths.d.ts.map +1 -1
- package/dist/hierarchy/utils/computePaths.js.map +1 -1
- package/dist/index.bundled.d.ts +4336 -5501
- package/dist/index.d.ts +27 -51
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -37
- package/dist/index.js.map +1 -1
- package/dist/llm-instructions/getInstructionsCollection.d.ts.map +1 -1
- package/dist/llm-instructions/getInstructionsCollection.js +2 -0
- package/dist/llm-instructions/getInstructionsCollection.js.map +1 -1
- package/dist/preferences/keys.d.ts +4 -11
- package/dist/preferences/keys.d.ts.map +1 -1
- package/dist/preferences/keys.js +3 -10
- package/dist/preferences/keys.js.map +1 -1
- package/dist/preferences/types.d.ts +0 -19
- package/dist/preferences/types.d.ts.map +1 -1
- package/dist/preferences/types.js.map +1 -1
- package/dist/queues/operations/runJobs/runJob/getRunTaskFunction.js +1 -1
- package/dist/queues/operations/runJobs/runJob/getRunTaskFunction.js.map +1 -1
- package/dist/types/index.d.ts +0 -13
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/uploads/deleteAssociatedFiles.d.ts.map +1 -1
- package/dist/uploads/deleteAssociatedFiles.js +29 -108
- package/dist/uploads/deleteAssociatedFiles.js.map +1 -1
- package/dist/uploads/endpoints/getFile.d.ts.map +1 -1
- package/dist/uploads/endpoints/getFile.js +0 -5
- package/dist/uploads/endpoints/getFile.js.map +1 -1
- package/dist/uploads/fileExists.d.ts.map +1 -1
- package/dist/uploads/fileExists.js +2 -5
- package/dist/uploads/fileExists.js.map +1 -1
- package/dist/uploads/fileVersioning/archive.d.ts.map +1 -1
- package/dist/uploads/fileVersioning/archive.js +1 -15
- package/dist/uploads/fileVersioning/archive.js.map +1 -1
- package/dist/uploads/fileVersioning/cleanup.d.ts +0 -7
- package/dist/uploads/fileVersioning/cleanup.d.ts.map +1 -1
- package/dist/uploads/fileVersioning/cleanup.js +0 -12
- package/dist/uploads/fileVersioning/cleanup.js.map +1 -1
- package/dist/uploads/fileVersioning/cloudStorage.d.ts.map +1 -1
- package/dist/uploads/fileVersioning/cloudStorage.js +1 -16
- package/dist/uploads/fileVersioning/cloudStorage.js.map +1 -1
- package/dist/uploads/fileVersioning/resolveHistoricalFile.js.map +1 -1
- package/dist/uploads/formatFilesize.js +1 -1
- package/dist/uploads/formatFilesize.js.map +1 -1
- package/dist/uploads/generateFileData.d.ts +0 -5
- package/dist/uploads/generateFileData.d.ts.map +1 -1
- package/dist/uploads/generateFileData.js +2 -74
- package/dist/uploads/generateFileData.js.map +1 -1
- package/dist/uploads/getBaseFields.d.ts.map +1 -1
- package/dist/uploads/getBaseFields.js +29 -46
- package/dist/uploads/getBaseFields.js.map +1 -1
- package/dist/uploads/getFileContentRequirement.js.map +1 -1
- package/dist/uploads/getFileFromUploadInstructions.js.map +1 -1
- package/dist/uploads/getSafeFilename.d.ts.map +1 -1
- package/dist/uploads/getSafeFilename.js +3 -5
- package/dist/uploads/getSafeFilename.js.map +1 -1
- package/dist/uploads/safeFetch.js.map +1 -1
- package/dist/uploads/stagedUpload.js.map +1 -1
- package/dist/uploads/transformers/handleDynamicFileRequest.js +11 -2
- package/dist/uploads/transformers/handleDynamicFileRequest.js.map +1 -1
- package/dist/uploads/types.d.ts +0 -11
- package/dist/uploads/types.d.ts.map +1 -1
- package/dist/uploads/types.js.map +1 -1
- package/dist/uploads/uploadFiles.d.ts +1 -4
- package/dist/uploads/uploadFiles.d.ts.map +1 -1
- package/dist/uploads/uploadFiles.js +5 -29
- package/dist/uploads/uploadFiles.js.map +1 -1
- package/dist/utilities/addSelectGenericsToGeneretedTypes.d.ts.map +1 -1
- package/dist/utilities/addSelectGenericsToGeneretedTypes.js +0 -1
- package/dist/utilities/addSelectGenericsToGeneretedTypes.js.map +1 -1
- package/dist/utilities/appendDateTimezoneSelectFields.js.map +1 -1
- package/dist/utilities/assertNoValidationWrite.d.ts.map +1 -1
- package/dist/utilities/assertNoValidationWrite.js +0 -4
- package/dist/utilities/assertNoValidationWrite.js.map +1 -1
- package/dist/utilities/checkDocumentLockStatus.d.ts +6 -15
- package/dist/utilities/checkDocumentLockStatus.d.ts.map +1 -1
- package/dist/utilities/checkDocumentLockStatus.js +11 -44
- package/dist/utilities/checkDocumentLockStatus.js.map +1 -1
- package/dist/utilities/cloneValidationRequest.js.map +1 -1
- package/dist/utilities/commitTransaction.d.ts +0 -4
- package/dist/utilities/commitTransaction.d.ts.map +1 -1
- package/dist/utilities/commitTransaction.js +1 -41
- package/dist/utilities/commitTransaction.js.map +1 -1
- package/dist/utilities/configToJSONSchema.d.ts.map +1 -1
- package/dist/utilities/configToJSONSchema.js +2 -18
- package/dist/utilities/configToJSONSchema.js.map +1 -1
- package/dist/utilities/createPayloadRequest.d.ts +0 -5
- package/dist/utilities/createPayloadRequest.d.ts.map +1 -1
- package/dist/utilities/createPayloadRequest.js +3 -50
- package/dist/utilities/createPayloadRequest.js.map +1 -1
- package/dist/utilities/createPayloadRequestFromWebRequest.d.ts +12 -1
- package/dist/utilities/createPayloadRequestFromWebRequest.d.ts.map +1 -1
- package/dist/utilities/createPayloadRequestFromWebRequest.js +9 -5
- package/dist/utilities/createPayloadRequestFromWebRequest.js.map +1 -1
- package/dist/utilities/deepCopyObject.js.map +1 -1
- package/dist/utilities/documentMatchingWhereExists.js +1 -1
- package/dist/utilities/documentMatchingWhereExists.js.map +1 -1
- package/dist/utilities/entityInputSchema/validateEntityData.d.ts.map +1 -1
- package/dist/utilities/entityInputSchema/validateEntityData.js.map +1 -1
- package/dist/utilities/filterDataToSelectedLocales.js.map +1 -1
- package/dist/utilities/getEntityPermissions/getEntityPermissions.d.ts.map +1 -1
- package/dist/utilities/getEntityPermissions/getEntityPermissions.js +1 -0
- package/dist/utilities/getEntityPermissions/getEntityPermissions.js.map +1 -1
- package/dist/utilities/getEntityPermissions/populateFieldPermissions.js.map +1 -1
- package/dist/utilities/getVersionsConfig.d.ts +4 -0
- package/dist/utilities/getVersionsConfig.d.ts.map +1 -1
- package/dist/utilities/getVersionsConfig.js +5 -0
- package/dist/utilities/getVersionsConfig.js.map +1 -1
- package/dist/utilities/handleEndpoints.d.ts.map +1 -1
- package/dist/utilities/handleEndpoints.js +10 -9
- package/dist/utilities/handleEndpoints.js.map +1 -1
- package/dist/utilities/httpStatus.d.ts +0 -2
- package/dist/utilities/httpStatus.d.ts.map +1 -1
- package/dist/utilities/httpStatus.js +1 -3
- package/dist/utilities/httpStatus.js.map +1 -1
- package/dist/utilities/initTransaction.d.ts.map +1 -1
- package/dist/utilities/initTransaction.js +7 -35
- package/dist/utilities/initTransaction.js.map +1 -1
- package/dist/utilities/killTransaction.d.ts.map +1 -1
- package/dist/utilities/killTransaction.js +0 -27
- package/dist/utilities/killTransaction.js.map +1 -1
- package/dist/utilities/parseParams/index.js.map +1 -1
- package/dist/utilities/parseValidationLocale.js.map +1 -1
- package/dist/utilities/sanitizePopulateParam.js.map +1 -1
- package/dist/utilities/telemetry/conf/index.d.ts +4 -1
- package/dist/utilities/telemetry/conf/index.d.ts.map +1 -1
- package/dist/utilities/telemetry/conf/index.js.map +1 -1
- package/dist/utilities/telemetry/featureInfo/getFeatureInfo.js.map +1 -1
- package/dist/versions/allLocalesPublicationStatus.js.map +1 -1
- package/dist/versions/buildCollectionFields.d.ts.map +1 -1
- package/dist/versions/buildCollectionFields.js +0 -23
- package/dist/versions/buildCollectionFields.js.map +1 -1
- package/dist/versions/buildGlobalFields.d.ts.map +1 -1
- package/dist/versions/buildGlobalFields.js +0 -14
- package/dist/versions/buildGlobalFields.js.map +1 -1
- package/dist/versions/buildVersionCompoundIndexes.d.ts.map +1 -1
- package/dist/versions/buildVersionCompoundIndexes.js +2 -8
- package/dist/versions/buildVersionCompoundIndexes.js.map +1 -1
- package/dist/versions/deleteCollectionVersions.d.ts +1 -2
- package/dist/versions/deleteCollectionVersions.d.ts.map +1 -1
- package/dist/versions/deleteCollectionVersions.js +8 -37
- package/dist/versions/deleteCollectionVersions.js.map +1 -1
- package/dist/versions/deleteScheduledPublishJobs.d.ts.map +1 -1
- package/dist/versions/deleteScheduledPublishJobs.js +0 -4
- package/dist/versions/deleteScheduledPublishJobs.js.map +1 -1
- package/dist/versions/drafts/appendVersionToQueryKey.d.ts.map +1 -1
- package/dist/versions/drafts/appendVersionToQueryKey.js +1 -9
- package/dist/versions/drafts/appendVersionToQueryKey.js.map +1 -1
- package/dist/versions/drafts/replaceWithDraftIfAvailable.d.ts.map +1 -1
- package/dist/versions/drafts/replaceWithDraftIfAvailable.js +1 -8
- package/dist/versions/drafts/replaceWithDraftIfAvailable.js.map +1 -1
- package/dist/versions/enforceMaxVersions.d.ts +0 -1
- package/dist/versions/enforceMaxVersions.d.ts.map +1 -1
- package/dist/versions/enforceMaxVersions.js +6 -22
- package/dist/versions/enforceMaxVersions.js.map +1 -1
- package/dist/versions/getLatestCollectionVersion.d.ts.map +1 -1
- package/dist/versions/getLatestCollectionVersion.js +2 -10
- package/dist/versions/getLatestCollectionVersion.js.map +1 -1
- package/dist/versions/getLatestGlobalVersion.d.ts +2 -6
- package/dist/versions/getLatestGlobalVersion.d.ts.map +1 -1
- package/dist/versions/getLatestGlobalVersion.js +21 -65
- package/dist/versions/getLatestGlobalVersion.js.map +1 -1
- package/dist/versions/isInheritedReadVersionsAccess.js.map +1 -1
- package/dist/versions/saveVersion.d.ts +0 -7
- package/dist/versions/saveVersion.d.ts.map +1 -1
- package/dist/versions/saveVersion.js +4 -27
- package/dist/versions/saveVersion.js.map +1 -1
- package/dist/versions/updateLatestVersion.d.ts +0 -1
- package/dist/versions/updateLatestVersion.d.ts.map +1 -1
- package/dist/versions/updateLatestVersion.js +7 -24
- package/dist/versions/updateLatestVersion.js.map +1 -1
- package/package.json +30 -28
- package/skills/payload/reference/ENDPOINTS.md +3 -9
- package/skills/payload/reference/PLUGIN-DEVELOPMENT.md +4 -4
- package/dist/admin/getAdminPreferences.d.ts +0 -10
- package/dist/admin/getAdminPreferences.d.ts.map +0 -1
- package/dist/admin/getAdminPreferences.js +0 -53
- package/dist/admin/getAdminPreferences.js.map +0 -1
- package/dist/admin/getRequestBranch.d.ts +0 -6
- package/dist/admin/getRequestBranch.d.ts.map +0 -1
- package/dist/admin/getRequestBranch.js +0 -17
- package/dist/admin/getRequestBranch.js.map +0 -1
- package/dist/branching/appendBranchFilter.d.ts +0 -30
- package/dist/branching/appendBranchFilter.d.ts.map +0 -1
- package/dist/branching/appendBranchFilter.js +0 -105
- package/dist/branching/appendBranchFilter.js.map +0 -1
- package/dist/branching/assertBranchAccess.d.ts +0 -10
- package/dist/branching/assertBranchAccess.d.ts.map +0 -1
- package/dist/branching/assertBranchAccess.js +0 -36
- package/dist/branching/assertBranchAccess.js.map +0 -1
- package/dist/branching/assertBranchActionAccess.d.ts +0 -10
- package/dist/branching/assertBranchActionAccess.d.ts.map +0 -1
- package/dist/branching/assertBranchActionAccess.js +0 -15
- package/dist/branching/assertBranchActionAccess.js.map +0 -1
- package/dist/branching/assertBranchCreatedDocumentsUnreferenced.d.ts +0 -53
- package/dist/branching/assertBranchCreatedDocumentsUnreferenced.d.ts.map +0 -1
- package/dist/branching/assertBranchCreatedDocumentsUnreferenced.js +0 -833
- package/dist/branching/assertBranchCreatedDocumentsUnreferenced.js.map +0 -1
- package/dist/branching/assertBranchReadable.d.ts +0 -36
- package/dist/branching/assertBranchReadable.d.ts.map +0 -1
- package/dist/branching/assertBranchReadable.js +0 -83
- package/dist/branching/assertBranchReadable.js.map +0 -1
- package/dist/branching/assertBranchUpdateAccess.d.ts +0 -8
- package/dist/branching/assertBranchUpdateAccess.d.ts.map +0 -1
- package/dist/branching/assertBranchUpdateAccess.js +0 -12
- package/dist/branching/assertBranchUpdateAccess.js.map +0 -1
- package/dist/branching/assertBranchWritable.d.ts +0 -18
- package/dist/branching/assertBranchWritable.d.ts.map +0 -1
- package/dist/branching/assertBranchWritable.js +0 -46
- package/dist/branching/assertBranchWritable.js.map +0 -1
- package/dist/branching/branchIDs.d.ts +0 -38
- package/dist/branching/branchIDs.d.ts.map +0 -1
- package/dist/branching/branchIDs.js +0 -113
- package/dist/branching/branchIDs.js.map +0 -1
- package/dist/branching/branchSelect.d.ts +0 -42
- package/dist/branching/branchSelect.d.ts.map +0 -1
- package/dist/branching/branchSelect.js +0 -97
- package/dist/branching/branchSelect.js.map +0 -1
- package/dist/branching/checkFieldAccess.d.ts +0 -21
- package/dist/branching/checkFieldAccess.d.ts.map +0 -1
- package/dist/branching/checkFieldAccess.js +0 -238
- package/dist/branching/checkFieldAccess.js.map +0 -1
- package/dist/branching/collections.d.ts +0 -14
- package/dist/branching/collections.d.ts.map +0 -1
- package/dist/branching/collections.js +0 -713
- package/dist/branching/collections.js.map +0 -1
- package/dist/branching/combineBranchAccess.d.ts +0 -6
- package/dist/branching/combineBranchAccess.d.ts.map +0 -1
- package/dist/branching/combineBranchAccess.js +0 -22
- package/dist/branching/combineBranchAccess.js.map +0 -1
- package/dist/branching/copyUploadFilesToBranch.d.ts +0 -9
- package/dist/branching/copyUploadFilesToBranch.d.ts.map +0 -1
- package/dist/branching/copyUploadFilesToBranch.js +0 -126
- package/dist/branching/copyUploadFilesToBranch.js.map +0 -1
- package/dist/branching/createShadowRow.d.ts +0 -70
- package/dist/branching/createShadowRow.d.ts.map +0 -1
- package/dist/branching/createShadowRow.js +0 -296
- package/dist/branching/createShadowRow.js.map +0 -1
- package/dist/branching/discard.d.ts +0 -52
- package/dist/branching/discard.d.ts.map +0 -1
- package/dist/branching/discard.js +0 -428
- package/dist/branching/discard.js.map +0 -1
- package/dist/branching/effectiveOperations.d.ts +0 -55
- package/dist/branching/effectiveOperations.d.ts.map +0 -1
- package/dist/branching/effectiveOperations.js +0 -472
- package/dist/branching/effectiveOperations.js.map +0 -1
- package/dist/branching/endpoints/discard.d.ts +0 -15
- package/dist/branching/endpoints/discard.d.ts.map +0 -1
- package/dist/branching/endpoints/discard.js +0 -55
- package/dist/branching/endpoints/discard.js.map +0 -1
- package/dist/branching/endpoints/merge.d.ts +0 -34
- package/dist/branching/endpoints/merge.d.ts.map +0 -1
- package/dist/branching/endpoints/merge.js +0 -119
- package/dist/branching/endpoints/merge.js.map +0 -1
- package/dist/branching/forkDocument.d.ts +0 -20
- package/dist/branching/forkDocument.d.ts.map +0 -1
- package/dist/branching/forkDocument.js +0 -169
- package/dist/branching/forkDocument.js.map +0 -1
- package/dist/branching/globalMergeWrites.d.ts +0 -21
- package/dist/branching/globalMergeWrites.d.ts.map +0 -1
- package/dist/branching/globalMergeWrites.js +0 -146
- package/dist/branching/globalMergeWrites.js.map +0 -1
- package/dist/branching/globals.d.ts +0 -49
- package/dist/branching/globals.d.ts.map +0 -1
- package/dist/branching/globals.js +0 -197
- package/dist/branching/globals.js.map +0 -1
- package/dist/branching/hooks.d.ts +0 -24
- package/dist/branching/hooks.d.ts.map +0 -1
- package/dist/branching/hooks.js +0 -92
- package/dist/branching/hooks.js.map +0 -1
- package/dist/branching/injectBranchFields.d.ts +0 -40
- package/dist/branching/injectBranchFields.d.ts.map +0 -1
- package/dist/branching/injectBranchFields.js +0 -229
- package/dist/branching/injectBranchFields.js.map +0 -1
- package/dist/branching/merge/applyMergeChange.d.ts +0 -27
- package/dist/branching/merge/applyMergeChange.d.ts.map +0 -1
- package/dist/branching/merge/applyMergeChange.js +0 -853
- package/dist/branching/merge/applyMergeChange.js.map +0 -1
- package/dist/branching/merge/branchMergeStatus.d.ts +0 -12
- package/dist/branching/merge/branchMergeStatus.d.ts.map +0 -1
- package/dist/branching/merge/branchMergeStatus.js +0 -74
- package/dist/branching/merge/branchMergeStatus.js.map +0 -1
- package/dist/branching/merge/executeMerge.d.ts +0 -22
- package/dist/branching/merge/executeMerge.d.ts.map +0 -1
- package/dist/branching/merge/executeMerge.js +0 -600
- package/dist/branching/merge/executeMerge.js.map +0 -1
- package/dist/branching/merge/finalizeMerge.d.ts +0 -40
- package/dist/branching/merge/finalizeMerge.d.ts.map +0 -1
- package/dist/branching/merge/finalizeMerge.js +0 -237
- package/dist/branching/merge/finalizeMerge.js.map +0 -1
- package/dist/branching/merge/mergeLedger.d.ts +0 -40
- package/dist/branching/merge/mergeLedger.d.ts.map +0 -1
- package/dist/branching/merge/mergeLedger.js +0 -130
- package/dist/branching/merge/mergeLedger.js.map +0 -1
- package/dist/branching/merge/prepareMerge.d.ts +0 -41
- package/dist/branching/merge/prepareMerge.d.ts.map +0 -1
- package/dist/branching/merge/prepareMerge.js +0 -234
- package/dist/branching/merge/prepareMerge.js.map +0 -1
- package/dist/branching/merge/recoverMerge.d.ts +0 -16
- package/dist/branching/merge/recoverMerge.d.ts.map +0 -1
- package/dist/branching/merge/recoverMerge.js +0 -199
- package/dist/branching/merge/recoverMerge.js.map +0 -1
- package/dist/branching/merge/retryFailedCleanups.d.ts +0 -36
- package/dist/branching/merge/retryFailedCleanups.d.ts.map +0 -1
- package/dist/branching/merge/retryFailedCleanups.js +0 -335
- package/dist/branching/merge/retryFailedCleanups.js.map +0 -1
- package/dist/branching/merge/utilities.d.ts +0 -35
- package/dist/branching/merge/utilities.d.ts.map +0 -1
- package/dist/branching/merge/utilities.js +0 -54
- package/dist/branching/merge/utilities.js.map +0 -1
- package/dist/branching/merge.d.ts +0 -88
- package/dist/branching/merge.d.ts.map +0 -1
- package/dist/branching/merge.js +0 -163
- package/dist/branching/merge.js.map +0 -1
- package/dist/branching/mergeWriteGuard.d.ts +0 -20
- package/dist/branching/mergeWriteGuard.d.ts.map +0 -1
- package/dist/branching/mergeWriteGuard.js +0 -27
- package/dist/branching/mergeWriteGuard.js.map +0 -1
- package/dist/branching/preflight.d.ts +0 -71
- package/dist/branching/preflight.d.ts.map +0 -1
- package/dist/branching/preflight.js +0 -757
- package/dist/branching/preflight.js.map +0 -1
- package/dist/branching/readLocalizedBranchWrite.d.ts +0 -14
- package/dist/branching/readLocalizedBranchWrite.d.ts.map +0 -1
- package/dist/branching/readLocalizedBranchWrite.js +0 -90
- package/dist/branching/readLocalizedBranchWrite.js.map +0 -1
- package/dist/branching/readMergeSnapshot.d.ts +0 -18
- package/dist/branching/readMergeSnapshot.d.ts.map +0 -1
- package/dist/branching/readMergeSnapshot.js +0 -99
- package/dist/branching/readMergeSnapshot.js.map +0 -1
- package/dist/branching/resolveBranch.d.ts +0 -153
- package/dist/branching/resolveBranch.d.ts.map +0 -1
- package/dist/branching/resolveBranch.js +0 -363
- package/dist/branching/resolveBranch.js.map +0 -1
- package/dist/branching/resolveBranchActionAccess.d.ts +0 -8
- package/dist/branching/resolveBranchActionAccess.d.ts.map +0 -1
- package/dist/branching/resolveBranchActionAccess.js +0 -9
- package/dist/branching/resolveBranchActionAccess.js.map +0 -1
- package/dist/branching/resolveBranchQuery.d.ts +0 -48
- package/dist/branching/resolveBranchQuery.d.ts.map +0 -1
- package/dist/branching/resolveBranchQuery.js +0 -115
- package/dist/branching/resolveBranchQuery.js.map +0 -1
- package/dist/branching/resolveBranchRowID.d.ts +0 -22
- package/dist/branching/resolveBranchRowID.d.ts.map +0 -1
- package/dist/branching/resolveBranchRowID.js +0 -70
- package/dist/branching/resolveBranchRowID.js.map +0 -1
- package/dist/branching/sanitizeBranchingConfig.d.ts +0 -31
- package/dist/branching/sanitizeBranchingConfig.d.ts.map +0 -1
- package/dist/branching/sanitizeBranchingConfig.js +0 -110
- package/dist/branching/sanitizeBranchingConfig.js.map +0 -1
- package/dist/branching/schedule/job.d.ts +0 -51
- package/dist/branching/schedule/job.d.ts.map +0 -1
- package/dist/branching/schedule/job.js +0 -151
- package/dist/branching/schedule/job.js.map +0 -1
- package/dist/branching/selectBranchChanges.d.ts +0 -8
- package/dist/branching/selectBranchChanges.d.ts.map +0 -1
- package/dist/branching/selectBranchChanges.js +0 -9
- package/dist/branching/selectBranchChanges.js.map +0 -1
- package/dist/branching/stripBranchMergeData.d.ts +0 -11
- package/dist/branching/stripBranchMergeData.d.ts.map +0 -1
- package/dist/branching/stripBranchMergeData.js +0 -20
- package/dist/branching/stripBranchMergeData.js.map +0 -1
- package/dist/branching/tombstone.d.ts +0 -91
- package/dist/branching/tombstone.d.ts.map +0 -1
- package/dist/branching/tombstone.js +0 -546
- package/dist/branching/tombstone.js.map +0 -1
- package/dist/branching/types.d.ts +0 -158
- package/dist/branching/types.d.ts.map +0 -1
- package/dist/branching/types.js +0 -54
- package/dist/branching/types.js.map +0 -1
- package/dist/branching/validation.d.ts +0 -47
- package/dist/branching/validation.d.ts.map +0 -1
- package/dist/branching/validation.js +0 -272
- package/dist/branching/validation.js.map +0 -1
- package/dist/branching/versions.d.ts +0 -131
- package/dist/branching/versions.d.ts.map +0 -1
- package/dist/branching/versions.js +0 -572
- package/dist/branching/versions.js.map +0 -1
- package/dist/collections/operations/utilities/createOperationRetryRequest.d.ts +0 -23
- package/dist/collections/operations/utilities/createOperationRetryRequest.d.ts.map +0 -1
- package/dist/collections/operations/utilities/createOperationRetryRequest.js +0 -683
- package/dist/collections/operations/utilities/createOperationRetryRequest.js.map +0 -1
- package/dist/fields/hooks/beforeValidate/throwOnAccessDenied.d.ts +0 -3
- package/dist/fields/hooks/beforeValidate/throwOnAccessDenied.d.ts.map +0 -1
- package/dist/fields/hooks/beforeValidate/throwOnAccessDenied.js +0 -3
- package/dist/fields/hooks/beforeValidate/throwOnAccessDenied.js.map +0 -1
- package/dist/uploads/appendBranchToFileURL.d.ts +0 -6
- package/dist/uploads/appendBranchToFileURL.d.ts.map +0 -1
- package/dist/uploads/appendBranchToFileURL.js +0 -24
- package/dist/uploads/appendBranchToFileURL.js.map +0 -1
- package/dist/uploads/deleteUploadFilesExclusiveToDocument.d.ts +0 -15
- package/dist/uploads/deleteUploadFilesExclusiveToDocument.d.ts.map +0 -1
- package/dist/uploads/deleteUploadFilesExclusiveToDocument.js +0 -62
- package/dist/uploads/deleteUploadFilesExclusiveToDocument.js.map +0 -1
- package/dist/uploads/fileIdentity.d.ts +0 -24
- package/dist/uploads/fileIdentity.d.ts.map +0 -1
- package/dist/uploads/fileIdentity.js +0 -36
- package/dist/uploads/fileIdentity.js.map +0 -1
- package/dist/uploads/fileQuarantine.d.ts +0 -17
- package/dist/uploads/fileQuarantine.d.ts.map +0 -1
- package/dist/uploads/fileQuarantine.js +0 -52
- package/dist/uploads/fileQuarantine.js.map +0 -1
- package/dist/uploads/linkFileWithoutOverwrite.d.ts +0 -13
- package/dist/uploads/linkFileWithoutOverwrite.d.ts.map +0 -1
- package/dist/uploads/linkFileWithoutOverwrite.js +0 -13
- package/dist/uploads/linkFileWithoutOverwrite.js.map +0 -1
- package/dist/uploads/uploadFileRollback.d.ts +0 -31
- package/dist/uploads/uploadFileRollback.d.ts.map +0 -1
- package/dist/uploads/uploadFileRollback.js +0 -269
- package/dist/uploads/uploadFileRollback.js.map +0 -1
- package/dist/utilities/extractRelationshipID.d.ts +0 -4
- package/dist/utilities/extractRelationshipID.d.ts.map +0 -1
- package/dist/utilities/extractRelationshipID.js +0 -14
- package/dist/utilities/extractRelationshipID.js.map +0 -1
- package/dist/utilities/transactionCallbacks.d.ts +0 -77
- package/dist/utilities/transactionCallbacks.d.ts.map +0 -1
- package/dist/utilities/transactionCallbacks.js +0 -299
- package/dist/utilities/transactionCallbacks.js.map +0 -1
- package/dist/utilities/transactionMutationTracker.d.ts +0 -21
- package/dist/utilities/transactionMutationTracker.d.ts.map +0 -1
- package/dist/utilities/transactionMutationTracker.js +0 -71
- package/dist/utilities/transactionMutationTracker.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/auth/operations/login.ts"],"sourcesContent":["import type {\n AuthOperationsFromCollectionSlug,\n Collection,\n DataFromCollectionSlug,\n} from '../../collections/config/types.js'\nimport type { AuthCollectionSlug, AuthenticatedUser, User } from '../../index.js'\nimport type { PayloadRequest, Where } from '../../types/index.js'\nimport type { AuthRuntimeFields } from '../types.js'\n\nimport { buildAfterOperation } from '../../collections/operations/utilities/buildAfterOperation.js'\nimport { buildBeforeOperation } from '../../collections/operations/utilities/buildBeforeOperation.js'\nimport {\n AuthenticationError,\n LockedAuth,\n UnverifiedEmail,\n ValidationError,\n} from '../../errors/index.js'\nimport { commitTransaction, Forbidden, initTransaction } from '../../index.js'\nimport { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js'\nimport { assertNoValidationWrite } from '../../utilities/assertNoValidationWrite.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { sanitizeInternalFields } from '../../utilities/sanitizeInternalFields.js'\nimport { applyUserReadAccess } from '../applyUserReadAccess.js'\nimport { getFieldsToSign } from '../getFieldsToSign.js'\nimport { getLoginOptions } from '../getLoginOptions.js'\nimport { isUserLocked } from '../isUserLocked.js'\nimport { jwtSign } from '../jwt.js'\nimport { addSessionToUser, revokeSession } from '../sessions.js'\nimport { authenticateLocalStrategy } from '../strategies/local/authenticate.js'\nimport { generatePasswordSaltHash } from '../strategies/local/generatePasswordSaltHash.js'\nimport { incrementLoginAttempts } from '../strategies/local/incrementLoginAttempts.js'\nimport { resetLoginAttempts } from '../strategies/local/resetLoginAttempts.js'\n\nexport type LoginResult<TSlug extends AuthCollectionSlug> = {\n exp?: number\n token?: string\n user?: AuthRuntimeFields & DataFromCollectionSlug<TSlug>\n}\n\nexport type Arguments<TSlug extends AuthCollectionSlug> = {\n collection: Collection\n data: AuthOperationsFromCollectionSlug<TSlug>['login']\n depth?: number\n overrideAccess?: boolean\n req: PayloadRequest\n showHiddenFields?: boolean\n}\n\ntype CheckLoginPermissionArgs<TSlug extends AuthCollectionSlug> = {\n loggingInWithUsername?: boolean\n req: PayloadRequest\n user: DataFromCollectionSlug<TSlug>\n}\n\n/**\n * Throws an error if the user is locked or does not exist.\n * This does not check the login attempts, only the lock status. Whoever increments login attempts\n * is responsible for locking the user properly, not whoever checks the login permission.\n */\nexport const checkLoginPermission = <TSlug extends AuthCollectionSlug>({\n loggingInWithUsername,\n req,\n user,\n}: CheckLoginPermissionArgs<TSlug>) => {\n if (!user) {\n throw new AuthenticationError(req.t, Boolean(loggingInWithUsername))\n }\n\n if (isUserLocked(new Date(user.lockUntil))) {\n throw new LockedAuth(req.t)\n }\n}\n\nexport const loginOperation = async <TSlug extends AuthCollectionSlug>(\n incomingArgs: Arguments<TSlug>,\n): Promise<LoginResult<TSlug>> => {\n let args = incomingArgs\n\n assertNoValidationWrite(args.req)\n\n if (args.collection.config.auth.disableLocalStrategy) {\n throw new Forbidden(args.req.t)\n }\n\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n args = await buildBeforeOperation({\n args,\n collection: args.collection.config,\n operation: 'login',\n overrideAccess: args.overrideAccess!,\n })\n\n const {\n collection: { config: collectionConfig },\n data,\n depth,\n overrideAccess = false,\n req,\n req: {\n payload,\n payload: { secret },\n },\n showHiddenFields,\n } = args\n\n // /////////////////////////////////////\n // Login\n // /////////////////////////////////////\n\n const { email: unsanitizedEmail, password } = data\n const loginWithUsername = collectionConfig.auth.loginWithUsername\n\n const sanitizedEmail =\n typeof unsanitizedEmail === 'string' ? unsanitizedEmail.toLowerCase().trim() : null\n const sanitizedUsername =\n 'username' in data && typeof data?.username === 'string'\n ? data.username.toLowerCase().trim()\n : null\n\n const { canLoginWithEmail, canLoginWithUsername } = getLoginOptions(loginWithUsername)\n\n // cannot login with email, did not provide username\n if (!canLoginWithEmail && !sanitizedUsername) {\n throw new ValidationError({\n collection: collectionConfig.slug,\n errors: [{ message: req.i18n.t('validation:required'), path: 'username' }],\n })\n }\n\n // cannot login with username, did not provide email\n if (!canLoginWithUsername && !sanitizedEmail) {\n throw new ValidationError({\n collection: collectionConfig.slug,\n errors: [{ message: req.i18n.t('validation:required'), path: 'email' }],\n })\n }\n\n // can login with either email or username, did not provide either\n if (!sanitizedUsername && !sanitizedEmail) {\n throw new ValidationError({\n collection: collectionConfig.slug,\n errors: [\n { message: req.i18n.t('validation:required'), path: 'email' },\n { message: req.i18n.t('validation:required'), path: 'username' },\n ],\n })\n }\n\n // did not provide password for login\n if (typeof password !== 'string' || password.trim() === '') {\n throw new ValidationError({\n collection: collectionConfig.slug,\n errors: [{ message: req.i18n.t('validation:required'), path: 'password' }],\n })\n }\n\n let whereConstraint: Where = {}\n const emailConstraint: Where = {\n email: {\n equals: sanitizedEmail,\n },\n }\n const usernameConstraint: Where = {\n username: {\n equals: sanitizedUsername,\n },\n }\n\n if (canLoginWithEmail && canLoginWithUsername && (sanitizedUsername || sanitizedEmail)) {\n if (sanitizedUsername) {\n whereConstraint = {\n or: [\n usernameConstraint,\n {\n email: {\n equals: sanitizedUsername,\n },\n },\n ],\n }\n } else {\n whereConstraint = {\n or: [\n emailConstraint,\n {\n username: {\n equals: sanitizedEmail,\n },\n },\n ],\n }\n }\n } else if (canLoginWithEmail && sanitizedEmail) {\n whereConstraint = emailConstraint\n } else if (canLoginWithUsername && sanitizedUsername) {\n whereConstraint = usernameConstraint\n }\n\n // Exclude trashed users\n whereConstraint = appendNonTrashedFilter({\n enableTrash: collectionConfig.trash,\n trash: false,\n where: whereConstraint,\n })\n\n let user = (await payload.db.findOne<User>({\n collection: collectionConfig.slug,\n req,\n where: whereConstraint,\n })) as AuthenticatedUser\n\n checkLoginPermission({\n loggingInWithUsername: Boolean(canLoginWithUsername && sanitizedUsername),\n req,\n user,\n })\n\n user.collection = collectionConfig.slug\n user._strategy = 'local-jwt'\n\n const authenticatedHash = user.hash\n const authenticatedSalt = user.salt\n const authResult = await authenticateLocalStrategy({ doc: user, password })\n user = sanitizeInternalFields(user)\n\n const maxLoginAttemptsEnabled = args.collection.config.auth.maxLoginAttempts > 0\n\n if (!authResult) {\n if (maxLoginAttemptsEnabled) {\n await incrementLoginAttempts({\n collection: collectionConfig,\n payload: req.payload,\n user,\n })\n\n // Re-check login permissions and max attempts after incrementing attempts, in case parallel updates occurred\n checkLoginPermission({\n loggingInWithUsername: Boolean(canLoginWithUsername && sanitizedUsername),\n req,\n user,\n })\n }\n\n throw new AuthenticationError(req.t)\n }\n\n if (collectionConfig.auth.verify && user._verified === false) {\n throw new UnverifiedEmail({ t: req.t })\n }\n\n // Authentication successful - start transaction for remaining operations\n const shouldCommit = await initTransaction(args.req)\n let sid: string | undefined\n\n try {\n /*\n * Correct password accepted - re‑check that the account didn't\n * get locked by parallel bad attempts in the meantime.\n */\n if (maxLoginAttemptsEnabled) {\n const { lockUntil, loginAttempts } = (await payload.db.findOne<User>({\n collection: collectionConfig.slug,\n req,\n select: {\n lockUntil: true,\n loginAttempts: true,\n },\n where: { id: { equals: user.id } },\n }))!\n\n user.lockUntil = lockUntil\n user.loginAttempts = loginAttempts\n\n checkLoginPermission({\n req,\n user,\n })\n }\n\n const fieldsToSignArgs: Parameters<typeof getFieldsToSign>[0] = {\n collectionConfig,\n email: sanitizedEmail!,\n user,\n }\n\n const session = await addSessionToUser({\n collectionConfig,\n payload,\n req,\n user,\n })\n sid = session.sid\n\n if (sid) {\n fieldsToSignArgs.sid = sid\n }\n\n if (\n authResult.shouldUpdatePasswordHash &&\n typeof authenticatedHash === 'string' &&\n typeof authenticatedSalt === 'string'\n ) {\n try {\n const { hash, salt } = await generatePasswordSaltHash({\n collection: collectionConfig,\n isPasswordAuthenticated: true,\n password,\n req,\n })\n\n await payload.db.updateOne({\n collection: collectionConfig.slug,\n data: { hash, salt },\n req,\n select: { id: true },\n where: {\n id: { equals: user.id },\n hash: { equals: authenticatedHash },\n salt: { equals: authenticatedSalt },\n },\n })\n } catch (err) {\n // Rehashing is opportunistic and is retried on the next login, so a failure here\n // must not reject an otherwise valid login or discard the session already created\n payload.logger.error({ err, msg: 'Failed to update the stored password hash' })\n }\n }\n\n const fieldsToSign = getFieldsToSign(fieldsToSignArgs)\n\n if (maxLoginAttemptsEnabled) {\n await resetLoginAttempts({\n collection: collectionConfig,\n doc: user,\n payload: req.payload,\n req,\n })\n }\n\n // /////////////////////////////////////\n // beforeLogin - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.beforeLogin?.length) {\n for (const hook of collectionConfig.hooks.beforeLogin) {\n user =\n (await hook({\n collection: args.collection?.config,\n context: args.req.context,\n req: args.req,\n user,\n })) || user\n }\n }\n\n const { exp, token } = await jwtSign({\n fieldsToSign,\n secret,\n tokenExpiration: collectionConfig.auth.tokenExpiration,\n })\n\n req.user = user\n\n // /////////////////////////////////////\n // afterLogin - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.afterLogin?.length) {\n for (const hook of collectionConfig.hooks.afterLogin) {\n user =\n (await hook({\n collection: args.collection?.config,\n context: args.req.context,\n req: args.req,\n token,\n user,\n })) || user\n }\n }\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n const userWithReadAccess = await applyUserReadAccess({\n collection: collectionConfig,\n depth: depth!,\n overrideAccess,\n req,\n showHiddenFields: showHiddenFields!,\n user,\n })\n\n let result: LoginResult<TSlug> = {\n exp,\n token,\n user: userWithReadAccess,\n }\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n result = await buildAfterOperation({\n args,\n collection: args.collection?.config,\n operation: 'login',\n overrideAccess: args.overrideAccess!,\n result,\n })\n\n if (shouldCommit) {\n await commitTransaction(req)\n }\n\n // /////////////////////////////////////\n // Return results\n // /////////////////////////////////////\n\n return result\n } catch (error: unknown) {\n if (sid) {\n await revokeSession({\n collectionConfig,\n payload,\n req,\n sid,\n user,\n })\n }\n await killTransaction(args.req)\n throw error\n }\n}\n"],"names":["buildAfterOperation","buildBeforeOperation","AuthenticationError","LockedAuth","UnverifiedEmail","ValidationError","commitTransaction","Forbidden","initTransaction","appendNonTrashedFilter","assertNoValidationWrite","killTransaction","sanitizeInternalFields","applyUserReadAccess","getFieldsToSign","getLoginOptions","isUserLocked","jwtSign","addSessionToUser","revokeSession","authenticateLocalStrategy","generatePasswordSaltHash","incrementLoginAttempts","resetLoginAttempts","checkLoginPermission","loggingInWithUsername","req","user","t","Boolean","Date","lockUntil","loginOperation","incomingArgs","args","collection","config","auth","disableLocalStrategy","operation","overrideAccess","collectionConfig","data","depth","payload","secret","showHiddenFields","email","unsanitizedEmail","password","loginWithUsername","sanitizedEmail","toLowerCase","trim","sanitizedUsername","username","canLoginWithEmail","canLoginWithUsername","slug","errors","message","i18n","path","whereConstraint","emailConstraint","equals","usernameConstraint","or","enableTrash","trash","where","db","findOne","_strategy","authenticatedHash","hash","authenticatedSalt","salt","authResult","doc","maxLoginAttemptsEnabled","maxLoginAttempts","verify","_verified","shouldCommit","sid","loginAttempts","select","id","fieldsToSignArgs","session","shouldUpdatePasswordHash","isPasswordAuthenticated","updateOne","err","logger","error","msg","fieldsToSign","hooks","beforeLogin","length","hook","context","exp","token","tokenExpiration","afterLogin","userWithReadAccess","result"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/auth/operations/login.ts"],"sourcesContent":["import type {\n AuthOperationsFromCollectionSlug,\n Collection,\n DataFromCollectionSlug,\n} from '../../collections/config/types.js'\nimport type { AuthCollectionSlug, AuthenticatedUser, User } from '../../index.js'\nimport type { PayloadRequest, Where } from '../../types/index.js'\nimport type { AuthRuntimeFields } from '../types.js'\n\nimport { buildAfterOperation } from '../../collections/operations/utilities/buildAfterOperation.js'\nimport { buildBeforeOperation } from '../../collections/operations/utilities/buildBeforeOperation.js'\nimport {\n AuthenticationError,\n LockedAuth,\n UnverifiedEmail,\n ValidationError,\n} from '../../errors/index.js'\nimport { commitTransaction, Forbidden, initTransaction } from '../../index.js'\nimport { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js'\nimport { assertNoValidationWrite } from '../../utilities/assertNoValidationWrite.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { sanitizeInternalFields } from '../../utilities/sanitizeInternalFields.js'\nimport { applyUserReadAccess } from '../applyUserReadAccess.js'\nimport { createAuthToken } from '../createAuthToken.js'\nimport { getLoginOptions } from '../getLoginOptions.js'\nimport { isUserLocked } from '../isUserLocked.js'\nimport { revokeSession } from '../sessions.js'\nimport { authenticateLocalStrategy } from '../strategies/local/authenticate.js'\nimport { generatePasswordSaltHash } from '../strategies/local/generatePasswordSaltHash.js'\nimport { incrementLoginAttempts } from '../strategies/local/incrementLoginAttempts.js'\nimport { resetLoginAttempts } from '../strategies/local/resetLoginAttempts.js'\n\nexport type LoginResult<TSlug extends AuthCollectionSlug> = {\n exp?: number\n /** With `auth.refreshTokens`, trades for a new token after this one expires. */\n refreshToken?: string\n token?: string\n user?: AuthRuntimeFields & DataFromCollectionSlug<TSlug>\n}\n\nexport type Arguments<TSlug extends AuthCollectionSlug> = {\n collection: Collection\n data: AuthOperationsFromCollectionSlug<TSlug>['login']\n depth?: number\n overrideAccess?: boolean\n req: PayloadRequest\n showHiddenFields?: boolean\n}\n\ntype CheckLoginPermissionArgs<TSlug extends AuthCollectionSlug> = {\n loggingInWithUsername?: boolean\n req: PayloadRequest\n user: DataFromCollectionSlug<TSlug>\n}\n\n/**\n * Throws an error if the user is locked or does not exist.\n * This does not check the login attempts, only the lock status. Whoever increments login attempts\n * is responsible for locking the user properly, not whoever checks the login permission.\n */\nexport const checkLoginPermission = <TSlug extends AuthCollectionSlug>({\n loggingInWithUsername,\n req,\n user,\n}: CheckLoginPermissionArgs<TSlug>) => {\n if (!user) {\n throw new AuthenticationError(req.t, Boolean(loggingInWithUsername))\n }\n\n if (isUserLocked(new Date(user.lockUntil))) {\n throw new LockedAuth(req.t)\n }\n}\n\nexport const loginOperation = async <TSlug extends AuthCollectionSlug>(\n incomingArgs: Arguments<TSlug>,\n): Promise<LoginResult<TSlug>> => {\n let args = incomingArgs\n\n assertNoValidationWrite(args.req)\n\n if (args.collection.config.auth.disableLocalStrategy) {\n throw new Forbidden(args.req.t)\n }\n\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n args = await buildBeforeOperation({\n args,\n collection: args.collection.config,\n operation: 'login',\n overrideAccess: args.overrideAccess!,\n })\n\n const {\n collection: { config: collectionConfig },\n data,\n depth,\n overrideAccess = false,\n req,\n req: { payload },\n showHiddenFields,\n } = args\n\n // /////////////////////////////////////\n // Login\n // /////////////////////////////////////\n\n const { email: unsanitizedEmail, password } = data\n const loginWithUsername = collectionConfig.auth.loginWithUsername\n\n const sanitizedEmail =\n typeof unsanitizedEmail === 'string' ? unsanitizedEmail.toLowerCase().trim() : null\n const sanitizedUsername =\n 'username' in data && typeof data?.username === 'string'\n ? data.username.toLowerCase().trim()\n : null\n\n const { canLoginWithEmail, canLoginWithUsername } = getLoginOptions(loginWithUsername)\n\n // cannot login with email, did not provide username\n if (!canLoginWithEmail && !sanitizedUsername) {\n throw new ValidationError({\n collection: collectionConfig.slug,\n errors: [{ message: req.i18n.t('validation:required'), path: 'username' }],\n })\n }\n\n // cannot login with username, did not provide email\n if (!canLoginWithUsername && !sanitizedEmail) {\n throw new ValidationError({\n collection: collectionConfig.slug,\n errors: [{ message: req.i18n.t('validation:required'), path: 'email' }],\n })\n }\n\n // can login with either email or username, did not provide either\n if (!sanitizedUsername && !sanitizedEmail) {\n throw new ValidationError({\n collection: collectionConfig.slug,\n errors: [\n { message: req.i18n.t('validation:required'), path: 'email' },\n { message: req.i18n.t('validation:required'), path: 'username' },\n ],\n })\n }\n\n // did not provide password for login\n if (typeof password !== 'string' || password.trim() === '') {\n throw new ValidationError({\n collection: collectionConfig.slug,\n errors: [{ message: req.i18n.t('validation:required'), path: 'password' }],\n })\n }\n\n let whereConstraint: Where = {}\n const emailConstraint: Where = {\n email: {\n equals: sanitizedEmail,\n },\n }\n const usernameConstraint: Where = {\n username: {\n equals: sanitizedUsername,\n },\n }\n\n if (canLoginWithEmail && canLoginWithUsername && (sanitizedUsername || sanitizedEmail)) {\n if (sanitizedUsername) {\n whereConstraint = {\n or: [\n usernameConstraint,\n {\n email: {\n equals: sanitizedUsername,\n },\n },\n ],\n }\n } else {\n whereConstraint = {\n or: [\n emailConstraint,\n {\n username: {\n equals: sanitizedEmail,\n },\n },\n ],\n }\n }\n } else if (canLoginWithEmail && sanitizedEmail) {\n whereConstraint = emailConstraint\n } else if (canLoginWithUsername && sanitizedUsername) {\n whereConstraint = usernameConstraint\n }\n\n // Exclude trashed users\n whereConstraint = appendNonTrashedFilter({\n enableTrash: collectionConfig.trash,\n trash: false,\n where: whereConstraint,\n })\n\n let user = (await payload.db.findOne<User>({\n collection: collectionConfig.slug,\n req,\n where: whereConstraint,\n })) as AuthenticatedUser\n\n checkLoginPermission({\n loggingInWithUsername: Boolean(canLoginWithUsername && sanitizedUsername),\n req,\n user,\n })\n\n user.collection = collectionConfig.slug\n user._strategy = 'local-jwt'\n\n const authenticatedHash = user.hash\n const authenticatedSalt = user.salt\n const authResult = await authenticateLocalStrategy({ doc: user, password })\n user = sanitizeInternalFields(user)\n\n const maxLoginAttemptsEnabled = args.collection.config.auth.maxLoginAttempts > 0\n\n if (!authResult) {\n if (maxLoginAttemptsEnabled) {\n await incrementLoginAttempts({\n collection: collectionConfig,\n payload: req.payload,\n user,\n })\n\n // Re-check login permissions and max attempts after incrementing attempts, in case parallel updates occurred\n checkLoginPermission({\n loggingInWithUsername: Boolean(canLoginWithUsername && sanitizedUsername),\n req,\n user,\n })\n }\n\n throw new AuthenticationError(req.t)\n }\n\n if (collectionConfig.auth.verify && user._verified === false) {\n throw new UnverifiedEmail({ t: req.t })\n }\n\n // Authentication successful - start transaction for remaining operations\n const shouldCommit = await initTransaction(args.req)\n let sid: string | undefined\n\n try {\n /*\n * Correct password accepted - re‑check that the account didn't\n * get locked by parallel bad attempts in the meantime.\n */\n if (maxLoginAttemptsEnabled) {\n const { lockUntil, loginAttempts } = (await payload.db.findOne<User>({\n collection: collectionConfig.slug,\n req,\n select: {\n lockUntil: true,\n loginAttempts: true,\n },\n where: { id: { equals: user.id } },\n }))!\n\n user.lockUntil = lockUntil\n user.loginAttempts = loginAttempts\n\n checkLoginPermission({\n req,\n user,\n })\n }\n\n const { exp, refreshToken, token, ...session } = await createAuthToken({\n collectionConfig,\n email: sanitizedEmail!,\n req,\n shouldCreateRefreshToken: Boolean(collectionConfig.auth.refreshTokens),\n user,\n })\n sid = session.sid\n\n if (\n authResult.shouldUpdatePasswordHash &&\n typeof authenticatedHash === 'string' &&\n typeof authenticatedSalt === 'string'\n ) {\n try {\n const { hash, salt } = await generatePasswordSaltHash({\n collection: collectionConfig,\n isPasswordAuthenticated: true,\n password,\n req,\n })\n\n await payload.db.updateOne({\n collection: collectionConfig.slug,\n data: { hash, salt },\n req,\n select: { id: true },\n where: {\n id: { equals: user.id },\n hash: { equals: authenticatedHash },\n salt: { equals: authenticatedSalt },\n },\n })\n } catch (err) {\n // Rehashing is opportunistic and is retried on the next login, so a failure here\n // must not reject an otherwise valid login or discard the session already created\n payload.logger.error({ err, msg: 'Failed to update the stored password hash' })\n }\n }\n\n if (maxLoginAttemptsEnabled) {\n await resetLoginAttempts({\n collection: collectionConfig,\n doc: user,\n payload: req.payload,\n req,\n })\n }\n\n // /////////////////////////////////////\n // beforeLogin - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.beforeLogin?.length) {\n for (const hook of collectionConfig.hooks.beforeLogin) {\n user =\n (await hook({\n collection: args.collection?.config,\n context: args.req.context,\n req: args.req,\n user,\n })) || user\n }\n }\n\n req.user = user\n\n // /////////////////////////////////////\n // afterLogin - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.afterLogin?.length) {\n for (const hook of collectionConfig.hooks.afterLogin) {\n user =\n (await hook({\n collection: args.collection?.config,\n context: args.req.context,\n req: args.req,\n token,\n user,\n })) || user\n }\n }\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n const userWithReadAccess = await applyUserReadAccess({\n collection: collectionConfig,\n depth: depth!,\n overrideAccess,\n req,\n showHiddenFields: showHiddenFields!,\n user,\n })\n\n let result: LoginResult<TSlug> = {\n exp,\n refreshToken,\n token,\n user: userWithReadAccess,\n }\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n result = await buildAfterOperation({\n args,\n collection: args.collection?.config,\n operation: 'login',\n overrideAccess: args.overrideAccess!,\n result,\n })\n\n if (shouldCommit) {\n await commitTransaction(req)\n }\n\n // /////////////////////////////////////\n // Return results\n // /////////////////////////////////////\n\n return result\n } catch (error: unknown) {\n if (sid) {\n await revokeSession({\n collectionConfig,\n payload,\n req,\n sid,\n user,\n })\n }\n await killTransaction(args.req)\n throw error\n }\n}\n"],"names":["buildAfterOperation","buildBeforeOperation","AuthenticationError","LockedAuth","UnverifiedEmail","ValidationError","commitTransaction","Forbidden","initTransaction","appendNonTrashedFilter","assertNoValidationWrite","killTransaction","sanitizeInternalFields","applyUserReadAccess","createAuthToken","getLoginOptions","isUserLocked","revokeSession","authenticateLocalStrategy","generatePasswordSaltHash","incrementLoginAttempts","resetLoginAttempts","checkLoginPermission","loggingInWithUsername","req","user","t","Boolean","Date","lockUntil","loginOperation","incomingArgs","args","collection","config","auth","disableLocalStrategy","operation","overrideAccess","collectionConfig","data","depth","payload","showHiddenFields","email","unsanitizedEmail","password","loginWithUsername","sanitizedEmail","toLowerCase","trim","sanitizedUsername","username","canLoginWithEmail","canLoginWithUsername","slug","errors","message","i18n","path","whereConstraint","emailConstraint","equals","usernameConstraint","or","enableTrash","trash","where","db","findOne","_strategy","authenticatedHash","hash","authenticatedSalt","salt","authResult","doc","maxLoginAttemptsEnabled","maxLoginAttempts","verify","_verified","shouldCommit","sid","loginAttempts","select","id","exp","refreshToken","token","session","shouldCreateRefreshToken","refreshTokens","shouldUpdatePasswordHash","isPasswordAuthenticated","updateOne","err","logger","error","msg","hooks","beforeLogin","length","hook","context","afterLogin","userWithReadAccess","result"],"mappings":"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"}
|
|
@@ -3,11 +3,19 @@ import type { Document, PayloadRequest } from '../../types/index.js';
|
|
|
3
3
|
export type Result = {
|
|
4
4
|
exp: number;
|
|
5
5
|
refreshedToken: string;
|
|
6
|
+
/** The next refresh token, when refreshing with a refresh token. */
|
|
7
|
+
refreshToken?: string;
|
|
6
8
|
setCookie?: boolean;
|
|
7
9
|
user: Document;
|
|
8
10
|
};
|
|
9
11
|
export type Arguments = {
|
|
10
12
|
collection: Collection;
|
|
13
|
+
/**
|
|
14
|
+
* A refresh token from login to refresh with, instead of the request's token. Unlike the
|
|
15
|
+
* request's token, it still works after the token expired. Collection `refresh` hooks don't run
|
|
16
|
+
* for it, since they replace refreshing with the request's token.
|
|
17
|
+
*/
|
|
18
|
+
refreshToken?: string;
|
|
11
19
|
req: PayloadRequest;
|
|
12
20
|
};
|
|
13
21
|
export declare const refreshOperation: (incomingArgs: Arguments) => Promise<Result>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../../../src/auth/operations/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;AAEnE,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../../../src/auth/operations/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;AAEnE,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAiBpE,MAAM,MAAM,MAAM,GAAG;IACnB,GAAG,EAAE,MAAM,CAAA;IACX,cAAc,EAAE,MAAM,CAAA;IACtB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,IAAI,EAAE,QAAQ,CAAA;CACf,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,UAAU,EAAE,UAAU,CAAA;IACtB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,GAAG,EAAE,cAAc,CAAA;CACpB,CAAA;AAED,eAAO,MAAM,gBAAgB,iBAAwB,SAAS,KAAG,OAAO,CAAC,MAAM,CAoO9E,CAAA"}
|
|
@@ -10,6 +10,7 @@ import { killTransaction } from '../../utilities/killTransaction.js';
|
|
|
10
10
|
import { applyUserReadAccess } from '../applyUserReadAccess.js';
|
|
11
11
|
import { getFieldsToSign } from '../getFieldsToSign.js';
|
|
12
12
|
import { jwtSign } from '../jwt.js';
|
|
13
|
+
import { refreshAuthToken } from '../refreshAuthToken.js';
|
|
13
14
|
import { removeExpiredSessions } from '../sessions.js';
|
|
14
15
|
export const refreshOperation = async (incomingArgs)=>{
|
|
15
16
|
let args = incomingArgs;
|
|
@@ -29,11 +30,25 @@ export const refreshOperation = async (incomingArgs)=>{
|
|
|
29
30
|
// Refresh
|
|
30
31
|
// /////////////////////////////////////
|
|
31
32
|
const { collection: { config: collectionConfig }, req, req: { payload: { config, secret } } } = args;
|
|
32
|
-
|
|
33
|
+
const refreshed = args.refreshToken ? await refreshAuthToken({
|
|
34
|
+
collection: collectionConfig.slug,
|
|
35
|
+
refreshToken: args.refreshToken,
|
|
36
|
+
req
|
|
37
|
+
}) : undefined;
|
|
38
|
+
if (args.refreshToken && !refreshed) {
|
|
39
|
+
// Commit, so a reused refresh token's session stays logged out
|
|
40
|
+
if (shouldCommit) {
|
|
41
|
+
await commitTransaction(req);
|
|
42
|
+
}
|
|
33
43
|
throw new Forbidden(args.req.t);
|
|
34
44
|
}
|
|
35
|
-
if (
|
|
36
|
-
|
|
45
|
+
if (!refreshed) {
|
|
46
|
+
if (!args.req.user) {
|
|
47
|
+
throw new Forbidden(args.req.t);
|
|
48
|
+
}
|
|
49
|
+
if (args.req.user.collection !== collectionConfig.slug) {
|
|
50
|
+
throw new APIError('Incorrect collection', httpStatus.FORBIDDEN);
|
|
51
|
+
}
|
|
37
52
|
}
|
|
38
53
|
const pathname = new URL(args.req.url).pathname;
|
|
39
54
|
const isGraphQL = pathname === config.routes.graphQL;
|
|
@@ -42,15 +57,16 @@ export const refreshOperation = async (incomingArgs)=>{
|
|
|
42
57
|
req,
|
|
43
58
|
where: {
|
|
44
59
|
id: {
|
|
45
|
-
equals: args.req.user.id
|
|
60
|
+
equals: refreshed?.user.id ?? args.req.user.id
|
|
46
61
|
}
|
|
47
62
|
}
|
|
48
63
|
});
|
|
49
64
|
if (!user) {
|
|
50
65
|
throw new Forbidden(args.req.t);
|
|
51
66
|
}
|
|
52
|
-
const sid = args.req.user
|
|
53
|
-
|
|
67
|
+
const sid = args.req.user?._sid;
|
|
68
|
+
// refreshAuthToken already refreshed the refresh token's session
|
|
69
|
+
if (!refreshed && collectionConfig.auth.useSessions && !collectionConfig.auth.disableLocalStrategy) {
|
|
54
70
|
if (!Array.isArray(user.sessions) || !sid) {
|
|
55
71
|
throw new Forbidden(args.req.t);
|
|
56
72
|
}
|
|
@@ -60,7 +76,12 @@ export const refreshOperation = async (incomingArgs)=>{
|
|
|
60
76
|
}
|
|
61
77
|
const now = new Date();
|
|
62
78
|
const tokenExpInMs = collectionConfig.auth.tokenExpiration * 1000;
|
|
63
|
-
|
|
79
|
+
const tokenExpiresAt = new Date(now.getTime() + tokenExpInMs);
|
|
80
|
+
// Don't shorten sessions that outlast their tokens. Moving the expiry of a session with a
|
|
81
|
+
// refresh token would also make its refresh token look reused.
|
|
82
|
+
if (new Date(existingSession.expiresAt) < tokenExpiresAt) {
|
|
83
|
+
existingSession.expiresAt = tokenExpiresAt;
|
|
84
|
+
}
|
|
64
85
|
await req.payload.db.updateOne({
|
|
65
86
|
id: user.id,
|
|
66
87
|
collection: collectionConfig.slug,
|
|
@@ -91,20 +112,30 @@ export const refreshOperation = async (incomingArgs)=>{
|
|
|
91
112
|
if (!user) {
|
|
92
113
|
throw new NotFound(req.t);
|
|
93
114
|
}
|
|
94
|
-
user.collection =
|
|
95
|
-
user._strategy = args.req.user._strategy;
|
|
115
|
+
user.collection = collectionConfig.slug;
|
|
116
|
+
user._strategy = refreshed ? 'local-jwt' : args.req.user._strategy;
|
|
96
117
|
let result;
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
118
|
+
if (refreshed) {
|
|
119
|
+
result = {
|
|
120
|
+
exp: refreshed.exp,
|
|
121
|
+
refreshedToken: refreshed.token,
|
|
122
|
+
refreshToken: refreshed.refreshToken,
|
|
123
|
+
setCookie: true,
|
|
103
124
|
user
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
125
|
+
};
|
|
126
|
+
} else {
|
|
127
|
+
// /////////////////////////////////////
|
|
128
|
+
// refresh hook - Collection
|
|
129
|
+
// /////////////////////////////////////
|
|
130
|
+
for (const refreshHook of args.collection.config.hooks.refresh){
|
|
131
|
+
const hookResult = await refreshHook({
|
|
132
|
+
args,
|
|
133
|
+
user
|
|
134
|
+
});
|
|
135
|
+
if (hookResult) {
|
|
136
|
+
result = hookResult;
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
108
139
|
}
|
|
109
140
|
}
|
|
110
141
|
if (!result) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/auth/operations/refresh.ts"],"sourcesContent":["import type { Collection } from '../../collections/config/types.js'\nimport type { AuthenticatedUser } from '../../index.js'\nimport type { Document, PayloadRequest } from '../../types/index.js'\n\nimport { buildAfterOperation } from '../../collections/operations/utilities/buildAfterOperation.js'\nimport { buildBeforeOperation } from '../../collections/operations/utilities/buildBeforeOperation.js'\nimport { APIError, Forbidden, NotFound } from '../../errors/index.js'\nimport { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js'\nimport { assertNoValidationWrite } from '../../utilities/assertNoValidationWrite.js'\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport { httpStatus } from '../../utilities/httpStatus.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { applyUserReadAccess } from '../applyUserReadAccess.js'\nimport { getFieldsToSign } from '../getFieldsToSign.js'\nimport { jwtSign } from '../jwt.js'\nimport { removeExpiredSessions } from '../sessions.js'\n\nexport type Result = {\n exp: number\n refreshedToken: string\n setCookie?: boolean\n user: Document\n}\n\nexport type Arguments = {\n collection: Collection\n req: PayloadRequest\n}\n\nexport const refreshOperation = async (incomingArgs: Arguments): Promise<Result> => {\n let args = incomingArgs\n\n assertNoValidationWrite(args.req)\n\n try {\n const shouldCommit = await initTransaction(args.req)\n\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n args = await buildBeforeOperation({\n args,\n collection: args.collection.config,\n operation: 'refresh',\n overrideAccess: false,\n })\n\n // /////////////////////////////////////\n // Refresh\n // /////////////////////////////////////\n\n const {\n collection: { config: collectionConfig },\n req,\n req: {\n payload: { config, secret },\n },\n } = args\n\n if (!args.req.user) {\n throw new Forbidden(args.req.t)\n }\n if (args.req.user.collection !== collectionConfig.slug) {\n throw new APIError('Incorrect collection', httpStatus.FORBIDDEN)\n }\n\n const pathname = new URL(args.req.url!).pathname\n\n const isGraphQL = pathname === config.routes.graphQL\n\n let user = await req.payload.db.findOne<AuthenticatedUser>({\n collection: collectionConfig.slug,\n req,\n where: { id: { equals: args.req.user.id } },\n })\n\n if (!user) {\n throw new Forbidden(args.req.t)\n }\n\n const sid = args.req.user._sid\n\n if (collectionConfig.auth.useSessions && !collectionConfig.auth.disableLocalStrategy) {\n if (!Array.isArray(user.sessions) || !sid) {\n throw new Forbidden(args.req.t)\n }\n\n const existingSession = user.sessions.find(({ id }) => id === sid)\n\n if (!existingSession) {\n throw new Forbidden(args.req.t)\n }\n\n const now = new Date()\n const tokenExpInMs = collectionConfig.auth.tokenExpiration * 1000\n existingSession.expiresAt = new Date(now.getTime() + tokenExpInMs)\n\n await req.payload.db.updateOne({\n id: user.id,\n collection: collectionConfig.slug,\n data: {\n ...user,\n // Prevent updatedAt from being updated when only refreshing a session\n sessions: removeExpiredSessions(user.sessions),\n updatedAt: null,\n },\n req,\n returning: false,\n })\n }\n\n user = await req.payload.db.findOne({\n collection: collectionConfig.slug,\n locale: req.locale ?? undefined,\n req,\n where: appendNonTrashedFilter({\n enableTrash: Boolean(collectionConfig.trash),\n trash: false,\n where: { id: { equals: user.id } },\n }),\n })\n\n if (!user) {\n throw new NotFound(req.t)\n }\n\n user.collection = args.req.user.collection\n user._strategy = args.req.user._strategy\n\n let result!: Result\n\n // /////////////////////////////////////\n // refresh hook - Collection\n // /////////////////////////////////////\n\n for (const refreshHook of args.collection.config.hooks.refresh) {\n const hookResult = await refreshHook({ args, user })\n\n if (hookResult) {\n result = hookResult\n break\n }\n }\n\n if (!result) {\n const fieldsToSign = getFieldsToSign({\n collectionConfig,\n email: user?.email as string,\n sid,\n user: args.req.user,\n })\n\n const { exp, token: refreshedToken } = await jwtSign({\n fieldsToSign,\n secret,\n tokenExpiration: collectionConfig.auth.tokenExpiration,\n })\n\n result = {\n exp,\n refreshedToken,\n setCookie: true,\n user,\n }\n }\n\n result.user = await applyUserReadAccess({\n collection: collectionConfig,\n depth: isGraphQL ? 0 : collectionConfig.auth.depth,\n overrideAccess: false,\n req,\n showHiddenFields: false,\n user: result.user as AuthenticatedUser,\n })\n\n // /////////////////////////////////////\n // After Refresh - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.afterRefresh?.length) {\n for (const hook of collectionConfig.hooks.afterRefresh) {\n result =\n (await hook({\n collection: args.collection?.config,\n context: args.req.context,\n exp: result.exp,\n req: args.req,\n token: result.refreshedToken,\n })) || result\n }\n }\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n result = await buildAfterOperation({\n args,\n collection: args.collection?.config,\n operation: 'refresh',\n overrideAccess: false,\n result,\n })\n\n // /////////////////////////////////////\n // Return results\n // /////////////////////////////////////\n\n if (shouldCommit) {\n await commitTransaction(req)\n }\n\n return result\n } catch (error: unknown) {\n await killTransaction(args.req)\n throw error\n }\n}\n"],"names":["buildAfterOperation","buildBeforeOperation","APIError","Forbidden","NotFound","appendNonTrashedFilter","assertNoValidationWrite","commitTransaction","httpStatus","initTransaction","killTransaction","applyUserReadAccess","getFieldsToSign","jwtSign","removeExpiredSessions","refreshOperation","incomingArgs","args","req","shouldCommit","collection","config","operation","overrideAccess","collectionConfig","payload","secret","user","t","slug","FORBIDDEN","pathname","URL","url","isGraphQL","routes","graphQL","db","findOne","where","id","equals","sid","_sid","auth","useSessions","disableLocalStrategy","Array","isArray","sessions","existingSession","find","now","Date","tokenExpInMs","tokenExpiration","expiresAt","getTime","updateOne","data","updatedAt","returning","locale","undefined","enableTrash","Boolean","trash","_strategy","result","refreshHook","hooks","refresh","hookResult","fieldsToSign","email","exp","token","refreshedToken","setCookie","depth","showHiddenFields","afterRefresh","length","hook","context","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/auth/operations/refresh.ts"],"sourcesContent":["import type { Collection } from '../../collections/config/types.js'\nimport type { AuthenticatedUser } from '../../index.js'\nimport type { Document, PayloadRequest } from '../../types/index.js'\n\nimport { buildAfterOperation } from '../../collections/operations/utilities/buildAfterOperation.js'\nimport { buildBeforeOperation } from '../../collections/operations/utilities/buildBeforeOperation.js'\nimport { APIError, Forbidden, NotFound } from '../../errors/index.js'\nimport { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js'\nimport { assertNoValidationWrite } from '../../utilities/assertNoValidationWrite.js'\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport { httpStatus } from '../../utilities/httpStatus.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { applyUserReadAccess } from '../applyUserReadAccess.js'\nimport { getFieldsToSign } from '../getFieldsToSign.js'\nimport { jwtSign } from '../jwt.js'\nimport { refreshAuthToken } from '../refreshAuthToken.js'\nimport { removeExpiredSessions } from '../sessions.js'\n\nexport type Result = {\n exp: number\n refreshedToken: string\n /** The next refresh token, when refreshing with a refresh token. */\n refreshToken?: string\n setCookie?: boolean\n user: Document\n}\n\nexport type Arguments = {\n collection: Collection\n /**\n * A refresh token from login to refresh with, instead of the request's token. Unlike the\n * request's token, it still works after the token expired. Collection `refresh` hooks don't run\n * for it, since they replace refreshing with the request's token.\n */\n refreshToken?: string\n req: PayloadRequest\n}\n\nexport const refreshOperation = async (incomingArgs: Arguments): Promise<Result> => {\n let args = incomingArgs\n\n assertNoValidationWrite(args.req)\n\n try {\n const shouldCommit = await initTransaction(args.req)\n\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n args = await buildBeforeOperation({\n args,\n collection: args.collection.config,\n operation: 'refresh',\n overrideAccess: false,\n })\n\n // /////////////////////////////////////\n // Refresh\n // /////////////////////////////////////\n\n const {\n collection: { config: collectionConfig },\n req,\n req: {\n payload: { config, secret },\n },\n } = args\n\n const refreshed = args.refreshToken\n ? await refreshAuthToken({\n collection: collectionConfig.slug,\n refreshToken: args.refreshToken,\n req,\n })\n : undefined\n\n if (args.refreshToken && !refreshed) {\n // Commit, so a reused refresh token's session stays logged out\n if (shouldCommit) {\n await commitTransaction(req)\n }\n\n throw new Forbidden(args.req.t)\n }\n if (!refreshed) {\n if (!args.req.user) {\n throw new Forbidden(args.req.t)\n }\n if (args.req.user.collection !== collectionConfig.slug) {\n throw new APIError('Incorrect collection', httpStatus.FORBIDDEN)\n }\n }\n\n const pathname = new URL(args.req.url!).pathname\n\n const isGraphQL = pathname === config.routes.graphQL\n\n let user = await req.payload.db.findOne<AuthenticatedUser>({\n collection: collectionConfig.slug,\n req,\n where: { id: { equals: refreshed?.user.id ?? args.req.user!.id } },\n })\n\n if (!user) {\n throw new Forbidden(args.req.t)\n }\n\n const sid = args.req.user?._sid\n\n // refreshAuthToken already refreshed the refresh token's session\n if (\n !refreshed &&\n collectionConfig.auth.useSessions &&\n !collectionConfig.auth.disableLocalStrategy\n ) {\n if (!Array.isArray(user.sessions) || !sid) {\n throw new Forbidden(args.req.t)\n }\n\n const existingSession = user.sessions.find(({ id }) => id === sid)\n\n if (!existingSession) {\n throw new Forbidden(args.req.t)\n }\n\n const now = new Date()\n const tokenExpInMs = collectionConfig.auth.tokenExpiration * 1000\n const tokenExpiresAt = new Date(now.getTime() + tokenExpInMs)\n\n // Don't shorten sessions that outlast their tokens. Moving the expiry of a session with a\n // refresh token would also make its refresh token look reused.\n if (new Date(existingSession.expiresAt) < tokenExpiresAt) {\n existingSession.expiresAt = tokenExpiresAt\n }\n\n await req.payload.db.updateOne({\n id: user.id,\n collection: collectionConfig.slug,\n data: {\n ...user,\n // Prevent updatedAt from being updated when only refreshing a session\n sessions: removeExpiredSessions(user.sessions),\n updatedAt: null,\n },\n req,\n returning: false,\n })\n }\n\n user = await req.payload.db.findOne({\n collection: collectionConfig.slug,\n locale: req.locale ?? undefined,\n req,\n where: appendNonTrashedFilter({\n enableTrash: Boolean(collectionConfig.trash),\n trash: false,\n where: { id: { equals: user.id } },\n }),\n })\n\n if (!user) {\n throw new NotFound(req.t)\n }\n\n user.collection = collectionConfig.slug\n user._strategy = refreshed ? 'local-jwt' : args.req.user!._strategy\n\n let result!: Result\n\n if (refreshed) {\n result = {\n exp: refreshed.exp,\n refreshedToken: refreshed.token,\n refreshToken: refreshed.refreshToken,\n setCookie: true,\n user,\n }\n } else {\n // /////////////////////////////////////\n // refresh hook - Collection\n // /////////////////////////////////////\n\n for (const refreshHook of args.collection.config.hooks.refresh) {\n const hookResult = await refreshHook({ args, user })\n\n if (hookResult) {\n result = hookResult\n break\n }\n }\n }\n\n if (!result) {\n const fieldsToSign = getFieldsToSign({\n collectionConfig,\n email: user?.email as string,\n sid,\n user: args.req.user,\n })\n\n const { exp, token: refreshedToken } = await jwtSign({\n fieldsToSign,\n secret,\n tokenExpiration: collectionConfig.auth.tokenExpiration,\n })\n\n result = {\n exp,\n refreshedToken,\n setCookie: true,\n user,\n }\n }\n\n result.user = await applyUserReadAccess({\n collection: collectionConfig,\n depth: isGraphQL ? 0 : collectionConfig.auth.depth,\n overrideAccess: false,\n req,\n showHiddenFields: false,\n user: result.user as AuthenticatedUser,\n })\n\n // /////////////////////////////////////\n // After Refresh - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.afterRefresh?.length) {\n for (const hook of collectionConfig.hooks.afterRefresh) {\n result =\n (await hook({\n collection: args.collection?.config,\n context: args.req.context,\n exp: result.exp,\n req: args.req,\n token: result.refreshedToken,\n })) || result\n }\n }\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n result = await buildAfterOperation({\n args,\n collection: args.collection?.config,\n operation: 'refresh',\n overrideAccess: false,\n result,\n })\n\n // /////////////////////////////////////\n // Return results\n // /////////////////////////////////////\n\n if (shouldCommit) {\n await commitTransaction(req)\n }\n\n return result\n } catch (error: unknown) {\n await killTransaction(args.req)\n throw error\n }\n}\n"],"names":["buildAfterOperation","buildBeforeOperation","APIError","Forbidden","NotFound","appendNonTrashedFilter","assertNoValidationWrite","commitTransaction","httpStatus","initTransaction","killTransaction","applyUserReadAccess","getFieldsToSign","jwtSign","refreshAuthToken","removeExpiredSessions","refreshOperation","incomingArgs","args","req","shouldCommit","collection","config","operation","overrideAccess","collectionConfig","payload","secret","refreshed","refreshToken","slug","undefined","t","user","FORBIDDEN","pathname","URL","url","isGraphQL","routes","graphQL","db","findOne","where","id","equals","sid","_sid","auth","useSessions","disableLocalStrategy","Array","isArray","sessions","existingSession","find","now","Date","tokenExpInMs","tokenExpiration","tokenExpiresAt","getTime","expiresAt","updateOne","data","updatedAt","returning","locale","enableTrash","Boolean","trash","_strategy","result","exp","refreshedToken","token","setCookie","refreshHook","hooks","refresh","hookResult","fieldsToSign","email","depth","showHiddenFields","afterRefresh","length","hook","context","error"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resetPassword.d.ts","sourceRoot":"","sources":["../../../src/auth/operations/resetPassword.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"resetPassword.d.ts","sourceRoot":"","sources":["../../../src/auth/operations/resetPassword.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EAGX,MAAM,mCAAmC,CAAA;AAE1C,OAAO,KAAK,EAAE,kBAAkB,EAAqB,MAAM,gBAAgB,CAAA;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAiB1D,MAAM,MAAM,MAAM,GAAG;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC9B,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,UAAU,EAAE,UAAU,CAAA;IACtB,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAA;QAChB,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;IACD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,GAAG,EAAE,cAAc,CAAA;CACpB,CAAA;AAED,eAAO,MAAM,sBAAsB,GAAU,KAAK,SAAS,kBAAkB,QACrE,SAAS,KACd,OAAO,CAAC,MAAM,CA4NhB,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { buildAfterOperation } from '../../collections/operations/utilities/buildAfterOperation.js';
|
|
2
2
|
import { buildBeforeOperation } from '../../collections/operations/utilities/buildBeforeOperation.js';
|
|
3
|
-
import { APIError, Forbidden } from '../../errors/index.js';
|
|
3
|
+
import { APIError, Forbidden, ValidationError } from '../../errors/index.js';
|
|
4
4
|
import { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js';
|
|
5
5
|
import { assertNoValidationWrite } from '../../utilities/assertNoValidationWrite.js';
|
|
6
6
|
import { commitTransaction } from '../../utilities/commitTransaction.js';
|
|
@@ -8,13 +8,12 @@ import { httpStatus } from '../../utilities/httpStatus.js';
|
|
|
8
8
|
import { initTransaction } from '../../utilities/initTransaction.js';
|
|
9
9
|
import { killTransaction } from '../../utilities/killTransaction.js';
|
|
10
10
|
import { applyUserReadAccess } from '../applyUserReadAccess.js';
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import { addSessionToUser, revokeSession } from '../sessions.js';
|
|
11
|
+
import { createAuthToken } from '../createAuthToken.js';
|
|
12
|
+
import { revokeSession } from '../sessions.js';
|
|
14
13
|
import { authenticateLocalStrategy } from '../strategies/local/authenticate.js';
|
|
15
14
|
import { generatePasswordSaltHash } from '../strategies/local/generatePasswordSaltHash.js';
|
|
16
15
|
export const resetPasswordOperation = async (args)=>{
|
|
17
|
-
const { collection: { config: collectionConfig }, data, depth, overrideAccess = false, req: { payload
|
|
16
|
+
const { collection: { config: collectionConfig }, data, depth, overrideAccess = false, req: { payload }, req } = args;
|
|
18
17
|
assertNoValidationWrite(req);
|
|
19
18
|
if (!Object.prototype.hasOwnProperty.call(data, 'token') || !Object.prototype.hasOwnProperty.call(data, 'password')) {
|
|
20
19
|
throw new APIError('Missing required data.', httpStatus.BAD_REQUEST);
|
|
@@ -55,6 +54,13 @@ export const resetPasswordOperation = async (args)=>{
|
|
|
55
54
|
if (!user) {
|
|
56
55
|
throw new APIError('Token is either invalid or has expired.', httpStatus.FORBIDDEN);
|
|
57
56
|
}
|
|
57
|
+
await validatePasswordField({
|
|
58
|
+
collectionConfig,
|
|
59
|
+
overrideAccess,
|
|
60
|
+
password: data.password,
|
|
61
|
+
req,
|
|
62
|
+
user
|
|
63
|
+
});
|
|
58
64
|
// TODO: replace this method
|
|
59
65
|
const { hash, salt } = await generatePasswordSaltHash({
|
|
60
66
|
collection: collectionConfig,
|
|
@@ -106,23 +112,14 @@ export const resetPasswordOperation = async (args)=>{
|
|
|
106
112
|
user = doc;
|
|
107
113
|
user.collection = collectionConfig.slug;
|
|
108
114
|
user._strategy = 'local-jwt';
|
|
109
|
-
const
|
|
115
|
+
const { token, ...session } = await createAuthToken({
|
|
110
116
|
collectionConfig,
|
|
111
117
|
email: user.email,
|
|
112
|
-
user
|
|
113
|
-
};
|
|
114
|
-
const session = await addSessionToUser({
|
|
115
|
-
collectionConfig,
|
|
116
|
-
payload,
|
|
117
118
|
req,
|
|
118
119
|
user
|
|
119
120
|
});
|
|
120
121
|
sessionUser = user;
|
|
121
122
|
sid = session.sid;
|
|
122
|
-
if (sid) {
|
|
123
|
-
fieldsToSignArgs.sid = sid;
|
|
124
|
-
}
|
|
125
|
-
const fieldsToSign = getFieldsToSign(fieldsToSignArgs);
|
|
126
123
|
// /////////////////////////////////////
|
|
127
124
|
// beforeLogin - Collection
|
|
128
125
|
// /////////////////////////////////////
|
|
@@ -136,11 +133,6 @@ export const resetPasswordOperation = async (args)=>{
|
|
|
136
133
|
}) || user;
|
|
137
134
|
}
|
|
138
135
|
}
|
|
139
|
-
const { token } = await jwtSign({
|
|
140
|
-
fieldsToSign,
|
|
141
|
-
secret,
|
|
142
|
-
tokenExpiration: collectionConfig.auth.tokenExpiration
|
|
143
|
-
});
|
|
144
136
|
req.user = user;
|
|
145
137
|
// /////////////////////////////////////
|
|
146
138
|
// afterLogin - Collection
|
|
@@ -198,5 +190,47 @@ export const resetPasswordOperation = async (args)=>{
|
|
|
198
190
|
throw error;
|
|
199
191
|
}
|
|
200
192
|
};
|
|
193
|
+
/**
|
|
194
|
+
* Runs the `password` field override's validation, which `payload.db.updateOne` skips.
|
|
195
|
+
*/ async function validatePasswordField({ collectionConfig, overrideAccess, password, req, user }) {
|
|
196
|
+
const passwordField = collectionConfig.flattenedFields.find((field)=>field.name === 'password');
|
|
197
|
+
if (!passwordField || !('validate' in passwordField) || !passwordField.validate) {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
const validate = passwordField.validate;
|
|
201
|
+
const dataToValidate = {
|
|
202
|
+
...user,
|
|
203
|
+
password
|
|
204
|
+
};
|
|
205
|
+
const validationResult = await validate(password, {
|
|
206
|
+
...passwordField,
|
|
207
|
+
id: user.id,
|
|
208
|
+
blockData: {},
|
|
209
|
+
collectionSlug: collectionConfig.slug,
|
|
210
|
+
data: dataToValidate,
|
|
211
|
+
event: 'submit',
|
|
212
|
+
operation: 'update',
|
|
213
|
+
overrideAccess,
|
|
214
|
+
path: [
|
|
215
|
+
'password'
|
|
216
|
+
],
|
|
217
|
+
preferences: {
|
|
218
|
+
fields: {}
|
|
219
|
+
},
|
|
220
|
+
req,
|
|
221
|
+
siblingData: dataToValidate
|
|
222
|
+
});
|
|
223
|
+
if (typeof validationResult === 'string') {
|
|
224
|
+
throw new ValidationError({
|
|
225
|
+
collection: collectionConfig.slug,
|
|
226
|
+
errors: [
|
|
227
|
+
{
|
|
228
|
+
message: validationResult,
|
|
229
|
+
path: 'password'
|
|
230
|
+
}
|
|
231
|
+
]
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
}
|
|
201
235
|
|
|
202
236
|
//# sourceMappingURL=resetPassword.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/auth/operations/resetPassword.ts"],"sourcesContent":["import type { Collection, DataFromCollectionSlug } from '../../collections/config/types.js'\nimport type { AuthCollectionSlug, AuthenticatedUser } from '../../index.js'\nimport type { PayloadRequest } from '../../types/index.js'\n\nimport { buildAfterOperation } from '../../collections/operations/utilities/buildAfterOperation.js'\nimport { buildBeforeOperation } from '../../collections/operations/utilities/buildBeforeOperation.js'\nimport { APIError, Forbidden } from '../../errors/index.js'\nimport { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js'\nimport { assertNoValidationWrite } from '../../utilities/assertNoValidationWrite.js'\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport { httpStatus } from '../../utilities/httpStatus.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { applyUserReadAccess } from '../applyUserReadAccess.js'\nimport { getFieldsToSign } from '../getFieldsToSign.js'\nimport { jwtSign } from '../jwt.js'\nimport { addSessionToUser, revokeSession } from '../sessions.js'\nimport { authenticateLocalStrategy } from '../strategies/local/authenticate.js'\nimport { generatePasswordSaltHash } from '../strategies/local/generatePasswordSaltHash.js'\n\nexport type Result = {\n token?: string\n user: Record<string, unknown>\n}\n\nexport type Arguments = {\n collection: Collection\n data: {\n password: string\n token: string\n }\n depth?: number\n overrideAccess?: boolean\n req: PayloadRequest\n}\n\nexport const resetPasswordOperation = async <TSlug extends AuthCollectionSlug>(\n args: Arguments,\n): Promise<Result> => {\n const {\n collection: { config: collectionConfig },\n data,\n depth,\n overrideAccess = false,\n req: {\n payload: { secret },\n payload,\n },\n req,\n } = args\n\n assertNoValidationWrite(req)\n\n if (\n !Object.prototype.hasOwnProperty.call(data, 'token') ||\n !Object.prototype.hasOwnProperty.call(data, 'password')\n ) {\n throw new APIError('Missing required data.', httpStatus.BAD_REQUEST)\n }\n\n if (collectionConfig.auth.disableLocalStrategy) {\n throw new Forbidden(req.t)\n }\n\n let sid: string | undefined\n let sessionUser: AuthenticatedUser | null = null\n\n try {\n const shouldCommit = await initTransaction(req)\n\n args = await buildBeforeOperation({\n args,\n collection: args.collection.config,\n operation: 'resetPassword',\n overrideAccess,\n })\n\n // /////////////////////////////////////\n // Reset Password\n // /////////////////////////////////////\n\n const where = appendNonTrashedFilter({\n enableTrash: Boolean(collectionConfig.trash),\n trash: false,\n where: {\n resetPasswordExpiration: { greater_than: new Date().toISOString() },\n resetPasswordToken: { equals: data.token },\n },\n })\n\n let user = await payload.db.findOne<AuthenticatedUser>({\n collection: collectionConfig.slug,\n req,\n where,\n })\n\n if (!user) {\n throw new APIError('Token is either invalid or has expired.', httpStatus.FORBIDDEN)\n }\n\n // TODO: replace this method\n const { hash, salt } = await generatePasswordSaltHash({\n collection: collectionConfig,\n password: data.password,\n req,\n })\n\n user.salt = salt\n user.hash = hash\n\n user.resetPasswordExpiration = new Date().toISOString()\n\n if (collectionConfig.auth.maxLoginAttempts > 0) {\n user.lockUntil = null\n user.loginAttempts = 0\n }\n\n if (collectionConfig.auth.verify) {\n user._verified = Boolean(user._verified)\n }\n\n // /////////////////////////////////////\n // beforeValidate - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.beforeValidate?.length) {\n for (const hook of collectionConfig.hooks.beforeValidate) {\n await hook({\n collection: args.collection?.config,\n context: req.context,\n data: user,\n operation: 'update',\n req,\n })\n }\n }\n\n // /////////////////////////////////////\n // Update new password\n // /////////////////////////////////////\n\n // Ensure updatedAt date is always updated\n user.updatedAt = new Date().toISOString()\n\n if (collectionConfig.auth.useSessions) {\n user.sessions = []\n }\n\n const doc = await payload.db.updateOne({\n id: user.id,\n collection: collectionConfig.slug,\n data: user,\n req,\n })\n\n await authenticateLocalStrategy({ doc, password: data.password })\n\n user = doc as AuthenticatedUser\n user.collection = collectionConfig.slug\n user._strategy = 'local-jwt'\n\n const fieldsToSignArgs: Parameters<typeof getFieldsToSign>[0] = {\n collectionConfig,\n email: user.email!,\n user,\n }\n\n const session = await addSessionToUser({\n collectionConfig,\n payload,\n req,\n user,\n })\n\n sessionUser = user\n sid = session.sid\n\n if (sid) {\n fieldsToSignArgs.sid = sid\n }\n\n const fieldsToSign = getFieldsToSign(fieldsToSignArgs)\n\n // /////////////////////////////////////\n // beforeLogin - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.beforeLogin?.length) {\n for (const hook of collectionConfig.hooks.beforeLogin) {\n user =\n (await hook({\n collection: args.collection?.config,\n context: args.req.context,\n req: args.req,\n user,\n })) || user\n }\n }\n\n const { token } = await jwtSign({\n fieldsToSign,\n secret,\n tokenExpiration: collectionConfig.auth.tokenExpiration,\n })\n\n req.user = user\n\n // /////////////////////////////////////\n // afterLogin - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.afterLogin?.length) {\n for (const hook of collectionConfig.hooks.afterLogin) {\n user =\n (await hook({\n collection: args.collection?.config,\n context: args.req.context,\n req: args.req,\n token,\n user,\n })) || user\n }\n }\n\n user!.collection = collectionConfig.slug\n user!._strategy = 'local-jwt'\n\n const userWithReadAccess = await applyUserReadAccess({\n collection: collectionConfig,\n depth: depth!,\n overrideAccess,\n req,\n showHiddenFields: false,\n user: user!,\n })\n\n if (shouldCommit) {\n await commitTransaction(req)\n }\n\n let result: { user: DataFromCollectionSlug<TSlug> } & Result = {\n token,\n user: userWithReadAccess,\n }\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n result = await buildAfterOperation({\n args,\n collection: args.collection?.config,\n operation: 'resetPassword',\n overrideAccess,\n result,\n })\n\n return result\n } catch (error: unknown) {\n if (sid) {\n await revokeSession({\n collectionConfig,\n payload,\n req,\n sid,\n user: sessionUser,\n })\n }\n await killTransaction(req)\n throw error\n }\n}\n"],"names":["buildAfterOperation","buildBeforeOperation","APIError","Forbidden","appendNonTrashedFilter","assertNoValidationWrite","commitTransaction","httpStatus","initTransaction","killTransaction","applyUserReadAccess","getFieldsToSign","jwtSign","addSessionToUser","revokeSession","authenticateLocalStrategy","generatePasswordSaltHash","resetPasswordOperation","args","collection","config","collectionConfig","data","depth","overrideAccess","req","payload","secret","Object","prototype","hasOwnProperty","call","BAD_REQUEST","auth","disableLocalStrategy","t","sid","sessionUser","shouldCommit","operation","where","enableTrash","Boolean","trash","resetPasswordExpiration","greater_than","Date","toISOString","resetPasswordToken","equals","token","user","db","findOne","slug","FORBIDDEN","hash","salt","password","maxLoginAttempts","lockUntil","loginAttempts","verify","_verified","hooks","beforeValidate","length","hook","context","updatedAt","useSessions","sessions","doc","updateOne","id","_strategy","fieldsToSignArgs","email","session","fieldsToSign","beforeLogin","tokenExpiration","afterLogin","userWithReadAccess","showHiddenFields","result","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/auth/operations/resetPassword.ts"],"sourcesContent":["import type {\n Collection,\n DataFromCollectionSlug,\n SanitizedCollectionConfig,\n} from '../../collections/config/types.js'\nimport type { Validate } from '../../fields/config/types.js'\nimport type { AuthCollectionSlug, AuthenticatedUser } from '../../index.js'\nimport type { PayloadRequest } from '../../types/index.js'\n\nimport { buildAfterOperation } from '../../collections/operations/utilities/buildAfterOperation.js'\nimport { buildBeforeOperation } from '../../collections/operations/utilities/buildBeforeOperation.js'\nimport { APIError, Forbidden, ValidationError } from '../../errors/index.js'\nimport { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js'\nimport { assertNoValidationWrite } from '../../utilities/assertNoValidationWrite.js'\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport { httpStatus } from '../../utilities/httpStatus.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { applyUserReadAccess } from '../applyUserReadAccess.js'\nimport { createAuthToken } from '../createAuthToken.js'\nimport { revokeSession } from '../sessions.js'\nimport { authenticateLocalStrategy } from '../strategies/local/authenticate.js'\nimport { generatePasswordSaltHash } from '../strategies/local/generatePasswordSaltHash.js'\n\nexport type Result = {\n token?: string\n user: Record<string, unknown>\n}\n\nexport type Arguments = {\n collection: Collection\n data: {\n password: string\n token: string\n }\n depth?: number\n overrideAccess?: boolean\n req: PayloadRequest\n}\n\nexport const resetPasswordOperation = async <TSlug extends AuthCollectionSlug>(\n args: Arguments,\n): Promise<Result> => {\n const {\n collection: { config: collectionConfig },\n data,\n depth,\n overrideAccess = false,\n req: { payload },\n req,\n } = args\n\n assertNoValidationWrite(req)\n\n if (\n !Object.prototype.hasOwnProperty.call(data, 'token') ||\n !Object.prototype.hasOwnProperty.call(data, 'password')\n ) {\n throw new APIError('Missing required data.', httpStatus.BAD_REQUEST)\n }\n\n if (collectionConfig.auth.disableLocalStrategy) {\n throw new Forbidden(req.t)\n }\n\n let sid: string | undefined\n let sessionUser: AuthenticatedUser | null = null\n\n try {\n const shouldCommit = await initTransaction(req)\n\n args = await buildBeforeOperation({\n args,\n collection: args.collection.config,\n operation: 'resetPassword',\n overrideAccess,\n })\n\n // /////////////////////////////////////\n // Reset Password\n // /////////////////////////////////////\n\n const where = appendNonTrashedFilter({\n enableTrash: Boolean(collectionConfig.trash),\n trash: false,\n where: {\n resetPasswordExpiration: { greater_than: new Date().toISOString() },\n resetPasswordToken: { equals: data.token },\n },\n })\n\n let user = await payload.db.findOne<AuthenticatedUser>({\n collection: collectionConfig.slug,\n req,\n where,\n })\n\n if (!user) {\n throw new APIError('Token is either invalid or has expired.', httpStatus.FORBIDDEN)\n }\n\n await validatePasswordField({\n collectionConfig,\n overrideAccess,\n password: data.password,\n req,\n user,\n })\n\n // TODO: replace this method\n const { hash, salt } = await generatePasswordSaltHash({\n collection: collectionConfig,\n password: data.password,\n req,\n })\n\n user.salt = salt\n user.hash = hash\n\n user.resetPasswordExpiration = new Date().toISOString()\n\n if (collectionConfig.auth.maxLoginAttempts > 0) {\n user.lockUntil = null\n user.loginAttempts = 0\n }\n\n if (collectionConfig.auth.verify) {\n user._verified = Boolean(user._verified)\n }\n\n // /////////////////////////////////////\n // beforeValidate - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.beforeValidate?.length) {\n for (const hook of collectionConfig.hooks.beforeValidate) {\n await hook({\n collection: args.collection?.config,\n context: req.context,\n data: user,\n operation: 'update',\n req,\n })\n }\n }\n\n // /////////////////////////////////////\n // Update new password\n // /////////////////////////////////////\n\n // Ensure updatedAt date is always updated\n user.updatedAt = new Date().toISOString()\n\n if (collectionConfig.auth.useSessions) {\n user.sessions = []\n }\n\n const doc = await payload.db.updateOne({\n id: user.id,\n collection: collectionConfig.slug,\n data: user,\n req,\n })\n\n await authenticateLocalStrategy({ doc, password: data.password })\n\n user = doc as AuthenticatedUser\n user.collection = collectionConfig.slug\n user._strategy = 'local-jwt'\n\n const { token, ...session } = await createAuthToken({\n collectionConfig,\n email: user.email!,\n req,\n user,\n })\n\n sessionUser = user\n sid = session.sid\n\n // /////////////////////////////////////\n // beforeLogin - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.beforeLogin?.length) {\n for (const hook of collectionConfig.hooks.beforeLogin) {\n user =\n (await hook({\n collection: args.collection?.config,\n context: args.req.context,\n req: args.req,\n user,\n })) || user\n }\n }\n\n req.user = user\n\n // /////////////////////////////////////\n // afterLogin - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.afterLogin?.length) {\n for (const hook of collectionConfig.hooks.afterLogin) {\n user =\n (await hook({\n collection: args.collection?.config,\n context: args.req.context,\n req: args.req,\n token,\n user,\n })) || user\n }\n }\n\n user!.collection = collectionConfig.slug\n user!._strategy = 'local-jwt'\n\n const userWithReadAccess = await applyUserReadAccess({\n collection: collectionConfig,\n depth: depth!,\n overrideAccess,\n req,\n showHiddenFields: false,\n user: user!,\n })\n\n if (shouldCommit) {\n await commitTransaction(req)\n }\n\n let result: { user: DataFromCollectionSlug<TSlug> } & Result = {\n token,\n user: userWithReadAccess,\n }\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n result = await buildAfterOperation({\n args,\n collection: args.collection?.config,\n operation: 'resetPassword',\n overrideAccess,\n result,\n })\n\n return result\n } catch (error: unknown) {\n if (sid) {\n await revokeSession({\n collectionConfig,\n payload,\n req,\n sid,\n user: sessionUser,\n })\n }\n await killTransaction(req)\n throw error\n }\n}\n\n/**\n * Runs the `password` field override's validation, which `payload.db.updateOne` skips.\n */\nasync function validatePasswordField({\n collectionConfig,\n overrideAccess,\n password,\n req,\n user,\n}: {\n collectionConfig: SanitizedCollectionConfig\n overrideAccess: boolean\n password: string\n req: PayloadRequest\n user: AuthenticatedUser\n}): Promise<void> {\n const passwordField = collectionConfig.flattenedFields.find((field) => field.name === 'password')\n\n if (!passwordField || !('validate' in passwordField) || !passwordField.validate) {\n return\n }\n\n const validate = passwordField.validate as Validate<string>\n const dataToValidate = { ...user, password }\n\n const validationResult = await validate(password, {\n ...passwordField,\n id: user.id,\n blockData: {},\n collectionSlug: collectionConfig.slug,\n data: dataToValidate,\n event: 'submit',\n operation: 'update',\n overrideAccess,\n path: ['password'],\n preferences: { fields: {} },\n req,\n siblingData: dataToValidate,\n })\n\n if (typeof validationResult === 'string') {\n throw new ValidationError({\n collection: collectionConfig.slug,\n errors: [{ message: validationResult, path: 'password' }],\n })\n }\n}\n"],"names":["buildAfterOperation","buildBeforeOperation","APIError","Forbidden","ValidationError","appendNonTrashedFilter","assertNoValidationWrite","commitTransaction","httpStatus","initTransaction","killTransaction","applyUserReadAccess","createAuthToken","revokeSession","authenticateLocalStrategy","generatePasswordSaltHash","resetPasswordOperation","args","collection","config","collectionConfig","data","depth","overrideAccess","req","payload","Object","prototype","hasOwnProperty","call","BAD_REQUEST","auth","disableLocalStrategy","t","sid","sessionUser","shouldCommit","operation","where","enableTrash","Boolean","trash","resetPasswordExpiration","greater_than","Date","toISOString","resetPasswordToken","equals","token","user","db","findOne","slug","FORBIDDEN","validatePasswordField","password","hash","salt","maxLoginAttempts","lockUntil","loginAttempts","verify","_verified","hooks","beforeValidate","length","hook","context","updatedAt","useSessions","sessions","doc","updateOne","id","_strategy","session","email","beforeLogin","afterLogin","userWithReadAccess","showHiddenFields","result","error","passwordField","flattenedFields","find","field","name","validate","dataToValidate","validationResult","blockData","collectionSlug","event","path","preferences","fields","siblingData","errors","message"],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { SanitizedCollectionConfig } from '../collections/config/types.js';
|
|
2
|
+
import type { AuthenticatedUser, UserSession } from '../index.js';
|
|
3
|
+
import type { PayloadRequest } from '../types/index.js';
|
|
4
|
+
/**
|
|
5
|
+
* Trades a refresh token from `createAuthToken` or an earlier refresh for a new token and a new
|
|
6
|
+
* refresh token. Every refresh moves the session's `expiresAt`, which the refresh token remembers,
|
|
7
|
+
* so a refresh token with an outdated one was already used. That means it was copied, and its
|
|
8
|
+
* session is logged out.
|
|
9
|
+
*
|
|
10
|
+
* @returns `null` when the refresh token is invalid, its session ended, or it was reused
|
|
11
|
+
*/
|
|
12
|
+
export declare const refreshAuthToken: ({ collection, refreshToken, req, }: {
|
|
13
|
+
/** Only accept refresh tokens of this collection. */
|
|
14
|
+
collection?: string;
|
|
15
|
+
refreshToken: string;
|
|
16
|
+
req: PayloadRequest;
|
|
17
|
+
}) => Promise<{
|
|
18
|
+
collectionConfig: SanitizedCollectionConfig;
|
|
19
|
+
exp: number;
|
|
20
|
+
refreshToken: string;
|
|
21
|
+
token: string;
|
|
22
|
+
user: AuthenticatedUser;
|
|
23
|
+
} | null>;
|
|
24
|
+
/** How many seconds a session with a refresh token lasts from each refresh. */
|
|
25
|
+
export declare const getRefreshTokenExpiration: (collectionConfig: SanitizedCollectionConfig) => number;
|
|
26
|
+
export declare const createRefreshToken: ({ collectionConfig, req, session, userID, }: {
|
|
27
|
+
collectionConfig: SanitizedCollectionConfig;
|
|
28
|
+
req: PayloadRequest;
|
|
29
|
+
session: UserSession;
|
|
30
|
+
userID: number | string;
|
|
31
|
+
}) => string;
|
|
32
|
+
//# sourceMappingURL=refreshAuthToken.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refreshAuthToken.d.ts","sourceRoot":"","sources":["../../src/auth/refreshAuthToken.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAC/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAuBvD;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,uCAI1B;IACD,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,GAAG,EAAE,cAAc,CAAA;CACpB,KAAG,OAAO,CAAC;IACV,gBAAgB,EAAE,yBAAyB,CAAA;IAC3C,GAAG,EAAE,MAAM,CAAA;IACX,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,iBAAiB,CAAA;CACxB,GAAG,IAAI,CA4DP,CAAA;AAED,+EAA+E;AAC/E,eAAO,MAAM,yBAAyB,qBAAsB,yBAAyB,KAAG,MAGrD,CAAA;AAEnC,eAAO,MAAM,kBAAkB,gDAK5B;IACD,gBAAgB,EAAE,yBAAyB,CAAA;IAC3C,GAAG,EAAE,cAAc,CAAA;IACnB,OAAO,EAAE,WAAW,CAAA;IACpB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAA;CACxB,KAAG,MAQD,CAAA"}
|