diff --git a/.eslintrc.json b/.eslintrc.json index 6647d81..9c57853 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,30 +1,30 @@ { - "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"], - "parser": "@typescript-eslint/parser", - "plugins": ["@typescript-eslint"], - "rules": { - "no-await-in-loop": "warn", - "no-unused-labels": "error", - "no-unused-vars": "error", - "quotes": ["error", "double"], - "max-lines-per-function": [ - "error", - { - "max": 200, - "skipComments": true - } - ], - "getter-return": "error", - "newline-before-return": "error", - "no-multiple-empty-lines": "error", - "no-var": "error", - "no-this-before-super": "warn", - "no-useless-return": "error", - "no-shadow": "error", - "prefer-const": "warn", - "no-unreachable": "warn", - "no-undef": "off", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/ban-ts-comment": "off" - } + "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"], + "parser": "@typescript-eslint/parser", + "plugins": ["@typescript-eslint"], + "rules": { + "no-await-in-loop": "warn", + "no-unused-labels": "error", + "no-unused-vars": "error", + "quotes": ["error", "double"], + "max-lines-per-function": [ + "error", + { + "max": 200, + "skipComments": true + } + ], + "getter-return": "error", + "newline-before-return": "error", + "no-multiple-empty-lines": "error", + "no-var": "error", + "no-this-before-super": "warn", + "no-useless-return": "error", + "no-shadow": "error", + "prefer-const": "warn", + "no-unreachable": "warn", + "no-undef": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/ban-ts-comment": "off" + } } diff --git a/package.json b/package.json index 8374e30..15ae1ab 100644 --- a/package.json +++ b/package.json @@ -1,59 +1,60 @@ { - "name": "@mercuryworkshop/scramjet", - "version": "1.0.2", - "description": "An experimental web proxy that aims to be the successor to Ultraviolet", - "main": "./lib/index.cjs", - "types": "./lib/index.d.js", - "repository": { - "type": "git", - "url": "https://github.com/MercuryWorkshop/scramjet" - }, - "scripts": { - "build": "rspack build", - "dev": "node server.js", - "prepublish": "pnpm build", - "pub": "pnpm publish --no-git-checks --access public" - }, - "files": [ - "dist", - "lib" - ], - "keywords": [], - "author": "", - "license": "ISC", - "devDependencies": { - "@fastify/static": "^7.0.3", - "@mercuryworkshop/bare-as-module3": "^2.2.2", - "@mercuryworkshop/epoxy-transport": "^2.1.3", - "@mercuryworkshop/libcurl-transport": "^1.3.6", - "@rsdoctor/rspack-plugin": "^0.3.7", - "@rspack/cli": "^0.7.5", - "@rspack/core": "^0.7.5", - "@tomphttp/bare-server-node": "^2.0.3", - "@types/eslint": "^8.56.10", - "@types/estree": "^1.0.5", - "@types/node": "^20.14.10", - "@types/serviceworker": "^0.0.85", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", - "dotenv": "^16.4.5", - "eslint": "^8.57.0", - "fastify": "^4.26.2", - "prettier": "^3.3.3", - "tslib": "^2.6.2", - "typescript": "^5.4.5" - }, - "type": "module", - "dependencies": { - "@mercuryworkshop/bare-mux": "^2.0.2", - "@webreflection/idb-map": "^0.3.1", - "astravel": "^0.6.1", - "astring": "^1.8.6", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.1.0", - "htmlparser2": "^9.1.0", - "meriyah": "^4.4.2", - "parse-domain": "^8.0.2" - } + "name": "@mercuryworkshop/scramjet", + "version": "1.0.2", + "description": "An experimental web proxy that aims to be the successor to Ultraviolet", + "main": "./lib/index.cjs", + "types": "./lib/index.d.js", + "repository": { + "type": "git", + "url": "https://github.com/MercuryWorkshop/scramjet" + }, + "scripts": { + "build": "rspack build", + "dev": "node server.js", + "prepublish": "pnpm build", + "pub": "pnpm publish --no-git-checks --access public", + "format": "prettier --write ." + }, + "files": [ + "dist", + "lib" + ], + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "@fastify/static": "^7.0.3", + "@mercuryworkshop/bare-as-module3": "^2.2.2", + "@mercuryworkshop/epoxy-transport": "^2.1.3", + "@mercuryworkshop/libcurl-transport": "^1.3.6", + "@rsdoctor/rspack-plugin": "^0.3.7", + "@rspack/cli": "^0.7.5", + "@rspack/core": "^0.7.5", + "@tomphttp/bare-server-node": "^2.0.3", + "@types/eslint": "^8.56.10", + "@types/estree": "^1.0.5", + "@types/node": "^20.14.10", + "@types/serviceworker": "^0.0.85", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "dotenv": "^16.4.5", + "eslint": "^8.57.0", + "fastify": "^4.26.2", + "prettier": "^3.3.3", + "tslib": "^2.6.2", + "typescript": "^5.4.5" + }, + "type": "module", + "dependencies": { + "@mercuryworkshop/bare-mux": "^2.0.2", + "@webreflection/idb-map": "^0.3.1", + "astravel": "^0.6.1", + "astring": "^1.8.6", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "htmlparser2": "^9.1.0", + "meriyah": "^4.4.2", + "parse-domain": "^8.0.2" + } } diff --git a/prettier.json b/prettier.json index f49da48..1a45cf0 100644 --- a/prettier.json +++ b/prettier.json @@ -1,6 +1,6 @@ { - "trailingComma": "es5", - "useTabs": true, - "semi": true, - "singleQuote": false + "trailingComma": "es5", + "useTabs": true, + "semi": true, + "singleQuote": false } diff --git a/rspack.config.js b/rspack.config.js index 1eba09f..016fd9b 100644 --- a/rspack.config.js +++ b/rspack.config.js @@ -6,48 +6,48 @@ import { fileURLToPath } from "url"; const __dirname = fileURLToPath(new URL(".", import.meta.url)); export default defineConfig({ - // change to production when needed - mode: "development", - entry: { - shared: join(__dirname, "src/shared/index.ts"), - worker: join(__dirname, "src/worker/index.ts"), - client: join(__dirname, "src/client/index.ts"), - config: join(__dirname, "src/scramjet.config.ts"), - codecs: join(__dirname, "src/codecs/index.ts"), - }, - resolve: { - extensions: [".ts", ".js"], - }, - module: { - rules: [ - { - test: /\.ts$/, - use: "builtin:swc-loader", - exclude: ["/node_modules/"], - options: { - jsc: { - parser: { - syntax: "typescript", - }, - }, - }, - type: "javascript/auto", - }, - ], - }, - output: { - filename: "scramjet.[name].js", - path: join(__dirname, "dist"), - iife: true, - clean: true, - }, - plugins: [ - // new RsdoctorRspackPlugin({ - // supports: { - // parseBundle: true, - // banner: true - // } - // }) - ], - watch: true, + // change to production when needed + mode: "development", + entry: { + shared: join(__dirname, "src/shared/index.ts"), + worker: join(__dirname, "src/worker/index.ts"), + client: join(__dirname, "src/client/index.ts"), + config: join(__dirname, "src/scramjet.config.ts"), + codecs: join(__dirname, "src/codecs/index.ts"), + }, + resolve: { + extensions: [".ts", ".js"], + }, + module: { + rules: [ + { + test: /\.ts$/, + use: "builtin:swc-loader", + exclude: ["/node_modules/"], + options: { + jsc: { + parser: { + syntax: "typescript", + }, + }, + }, + type: "javascript/auto", + }, + ], + }, + output: { + filename: "scramjet.[name].js", + path: join(__dirname, "dist"), + iife: true, + clean: true, + }, + plugins: [ + // new RsdoctorRspackPlugin({ + // supports: { + // parseBundle: true, + // banner: true + // } + // }) + ], + watch: true, }); diff --git a/server.js b/server.js index 95fee68..e00957a 100644 --- a/server.js +++ b/server.js @@ -14,71 +14,71 @@ import { libcurlPath } from "@mercuryworkshop/libcurl-transport"; import { bareModulePath } from "@mercuryworkshop/bare-as-module3"; const bare = createBareServer("/bare/", { - logErrors: true, + logErrors: true, }); const fastify = Fastify({ - serverFactory: (handler) => { - return createServer() - .on("request", (req, res) => { - if (bare.shouldRoute(req)) { - bare.routeRequest(req, res); - } else { - handler(req, res); - } - }) - .on("upgrade", (req, socket, head) => { - if (bare.shouldRoute(req)) { - bare.routeUpgrade(req, socket, head); - } else { - socket.end(); - } - }); - }, + serverFactory: (handler) => { + return createServer() + .on("request", (req, res) => { + if (bare.shouldRoute(req)) { + bare.routeRequest(req, res); + } else { + handler(req, res); + } + }) + .on("upgrade", (req, socket, head) => { + if (bare.shouldRoute(req)) { + bare.routeUpgrade(req, socket, head); + } else { + socket.end(); + } + }); + }, }); fastify.register(fastifyStatic, { - root: join(fileURLToPath(new URL(".", import.meta.url)), "./static"), - decorateReply: false, + root: join(fileURLToPath(new URL(".", import.meta.url)), "./static"), + decorateReply: false, }); fastify.register(fastifyStatic, { - root: join(fileURLToPath(new URL(".", import.meta.url)), "./dist"), - prefix: "/scram/", - decorateReply: false, + root: join(fileURLToPath(new URL(".", import.meta.url)), "./dist"), + prefix: "/scram/", + decorateReply: false, }); fastify.register(fastifyStatic, { - root: baremuxPath, - prefix: "/baremux/", - decorateReply: false, + root: baremuxPath, + prefix: "/baremux/", + decorateReply: false, }); fastify.register(fastifyStatic, { - root: epoxyPath, - prefix: "/epoxy/", - decorateReply: false, + root: epoxyPath, + prefix: "/epoxy/", + decorateReply: false, }); fastify.register(fastifyStatic, { - root: libcurlPath, - prefix: "/libcurl/", - decorateReply: false, + root: libcurlPath, + prefix: "/libcurl/", + decorateReply: false, }); fastify.register(fastifyStatic, { - root: bareModulePath, - prefix: "/baremod/", - decorateReply: false, + root: bareModulePath, + prefix: "/baremod/", + decorateReply: false, }); fastify.listen({ - port: process.env.PORT || 1337, + port: process.env.PORT || 1337, }); const watch = spawn("pnpm", ["rspack", "-w"], { - detached: true, - cwd: process.cwd(), + detached: true, + cwd: process.cwd(), }); watch.stdout.on("data", (data) => { - console.log(`${data}`); + console.log(`${data}`); }); watch.stderr.on("data", (data) => { - console.log(`${data}`); + console.log(`${data}`); }); diff --git a/src/client/beacon.ts b/src/client/beacon.ts index f84804b..5d7c689 100644 --- a/src/client/beacon.ts +++ b/src/client/beacon.ts @@ -1,9 +1,9 @@ import { encodeUrl } from "./shared"; navigator.sendBeacon = new Proxy(navigator.sendBeacon, { - apply(target, thisArg, argArray) { - argArray[0] = encodeUrl(argArray[0]); + apply(target, thisArg, argArray) { + argArray[0] = encodeUrl(argArray[0]); - return Reflect.apply(target, thisArg, argArray); - }, + return Reflect.apply(target, thisArg, argArray); + }, }); diff --git a/src/client/css.ts b/src/client/css.ts index 47afe46..2b705de 100644 --- a/src/client/css.ts +++ b/src/client/css.ts @@ -1,26 +1,26 @@ import { rewriteCss } from "./shared"; const cssProperties = [ - "background", - "background-image", - "mask", - "mask-image", - "list-style", - "list-style-image", - "border-image", - "border-image-source", - "cursor", + "background", + "background-image", + "mask", + "mask-image", + "list-style", + "list-style-image", + "border-image", + "border-image-source", + "cursor", ]; // const jsProperties = ["background", "backgroundImage", "mask", "maskImage", "listStyle", "listStyleImage", "borderImage", "borderImageSource", "cursor"]; CSSStyleDeclaration.prototype.setProperty = new Proxy( - CSSStyleDeclaration.prototype.setProperty, - { - apply(target, thisArg, argArray) { - if (cssProperties.includes(argArray[0])) - argArray[1] = rewriteCss(argArray[1]); + CSSStyleDeclaration.prototype.setProperty, + { + apply(target, thisArg, argArray) { + if (cssProperties.includes(argArray[0])) + argArray[1] = rewriteCss(argArray[1]); - return Reflect.apply(target, thisArg, argArray); - }, - } + return Reflect.apply(target, thisArg, argArray); + }, + }, ); diff --git a/src/client/element.ts b/src/client/element.ts index 82d2c40..997304e 100644 --- a/src/client/element.ts +++ b/src/client/element.ts @@ -1,123 +1,121 @@ import { decodeUrl } from "../shared/rewriters/url"; import { - encodeUrl, - rewriteCss, - rewriteHtml, - rewriteJs, - rewriteSrcset, + encodeUrl, + rewriteCss, + rewriteHtml, + rewriteJs, + rewriteSrcset, } from "./shared"; const attrObject = { - nonce: [HTMLElement], - integrity: [HTMLScriptElement, HTMLLinkElement], - csp: [HTMLIFrameElement], - src: [ - HTMLImageElement, - HTMLMediaElement, - HTMLIFrameElement, - HTMLEmbedElement, - HTMLScriptElement, - ], - href: [HTMLAnchorElement, HTMLLinkElement], - data: [HTMLObjectElement], - action: [HTMLFormElement], - formaction: [HTMLButtonElement, HTMLInputElement], - srcdoc: [HTMLIFrameElement], - srcset: [HTMLImageElement, HTMLSourceElement], - imagesrcset: [HTMLLinkElement], + nonce: [HTMLElement], + integrity: [HTMLScriptElement, HTMLLinkElement], + csp: [HTMLIFrameElement], + src: [ + HTMLImageElement, + HTMLMediaElement, + HTMLIFrameElement, + HTMLEmbedElement, + HTMLScriptElement, + ], + href: [HTMLAnchorElement, HTMLLinkElement], + data: [HTMLObjectElement], + action: [HTMLFormElement], + formaction: [HTMLButtonElement, HTMLInputElement], + srcdoc: [HTMLIFrameElement], + srcset: [HTMLImageElement, HTMLSourceElement], + imagesrcset: [HTMLLinkElement], }; const attrs = Object.keys(attrObject); for (const attr of attrs) { - for (const element of attrObject[attr]) { - const descriptor = Object.getOwnPropertyDescriptor(element.prototype, attr); - Object.defineProperty(element.prototype, attr, { - get() { - if (/src|href|data|action|formaction/.test(attr)) { - return decodeUrl(descriptor.get.call(this)); - } + for (const element of attrObject[attr]) { + const descriptor = Object.getOwnPropertyDescriptor(element.prototype, attr); + Object.defineProperty(element.prototype, attr, { + get() { + if (/src|href|data|action|formaction/.test(attr)) { + return decodeUrl(descriptor.get.call(this)); + } - if (this.__origattrs[attr]) { - return this.__origattrs[attr]; - } + if (this.__origattrs[attr]) { + return this.__origattrs[attr]; + } - return descriptor.get.call(this); - }, + return descriptor.get.call(this); + }, - set(value) { - this.__origattrs[attr] = value; + set(value) { + this.__origattrs[attr] = value; - if (/nonce|integrity|csp/.test(attr)) { - return; - } else if (/src|href|data|action|formaction/.test(attr)) { - value = encodeUrl(value); - } else if (attr === "srcdoc") { - value = rewriteHtml(value); - } else if (/(image)?srcset/.test(attr)) { - value = rewriteSrcset(value); - } + if (/nonce|integrity|csp/.test(attr)) { + return; + } else if (/src|href|data|action|formaction/.test(attr)) { + value = encodeUrl(value); + } else if (attr === "srcdoc") { + value = rewriteHtml(value); + } else if (/(image)?srcset/.test(attr)) { + value = rewriteSrcset(value); + } - descriptor.set.call(this, value); - }, - }); - } + descriptor.set.call(this, value); + }, + }); + } } declare global { - interface Element { - __origattrs: Record; - } + interface Element { + __origattrs: Record; + } } Element.prototype.__origattrs = {}; Element.prototype.getAttribute = new Proxy(Element.prototype.getAttribute, { - apply(target, thisArg, argArray) { - if (attrs.includes(argArray[0]) && thisArg.__origattrs[argArray[0]]) { - return thisArg.__origattrs[argArray[0]]; - } + apply(target, thisArg, argArray) { + if (attrs.includes(argArray[0]) && thisArg.__origattrs[argArray[0]]) { + return thisArg.__origattrs[argArray[0]]; + } - return Reflect.apply(target, thisArg, argArray); - }, + return Reflect.apply(target, thisArg, argArray); + }, }); Element.prototype.setAttribute = new Proxy(Element.prototype.setAttribute, { - apply(target, thisArg, argArray) { - if (attrs.includes(argArray[0])) { - thisArg.__origattrs[argArray[0]] = argArray[1]; - if (/nonce|integrity|csp/.test(argArray[0])) { - return; - } else if (/src|href|data|action|formaction/.test(argArray[0])) { - argArray[1] = encodeUrl(argArray[1]); - } else if (argArray[0] === "srcdoc") { - argArray[1] = rewriteHtml(argArray[1]); - } else if (/(image)?srcset/.test(argArray[0])) { - argArray[1] = rewriteSrcset(argArray[1]); - } else if (argArray[1] === "style") { - argArray[1] = rewriteCss(argArray[1]); - } - } + apply(target, thisArg, argArray) { + if (attrs.includes(argArray[0])) { + thisArg.__origattrs[argArray[0]] = argArray[1]; + if (/nonce|integrity|csp/.test(argArray[0])) { + return; + } else if (/src|href|data|action|formaction/.test(argArray[0])) { + argArray[1] = encodeUrl(argArray[1]); + } else if (argArray[0] === "srcdoc") { + argArray[1] = rewriteHtml(argArray[1]); + } else if (/(image)?srcset/.test(argArray[0])) { + argArray[1] = rewriteSrcset(argArray[1]); + } else if (argArray[1] === "style") { + argArray[1] = rewriteCss(argArray[1]); + } + } - return Reflect.apply(target, thisArg, argArray); - }, + return Reflect.apply(target, thisArg, argArray); + }, }); const innerHTML = Object.getOwnPropertyDescriptor( - Element.prototype, - "innerHTML" + Element.prototype, + "innerHTML", ); Object.defineProperty(Element.prototype, "innerHTML", { - set(value) { - if ( - this instanceof HTMLScriptElement - ) { - value = rewriteJs(value); - } else if (this instanceof HTMLStyleElement) { - value = rewriteCss(value); - } + set(value) { + if (this instanceof HTMLScriptElement) { + value = rewriteJs(value); + } else if (this instanceof HTMLStyleElement) { + value = rewriteCss(value); + } - return innerHTML.set.call(this, value); - }, + return innerHTML.set.call(this, value); + }, }); diff --git a/src/client/history.ts b/src/client/history.ts index 1a7c0cd..83e41c4 100644 --- a/src/client/history.ts +++ b/src/client/history.ts @@ -1,17 +1,17 @@ import { decodeUrl } from "./shared"; window.history.pushState = new Proxy(window.history.pushState, { - apply(target, thisArg, argArray) { - argArray[3] = decodeUrl(argArray[3]); + apply(target, thisArg, argArray) { + argArray[3] = decodeUrl(argArray[3]); - return Reflect.apply(target, thisArg, argArray); - }, + return Reflect.apply(target, thisArg, argArray); + }, }); window.history.replaceState = new Proxy(window.history.replaceState, { - apply(target, thisArg, argArray) { - argArray[3] = decodeUrl(argArray[3]); + apply(target, thisArg, argArray) { + argArray[3] = decodeUrl(argArray[3]); - return Reflect.apply(target, thisArg, argArray); - }, + return Reflect.apply(target, thisArg, argArray); + }, }); diff --git a/src/client/index.ts b/src/client/index.ts index 3db716d..2fbba94 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -13,10 +13,10 @@ import "./css.ts"; import "./history.ts"; import "./worker.ts"; import "./url.ts"; -import "./beacon.ts" +import "./beacon.ts"; declare global { - interface Window { - $s: any; - } + interface Window { + $s: any; + } } diff --git a/src/client/location.ts b/src/client/location.ts index ca207fd..da0a37d 100644 --- a/src/client/location.ts +++ b/src/client/location.ts @@ -2,31 +2,31 @@ import { encodeUrl, decodeUrl } from "./shared"; function createLocation() { - const loc = new URL(decodeUrl(location.href)); - loc.assign = (url: string) => location.assign(encodeUrl(url)); - loc.reload = () => location.reload(); - loc.replace = (url: string) => location.replace(encodeUrl(url)); - loc.toString = () => loc.href; + const loc = new URL(decodeUrl(location.href)); + loc.assign = (url: string) => location.assign(encodeUrl(url)); + loc.reload = () => location.reload(); + loc.replace = (url: string) => location.replace(encodeUrl(url)); + loc.toString = () => loc.href; - return loc; + return loc; } export const locationProxy = new Proxy(window.location, { - get(target, prop) { - const loc = createLocation(); + get(target, prop) { + const loc = createLocation(); - return loc[prop]; - }, + return loc[prop]; + }, - set(obj, prop, value) { - const loc = createLocation(); + set(obj, prop, value) { + const loc = createLocation(); - if (prop === "href") { - location.href = encodeUrl(value); - } else { - loc[prop] = value; - } + if (prop === "href") { + location.href = encodeUrl(value); + } else { + loc[prop] = value; + } - return true; - }, + return true; + }, }); diff --git a/src/client/native/eval.ts b/src/client/native/eval.ts index aad23d2..fdb7bb4 100644 --- a/src/client/native/eval.ts +++ b/src/client/native/eval.ts @@ -1,26 +1,26 @@ import { rewriteJs } from "../shared"; const FunctionProxy = new Proxy(Function, { - construct(target, argArray) { - if (argArray.length === 1) { - return Reflect.construct(target, rewriteJs(argArray[0])); - } else { - return Reflect.construct( - target, - rewriteJs(argArray[argArray.length - 1]) - ); - } - }, - apply(target, thisArg, argArray) { - if (argArray.length === 1) { - return Reflect.apply(target, undefined, [rewriteJs(argArray[0])]); - } else { - return Reflect.apply(target, undefined, [ - ...argArray.map((x, index) => index === argArray.length - 1), - rewriteJs(argArray[argArray.length - 1]), - ]); - } - }, + construct(target, argArray) { + if (argArray.length === 1) { + return Reflect.construct(target, rewriteJs(argArray[0])); + } else { + return Reflect.construct( + target, + rewriteJs(argArray[argArray.length - 1]), + ); + } + }, + apply(target, thisArg, argArray) { + if (argArray.length === 1) { + return Reflect.apply(target, undefined, [rewriteJs(argArray[0])]); + } else { + return Reflect.apply(target, undefined, [ + ...argArray.map((x, index) => index === argArray.length - 1), + rewriteJs(argArray[argArray.length - 1]), + ]); + } + }, }); delete window.Function; @@ -28,7 +28,7 @@ delete window.Function; window.Function = FunctionProxy; window.eval = new Proxy(window.eval, { - apply(target, thisArg, argArray) { - return Reflect.apply(target, thisArg, [rewriteJs(argArray[0])]); - }, + apply(target, thisArg, argArray) { + return Reflect.apply(target, thisArg, [rewriteJs(argArray[0])]); + }, }); diff --git a/src/client/requests/fetch.ts b/src/client/requests/fetch.ts index ec3e76d..28a3233 100644 --- a/src/client/requests/fetch.ts +++ b/src/client/requests/fetch.ts @@ -3,33 +3,33 @@ import { encodeUrl, rewriteHeaders } from "../shared"; window.fetch = new Proxy(window.fetch, { - apply(target, thisArg, argArray) { - argArray[0] = encodeUrl(argArray[0]); + apply(target, thisArg, argArray) { + argArray[0] = encodeUrl(argArray[0]); - return Reflect.apply(target, thisArg, argArray); - }, + return Reflect.apply(target, thisArg, argArray); + }, }); Headers = new Proxy(Headers, { - construct(target, argArray, newTarget) { - argArray[0] = rewriteHeaders(argArray[0]); + construct(target, argArray, newTarget) { + argArray[0] = rewriteHeaders(argArray[0]); - return Reflect.construct(target, argArray, newTarget); - }, + return Reflect.construct(target, argArray, newTarget); + }, }); Request = new Proxy(Request, { - construct(target, argArray, newTarget) { - if (typeof argArray[0] === "string") argArray[0] = encodeUrl(argArray[0]); + construct(target, argArray, newTarget) { + if (typeof argArray[0] === "string") argArray[0] = encodeUrl(argArray[0]); - return Reflect.construct(target, argArray, newTarget); - }, + return Reflect.construct(target, argArray, newTarget); + }, }); Response.redirect = new Proxy(Response.redirect, { - apply(target, thisArg, argArray) { - argArray[0] = encodeUrl(argArray[0]); + apply(target, thisArg, argArray) { + argArray[0] = encodeUrl(argArray[0]); - return Reflect.apply(target, thisArg, argArray); - }, + return Reflect.apply(target, thisArg, argArray); + }, }); diff --git a/src/client/requests/websocket.ts b/src/client/requests/websocket.ts index 5255ee5..6ae5d7d 100644 --- a/src/client/requests/websocket.ts +++ b/src/client/requests/websocket.ts @@ -2,15 +2,15 @@ import { BareClient } from "../shared"; const client = new BareClient(); WebSocket = new Proxy(WebSocket, { - construct(target, args) { - return client.createWebSocket( - args[0], - args[1], - target, - { - "User-Agent": navigator.userAgent, - }, - ArrayBuffer.prototype - ); - }, + construct(target, args) { + return client.createWebSocket( + args[0], + args[1], + target, + { + "User-Agent": navigator.userAgent, + }, + ArrayBuffer.prototype, + ); + }, }); diff --git a/src/client/requests/xmlhttprequest.ts b/src/client/requests/xmlhttprequest.ts index 1b1bb78..3f21bb3 100644 --- a/src/client/requests/xmlhttprequest.ts +++ b/src/client/requests/xmlhttprequest.ts @@ -1,23 +1,23 @@ import { encodeUrl, rewriteHeaders } from "../shared"; XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, { - apply(target, thisArg, argArray) { - if (argArray[1]) argArray[1] = encodeUrl(argArray[1]); + apply(target, thisArg, argArray) { + if (argArray[1]) argArray[1] = encodeUrl(argArray[1]); - return Reflect.apply(target, thisArg, argArray); - }, + return Reflect.apply(target, thisArg, argArray); + }, }); XMLHttpRequest.prototype.setRequestHeader = new Proxy( - XMLHttpRequest.prototype.setRequestHeader, - { - apply(target, thisArg, argArray) { - let headerObject = Object.fromEntries([argArray]); - headerObject = rewriteHeaders(headerObject); + XMLHttpRequest.prototype.setRequestHeader, + { + apply(target, thisArg, argArray) { + let headerObject = Object.fromEntries([argArray]); + headerObject = rewriteHeaders(headerObject); - argArray = Object.entries(headerObject)[0]; + argArray = Object.entries(headerObject)[0]; - return Reflect.apply(target, thisArg, argArray); - }, - } + return Reflect.apply(target, thisArg, argArray); + }, + }, ); diff --git a/src/client/scope.ts b/src/client/scope.ts index 4fe24c8..c2b7646 100644 --- a/src/client/scope.ts +++ b/src/client/scope.ts @@ -2,13 +2,13 @@ import { locationProxy } from "./location"; import { windowProxy } from "./window"; function scope(identifier: any) { - if (identifier instanceof Window) { - return windowProxy; - } else if (identifier instanceof Location) { - return locationProxy; - } + if (identifier instanceof Window) { + return windowProxy; + } else if (identifier instanceof Location) { + return locationProxy; + } - return identifier; + return identifier; } // shorthand because this can get out of hand reall quickly diff --git a/src/client/shared.ts b/src/client/shared.ts index c1ee55b..75564aa 100644 --- a/src/client/shared.ts +++ b/src/client/shared.ts @@ -1,12 +1,12 @@ export const { - util: { isScramjetFile, BareClient }, - url: { encodeUrl, decodeUrl }, - rewrite: { - rewriteCss, - rewriteHtml, - rewriteSrcset, - rewriteJs, - rewriteHeaders, - rewriteWorkers, - }, + util: { isScramjetFile, BareClient }, + url: { encodeUrl, decodeUrl }, + rewrite: { + rewriteCss, + rewriteHtml, + rewriteSrcset, + rewriteJs, + rewriteHeaders, + rewriteWorkers, + }, } = self.$scramjet.shared; diff --git a/src/client/storage.ts b/src/client/storage.ts index 56a5fba..e4bd1cc 100644 --- a/src/client/storage.ts +++ b/src/client/storage.ts @@ -2,62 +2,62 @@ import IDBMapSync from "@webreflection/idb-map/sync"; import { locationProxy } from "./location"; const store = new IDBMapSync(locationProxy.host, { - prefix: "Storage", - durability: "relaxed", + prefix: "Storage", + durability: "relaxed", }); await store.sync(); function storageProxy(scope: Storage): Storage { - return new Proxy(scope, { - get(target, prop) { - switch (prop) { - case "getItem": - return (key: string) => { - return store.get(key); - }; + return new Proxy(scope, { + get(target, prop) { + switch (prop) { + case "getItem": + return (key: string) => { + return store.get(key); + }; - case "setItem": - return (key: string, value: string) => { - store.set(key, value); - store.sync(); - }; + case "setItem": + return (key: string, value: string) => { + store.set(key, value); + store.sync(); + }; - case "removeItem": - return (key: string) => { - store.delete(key); - store.sync(); - }; + case "removeItem": + return (key: string) => { + store.delete(key); + store.sync(); + }; - case "clear": - return () => { - store.clear(); - store.sync(); - }; + case "clear": + return () => { + store.clear(); + store.sync(); + }; - case "key": - return (index: number) => { - store.keys()[index]; - }; - case "length": - return store.size; - default: - return store.get(prop); - } - }, + case "key": + return (index: number) => { + store.keys()[index]; + }; + case "length": + return store.size; + default: + return store.get(prop); + } + }, - //@ts-ignore - set(target, prop, value) { - store.set(prop, value); - store.sync(); - }, + //@ts-ignore + set(target, prop, value) { + store.set(prop, value); + store.sync(); + }, - defineProperty(target, property, attributes) { - store.set(property as string, attributes.value); + defineProperty(target, property, attributes) { + store.set(property as string, attributes.value); - return true; - }, - }); + return true; + }, + }); } const localStorageProxy = storageProxy(window.localStorage); diff --git a/src/client/trustedTypes.ts b/src/client/trustedTypes.ts index bf83598..6d63b1e 100644 --- a/src/client/trustedTypes.ts +++ b/src/client/trustedTypes.ts @@ -37,4 +37,3 @@ delete window.TrustedScriptURL; delete window.TrustedTypePolicy; delete window.TrustedTypePolicyFactory; delete window.trustedTypes; - diff --git a/src/client/url.ts b/src/client/url.ts index 35a497f..3fe5522 100644 --- a/src/client/url.ts +++ b/src/client/url.ts @@ -2,12 +2,12 @@ import { encodeUrl } from "../shared/rewriters/url"; export const URL = globalThis.URL; if (globalThis.window) { - window.URL = new Proxy(URL, { - construct(target, argArray, newTarget) { - if (typeof argArray[0] === "string") argArray[0] = encodeUrl(argArray[0]); - if (typeof argArray[1] === "string") argArray[1] = encodeUrl(argArray[1]); + window.URL = new Proxy(URL, { + construct(target, argArray, newTarget) { + if (typeof argArray[0] === "string") argArray[0] = encodeUrl(argArray[0]); + if (typeof argArray[1] === "string") argArray[1] = encodeUrl(argArray[1]); - return Reflect.construct(target, argArray, newTarget); - }, - }); + return Reflect.construct(target, argArray, newTarget); + }, + }); } diff --git a/src/client/window.ts b/src/client/window.ts index 7bfce26..1a67dfb 100644 --- a/src/client/window.ts +++ b/src/client/window.ts @@ -1,47 +1,47 @@ import { locationProxy } from "./location"; export const windowProxy = new Proxy(window, { - get(target, prop) { - const propIsString = typeof prop === "string"; - if (propIsString && prop === "location") { - return locationProxy; - } else if ( - propIsString && - ["window", "top", "parent", "self", "globalThis"].includes(prop) - ) { - return windowProxy; - } else if (propIsString && prop === "$scramjet") { - return; - } else if (propIsString && prop === "addEventListener") { - console.log("addEventListener getteetetetetet"); + get(target, prop) { + const propIsString = typeof prop === "string"; + if (propIsString && prop === "location") { + return locationProxy; + } else if ( + propIsString && + ["window", "top", "parent", "self", "globalThis"].includes(prop) + ) { + return windowProxy; + } else if (propIsString && prop === "$scramjet") { + return; + } else if (propIsString && prop === "addEventListener") { + console.log("addEventListener getteetetetetet"); - return new Proxy(window.addEventListener, { - apply(target1, thisArg, argArray) { - window.addEventListener(argArray[0], argArray[1]); - }, - }); - } + return new Proxy(window.addEventListener, { + apply(target1, thisArg, argArray) { + window.addEventListener(argArray[0], argArray[1]); + }, + }); + } - const value = Reflect.get(target, prop); + const value = Reflect.get(target, prop); - if (typeof value === "function") { - return value.bind(target); - } + if (typeof value === "function") { + return value.bind(target); + } - return value; - }, + return value; + }, - set(target, prop, newValue) { - // ensures that no apis are overwritten - if ( - typeof prop === "string" && - ["window", "top", "parent", "self", "globalThis", "location"].includes( - prop - ) - ) { - return false; - } + set(target, prop, newValue) { + // ensures that no apis are overwritten + if ( + typeof prop === "string" && + ["window", "top", "parent", "self", "globalThis", "location"].includes( + prop, + ) + ) { + return false; + } - return Reflect.set(target, prop, newValue); - }, + return Reflect.set(target, prop, newValue); + }, }); diff --git a/src/client/worker.ts b/src/client/worker.ts index 1578089..9b037b6 100644 --- a/src/client/worker.ts +++ b/src/client/worker.ts @@ -1,23 +1,23 @@ import { encodeUrl } from "./shared"; Worker = new Proxy(Worker, { - construct(target, argArray) { - argArray[0] = encodeUrl(argArray[0]); + construct(target, argArray) { + argArray[0] = encodeUrl(argArray[0]); - // target is a reference to the object that you are proxying - // Reflect.construct is just a wrapper for calling target - // you could do new target(...argArray) and it would work the same effectively + // target is a reference to the object that you are proxying + // Reflect.construct is just a wrapper for calling target + // you could do new target(...argArray) and it would work the same effectively - return Reflect.construct(target, argArray); - }, + return Reflect.construct(target, argArray); + }, }); Worklet.prototype.addModule = new Proxy(Worklet.prototype.addModule, { - apply(target, thisArg, argArray) { - argArray[0] = encodeUrl(argArray[0]); + apply(target, thisArg, argArray) { + argArray[0] = encodeUrl(argArray[0]); - return Reflect.apply(target, thisArg, argArray); - }, + return Reflect.apply(target, thisArg, argArray); + }, }); // broken diff --git a/src/codecs/aes.ts b/src/codecs/aes.ts index 224f9e7..24b1f82 100644 --- a/src/codecs/aes.ts +++ b/src/codecs/aes.ts @@ -4,414 +4,414 @@ var Nr = 14; var Nk = 8; var Decrypt = false; function enc_utf8(s) { - try { - return unescape(encodeURIComponent(s)); - } catch (e) { - throw "Error on UTF-8 encode"; - } + try { + return unescape(encodeURIComponent(s)); + } catch (e) { + throw "Error on UTF-8 encode"; + } } function dec_utf8(s) { - try { - return decodeURIComponent(escape(s)); - } catch (e) { - throw "Bad Key"; - } + try { + return decodeURIComponent(escape(s)); + } catch (e) { + throw "Bad Key"; + } } function padBlock(byteArr) { - var array = [], - cpad, - i; - if (byteArr.length < 16) { - cpad = 16 - byteArr.length; - array = [ - cpad, - cpad, - cpad, - cpad, - cpad, - cpad, - cpad, - cpad, - cpad, - cpad, - cpad, - cpad, - cpad, - cpad, - cpad, - cpad, - ]; - } - for (i = 0; i < byteArr.length; i++) { - array[i] = byteArr[i]; - } - return array; + var array = [], + cpad, + i; + if (byteArr.length < 16) { + cpad = 16 - byteArr.length; + array = [ + cpad, + cpad, + cpad, + cpad, + cpad, + cpad, + cpad, + cpad, + cpad, + cpad, + cpad, + cpad, + cpad, + cpad, + cpad, + cpad, + ]; + } + for (i = 0; i < byteArr.length; i++) { + array[i] = byteArr[i]; + } + return array; } function block2s(block, lastBlock) { - var string = "", - padding, - i; - if (lastBlock) { - padding = block[15]; - if (padding > 16) { - throw "Decryption error: Maybe bad key"; - } - if (padding === 16) { - return ""; - } - for (i = 0; i < 16 - padding; i++) { - string += String.fromCharCode(block[i]); - } - } else { - for (i = 0; i < 16; i++) { - string += String.fromCharCode(block[i]); - } - } - return string; + var string = "", + padding, + i; + if (lastBlock) { + padding = block[15]; + if (padding > 16) { + throw "Decryption error: Maybe bad key"; + } + if (padding === 16) { + return ""; + } + for (i = 0; i < 16 - padding; i++) { + string += String.fromCharCode(block[i]); + } + } else { + for (i = 0; i < 16; i++) { + string += String.fromCharCode(block[i]); + } + } + return string; } function a2h(numArr) { - var string = "", - i; - for (i = 0; i < numArr.length; i++) { - string += (numArr[i] < 16 ? "0" : "") + numArr[i].toString(16); - } - return string; + var string = "", + i; + for (i = 0; i < numArr.length; i++) { + string += (numArr[i] < 16 ? "0" : "") + numArr[i].toString(16); + } + return string; } function h2a(s) { - var ret = []; - s.replace(/(..)/g, function (s) { - ret.push(parseInt(s, 16)); - }); - return ret; + var ret = []; + s.replace(/(..)/g, function (s) { + ret.push(parseInt(s, 16)); + }); + return ret; } function s2a(string, binary) { - var array = [], - i; + var array = [], + i; - if (!binary) { - string = enc_utf8(string); - } + if (!binary) { + string = enc_utf8(string); + } - for (i = 0; i < string.length; i++) { - array[i] = string.charCodeAt(i); - } + for (i = 0; i < string.length; i++) { + array[i] = string.charCodeAt(i); + } - return array; + return array; } function size(newsize) { - switch (newsize) { - case 128: - Nr = 10; - Nk = 4; - break; - case 192: - Nr = 12; - Nk = 6; - break; - case 256: - Nr = 14; - Nk = 8; - break; - default: - throw "Invalid Key Size Specified:" + newsize; - } + switch (newsize) { + case 128: + Nr = 10; + Nk = 4; + break; + case 192: + Nr = 12; + Nk = 6; + break; + case 256: + Nr = 14; + Nk = 8; + break; + default: + throw "Invalid Key Size Specified:" + newsize; + } } function randArr(num) { - var result = [], - i; - for (i = 0; i < num; i++) { - result = result.concat(Math.floor(Math.random() * 256)); - } - return result; + var result = [], + i; + for (i = 0; i < num; i++) { + result = result.concat(Math.floor(Math.random() * 256)); + } + return result; } function openSSLKey(passwordArr, saltArr) { - var rounds = Nr >= 12 ? 3 : 2, - key = [], - iv = [], - md5_hash = [], - result = [], - data00 = passwordArr.concat(saltArr), - i; - md5_hash[0] = MD5(data00); - result = md5_hash[0]; - for (i = 1; i < rounds; i++) { - md5_hash[i] = MD5(md5_hash[i - 1].concat(data00)); - result = result.concat(md5_hash[i]); - } - key = result.slice(0, 4 * Nk); - iv = result.slice(4 * Nk, 4 * Nk + 16); - return { - key: key, - iv: iv, - }; + var rounds = Nr >= 12 ? 3 : 2, + key = [], + iv = [], + md5_hash = [], + result = [], + data00 = passwordArr.concat(saltArr), + i; + md5_hash[0] = MD5(data00); + result = md5_hash[0]; + for (i = 1; i < rounds; i++) { + md5_hash[i] = MD5(md5_hash[i - 1].concat(data00)); + result = result.concat(md5_hash[i]); + } + key = result.slice(0, 4 * Nk); + iv = result.slice(4 * Nk, 4 * Nk + 16); + return { + key: key, + iv: iv, + }; } function rawEncrypt(plaintext, key, iv) { - key = expandKey(key); - var numBlocks = Math.ceil(plaintext.length / 16), - blocks = [], - i, - cipherBlocks = []; - for (i = 0; i < numBlocks; i++) { - blocks[i] = padBlock(plaintext.slice(i * 16, i * 16 + 16)); - } - if (plaintext.length % 16 === 0) { - blocks.push([ - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - ]); - numBlocks++; - } - for (i = 0; i < blocks.length; i++) { - blocks[i] = - i === 0 - ? xorBlocks(blocks[i], iv) - : xorBlocks(blocks[i], cipherBlocks[i - 1]); - cipherBlocks[i] = encryptBlock(blocks[i], key); - } - return cipherBlocks; + key = expandKey(key); + var numBlocks = Math.ceil(plaintext.length / 16), + blocks = [], + i, + cipherBlocks = []; + for (i = 0; i < numBlocks; i++) { + blocks[i] = padBlock(plaintext.slice(i * 16, i * 16 + 16)); + } + if (plaintext.length % 16 === 0) { + blocks.push([ + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + ]); + numBlocks++; + } + for (i = 0; i < blocks.length; i++) { + blocks[i] = + i === 0 + ? xorBlocks(blocks[i], iv) + : xorBlocks(blocks[i], cipherBlocks[i - 1]); + cipherBlocks[i] = encryptBlock(blocks[i], key); + } + return cipherBlocks; } function rawDecrypt(cryptArr, key, iv, binary) { - key = expandKey(key); - var numBlocks = cryptArr.length / 16, - cipherBlocks = [], - i, - plainBlocks = [], - string = ""; - for (i = 0; i < numBlocks; i++) { - cipherBlocks.push(cryptArr.slice(i * 16, (i + 1) * 16)); - } - for (i = cipherBlocks.length - 1; i >= 0; i--) { - plainBlocks[i] = decryptBlock(cipherBlocks[i], key); - plainBlocks[i] = - i === 0 - ? xorBlocks(plainBlocks[i], iv) - : xorBlocks(plainBlocks[i], cipherBlocks[i - 1]); - } - for (i = 0; i < numBlocks - 1; i++) { - string += block2s(plainBlocks[i], false); - } - string += block2s(plainBlocks[i], true); - return binary ? string : dec_utf8(string); + key = expandKey(key); + var numBlocks = cryptArr.length / 16, + cipherBlocks = [], + i, + plainBlocks = [], + string = ""; + for (i = 0; i < numBlocks; i++) { + cipherBlocks.push(cryptArr.slice(i * 16, (i + 1) * 16)); + } + for (i = cipherBlocks.length - 1; i >= 0; i--) { + plainBlocks[i] = decryptBlock(cipherBlocks[i], key); + plainBlocks[i] = + i === 0 + ? xorBlocks(plainBlocks[i], iv) + : xorBlocks(plainBlocks[i], cipherBlocks[i - 1]); + } + for (i = 0; i < numBlocks - 1; i++) { + string += block2s(plainBlocks[i], false); + } + string += block2s(plainBlocks[i], true); + return binary ? string : dec_utf8(string); } function encryptBlock(block, words) { - Decrypt = false; - var state = addRoundKey(block, words, 0), - round; - for (round = 1; round < Nr + 1; round++) { - state = subBytes(state); - state = shiftRows(state); - if (round < Nr) { - state = mixColumns(state); - } - state = addRoundKey(state, words, round); - } + Decrypt = false; + var state = addRoundKey(block, words, 0), + round; + for (round = 1; round < Nr + 1; round++) { + state = subBytes(state); + state = shiftRows(state); + if (round < Nr) { + state = mixColumns(state); + } + state = addRoundKey(state, words, round); + } - return state; + return state; } function decryptBlock(block, words) { - Decrypt = true; - var state = addRoundKey(block, words, Nr), - round; - for (round = Nr - 1; round > -1; round--) { - state = shiftRows(state); - state = subBytes(state); - state = addRoundKey(state, words, round); - if (round > 0) { - state = mixColumns(state); - } - } + Decrypt = true; + var state = addRoundKey(block, words, Nr), + round; + for (round = Nr - 1; round > -1; round--) { + state = shiftRows(state); + state = subBytes(state); + state = addRoundKey(state, words, round); + if (round > 0) { + state = mixColumns(state); + } + } - return state; + return state; } function subBytes(state) { - var S = Decrypt ? SBoxInv : SBox, - temp = [], - i; - for (i = 0; i < 16; i++) { - temp[i] = S[state[i]]; - } - return temp; + var S = Decrypt ? SBoxInv : SBox, + temp = [], + i; + for (i = 0; i < 16; i++) { + temp[i] = S[state[i]]; + } + return temp; } function shiftRows(state) { - var temp = [], - shiftBy = Decrypt - ? [0, 13, 10, 7, 4, 1, 14, 11, 8, 5, 2, 15, 12, 9, 6, 3] - : [0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 1, 6, 11], - i; - for (i = 0; i < 16; i++) { - temp[i] = state[shiftBy[i]]; - } - return temp; + var temp = [], + shiftBy = Decrypt + ? [0, 13, 10, 7, 4, 1, 14, 11, 8, 5, 2, 15, 12, 9, 6, 3] + : [0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 1, 6, 11], + i; + for (i = 0; i < 16; i++) { + temp[i] = state[shiftBy[i]]; + } + return temp; } function mixColumns(state) { - var t = [], - c; - if (!Decrypt) { - for (c = 0; c < 4; c++) { - t[c * 4] = - G2X[state[c * 4]] ^ - G3X[state[1 + c * 4]] ^ - state[2 + c * 4] ^ - state[3 + c * 4]; - t[1 + c * 4] = - state[c * 4] ^ - G2X[state[1 + c * 4]] ^ - G3X[state[2 + c * 4]] ^ - state[3 + c * 4]; - t[2 + c * 4] = - state[c * 4] ^ - state[1 + c * 4] ^ - G2X[state[2 + c * 4]] ^ - G3X[state[3 + c * 4]]; - t[3 + c * 4] = - G3X[state[c * 4]] ^ - state[1 + c * 4] ^ - state[2 + c * 4] ^ - G2X[state[3 + c * 4]]; - } - } else { - for (c = 0; c < 4; c++) { - t[c * 4] = - GEX[state[c * 4]] ^ - GBX[state[1 + c * 4]] ^ - GDX[state[2 + c * 4]] ^ - G9X[state[3 + c * 4]]; - t[1 + c * 4] = - G9X[state[c * 4]] ^ - GEX[state[1 + c * 4]] ^ - GBX[state[2 + c * 4]] ^ - GDX[state[3 + c * 4]]; - t[2 + c * 4] = - GDX[state[c * 4]] ^ - G9X[state[1 + c * 4]] ^ - GEX[state[2 + c * 4]] ^ - GBX[state[3 + c * 4]]; - t[3 + c * 4] = - GBX[state[c * 4]] ^ - GDX[state[1 + c * 4]] ^ - G9X[state[2 + c * 4]] ^ - GEX[state[3 + c * 4]]; - } - } + var t = [], + c; + if (!Decrypt) { + for (c = 0; c < 4; c++) { + t[c * 4] = + G2X[state[c * 4]] ^ + G3X[state[1 + c * 4]] ^ + state[2 + c * 4] ^ + state[3 + c * 4]; + t[1 + c * 4] = + state[c * 4] ^ + G2X[state[1 + c * 4]] ^ + G3X[state[2 + c * 4]] ^ + state[3 + c * 4]; + t[2 + c * 4] = + state[c * 4] ^ + state[1 + c * 4] ^ + G2X[state[2 + c * 4]] ^ + G3X[state[3 + c * 4]]; + t[3 + c * 4] = + G3X[state[c * 4]] ^ + state[1 + c * 4] ^ + state[2 + c * 4] ^ + G2X[state[3 + c * 4]]; + } + } else { + for (c = 0; c < 4; c++) { + t[c * 4] = + GEX[state[c * 4]] ^ + GBX[state[1 + c * 4]] ^ + GDX[state[2 + c * 4]] ^ + G9X[state[3 + c * 4]]; + t[1 + c * 4] = + G9X[state[c * 4]] ^ + GEX[state[1 + c * 4]] ^ + GBX[state[2 + c * 4]] ^ + GDX[state[3 + c * 4]]; + t[2 + c * 4] = + GDX[state[c * 4]] ^ + G9X[state[1 + c * 4]] ^ + GEX[state[2 + c * 4]] ^ + GBX[state[3 + c * 4]]; + t[3 + c * 4] = + GBX[state[c * 4]] ^ + GDX[state[1 + c * 4]] ^ + G9X[state[2 + c * 4]] ^ + GEX[state[3 + c * 4]]; + } + } - return t; + return t; } function addRoundKey(state, words, round) { - var temp = [], - i; - for (i = 0; i < 16; i++) { - temp[i] = state[i] ^ words[round][i]; - } - return temp; + var temp = [], + i; + for (i = 0; i < 16; i++) { + temp[i] = state[i] ^ words[round][i]; + } + return temp; } function xorBlocks(block1, block2) { - var temp = [], - i; - for (i = 0; i < 16; i++) { - temp[i] = block1[i] ^ block2[i]; - } - return temp; + var temp = [], + i; + for (i = 0; i < 16; i++) { + temp[i] = block1[i] ^ block2[i]; + } + return temp; } function expandKey(key) { - var w = [], - temp = [], - i, - r, - t, - flat = [], - j; + var w = [], + temp = [], + i, + r, + t, + flat = [], + j; - for (i = 0; i < Nk; i++) { - r = [key[4 * i], key[4 * i + 1], key[4 * i + 2], key[4 * i + 3]]; - w[i] = r; - } + for (i = 0; i < Nk; i++) { + r = [key[4 * i], key[4 * i + 1], key[4 * i + 2], key[4 * i + 3]]; + w[i] = r; + } - for (i = Nk; i < 4 * (Nr + 1); i++) { - w[i] = []; - for (t = 0; t < 4; t++) { - temp[t] = w[i - 1][t]; - } - if (i % Nk === 0) { - temp = subWord(rotWord(temp)); - temp[0] ^= Rcon[i / Nk - 1]; - } else if (Nk > 6 && i % Nk === 4) { - temp = subWord(temp); - } - for (t = 0; t < 4; t++) { - w[i][t] = w[i - Nk][t] ^ temp[t]; - } - } - for (i = 0; i < Nr + 1; i++) { - flat[i] = []; - for (j = 0; j < 4; j++) { - flat[i].push( - w[i * 4 + j][0], - w[i * 4 + j][1], - w[i * 4 + j][2], - w[i * 4 + j][3] - ); - } - } - return flat; + for (i = Nk; i < 4 * (Nr + 1); i++) { + w[i] = []; + for (t = 0; t < 4; t++) { + temp[t] = w[i - 1][t]; + } + if (i % Nk === 0) { + temp = subWord(rotWord(temp)); + temp[0] ^= Rcon[i / Nk - 1]; + } else if (Nk > 6 && i % Nk === 4) { + temp = subWord(temp); + } + for (t = 0; t < 4; t++) { + w[i][t] = w[i - Nk][t] ^ temp[t]; + } + } + for (i = 0; i < Nr + 1; i++) { + flat[i] = []; + for (j = 0; j < 4; j++) { + flat[i].push( + w[i * 4 + j][0], + w[i * 4 + j][1], + w[i * 4 + j][2], + w[i * 4 + j][3], + ); + } + } + return flat; } function subWord(w) { - for (var i = 0; i < 4; i++) { - w[i] = SBox[w[i]]; - } - return w; + for (var i = 0; i < 4; i++) { + w[i] = SBox[w[i]]; + } + return w; } function rotWord(w) { - var tmp = w[0], - i; - for (i = 0; i < 3; i++) { - w[i] = w[i + 1]; - } - w[3] = tmp; - return w; + var tmp = w[0], + i; + for (i = 0; i < 3; i++) { + w[i] = w[i + 1]; + } + w[3] = tmp; + return w; } function strhex(str, size) { - var i, - ret = []; - for (i = 0; i < str.length; i += size) { - ret[i / size] = parseInt(str.substr(i, size), 16); - } - return ret; + var i, + ret = []; + for (i = 0; i < str.length; i += size) { + ret[i / size] = parseInt(str.substr(i, size), 16); + } + return ret; } function invertArr(arr) { - var i, - ret = []; - for (i = 0; i < arr.length; i++) { - ret[arr[i]] = i; - } - return ret; + var i, + ret = []; + for (i = 0; i < arr.length; i++) { + ret[arr[i]] = i; + } + return ret; } function Gxx(a, b) { - var i, ret; + var i, ret; - ret = 0; - for (i = 0; i < 8; i++) { - ret = (b & 1) === 1 ? ret ^ a : ret; - a = a > 0x7f ? 0x11b ^ (a << 1) : a << 1; - b >>>= 1; - } + ret = 0; + for (i = 0; i < 8; i++) { + ret = (b & 1) === 1 ? ret ^ a : ret; + a = a > 0x7f ? 0x11b ^ (a << 1) : a << 1; + b >>>= 1; + } - return ret; + return ret; } function Gx(x) { - var i, - r = []; - for (i = 0; i < 256; i++) { - r[i] = Gxx(x, i); - } - return r; + var i, + r = []; + for (i = 0; i < 256; i++) { + r[i] = Gxx(x, i); + } + return r; } var SBox = strhex( - "637c777bf26b6fc53001672bfed7ab76ca82c97dfa5947f0add4a2af9ca472c0b7fd9326363ff7cc34a5e5f171d8311504c723c31896059a071280e2eb27b27509832c1a1b6e5aa0523bd6b329e32f8453d100ed20fcb15b6acbbe394a4c58cfd0efaafb434d338545f9027f503c9fa851a3408f929d38f5bcb6da2110fff3d2cd0c13ec5f974417c4a77e3d645d197360814fdc222a908846eeb814de5e0bdbe0323a0a4906245cc2d3ac629195e479e7c8376d8dd54ea96c56f4ea657aae08ba78252e1ca6b4c6e8dd741f4bbd8b8a703eb5664803f60e613557b986c11d9ee1f8981169d98e949b1e87e9ce5528df8ca1890dbfe6426841992d0fb054bb16", - 2 + "637c777bf26b6fc53001672bfed7ab76ca82c97dfa5947f0add4a2af9ca472c0b7fd9326363ff7cc34a5e5f171d8311504c723c31896059a071280e2eb27b27509832c1a1b6e5aa0523bd6b329e32f8453d100ed20fcb15b6acbbe394a4c58cfd0efaafb434d338545f9027f503c9fa851a3408f929d38f5bcb6da2110fff3d2cd0c13ec5f974417c4a77e3d645d197360814fdc222a908846eeb814de5e0bdbe0323a0a4906245cc2d3ac629195e479e7c8376d8dd54ea96c56f4ea657aae08ba78252e1ca6b4c6e8dd741f4bbd8b8a703eb5664803f60e613557b986c11d9ee1f8981169d98e949b1e87e9ce5528df8ca1890dbfe6426841992d0fb054bb16", + 2, ); var SBoxInv = invertArr(SBox); var Rcon = strhex( - "01020408102040801b366cd8ab4d9a2f5ebc63c697356ad4b37dfaefc591", - 2 + "01020408102040801b366cd8ab4d9a2f5ebc63c697356ad4b37dfaefc591", + 2, ); var G2X = Gx(2); var G3X = Gx(3); @@ -420,222 +420,222 @@ var GBX = Gx(0xb); var GDX = Gx(0xd); var GEX = Gx(0xe); function enc(string, pass, binary) { - var salt = randArr(8), - pbe = openSSLKey(s2a(pass, binary), salt), - key = pbe.key, - iv = pbe.iv, - cipherBlocks, - saltBlock = [[83, 97, 108, 116, 101, 100, 95, 95].concat(salt)]; - string = s2a(string, binary); - cipherBlocks = rawEncrypt(string, key, iv); + var salt = randArr(8), + pbe = openSSLKey(s2a(pass, binary), salt), + key = pbe.key, + iv = pbe.iv, + cipherBlocks, + saltBlock = [[83, 97, 108, 116, 101, 100, 95, 95].concat(salt)]; + string = s2a(string, binary); + cipherBlocks = rawEncrypt(string, key, iv); - cipherBlocks = saltBlock.concat(cipherBlocks); - return Base64.encode(cipherBlocks); + cipherBlocks = saltBlock.concat(cipherBlocks); + return Base64.encode(cipherBlocks); } function dec(string, pass, binary) { - var cryptArr = Base64.decode(string), - salt = cryptArr.slice(8, 16), - pbe = openSSLKey(s2a(pass, binary), salt), - key = pbe.key, - iv = pbe.iv; - cryptArr = cryptArr.slice(16, cryptArr.length); + var cryptArr = Base64.decode(string), + salt = cryptArr.slice(8, 16), + pbe = openSSLKey(s2a(pass, binary), salt), + key = pbe.key, + iv = pbe.iv; + cryptArr = cryptArr.slice(16, cryptArr.length); - string = rawDecrypt(cryptArr, key, iv, binary); - return string; + string = rawDecrypt(cryptArr, key, iv, binary); + return string; } function MD5(numArr) { - function rotateLeft(lValue, iShiftBits) { - return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits)); - } + function rotateLeft(lValue, iShiftBits) { + return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits)); + } - function addUnsigned(lX, lY) { - var lX4, lY4, lX8, lY8, lResult; - lX8 = lX & 0x80000000; - lY8 = lY & 0x80000000; - lX4 = lX & 0x40000000; - lY4 = lY & 0x40000000; - lResult = (lX & 0x3fffffff) + (lY & 0x3fffffff); - if (lX4 & lY4) { - return lResult ^ 0x80000000 ^ lX8 ^ lY8; - } - if (lX4 | lY4) { - if (lResult & 0x40000000) { - return lResult ^ 0xc0000000 ^ lX8 ^ lY8; - } else { - return lResult ^ 0x40000000 ^ lX8 ^ lY8; - } - } else { - return lResult ^ lX8 ^ lY8; - } - } + function addUnsigned(lX, lY) { + var lX4, lY4, lX8, lY8, lResult; + lX8 = lX & 0x80000000; + lY8 = lY & 0x80000000; + lX4 = lX & 0x40000000; + lY4 = lY & 0x40000000; + lResult = (lX & 0x3fffffff) + (lY & 0x3fffffff); + if (lX4 & lY4) { + return lResult ^ 0x80000000 ^ lX8 ^ lY8; + } + if (lX4 | lY4) { + if (lResult & 0x40000000) { + return lResult ^ 0xc0000000 ^ lX8 ^ lY8; + } else { + return lResult ^ 0x40000000 ^ lX8 ^ lY8; + } + } else { + return lResult ^ lX8 ^ lY8; + } + } - function f(x, y, z) { - return (x & y) | (~x & z); - } - function g(x, y, z) { - return (x & z) | (y & ~z); - } - function h(x, y, z) { - return x ^ y ^ z; - } - function funcI(x, y, z) { - return y ^ (x | ~z); - } + function f(x, y, z) { + return (x & y) | (~x & z); + } + function g(x, y, z) { + return (x & z) | (y & ~z); + } + function h(x, y, z) { + return x ^ y ^ z; + } + function funcI(x, y, z) { + return y ^ (x | ~z); + } - function ff(a, b, c, d, x, s, ac) { - a = addUnsigned(a, addUnsigned(addUnsigned(f(b, c, d), x), ac)); - return addUnsigned(rotateLeft(a, s), b); - } + function ff(a, b, c, d, x, s, ac) { + a = addUnsigned(a, addUnsigned(addUnsigned(f(b, c, d), x), ac)); + return addUnsigned(rotateLeft(a, s), b); + } - function gg(a, b, c, d, x, s, ac) { - a = addUnsigned(a, addUnsigned(addUnsigned(g(b, c, d), x), ac)); - return addUnsigned(rotateLeft(a, s), b); - } + function gg(a, b, c, d, x, s, ac) { + a = addUnsigned(a, addUnsigned(addUnsigned(g(b, c, d), x), ac)); + return addUnsigned(rotateLeft(a, s), b); + } - function hh(a, b, c, d, x, s, ac) { - a = addUnsigned(a, addUnsigned(addUnsigned(h(b, c, d), x), ac)); - return addUnsigned(rotateLeft(a, s), b); - } + function hh(a, b, c, d, x, s, ac) { + a = addUnsigned(a, addUnsigned(addUnsigned(h(b, c, d), x), ac)); + return addUnsigned(rotateLeft(a, s), b); + } - function ii(a, b, c, d, x, s, ac) { - a = addUnsigned(a, addUnsigned(addUnsigned(funcI(b, c, d), x), ac)); - return addUnsigned(rotateLeft(a, s), b); - } + function ii(a, b, c, d, x, s, ac) { + a = addUnsigned(a, addUnsigned(addUnsigned(funcI(b, c, d), x), ac)); + return addUnsigned(rotateLeft(a, s), b); + } - function convertToWordArray(numArr) { - var lWordCount, - lMessageLength = numArr.length, - lNumberOfWords_temp1 = lMessageLength + 8, - lNumberOfWords_temp2 = - (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64, - lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16, - lWordArray = [], - lBytePosition = 0, - lByteCount = 0; - while (lByteCount < lMessageLength) { - lWordCount = (lByteCount - (lByteCount % 4)) / 4; - lBytePosition = (lByteCount % 4) * 8; - lWordArray[lWordCount] = - lWordArray[lWordCount] | (numArr[lByteCount] << lBytePosition); - lByteCount++; - } - lWordCount = (lByteCount - (lByteCount % 4)) / 4; - lBytePosition = (lByteCount % 4) * 8; - lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition); - lWordArray[lNumberOfWords - 2] = lMessageLength << 3; - lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29; - return lWordArray; - } + function convertToWordArray(numArr) { + var lWordCount, + lMessageLength = numArr.length, + lNumberOfWords_temp1 = lMessageLength + 8, + lNumberOfWords_temp2 = + (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64, + lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16, + lWordArray = [], + lBytePosition = 0, + lByteCount = 0; + while (lByteCount < lMessageLength) { + lWordCount = (lByteCount - (lByteCount % 4)) / 4; + lBytePosition = (lByteCount % 4) * 8; + lWordArray[lWordCount] = + lWordArray[lWordCount] | (numArr[lByteCount] << lBytePosition); + lByteCount++; + } + lWordCount = (lByteCount - (lByteCount % 4)) / 4; + lBytePosition = (lByteCount % 4) * 8; + lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition); + lWordArray[lNumberOfWords - 2] = lMessageLength << 3; + lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29; + return lWordArray; + } - function wordToHex(lValue) { - var lByte, - lCount, - wordToHexArr = []; - for (lCount = 0; lCount <= 3; lCount++) { - lByte = (lValue >>> (lCount * 8)) & 255; - wordToHexArr = wordToHexArr.concat(lByte); - } - return wordToHexArr; - } + function wordToHex(lValue) { + var lByte, + lCount, + wordToHexArr = []; + for (lCount = 0; lCount <= 3; lCount++) { + lByte = (lValue >>> (lCount * 8)) & 255; + wordToHexArr = wordToHexArr.concat(lByte); + } + return wordToHexArr; + } - var x = [], - k, - AA, - BB, - CC, - DD, - a, - b, - c, - d, - rnd = strhex( - "67452301efcdab8998badcfe10325476d76aa478e8c7b756242070dbc1bdceeef57c0faf4787c62aa8304613fd469501698098d88b44f7afffff5bb1895cd7be6b901122fd987193a679438e49b40821f61e2562c040b340265e5a51e9b6c7aad62f105d02441453d8a1e681e7d3fbc821e1cde6c33707d6f4d50d87455a14eda9e3e905fcefa3f8676f02d98d2a4c8afffa39428771f6816d9d6122fde5380ca4beea444bdecfa9f6bb4b60bebfbc70289b7ec6eaa127fad4ef308504881d05d9d4d039e6db99e51fa27cf8c4ac5665f4292244432aff97ab9423a7fc93a039655b59c38f0ccc92ffeff47d85845dd16fa87e4ffe2ce6e0a30143144e0811a1f7537e82bd3af2352ad7d2bbeb86d391", - 8 - ); + var x = [], + k, + AA, + BB, + CC, + DD, + a, + b, + c, + d, + rnd = strhex( + "67452301efcdab8998badcfe10325476d76aa478e8c7b756242070dbc1bdceeef57c0faf4787c62aa8304613fd469501698098d88b44f7afffff5bb1895cd7be6b901122fd987193a679438e49b40821f61e2562c040b340265e5a51e9b6c7aad62f105d02441453d8a1e681e7d3fbc821e1cde6c33707d6f4d50d87455a14eda9e3e905fcefa3f8676f02d98d2a4c8afffa39428771f6816d9d6122fde5380ca4beea444bdecfa9f6bb4b60bebfbc70289b7ec6eaa127fad4ef308504881d05d9d4d039e6db99e51fa27cf8c4ac5665f4292244432aff97ab9423a7fc93a039655b59c38f0ccc92ffeff47d85845dd16fa87e4ffe2ce6e0a30143144e0811a1f7537e82bd3af2352ad7d2bbeb86d391", + 8, + ); - x = convertToWordArray(numArr); + x = convertToWordArray(numArr); - a = rnd[0]; - b = rnd[1]; - c = rnd[2]; - d = rnd[3]; + a = rnd[0]; + b = rnd[1]; + c = rnd[2]; + d = rnd[3]; - for (k = 0; k < x.length; k += 16) { - AA = a; - BB = b; - CC = c; - DD = d; - a = ff(a, b, c, d, x[k + 0], 7, rnd[4]); - d = ff(d, a, b, c, x[k + 1], 12, rnd[5]); - c = ff(c, d, a, b, x[k + 2], 17, rnd[6]); - b = ff(b, c, d, a, x[k + 3], 22, rnd[7]); - a = ff(a, b, c, d, x[k + 4], 7, rnd[8]); - d = ff(d, a, b, c, x[k + 5], 12, rnd[9]); - c = ff(c, d, a, b, x[k + 6], 17, rnd[10]); - b = ff(b, c, d, a, x[k + 7], 22, rnd[11]); - a = ff(a, b, c, d, x[k + 8], 7, rnd[12]); - d = ff(d, a, b, c, x[k + 9], 12, rnd[13]); - c = ff(c, d, a, b, x[k + 10], 17, rnd[14]); - b = ff(b, c, d, a, x[k + 11], 22, rnd[15]); - a = ff(a, b, c, d, x[k + 12], 7, rnd[16]); - d = ff(d, a, b, c, x[k + 13], 12, rnd[17]); - c = ff(c, d, a, b, x[k + 14], 17, rnd[18]); - b = ff(b, c, d, a, x[k + 15], 22, rnd[19]); - a = gg(a, b, c, d, x[k + 1], 5, rnd[20]); - d = gg(d, a, b, c, x[k + 6], 9, rnd[21]); - c = gg(c, d, a, b, x[k + 11], 14, rnd[22]); - b = gg(b, c, d, a, x[k + 0], 20, rnd[23]); - a = gg(a, b, c, d, x[k + 5], 5, rnd[24]); - d = gg(d, a, b, c, x[k + 10], 9, rnd[25]); - c = gg(c, d, a, b, x[k + 15], 14, rnd[26]); - b = gg(b, c, d, a, x[k + 4], 20, rnd[27]); - a = gg(a, b, c, d, x[k + 9], 5, rnd[28]); - d = gg(d, a, b, c, x[k + 14], 9, rnd[29]); - c = gg(c, d, a, b, x[k + 3], 14, rnd[30]); - b = gg(b, c, d, a, x[k + 8], 20, rnd[31]); - a = gg(a, b, c, d, x[k + 13], 5, rnd[32]); - d = gg(d, a, b, c, x[k + 2], 9, rnd[33]); - c = gg(c, d, a, b, x[k + 7], 14, rnd[34]); - b = gg(b, c, d, a, x[k + 12], 20, rnd[35]); - a = hh(a, b, c, d, x[k + 5], 4, rnd[36]); - d = hh(d, a, b, c, x[k + 8], 11, rnd[37]); - c = hh(c, d, a, b, x[k + 11], 16, rnd[38]); - b = hh(b, c, d, a, x[k + 14], 23, rnd[39]); - a = hh(a, b, c, d, x[k + 1], 4, rnd[40]); - d = hh(d, a, b, c, x[k + 4], 11, rnd[41]); - c = hh(c, d, a, b, x[k + 7], 16, rnd[42]); - b = hh(b, c, d, a, x[k + 10], 23, rnd[43]); - a = hh(a, b, c, d, x[k + 13], 4, rnd[44]); - d = hh(d, a, b, c, x[k + 0], 11, rnd[45]); - c = hh(c, d, a, b, x[k + 3], 16, rnd[46]); - b = hh(b, c, d, a, x[k + 6], 23, rnd[47]); - a = hh(a, b, c, d, x[k + 9], 4, rnd[48]); - d = hh(d, a, b, c, x[k + 12], 11, rnd[49]); - c = hh(c, d, a, b, x[k + 15], 16, rnd[50]); - b = hh(b, c, d, a, x[k + 2], 23, rnd[51]); - a = ii(a, b, c, d, x[k + 0], 6, rnd[52]); - d = ii(d, a, b, c, x[k + 7], 10, rnd[53]); - c = ii(c, d, a, b, x[k + 14], 15, rnd[54]); - b = ii(b, c, d, a, x[k + 5], 21, rnd[55]); - a = ii(a, b, c, d, x[k + 12], 6, rnd[56]); - d = ii(d, a, b, c, x[k + 3], 10, rnd[57]); - c = ii(c, d, a, b, x[k + 10], 15, rnd[58]); - b = ii(b, c, d, a, x[k + 1], 21, rnd[59]); - a = ii(a, b, c, d, x[k + 8], 6, rnd[60]); - d = ii(d, a, b, c, x[k + 15], 10, rnd[61]); - c = ii(c, d, a, b, x[k + 6], 15, rnd[62]); - b = ii(b, c, d, a, x[k + 13], 21, rnd[63]); - a = ii(a, b, c, d, x[k + 4], 6, rnd[64]); - d = ii(d, a, b, c, x[k + 11], 10, rnd[65]); - c = ii(c, d, a, b, x[k + 2], 15, rnd[66]); - b = ii(b, c, d, a, x[k + 9], 21, rnd[67]); - a = addUnsigned(a, AA); - b = addUnsigned(b, BB); - c = addUnsigned(c, CC); - d = addUnsigned(d, DD); - } + for (k = 0; k < x.length; k += 16) { + AA = a; + BB = b; + CC = c; + DD = d; + a = ff(a, b, c, d, x[k + 0], 7, rnd[4]); + d = ff(d, a, b, c, x[k + 1], 12, rnd[5]); + c = ff(c, d, a, b, x[k + 2], 17, rnd[6]); + b = ff(b, c, d, a, x[k + 3], 22, rnd[7]); + a = ff(a, b, c, d, x[k + 4], 7, rnd[8]); + d = ff(d, a, b, c, x[k + 5], 12, rnd[9]); + c = ff(c, d, a, b, x[k + 6], 17, rnd[10]); + b = ff(b, c, d, a, x[k + 7], 22, rnd[11]); + a = ff(a, b, c, d, x[k + 8], 7, rnd[12]); + d = ff(d, a, b, c, x[k + 9], 12, rnd[13]); + c = ff(c, d, a, b, x[k + 10], 17, rnd[14]); + b = ff(b, c, d, a, x[k + 11], 22, rnd[15]); + a = ff(a, b, c, d, x[k + 12], 7, rnd[16]); + d = ff(d, a, b, c, x[k + 13], 12, rnd[17]); + c = ff(c, d, a, b, x[k + 14], 17, rnd[18]); + b = ff(b, c, d, a, x[k + 15], 22, rnd[19]); + a = gg(a, b, c, d, x[k + 1], 5, rnd[20]); + d = gg(d, a, b, c, x[k + 6], 9, rnd[21]); + c = gg(c, d, a, b, x[k + 11], 14, rnd[22]); + b = gg(b, c, d, a, x[k + 0], 20, rnd[23]); + a = gg(a, b, c, d, x[k + 5], 5, rnd[24]); + d = gg(d, a, b, c, x[k + 10], 9, rnd[25]); + c = gg(c, d, a, b, x[k + 15], 14, rnd[26]); + b = gg(b, c, d, a, x[k + 4], 20, rnd[27]); + a = gg(a, b, c, d, x[k + 9], 5, rnd[28]); + d = gg(d, a, b, c, x[k + 14], 9, rnd[29]); + c = gg(c, d, a, b, x[k + 3], 14, rnd[30]); + b = gg(b, c, d, a, x[k + 8], 20, rnd[31]); + a = gg(a, b, c, d, x[k + 13], 5, rnd[32]); + d = gg(d, a, b, c, x[k + 2], 9, rnd[33]); + c = gg(c, d, a, b, x[k + 7], 14, rnd[34]); + b = gg(b, c, d, a, x[k + 12], 20, rnd[35]); + a = hh(a, b, c, d, x[k + 5], 4, rnd[36]); + d = hh(d, a, b, c, x[k + 8], 11, rnd[37]); + c = hh(c, d, a, b, x[k + 11], 16, rnd[38]); + b = hh(b, c, d, a, x[k + 14], 23, rnd[39]); + a = hh(a, b, c, d, x[k + 1], 4, rnd[40]); + d = hh(d, a, b, c, x[k + 4], 11, rnd[41]); + c = hh(c, d, a, b, x[k + 7], 16, rnd[42]); + b = hh(b, c, d, a, x[k + 10], 23, rnd[43]); + a = hh(a, b, c, d, x[k + 13], 4, rnd[44]); + d = hh(d, a, b, c, x[k + 0], 11, rnd[45]); + c = hh(c, d, a, b, x[k + 3], 16, rnd[46]); + b = hh(b, c, d, a, x[k + 6], 23, rnd[47]); + a = hh(a, b, c, d, x[k + 9], 4, rnd[48]); + d = hh(d, a, b, c, x[k + 12], 11, rnd[49]); + c = hh(c, d, a, b, x[k + 15], 16, rnd[50]); + b = hh(b, c, d, a, x[k + 2], 23, rnd[51]); + a = ii(a, b, c, d, x[k + 0], 6, rnd[52]); + d = ii(d, a, b, c, x[k + 7], 10, rnd[53]); + c = ii(c, d, a, b, x[k + 14], 15, rnd[54]); + b = ii(b, c, d, a, x[k + 5], 21, rnd[55]); + a = ii(a, b, c, d, x[k + 12], 6, rnd[56]); + d = ii(d, a, b, c, x[k + 3], 10, rnd[57]); + c = ii(c, d, a, b, x[k + 10], 15, rnd[58]); + b = ii(b, c, d, a, x[k + 1], 21, rnd[59]); + a = ii(a, b, c, d, x[k + 8], 6, rnd[60]); + d = ii(d, a, b, c, x[k + 15], 10, rnd[61]); + c = ii(c, d, a, b, x[k + 6], 15, rnd[62]); + b = ii(b, c, d, a, x[k + 13], 21, rnd[63]); + a = ii(a, b, c, d, x[k + 4], 6, rnd[64]); + d = ii(d, a, b, c, x[k + 11], 10, rnd[65]); + c = ii(c, d, a, b, x[k + 2], 15, rnd[66]); + b = ii(b, c, d, a, x[k + 9], 21, rnd[67]); + a = addUnsigned(a, AA); + b = addUnsigned(b, BB); + c = addUnsigned(c, CC); + d = addUnsigned(d, DD); + } - return wordToHex(a).concat(wordToHex(b), wordToHex(c), wordToHex(d)); + return wordToHex(a).concat(wordToHex(b), wordToHex(c), wordToHex(d)); } // function encString (plaintext, key, iv) { // var i; @@ -743,63 +743,63 @@ function MD5(numArr) { // } const Base64 = { - encode: function (b) { - var _chars = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", - chars = _chars.split(""), - flatArr = [], - b64 = "", - i, - broken_b64, - totalChunks = Math.floor((b.length * 16) / 3); - for (i = 0; i < b.length * 16; i++) { - flatArr.push(b[Math.floor(i / 16)][i % 16]); - } - for (i = 0; i < flatArr.length; i = i + 3) { - b64 += chars[flatArr[i] >> 2]; - b64 += chars[((flatArr[i] & 3) << 4) | (flatArr[i + 1] >> 4)]; - if (flatArr[i + 1] !== undefined) { - b64 += chars[((flatArr[i + 1] & 15) << 2) | (flatArr[i + 2] >> 6)]; - } else { - b64 += "="; - } - if (flatArr[i + 2] !== undefined) { - b64 += chars[flatArr[i + 2] & 63]; - } else { - b64 += "="; - } - } - broken_b64 = b64.slice(0, 64) + "\n"; - for (i = 1; i < Math.ceil(b64.length / 64); i++) { - broken_b64 += - b64.slice(i * 64, i * 64 + 64) + - (Math.ceil(b64.length / 64) === i + 1 ? "" : "\n"); - } - return broken_b64; - }, - decode: function (string) { - string = string.replace(/\n/g, ""); - var _chars = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", - chars = _chars.split(""), - flatArr = [], - c = [], - b = [], - i; - for (i = 0; i < string.length; i = i + 4) { - c[0] = _chars.indexOf(string.charAt(i)); - c[1] = _chars.indexOf(string.charAt(i + 1)); - c[2] = _chars.indexOf(string.charAt(i + 2)); - c[3] = _chars.indexOf(string.charAt(i + 3)); + encode: function (b) { + var _chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", + chars = _chars.split(""), + flatArr = [], + b64 = "", + i, + broken_b64, + totalChunks = Math.floor((b.length * 16) / 3); + for (i = 0; i < b.length * 16; i++) { + flatArr.push(b[Math.floor(i / 16)][i % 16]); + } + for (i = 0; i < flatArr.length; i = i + 3) { + b64 += chars[flatArr[i] >> 2]; + b64 += chars[((flatArr[i] & 3) << 4) | (flatArr[i + 1] >> 4)]; + if (flatArr[i + 1] !== undefined) { + b64 += chars[((flatArr[i + 1] & 15) << 2) | (flatArr[i + 2] >> 6)]; + } else { + b64 += "="; + } + if (flatArr[i + 2] !== undefined) { + b64 += chars[flatArr[i + 2] & 63]; + } else { + b64 += "="; + } + } + broken_b64 = b64.slice(0, 64) + "\n"; + for (i = 1; i < Math.ceil(b64.length / 64); i++) { + broken_b64 += + b64.slice(i * 64, i * 64 + 64) + + (Math.ceil(b64.length / 64) === i + 1 ? "" : "\n"); + } + return broken_b64; + }, + decode: function (string) { + string = string.replace(/\n/g, ""); + var _chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", + chars = _chars.split(""), + flatArr = [], + c = [], + b = [], + i; + for (i = 0; i < string.length; i = i + 4) { + c[0] = _chars.indexOf(string.charAt(i)); + c[1] = _chars.indexOf(string.charAt(i + 1)); + c[2] = _chars.indexOf(string.charAt(i + 2)); + c[3] = _chars.indexOf(string.charAt(i + 3)); - b[0] = (c[0] << 2) | (c[1] >> 4); - b[1] = ((c[1] & 15) << 4) | (c[2] >> 2); - b[2] = ((c[2] & 3) << 6) | c[3]; - flatArr.push(b[0], b[1], b[2]); - } - flatArr = flatArr.slice(0, flatArr.length - (flatArr.length % 16)); - return flatArr; - }, + b[0] = (c[0] << 2) | (c[1] >> 4); + b[1] = ((c[1] & 15) << 4) | (c[2] >> 2); + b[2] = ((c[2] & 3) << 6) | c[3]; + flatArr.push(b[0], b[1], b[2]); + } + flatArr = flatArr.slice(0, flatArr.length - (flatArr.length % 16)); + return flatArr; + }, }; export { enc, dec }; diff --git a/src/codecs/index.ts b/src/codecs/index.ts index 769998c..8754e5d 100644 --- a/src/codecs/index.ts +++ b/src/codecs/index.ts @@ -2,46 +2,46 @@ import { enc, dec } from "./aes"; // for some reason eslint was parsing the type inside of the function params as a variable export interface Codec { - // eslint-disable-next-line - encode: (str: string | undefined) => string; - // eslint-disable-next-line - decode: (str: string | undefined) => string; + // eslint-disable-next-line + encode: (str: string | undefined) => string; + // eslint-disable-next-line + decode: (str: string | undefined) => string; } const xor = { - encode: (str: string | undefined, key: number = 2) => { - if (!str) return str; + encode: (str: string | undefined, key: number = 2) => { + if (!str) return str; - return encodeURIComponent( - str - .split("") - .map((e, i) => - i % key ? String.fromCharCode(e.charCodeAt(0) ^ key) : e - ) - .join("") - ); - }, - decode: (str: string | undefined, key: number = 2) => { - if (!str) return str; + return encodeURIComponent( + str + .split("") + .map((e, i) => + i % key ? String.fromCharCode(e.charCodeAt(0) ^ key) : e, + ) + .join(""), + ); + }, + decode: (str: string | undefined, key: number = 2) => { + if (!str) return str; - return decodeURIComponent(str) - .split("") - .map((e, i) => (i % key ? String.fromCharCode(e.charCodeAt(0) ^ key) : e)) - .join(""); - }, + return decodeURIComponent(str) + .split("") + .map((e, i) => (i % key ? String.fromCharCode(e.charCodeAt(0) ^ key) : e)) + .join(""); + }, }; const plain = { - encode: (str: string | undefined) => { - if (!str) return str; + encode: (str: string | undefined) => { + if (!str) return str; - return encodeURIComponent(str); - }, - decode: (str: string | undefined) => { - if (!str) return str; + return encodeURIComponent(str); + }, + decode: (str: string | undefined) => { + if (!str) return str; - return decodeURIComponent(str); - }, + return decodeURIComponent(str); + }, }; /* @@ -60,30 +60,30 @@ const aes = { */ const none = { - encode: (str: string | undefined) => str, - decode: (str: string | undefined) => str, + encode: (str: string | undefined) => str, + decode: (str: string | undefined) => str, }; const base64 = { - encode: (str: string | undefined) => { - if (!str) return str; + encode: (str: string | undefined) => { + if (!str) return str; - return decodeURIComponent(btoa(str)); - }, - decode: (str: string | undefined) => { - if (!str) return str; + return decodeURIComponent(btoa(str)); + }, + decode: (str: string | undefined) => { + if (!str) return str; - return atob(str); - }, + return atob(str); + }, }; if (!self.$scramjet) { - //@ts-expect-error really dumb workaround - self.$scramjet = {}; + //@ts-expect-error really dumb workaround + self.$scramjet = {}; } self.$scramjet.codecs = { - none, - plain, - base64, - xor, + none, + plain, + base64, + xor, }; diff --git a/src/scramjet.config.ts b/src/scramjet.config.ts index a5e2082..75284e8 100644 --- a/src/scramjet.config.ts +++ b/src/scramjet.config.ts @@ -1,13 +1,13 @@ if (!self.$scramjet) { - //@ts-expect-error really dumb workaround - self.$scramjet = {}; + //@ts-expect-error really dumb workaround + self.$scramjet = {}; } self.$scramjet.config = { - prefix: "/scramjet/", - codec: self.$scramjet.codecs.plain, - config: "/scram/scramjet.config.js", - shared: "/scram/scramjet.shared.js", - worker: "/scram/scramjet.worker.js", - client: "/scram/scramjet.client.js", - codecs: "/scram/scramjet.codecs.js", + prefix: "/scramjet/", + codec: self.$scramjet.codecs.plain, + config: "/scram/scramjet.config.js", + shared: "/scram/scramjet.shared.js", + worker: "/scram/scramjet.worker.js", + client: "/scram/scramjet.client.js", + codecs: "/scram/scramjet.codecs.js", }; diff --git a/src/shared/index.ts b/src/shared/index.ts index 90b9b42..8605741 100644 --- a/src/shared/index.ts +++ b/src/shared/index.ts @@ -9,25 +9,25 @@ import { BareClient } from "@mercuryworkshop/bare-mux"; import { parseDomain } from "parse-domain"; if (!self.$scramjet) { - //@ts-expect-error really dumb workaround - self.$scramjet = {}; + //@ts-expect-error really dumb workaround + self.$scramjet = {}; } self.$scramjet.shared = { - util: { - isScramjetFile, - parseDomain, - BareClient, - }, - url: { - encodeUrl, - decodeUrl, - }, - rewrite: { - rewriteCss, - rewriteHtml, - rewriteSrcset, - rewriteJs, - rewriteHeaders, - rewriteWorkers, - }, + util: { + isScramjetFile, + parseDomain, + BareClient, + }, + url: { + encodeUrl, + decodeUrl, + }, + rewrite: { + rewriteCss, + rewriteHtml, + rewriteSrcset, + rewriteJs, + rewriteHeaders, + rewriteWorkers, + }, }; diff --git a/src/shared/rewriters/css.ts b/src/shared/rewriters/css.ts index de78be6..d4f361d 100644 --- a/src/shared/rewriters/css.ts +++ b/src/shared/rewriters/css.ts @@ -4,31 +4,31 @@ import { encodeUrl } from "./url"; export function rewriteCss(css: string, origin?: URL) { - const regex = - /(@import\s+(?!url\())?\s*url\(\s*(['"]?)([^'")]+)\2\s*\)|@import\s+(['"])([^'"]+)\4/g; + const regex = + /(@import\s+(?!url\())?\s*url\(\s*(['"]?)([^'")]+)\2\s*\)|@import\s+(['"])([^'"]+)\4/g; - return css.replace( - regex, - ( - match, - importStatement, - urlQuote, - urlContent, - importQuote, - importContent - ) => { - const url = urlContent || importContent; - const encodedUrl = encodeUrl(url.trim(), origin); + return css.replace( + regex, + ( + match, + importStatement, + urlQuote, + urlContent, + importQuote, + importContent, + ) => { + const url = urlContent || importContent; + const encodedUrl = encodeUrl(url.trim(), origin); - if (importStatement) { - return `@import url(${urlQuote}${encodedUrl}${urlQuote})`; - } + if (importStatement) { + return `@import url(${urlQuote}${encodedUrl}${urlQuote})`; + } - if (importQuote) { - return `@import ${importQuote}${encodedUrl}${importQuote}`; - } + if (importQuote) { + return `@import ${importQuote}${encodedUrl}${importQuote}`; + } - return `url(${urlQuote}${encodedUrl}${urlQuote})`; - } - ); + return `url(${urlQuote}${encodedUrl}${urlQuote})`; + }, + ); } diff --git a/src/shared/rewriters/headers.ts b/src/shared/rewriters/headers.ts index 8f928b2..9bfe55f 100644 --- a/src/shared/rewriters/headers.ts +++ b/src/shared/rewriters/headers.ts @@ -1,50 +1,50 @@ import { encodeUrl } from "./url"; import { BareHeaders } from "@mercuryworkshop/bare-mux"; const cspHeaders = [ - "cross-origin-embedder-policy", - "cross-origin-opener-policy", - "cross-origin-resource-policy", - "content-security-policy", - "content-security-policy-report-only", - "expect-ct", - "feature-policy", - "origin-isolation", - "strict-transport-security", - "upgrade-insecure-requests", - "x-content-type-options", - "x-download-options", - "x-frame-options", - "x-permitted-cross-domain-policies", - "x-powered-by", - "x-xss-protection", - // This needs to be emulated, but for right now it isn't that important of a feature to be worried about - // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Clear-Site-Data - "clear-site-data", + "cross-origin-embedder-policy", + "cross-origin-opener-policy", + "cross-origin-resource-policy", + "content-security-policy", + "content-security-policy-report-only", + "expect-ct", + "feature-policy", + "origin-isolation", + "strict-transport-security", + "upgrade-insecure-requests", + "x-content-type-options", + "x-download-options", + "x-frame-options", + "x-permitted-cross-domain-policies", + "x-powered-by", + "x-xss-protection", + // This needs to be emulated, but for right now it isn't that important of a feature to be worried about + // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Clear-Site-Data + "clear-site-data", ]; const urlHeaders = ["location", "content-location", "referer"]; export function rewriteHeaders(rawHeaders: BareHeaders, origin?: URL) { - const headers = {}; + const headers = {}; - for (const key in rawHeaders) { - headers[key.toLowerCase()] = rawHeaders[key]; - } + for (const key in rawHeaders) { + headers[key.toLowerCase()] = rawHeaders[key]; + } - cspHeaders.forEach((header) => { - delete headers[header]; - }); + cspHeaders.forEach((header) => { + delete headers[header]; + }); - urlHeaders.forEach((header) => { - if (headers[header]) - headers[header] = encodeUrl(headers[header] as string, origin); - }); + urlHeaders.forEach((header) => { + if (headers[header]) + headers[header] = encodeUrl(headers[header] as string, origin); + }); - if (headers["link"]) { - headers["link"] = headers["link"].replace(/<(.*?)>/gi, (match) => - encodeUrl(match, origin) - ); - } + if (headers["link"]) { + headers["link"] = headers["link"].replace(/<(.*?)>/gi, (match) => + encodeUrl(match, origin), + ); + } - return headers; + return headers; } diff --git a/src/shared/rewriters/html.ts b/src/shared/rewriters/html.ts index 927bb5b..759f981 100644 --- a/src/shared/rewriters/html.ts +++ b/src/shared/rewriters/html.ts @@ -7,121 +7,121 @@ import { rewriteCss } from "./css"; import { rewriteJs } from "./js"; export function isScramjetFile(src: string) { - let bool = false; - ["codecs", "client", "shared", "worker", "config"].forEach((file) => { - if (src === self.$scramjet.config[file]) bool = true; - }); + let bool = false; + ["codecs", "client", "shared", "worker", "config"].forEach((file) => { + if (src === self.$scramjet.config[file]) bool = true; + }); - return bool; + return bool; } export function rewriteHtml(html: string, origin?: URL) { - const handler = new DomHandler((err, dom) => dom); - const parser = new Parser(handler); + const handler = new DomHandler((err, dom) => dom); + const parser = new Parser(handler); - parser.write(html); - parser.end(); + parser.write(html); + parser.end(); - return render(traverseParsedHtml(handler.root, origin)); + return render(traverseParsedHtml(handler.root, origin)); } // i need to add the attributes in during rewriting function traverseParsedHtml(node, origin?: URL) { - /* csp attributes */ - for (const cspAttr of ["nonce", "integrity", "csp"]) { - if (hasAttrib(node, cspAttr)) { - node.attribs[`data-${cspAttr}`] = node.attribs[cspAttr]; - delete node.attribs[cspAttr]; - } - } + /* csp attributes */ + for (const cspAttr of ["nonce", "integrity", "csp"]) { + if (hasAttrib(node, cspAttr)) { + node.attribs[`data-${cspAttr}`] = node.attribs[cspAttr]; + delete node.attribs[cspAttr]; + } + } - /* url attributes */ - for (const urlAttr of ["src", "href", "action", "formaction"]) { - if (hasAttrib(node, urlAttr) && !isScramjetFile(node.attribs[urlAttr])) { - const value = node.attribs[urlAttr]; - node.attribs[`data-${urlAttr}`] = value; - node.attribs[urlAttr] = encodeUrl(value, origin); - } - } + /* url attributes */ + for (const urlAttr of ["src", "href", "action", "formaction"]) { + if (hasAttrib(node, urlAttr) && !isScramjetFile(node.attribs[urlAttr])) { + const value = node.attribs[urlAttr]; + node.attribs[`data-${urlAttr}`] = value; + node.attribs[urlAttr] = encodeUrl(value, origin); + } + } - /* other */ - for (const srcsetAttr of ["srcset", "imagesrcset"]) { - if (hasAttrib(node, srcsetAttr)) { - const value = node.attribs[srcsetAttr]; - node.attribs[`data-${srcsetAttr}`] = value; - node.attribs[srcsetAttr] = rewriteSrcset(value, origin); - } - } + /* other */ + for (const srcsetAttr of ["srcset", "imagesrcset"]) { + if (hasAttrib(node, srcsetAttr)) { + const value = node.attribs[srcsetAttr]; + node.attribs[`data-${srcsetAttr}`] = value; + node.attribs[srcsetAttr] = rewriteSrcset(value, origin); + } + } - if (hasAttrib(node, "srcdoc")) - node.attribs.srcdoc = rewriteHtml(node.attribs.srcdoc, origin); - if (hasAttrib(node, "style")) - node.attribs.style = rewriteCss(node.attribs.style, origin); + if (hasAttrib(node, "srcdoc")) + node.attribs.srcdoc = rewriteHtml(node.attribs.srcdoc, origin); + if (hasAttrib(node, "style")) + node.attribs.style = rewriteCss(node.attribs.style, origin); - if (node.name === "style" && node.children[0] !== undefined) - node.children[0].data = rewriteCss(node.children[0].data, origin); - if ( - node.name === "script" && - /(application|text)\/javascript|importmap|undefined/.test( - node.attribs.type - ) && - node.children[0] !== undefined - ) { - let js = node.children[0].data - const htmlcomment = //g; - js = js.replace(htmlcomment, ""); - node.children[0].data = rewriteJs(js, origin); - } - if (node.name === "meta" && hasAttrib(node, "http-equiv")) { - if (node.attribs["http-equiv"] === "content-security-policy") { - node = {}; - } else if ( - node.attribs["http-equiv"] === "refresh" && - node.attribs.content.includes("url") - ) { - const contentArray = node.attribs.content.split("url="); - contentArray[1] = encodeUrl(contentArray[1].trim(), origin); - node.attribs.content = contentArray.join("url="); - } - } + if (node.name === "style" && node.children[0] !== undefined) + node.children[0].data = rewriteCss(node.children[0].data, origin); + if ( + node.name === "script" && + /(application|text)\/javascript|importmap|undefined/.test( + node.attribs.type, + ) && + node.children[0] !== undefined + ) { + let js = node.children[0].data; + const htmlcomment = //g; + js = js.replace(htmlcomment, ""); + node.children[0].data = rewriteJs(js, origin); + } + if (node.name === "meta" && hasAttrib(node, "http-equiv")) { + if (node.attribs["http-equiv"] === "content-security-policy") { + node = {}; + } else if ( + node.attribs["http-equiv"] === "refresh" && + node.attribs.content.includes("url") + ) { + const contentArray = node.attribs.content.split("url="); + contentArray[1] = encodeUrl(contentArray[1].trim(), origin); + node.attribs.content = contentArray.join("url="); + } + } - if (node.name === "head") { - const scramjetScripts = []; - ["codecs", "config", "shared", "client"].forEach((script) => { - scramjetScripts.push( - new Element("script", { - src: self.$scramjet.config[script], - "data-scramjet": "", - }) - ); - }); + if (node.name === "head") { + const scramjetScripts = []; + ["codecs", "config", "shared", "client"].forEach((script) => { + scramjetScripts.push( + new Element("script", { + src: self.$scramjet.config[script], + "data-scramjet": "", + }), + ); + }); - node.children.unshift(...scramjetScripts); - } + node.children.unshift(...scramjetScripts); + } - if (node.childNodes) { - for (const childNode in node.childNodes) { - node.childNodes[childNode] = traverseParsedHtml( - node.childNodes[childNode], - origin - ); - } - } + if (node.childNodes) { + for (const childNode in node.childNodes) { + node.childNodes[childNode] = traverseParsedHtml( + node.childNodes[childNode], + origin, + ); + } + } - return node; + return node; } export function rewriteSrcset(srcset: string, origin?: URL) { - const urls = srcset.split(/ [0-9]+x,? ?/g); - if (!urls) return ""; - const sufixes = srcset.match(/ [0-9]+x,? ?/g); - if (!sufixes) return ""; - const rewrittenUrls = urls.map((url, i) => { - if (url && sufixes[i]) { - return encodeUrl(url, origin) + sufixes[i]; - } - }); + const urls = srcset.split(/ [0-9]+x,? ?/g); + if (!urls) return ""; + const sufixes = srcset.match(/ [0-9]+x,? ?/g); + if (!sufixes) return ""; + const rewrittenUrls = urls.map((url, i) => { + if (url && sufixes[i]) { + return encodeUrl(url, origin) + sufixes[i]; + } + }); - return rewrittenUrls.join(""); + return rewrittenUrls.join(""); } diff --git a/src/shared/rewriters/js.ts b/src/shared/rewriters/js.ts index 5fb9b5f..425e844 100644 --- a/src/shared/rewriters/js.ts +++ b/src/shared/rewriters/js.ts @@ -17,91 +17,91 @@ import * as ESTree from "estree"; // parent export function rewriteJs(js: string, origin?: URL) { - try { - const ast = parseModule(js, { - module: true, - webcompat: true, - }); + try { + const ast = parseModule(js, { + module: true, + webcompat: true, + }); - const identifierList = [ - "window", - "self", - "globalThis", - "this", - "parent", - "top", - "location", - ]; + const identifierList = [ + "window", + "self", + "globalThis", + "this", + "parent", + "top", + "location", + ]; - const customTraveler = makeTraveler({ - ImportDeclaration: (node: ESTree.ImportDeclaration) => { - node.source.value = encodeUrl(node.source.value as string, origin); - }, + const customTraveler = makeTraveler({ + ImportDeclaration: (node: ESTree.ImportDeclaration) => { + node.source.value = encodeUrl(node.source.value as string, origin); + }, - ImportExpression: (node: ESTree.ImportExpression) => { - if (node.source.type === "Literal") { - node.source.value = encodeUrl(node.source.value as string, origin); - } else if (node.source.type === "Identifier") { - // this is for things that import something like - // const moduleName = "name"; - // await import(moduleName); - node.source.name = `__wrapImport(${node.source.name})`; - } - }, + ImportExpression: (node: ESTree.ImportExpression) => { + if (node.source.type === "Literal") { + node.source.value = encodeUrl(node.source.value as string, origin); + } else if (node.source.type === "Identifier") { + // this is for things that import something like + // const moduleName = "name"; + // await import(moduleName); + node.source.name = `__wrapImport(${node.source.name})`; + } + }, - ExportAllDeclaration: (node: ESTree.ExportAllDeclaration) => { - node.source.value = encodeUrl(node.source.value as string, origin); - }, + ExportAllDeclaration: (node: ESTree.ExportAllDeclaration) => { + node.source.value = encodeUrl(node.source.value as string, origin); + }, - ExportNamedDeclaration: (node: ESTree.ExportNamedDeclaration) => { - // strings are Literals in ESTree syntax but these will always be strings - if (node.source) - node.source.value = encodeUrl(node.source.value as string, origin); - }, + ExportNamedDeclaration: (node: ESTree.ExportNamedDeclaration) => { + // strings are Literals in ESTree syntax but these will always be strings + if (node.source) + node.source.value = encodeUrl(node.source.value as string, origin); + }, - MemberExpression: (node: ESTree.MemberExpression) => { - if ( - node.object.type === "Identifier" && - identifierList.includes(node.object.name) - ) { - node.object.name = `globalThis.$s(${node.object.name})`; - } - }, + MemberExpression: (node: ESTree.MemberExpression) => { + if ( + node.object.type === "Identifier" && + identifierList.includes(node.object.name) + ) { + node.object.name = `globalThis.$s(${node.object.name})`; + } + }, - AssignmentExpression: (node: ESTree.AssignmentExpression) => { - if ( - node.left.type === "Identifier" && - identifierList.includes(node.left.name) - ) { - node.left.name = `globalThis.$s(${node.left.name})`; - } + AssignmentExpression: (node: ESTree.AssignmentExpression) => { + if ( + node.left.type === "Identifier" && + identifierList.includes(node.left.name) + ) { + node.left.name = `globalThis.$s(${node.left.name})`; + } - if ( - node.right.type === "Identifier" && - identifierList.includes(node.right.name) - ) { - node.right.name = `globalThis.$s(${node.right.name})`; - } - }, + if ( + node.right.type === "Identifier" && + identifierList.includes(node.right.name) + ) { + node.right.name = `globalThis.$s(${node.right.name})`; + } + }, - VariableDeclarator: (node: ESTree.VariableDeclarator) => { - if ( - node.init && - node.init.type === "Identifier" && - identifierList.includes(node.init.name) - ) { - node.init.name = `globalThis.$s(${node.init.name})`; - } - }, - }); + VariableDeclarator: (node: ESTree.VariableDeclarator) => { + if ( + node.init && + node.init.type === "Identifier" && + identifierList.includes(node.init.name) + ) { + node.init.name = `globalThis.$s(${node.init.name})`; + } + }, + }); - customTraveler.go(ast); + customTraveler.go(ast); - return generate(ast); - } catch (e) { - console.error(e); - console.log(js); + return generate(ast); + } catch (e) { + console.error(e); + console.log(js); - return js; - } + return js; + } } diff --git a/src/shared/rewriters/url.ts b/src/shared/rewriters/url.ts index fa41a56..b309af7 100644 --- a/src/shared/rewriters/url.ts +++ b/src/shared/rewriters/url.ts @@ -2,60 +2,60 @@ import { URL } from "../../client/url"; import { rewriteJs } from "./js"; function canParseUrl(url: string, origin?: URL) { - try { - new URL(url, origin); + try { + new URL(url, origin); - return true; - } catch { - return false; - } + return true; + } catch { + return false; + } } // something is broken with this but i didn't debug it export function encodeUrl(url: string | URL, origin?: URL) { - if (url instanceof URL) { - return url.toString(); - } + if (url instanceof URL) { + return url.toString(); + } - if (!origin) { - origin = new URL( - self.$scramjet.config.codec.decode( - location.href.slice( - (location.origin + self.$scramjet.config.prefix).length - ) - ) - ); - } + if (!origin) { + origin = new URL( + self.$scramjet.config.codec.decode( + location.href.slice( + (location.origin + self.$scramjet.config.prefix).length, + ), + ), + ); + } - // is this the correct behavior? - if (!url) url = origin.href; + // is this the correct behavior? + if (!url) url = origin.href; - if (url.startsWith("javascript:")) { - return "javascript:" + rewriteJs(url.slice("javascript:".length)); - } else if (/^(#|mailto|about|data)/.test(url)) { - return url; - } else if (canParseUrl(url, origin)) { - return ( - location.origin + - self.$scramjet.config.prefix + - self.$scramjet.config.codec.encode(new URL(url, origin).href) - ); - } + if (url.startsWith("javascript:")) { + return "javascript:" + rewriteJs(url.slice("javascript:".length)); + } else if (/^(#|mailto|about|data)/.test(url)) { + return url; + } else if (canParseUrl(url, origin)) { + return ( + location.origin + + self.$scramjet.config.prefix + + self.$scramjet.config.codec.encode(new URL(url, origin).href) + ); + } } // something is also broken with this but i didn't debug it export function decodeUrl(url: string | URL) { - if (url instanceof URL) { - return url.toString(); - } + if (url instanceof URL) { + return url.toString(); + } - if (/^(#|about|data|mailto|javascript)/.test(url)) { - return url; - } else if (canParseUrl(url)) { - return self.$scramjet.config.codec.decode( - url.slice((location.origin + self.$scramjet.config.prefix).length) - ); - } else { - return url; - } + if (/^(#|about|data|mailto|javascript)/.test(url)) { + return url; + } else if (canParseUrl(url)) { + return self.$scramjet.config.codec.decode( + url.slice((location.origin + self.$scramjet.config.prefix).length), + ); + } else { + return url; + } } diff --git a/src/shared/rewriters/worker.ts b/src/shared/rewriters/worker.ts index 5408763..f15b10f 100644 --- a/src/shared/rewriters/worker.ts +++ b/src/shared/rewriters/worker.ts @@ -1,12 +1,12 @@ import { rewriteJs } from "./js"; export function rewriteWorkers(js: string, origin?: URL) { - let str = new String().toString()[ - //@ts-expect-error - ("codecs", "config", "shared", "client") - ].forEach((script) => { - str += `import "${self.$scramjet.config[script]}"\n`; - }); - str += rewriteJs(js, origin); + let str = new String().toString()[ + //@ts-expect-error + ("codecs", "config", "shared", "client") + ].forEach((script) => { + str += `import "${self.$scramjet.config[script]}"\n`; + }); + str += rewriteJs(js, origin); - return str; + return str; } diff --git a/src/types.d.ts b/src/types.d.ts index 3b32a78..a6f8535 100644 --- a/src/types.d.ts +++ b/src/types.d.ts @@ -10,42 +10,42 @@ import { BareClient } from "@mercuryworkshop/bare-mux"; import { parseDomain } from "parse-domain"; declare global { - interface Window { - $scramjet: { - shared: { - url: { - encodeUrl: typeof encodeUrl; - decodeUrl: typeof decodeUrl; - }; - rewrite: { - rewriteCss: typeof rewriteCss; - rewriteHtml: typeof rewriteHtml; - rewriteSrcset: typeof rewriteSrcset; - rewriteJs: typeof rewriteJs; - rewriteHeaders: typeof rewriteHeaders; - rewriteWorkers: typeof rewriteWorkers; - }; - util: { - BareClient: typeof BareClient; - isScramjetFile: typeof isScramjetFile; - parseDomain: typeof parseDomain; - }; - }; - config: { - prefix: string; - codec: Codec; - config: string; - shared: string; - worker: string; - client: string; - codecs: string; - }; - codecs: { - none: Codec; - plain: Codec; - base64: Codec; - xor: Codec; - }; - }; - } + interface Window { + $scramjet: { + shared: { + url: { + encodeUrl: typeof encodeUrl; + decodeUrl: typeof decodeUrl; + }; + rewrite: { + rewriteCss: typeof rewriteCss; + rewriteHtml: typeof rewriteHtml; + rewriteSrcset: typeof rewriteSrcset; + rewriteJs: typeof rewriteJs; + rewriteHeaders: typeof rewriteHeaders; + rewriteWorkers: typeof rewriteWorkers; + }; + util: { + BareClient: typeof BareClient; + isScramjetFile: typeof isScramjetFile; + parseDomain: typeof parseDomain; + }; + }; + config: { + prefix: string; + codec: Codec; + config: string; + shared: string; + worker: string; + client: string; + codecs: string; + }; + codecs: { + none: Codec; + plain: Codec; + base64: Codec; + xor: Codec; + }; + }; + } } diff --git a/src/worker/index.ts b/src/worker/index.ts index 10bb0c2..5ee650f 100644 --- a/src/worker/index.ts +++ b/src/worker/index.ts @@ -4,208 +4,208 @@ import { ParseResultType } from "parse-domain"; import { parse } from "path"; declare global { - interface Window { - ScramjetServiceWorker; - } + interface Window { + ScramjetServiceWorker; + } } self.ScramjetServiceWorker = class ScramjetServiceWorker { - client: typeof self.$scramjet.shared.util.BareClient.prototype; - config: typeof self.$scramjet.config; + client: typeof self.$scramjet.shared.util.BareClient.prototype; + config: typeof self.$scramjet.config; - constructor(config = self.$scramjet.config) { - this.client = new self.$scramjet.shared.util.BareClient(); - if (!config.prefix) config.prefix = "/scramjet/"; - this.config = config; - } + constructor(config = self.$scramjet.config) { + this.client = new self.$scramjet.shared.util.BareClient(); + if (!config.prefix) config.prefix = "/scramjet/"; + this.config = config; + } - route({ request }: FetchEvent) { - if (request.url.startsWith(location.origin + this.config.prefix)) - return true; - else return false; - } + route({ request }: FetchEvent) { + if (request.url.startsWith(location.origin + this.config.prefix)) + return true; + else return false; + } - async fetch({ request }: FetchEvent) { - const urlParam = new URLSearchParams(new URL(request.url).search); - const { encodeUrl, decodeUrl } = self.$scramjet.shared.url; - const { - rewriteHeaders, - rewriteHtml, - rewriteJs, - rewriteCss, - rewriteWorkers, - } = self.$scramjet.shared.rewrite; - const { parseDomain } = self.$scramjet.shared.util; + async fetch({ request }: FetchEvent) { + const urlParam = new URLSearchParams(new URL(request.url).search); + const { encodeUrl, decodeUrl } = self.$scramjet.shared.url; + const { + rewriteHeaders, + rewriteHtml, + rewriteJs, + rewriteCss, + rewriteWorkers, + } = self.$scramjet.shared.rewrite; + const { parseDomain } = self.$scramjet.shared.util; - if (urlParam.has("url")) { - return Response.redirect( - encodeUrl(urlParam.get("url"), new URL(urlParam.get("url"))) - ); - } + if (urlParam.has("url")) { + return Response.redirect( + encodeUrl(urlParam.get("url"), new URL(urlParam.get("url"))), + ); + } - try { - const url = new URL(decodeUrl(request.url)); + try { + const url = new URL(decodeUrl(request.url)); - const cookieStore = new IDBMap(url.host, { - durability: "relaxed", - prefix: "Cookies", - }); + const cookieStore = new IDBMap(url.host, { + durability: "relaxed", + prefix: "Cookies", + }); - const response: BareResponseFetch = await this.client.fetch(url, { - method: request.method, - body: request.body, - headers: request.headers, - credentials: "omit", - mode: request.mode === "cors" ? request.mode : "same-origin", - cache: request.cache, - redirect: request.redirect, - //@ts-ignore why the fuck is this not typed mircosoft - duplex: "half", - }); + const response: BareResponseFetch = await this.client.fetch(url, { + method: request.method, + body: request.body, + headers: request.headers, + credentials: "omit", + mode: request.mode === "cors" ? request.mode : "same-origin", + cache: request.cache, + redirect: request.redirect, + //@ts-ignore why the fuck is this not typed mircosoft + duplex: "half", + }); - let responseBody; - const responseHeaders = rewriteHeaders(response.rawHeaders, url); + let responseBody; + const responseHeaders = rewriteHeaders(response.rawHeaders, url); - for (const cookie of (responseHeaders["set-cookie"] || []) as string[]) { - let cookieParsed = cookie.split(";").map((x) => x.trim().split("=")); + for (const cookie of (responseHeaders["set-cookie"] || []) as string[]) { + let cookieParsed = cookie.split(";").map((x) => x.trim().split("=")); - let [key, value] = cookieParsed.shift(); - value = value.replace('"', ""); + let [key, value] = cookieParsed.shift(); + value = value.replace('"', ""); - const hostArg = cookieParsed.find((x) => x[0] === "Domain"); - cookieParsed = cookieParsed.filter((x) => x[0] !== "Domain"); - let host = hostArg ? hostArg[1] : undefined; + const hostArg = cookieParsed.find((x) => x[0] === "Domain"); + cookieParsed = cookieParsed.filter((x) => x[0] !== "Domain"); + let host = hostArg ? hostArg[1] : undefined; - if (url.protocol === "http" && cookieParsed.includes(["Secure"])) - continue; - if ( - cookieParsed.includes(["SameSite", "None"]) && - !cookieParsed.includes(["Secure"]) - ) - continue; + if (url.protocol === "http" && cookieParsed.includes(["Secure"])) + continue; + if ( + cookieParsed.includes(["SameSite", "None"]) && + !cookieParsed.includes(["Secure"]) + ) + continue; - if (host && host !== url.host) { - if (host.startsWith(".")) host = host.slice(1); - const urlDomain = parseDomain(url.hostname); + if (host && host !== url.host) { + if (host.startsWith(".")) host = host.slice(1); + const urlDomain = parseDomain(url.hostname); - if (urlDomain.type === ParseResultType.Listed) { - const { subDomains: _, domain, topLevelDomains } = urlDomain; - if (!host.endsWith([domain, ...topLevelDomains].join("."))) - continue; - } else { - continue; - } + if (urlDomain.type === ParseResultType.Listed) { + const { subDomains: _, domain, topLevelDomains } = urlDomain; + if (!host.endsWith([domain, ...topLevelDomains].join("."))) + continue; + } else { + continue; + } - const realCookieStore = new IDBMap(host, { - durability: "relaxed", - prefix: "Cookies", - }); - realCookieStore.set(key, { - value: value, - args: cookieParsed, - subdomain: true, - }); - } else { - cookieStore.set(key, { - value: value, - args: cookieParsed, - subdomain: false, - }); - } - } + const realCookieStore = new IDBMap(host, { + durability: "relaxed", + prefix: "Cookies", + }); + realCookieStore.set(key, { + value: value, + args: cookieParsed, + subdomain: true, + }); + } else { + cookieStore.set(key, { + value: value, + args: cookieParsed, + subdomain: false, + }); + } + } - for (let header in responseHeaders) { - // flatten everything past here - if (responseHeaders[header] instanceof Array) - responseHeaders[header] = responseHeaders[header][0]; - } + for (let header in responseHeaders) { + // flatten everything past here + if (responseHeaders[header] instanceof Array) + responseHeaders[header] = responseHeaders[header][0]; + } - if (response.body) { - switch (request.destination) { - case "iframe": - case "document": - if ( - responseHeaders["content-type"] - ?.toString() - ?.startsWith("text/html") - ) { - responseBody = rewriteHtml(await response.text(), url); - } else { - responseBody = response.body; - } - break; - case "script": - responseBody = rewriteJs(await response.text(), url); - break; - case "style": - responseBody = rewriteCss(await response.text(), url); - break; - case "sharedworker": - case "worker": - responseBody = rewriteWorkers(await response.text(), url); - break; - default: - responseBody = response.body; - break; - } - } - // downloads - if (["document", "iframe"].includes(request.destination)) { - const header = responseHeaders["content-disposition"]; + if (response.body) { + switch (request.destination) { + case "iframe": + case "document": + if ( + responseHeaders["content-type"] + ?.toString() + ?.startsWith("text/html") + ) { + responseBody = rewriteHtml(await response.text(), url); + } else { + responseBody = response.body; + } + break; + case "script": + responseBody = rewriteJs(await response.text(), url); + break; + case "style": + responseBody = rewriteCss(await response.text(), url); + break; + case "sharedworker": + case "worker": + responseBody = rewriteWorkers(await response.text(), url); + break; + default: + responseBody = response.body; + break; + } + } + // downloads + if (["document", "iframe"].includes(request.destination)) { + const header = responseHeaders["content-disposition"]; - // validate header and test for filename - if (!/\s*?((inline|attachment);\s*?)filename=/i.test(header)) { - // if filename= wasn"t specified then maybe the remote specified to download this as an attachment? - // if it"s invalid then we can still possibly test for the attachment/inline type - const type = /^\s*?attachment/i.test(header) - ? "attachment" - : "inline"; + // validate header and test for filename + if (!/\s*?((inline|attachment);\s*?)filename=/i.test(header)) { + // if filename= wasn"t specified then maybe the remote specified to download this as an attachment? + // if it"s invalid then we can still possibly test for the attachment/inline type + const type = /^\s*?attachment/i.test(header) + ? "attachment" + : "inline"; - // set the filename - const [filename] = new URL(response.finalURL).pathname - .split("/") - .slice(-1); + // set the filename + const [filename] = new URL(response.finalURL).pathname + .split("/") + .slice(-1); - responseHeaders["content-disposition"] = - `${type}; filename=${JSON.stringify(filename)}`; - } - } - if (responseHeaders["accept"] === "text/event-stream") { - responseHeaders["content-type"] = "text/event-stream"; - } - if (crossOriginIsolated) { - responseHeaders["Cross-Origin-Embedder-Policy"] = "require-corp"; - } + responseHeaders["content-disposition"] = + `${type}; filename=${JSON.stringify(filename)}`; + } + } + if (responseHeaders["accept"] === "text/event-stream") { + responseHeaders["content-type"] = "text/event-stream"; + } + if (crossOriginIsolated) { + responseHeaders["Cross-Origin-Embedder-Policy"] = "require-corp"; + } - return new Response(responseBody, { - headers: responseHeaders as HeadersInit, - status: response.status, - statusText: response.statusText, - }); - } catch (err) { - if (!["document", "iframe"].includes(request.destination)) - return new Response(undefined, { status: 500 }); + return new Response(responseBody, { + headers: responseHeaders as HeadersInit, + status: response.status, + statusText: response.statusText, + }); + } catch (err) { + if (!["document", "iframe"].includes(request.destination)) + return new Response(undefined, { status: 500 }); - console.error(err); + console.error(err); - return renderError(err, decodeUrl(request.url)); - } - } + return renderError(err, decodeUrl(request.url)); + } + } }; function errorTemplate(trace: string, fetchedURL: string) { - // turn script into a data URI so we don"t have to escape any HTML values - const script = ` + // turn script into a data URI so we don"t have to escape any HTML values + const script = ` errorTrace.value = ${JSON.stringify(trace)}; fetchedURL.textContent = ${JSON.stringify(fetchedURL)}; for (const node of document.querySelectorAll("#hostname")) node.textContent = ${JSON.stringify( - location.hostname - )}; + location.hostname, + )}; reload.addEventListener("click", () => location.reload()); version.textContent = "0.0.1"; `; - return ` + return ` @@ -238,8 +238,8 @@ function errorTemplate(trace: string, fetchedURL: string) {

Scramjet v

+ "data:application/javascript," + encodeURIComponent(script) + }"> `; @@ -251,15 +251,15 @@ function errorTemplate(trace: string, fetchedURL: string) { * @param {string} fetchedURL */ function renderError(err, fetchedURL) { - const headers = { - "content-type": "text/html", - }; - if (crossOriginIsolated) { - headers["Cross-Origin-Embedder-Policy"] = "require-corp"; - } + const headers = { + "content-type": "text/html", + }; + if (crossOriginIsolated) { + headers["Cross-Origin-Embedder-Policy"] = "require-corp"; + } - return new Response(errorTemplate(String(err), fetchedURL), { - status: 500, - headers: headers, - }); + return new Response(errorTemplate(String(err), fetchedURL), { + status: 500, + headers: headers, + }); } diff --git a/static/index.html b/static/index.html index 1fa4908..a11cff7 100644 --- a/static/index.html +++ b/static/index.html @@ -1,39 +1,39 @@ - - - - Document - - - - - - - - - - - - + + + + Document + + + + + + + + + + + + diff --git a/static/sw.js b/static/sw.js index 22f6ea8..6d2b430 100644 --- a/static/sw.js +++ b/static/sw.js @@ -1,20 +1,20 @@ importScripts( - "/scram/scramjet.codecs.js", - "/scram/scramjet.config.js", - "/scram/scramjet.shared.js", - "/scram/scramjet.worker.js" + "/scram/scramjet.codecs.js", + "/scram/scramjet.config.js", + "/scram/scramjet.shared.js", + "/scram/scramjet.worker.js", ); const scramjet = new ScramjetServiceWorker(); async function handleRequest(event) { - if (scramjet.route(event)) { - return scramjet.fetch(event); - } + if (scramjet.route(event)) { + return scramjet.fetch(event); + } - return fetch(event.request); + return fetch(event.request); } self.addEventListener("fetch", (event) => { - event.respondWith(handleRequest(event)); + event.respondWith(handleRequest(event)); }); diff --git a/static/ui.js b/static/ui.js index c5ff001..958ff5c 100644 --- a/static/ui.js +++ b/static/ui.js @@ -1,33 +1,33 @@ navigator.serviceWorker - .register("./sw.js", { - scope: $scramjet.config.prefix, - }) - .then((reg) => { - reg.update(); - }); + .register("./sw.js", { + scope: $scramjet.config.prefix, + }) + .then((reg) => { + reg.update(); + }); const connection = new BareMux.BareMuxConnection("/baremux/worker.js"); const flex = css` - display: flex; + display: flex; `; const col = css` - flex-direction: column; + flex-direction: column; `; const store = $store( - { - url: "https://google.com", - wispurl: "wss://wisp.mercurywork.shop/", - bareurl: - (location.protocol === "https:" ? "https" : "http") + - "://" + - location.host + - "/bare/", - }, - { ident: "settings", backing: "localstorage", autosave: "auto" } + { + url: "https://google.com", + wispurl: "wss://wisp.mercurywork.shop/", + bareurl: + (location.protocol === "https:" ? "https" : "http") + + "://" + + location.host + + "/bare/", + }, + { ident: "settings", backing: "localstorage", autosave: "auto" }, ); connection.setTransport("/baremod/index.mjs", [store.bareurl]); function App() { - this.urlencoded = ""; - this.css = ` + this.urlencoded = ""; + this.css = ` width: 100%; height: 100%; color: #e0def4; @@ -86,7 +86,7 @@ function App() { } `; - return html` + return html`

Percury Unblocker

surf the unblocked and mostly buggy web

@@ -110,5 +110,5 @@ function App() { } window.addEventListener("load", () => { - document.body.appendChild(h(App)); + document.body.appendChild(h(App)); }); diff --git a/tests/location.html b/tests/location.html index 1dc72ca..68d94b7 100644 --- a/tests/location.html +++ b/tests/location.html @@ -1,7 +1,7 @@ diff --git a/tsconfig.json b/tsconfig.json index 90ac2e9..e9094b3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,10 +1,10 @@ { - "compilerOptions": { - // "allowJs": true, - "rootDir": "./src", - "target": "ES2022", - "moduleResolution": "Bundler", - "module": "ES2022" - }, - "include": ["src"] + "compilerOptions": { + // "allowJs": true, + "rootDir": "./src", + "target": "ES2022", + "moduleResolution": "Bundler", + "module": "ES2022" + }, + "include": ["src"] }