@lucidcms/core
Version:
The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.
3 lines • 1.17 kB
JavaScript
import e from"../../constants/constants.mjs";import t from"../../utils/helpers/url-add-path.mjs";import n from"node:crypto";const r=e=>Object.fromEntries(Object.entries(e??{}).filter(([,e])=>e!==void 0).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,String(t)])),i=e=>new URLSearchParams(r(e)).toString(),a=e=>n.createHmac(`sha256`,e.secretKey).update([e.path,e.key,String(e.timestamp),i(e.query)].join(`
`)).digest(`hex`),o=n=>{let i=Date.now(),o=r(n.query),s=a({path:n.path,key:n.key,timestamp:i,secretKey:n.secretKey,query:o}),c=new URLSearchParams({key:n.key,token:s,timestamp:String(i)});for(let[e,t]of Object.entries(o))c.set(e,t);return`${t(n.host,`${e.directories.base}/api/v1/${n.path}`)}?${c.toString()}`},s=t=>{let r=Number.parseInt(String(t.timestamp),10);if(!Number.isFinite(r))return!1;let i=Date.now()-r;if(i<0||i>e.presignedUrlExpiration)return!1;let o=a({path:t.path,key:t.key,timestamp:r,secretKey:t.secretKey,query:t.query});return t.token.length===o.length&&n.timingSafeEqual(Buffer.from(t.token),Buffer.from(o))};export{a as createSignedMediaToken,o as createSignedMediaUrl,s as validateSignedMediaUrl};
//# sourceMappingURL=signed-url.mjs.map