@s4e/jsentinel
Version:
Script integrity and clipboard tamper detection for browsers.
2 lines (1 loc) • 1.34 kB
JavaScript
function e(e){if(Array.isArray(null==e?void 0:e.scripts))return e.scripts;if(e&&e.scripts&&"object"==typeof e.scripts){const t=[];for(const[s,n]of Object.entries(e.scripts))"string"==typeof n&&t.push({src:s,type:"same-origin",hash:n});return t}return[]}function t(e){const t=new Map,s=new Set,n=new Set,r=[],a=new Map;for(const i of e)if("inline"in i)"inline-stable"===i.type&&i.hash&&s.add(i.hash);else if("same-origin"===i.type&&i.hash)try{const e=new URL(i.src,window.location.href);t.set(e.pathname,i.hash),t.set(decodeURIComponent(e.pathname),i.hash),t.set(i.src,i.hash);const s=(e.pathname.split("/").pop()||"").toLowerCase();s&&a.set(s,i.hash)}catch(e){t.set(i.src,i.hash);const s=(i.src.split("/").pop()||"").toLowerCase();s&&a.set(s,i.hash)}else"versioned-cdn"===i.type?n.add(i.src):"dynamic-loader"===i.type&&r.push({host:i.host,path:i.path,query:i.query});return{sameOriginHashes:t,inlineHashes:s,versionedPins:n,dynamicPins:r,filenameIndex:a}}function s(e,t){try{const s=new URL(e,window.location.href);return t.some(e=>{if(e.host)return s.host===e.host;if(e.path){const t=e.path;if("/"===t||t.endsWith("/")){if(!s.pathname.startsWith(t))return!1}else if(s.pathname!==t)return!1}return!e.query||s.search.replace(/^\?/,"")===(e.query||"")})}catch(e){return!1}}export{t as buildRuntimeManifest,e as coerceEntries,s as urlMatchesPin};