@lucidcms/core
Version:
The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.
1 lines • 5 kB
Source Map (JSON)
{"version":3,"file":"authorize-share.mjs","names":["formatter","constants"],"sources":["../../../src/services/media-share-links/authorize-share.ts"],"sourcesContent":["import { scrypt } from \"@noble/hashes/scrypt.js\";\nimport { isPast } from \"date-fns\";\nimport constants from \"../../constants/constants.js\";\nimport formatter from \"../../libs/formatters/index.js\";\nimport { copy } from \"../../libs/i18n/index.js\";\nimport { MediaShareLinksRepository } from \"../../libs/repositories/index.js\";\nimport type { ServiceFn } from \"../../utils/services/types.js\";\n\n/**\n * Authorize share access by validating the share password and checking that it isn't expired or soft-deleted\n */\nconst authorizeShare: ServiceFn<\n\t[\n\t\t{\n\t\t\ttoken: string;\n\t\t\tsessionCookie?: string;\n\t\t\tprovidedPassword?: string;\n\t\t\tenforcePasswordSession?: boolean;\n\t\t},\n\t],\n\t{\n\t\tmediaKey: string;\n\t\tposterKey: string | null;\n\t\tpasswordRequired: boolean;\n\t}\n> = async (context, data) => {\n\tconst MediaShareLinks = new MediaShareLinksRepository(\n\t\tcontext.db.client,\n\t\tcontext.config.db,\n\t);\n\n\tconst linkRes = await MediaShareLinks.selectSingleWithMediaByToken({\n\t\ttoken: data.token,\n\t});\n\tif (linkRes.error) {\n\t\treturn {\n\t\t\terror: {\n\t\t\t\ttype: \"basic\",\n\t\t\t\tname: copy(\"server:core.share.links.not.found.title\"),\n\t\t\t\tstatus: 404,\n\t\t\t\tmessage: copy(\"server:core.share.links.not.found.message\"),\n\t\t\t},\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\n\t//* check if expired\n\tif (linkRes.data.expires_at && isPast(linkRes.data.expires_at)) {\n\t\treturn {\n\t\t\terror: {\n\t\t\t\ttype: \"basic\",\n\t\t\t\tname: copy(\"server:core.share.links.expired.title\"),\n\t\t\t\tstatus: 410,\n\t\t\t\tmessage: copy(\"server:core.share.links.expired.message\"),\n\t\t\t},\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\n\t//* check if media is soft-deleted\n\tconst isDeleted = formatter.formatBoolean(linkRes.data.media_is_deleted);\n\tif (isDeleted) {\n\t\treturn {\n\t\t\terror: {\n\t\t\t\ttype: \"basic\",\n\t\t\t\tname: copy(\"server:core.share.links.media.deleted.title\"),\n\t\t\t\tstatus: 410,\n\t\t\t\tmessage: copy(\"server:core.share.links.media.deleted.message\"),\n\t\t\t},\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\n\t//* check if password is required\n\tif (linkRes.data.password && !data.sessionCookie) {\n\t\tif (!data.providedPassword) {\n\t\t\tif (data.enforcePasswordSession) {\n\t\t\t\treturn {\n\t\t\t\t\terror: {\n\t\t\t\t\t\ttype: \"authorisation\",\n\t\t\t\t\t\tname: copy(\"server:core.share.stream.password.required.title\"),\n\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\tmessage: copy(\"server:core.share.stream.password.required.message\"),\n\t\t\t\t\t},\n\t\t\t\t\tdata: undefined,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\terror: undefined,\n\t\t\t\tdata: {\n\t\t\t\t\tpasswordRequired: true,\n\t\t\t\t\tmediaKey: linkRes.data.media_key,\n\t\t\t\t\tposterKey: linkRes.data.media_poster_key ?? null,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tconst hashed = Buffer.from(\n\t\t\tscrypt(\n\t\t\t\tdata.providedPassword,\n\t\t\t\tcontext.config.secrets.encryption,\n\t\t\t\tconstants.scrypt,\n\t\t\t),\n\t\t).toString(\"base64\");\n\n\t\tif (hashed !== linkRes.data.password) {\n\t\t\treturn {\n\t\t\t\terror: {\n\t\t\t\t\ttype: \"authorisation\",\n\t\t\t\t\tname: copy(\"server:core.share.links.access.denied.title\"),\n\t\t\t\t\tstatus: 401,\n\t\t\t\t\tmessage: copy(\"server:core.share.links.incorrect.password.message\"),\n\t\t\t\t},\n\t\t\t\tdata: undefined,\n\t\t\t};\n\t\t}\n\t}\n\n\treturn {\n\t\terror: undefined,\n\t\tdata: {\n\t\t\tmediaKey: linkRes.data.media_key,\n\t\t\tposterKey: linkRes.data.media_poster_key ?? null,\n\t\t\tpasswordRequired: false,\n\t\t},\n\t};\n};\n\nexport default authorizeShare;\n"],"mappings":"4RAWA,MAAM,EAcF,MAAO,EAAS,IAAS,CAM5B,IAAM,EAAU,MAAM,IALM,EAC3B,EAAQ,GAAG,OACX,EAAQ,OAAO,EAGoB,CAAC,CAAC,6BAA6B,CAClE,MAAO,EAAK,KACb,CAAC,EACD,GAAI,EAAQ,MACX,MAAO,CACN,MAAO,CACN,KAAM,QACN,KAAM,EAAK,yCAAyC,EACpD,OAAQ,IACR,QAAS,EAAK,2CAA2C,CAC1D,EACA,KAAM,IAAA,EACP,EAID,GAAI,EAAQ,KAAK,YAAc,EAAO,EAAQ,KAAK,UAAU,EAC5D,MAAO,CACN,MAAO,CACN,KAAM,QACN,KAAM,EAAK,uCAAuC,EAClD,OAAQ,IACR,QAAS,EAAK,yCAAyC,CACxD,EACA,KAAM,IAAA,EACP,EAKD,GADkBA,EAAU,cAAc,EAAQ,KAAK,gBAC3C,EACX,MAAO,CACN,MAAO,CACN,KAAM,QACN,KAAM,EAAK,6CAA6C,EACxD,OAAQ,IACR,QAAS,EAAK,+CAA+C,CAC9D,EACA,KAAM,IAAA,EACP,EAID,GAAI,EAAQ,KAAK,UAAY,CAAC,EAAK,cAAe,CACjD,GAAI,CAAC,EAAK,iBAaT,OAZI,EAAK,uBACD,CACN,MAAO,CACN,KAAM,gBACN,KAAM,EAAK,kDAAkD,EAC7D,OAAQ,IACR,QAAS,EAAK,oDAAoD,CACnE,EACA,KAAM,IAAA,EACP,EAGM,CACN,MAAO,IAAA,GACP,KAAM,CACL,iBAAkB,GAClB,SAAU,EAAQ,KAAK,UACvB,UAAW,EAAQ,KAAK,kBAAoB,IAC7C,CACD,EAWD,GARe,OAAO,KACrB,EACC,EAAK,iBACL,EAAQ,OAAO,QAAQ,WACvBC,EAAU,MACX,CACD,CAAC,CAAC,SAAS,QAEF,IAAM,EAAQ,KAAK,SAC3B,MAAO,CACN,MAAO,CACN,KAAM,gBACN,KAAM,EAAK,6CAA6C,EACxD,OAAQ,IACR,QAAS,EAAK,oDAAoD,CACnE,EACA,KAAM,IAAA,EACP,CAEF,CAEA,MAAO,CACN,MAAO,IAAA,GACP,KAAM,CACL,SAAU,EAAQ,KAAK,UACvB,UAAW,EAAQ,KAAK,kBAAoB,KAC5C,iBAAkB,EACnB,CACD,CACD"}