diff --git a/README.md b/README.md index 237d2d6..f70416f 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ Please report any issue you have with those (only for mainstream browsers) Also, use this if you plan to use b4k's archive. - [Install 4chanX (recommended)](https://www.4chan-x.net/builds/4chan-X.user.js) -- Install the correct WebExtension for your Browser ([Firefox](https://git.coom.tech/fuckjannies/lolipiss/raw/branch/%E4%B8%AD%E5%87%BA%E3%81%97/pngextraembedder-0.289.xpi) or Chrome-based (Down for "maintainance")) +- Install the correct WebExtension for your Browser ([Firefox](https://git.coom.tech/fuckjannies/lolipiss/raw/branch/%E4%B8%AD%E5%87%BA%E3%81%97/pngextraembedder-0.290.xpi) or Chrome-based (Down for "maintainance")) For FF users, the extension is signed so you can just drag and drop it on your about:addons tab. diff --git a/chrome/dist/main.js b/chrome/dist/main.js index e29ae9f..b5263ba 100644 --- a/chrome/dist/main.js +++ b/chrome/dist/main.js @@ -73,7 +73,7 @@ var define_BUILD_VERSION_default; var init_define_BUILD_VERSION = __esm({ ""() { - define_BUILD_VERSION_default = [0, 289]; + define_BUILD_VERSION_default = [0, 290]; } }); @@ -21243,7 +21243,9 @@ } readSync(length) { let value = 0; - const byte = this.buffers[0][this._offset >> 3]; + if (this._offset >> 3 > this.buffers[0].byteLength) { + throw "Out of data"; + } for (let i = length - 1; i >= 0; --i) { value = value * 2 + this.getBit(this._offset + i); } @@ -21306,7 +21308,6 @@ this.trans = new Uint16Array(288); } }; - var pathMap = /* @__PURE__ */ new Map(); var getPathTo = (tree, value) => { if (tree[0] === value) return "0"; @@ -21362,6 +21363,7 @@ this.dests = dests; this.to_hide = to_hide; this.hidden = hidden; + this.pathMap = /* @__PURE__ */ new Map(); this.dest = []; this.ltree = new Tree(); this.dtree = new Tree(); @@ -21547,22 +21549,12 @@ i--; return [i, bits_table[i], value - base_table[i]]; }; - var encode_symbol = (sym, tree) => { - let m; - if (m = pathMap.get(tree)) { - const v2 = m.get(sym); - if (v2) - return v2; - } else { - m = /* @__PURE__ */ new Map(); - pathMap.set(tree, m); - } + var encode_symbol = (sym, tree, pathMap) => { const code = getPathTo(tree, sym); const v = { length: code?.length, val: parseInt(code, 2) }; - m.set(sym, v); return v; }; var capacity = 0; @@ -21584,7 +21576,7 @@ let backoffset = tinf_read_bits(d, dist_bits[dist], dist_base[dist]); const offs2 = d.dest.length - backoffset; let match; - const skip = d.to_hide && d.to_hide instanceof BitstreamReader2 && d.to_hide.available == 0; + const skip = !d.to_hide || d.to_hide && d.to_hide instanceof BitstreamReader2 && d.to_hide.available == 0; if (!skip && (match = Buffer2.from(d.dest.slice(offs2, offs2 + length))).length == length) { let begin = d.dest.length - 32768; if (begin < 0) @@ -21622,7 +21614,7 @@ } } const [dsym, dlen, doff] = get_symbol(backoffset, dist_bits, dist_base); - const encdist = encode_symbol(dsym, d.rdtree); + const encdist = encode_symbol(dsym, d.rdtree, d.pathMap); d.hidden?.write(encdist.length, revbyte(encdist.val, encdist.length)); d.hidden?.write(dlen, doff); for (let i = offs2; i < offs2 + length; ++i) { @@ -32020,7 +32012,7 @@ const filenames = threads.reduce((a, b) => [...a, ...b.posts.filter((p) => p.ext).map((p) => p)], []).filter((p) => p.ext != ".webm" && p.ext != ".gif").map((p) => [p.resto || p.no, `https://i.4cdn.org/${boardname}/${p.tim}${p.ext}`, p.md5, p.filename + p.ext, p.no]); console.log(filenames); fireNotification("info", "Analyzing images..."); - const n = 7; + const n = 1; const processFile = (src, fn, hex) => { return Promise.all(processors.filter((e) => e.match(fn)).map(async (proc) => { if (proc.skip) { @@ -32254,7 +32246,7 @@ Use the WebExtension version of PEE if you want to use b4k!`); if (csettings5.notcata) return; } - const n = 7; + const n = 1; const range = ~~(posts.length / n) + 1; await Promise.all([...new Array(n + 1)].map(async (e, i) => { const postsslice = posts.slice(i * range, (i + 1) * range); diff --git a/chrome/manifest.json b/chrome/manifest.json index 39aa1de..62ec986 100644 --- a/chrome/manifest.json +++ b/chrome/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 3, "name": "PngExtraEmbedder", "description": "Discover embedded files on 4chan and archives!", - "version": "0.289", + "version": "0.290", "icons": { "64": "1449696017588.png" }, diff --git a/dist/main.js b/dist/main.js index 5a2ff3c..2c35d79 100644 --- a/dist/main.js +++ b/dist/main.js @@ -73,7 +73,7 @@ var define_BUILD_VERSION_default; var init_define_BUILD_VERSION = __esm({ ""() { - define_BUILD_VERSION_default = [0, 289]; + define_BUILD_VERSION_default = [0, 290]; } }); @@ -21078,7 +21078,9 @@ } readSync(length) { let value = 0; - const byte = this.buffers[0][this._offset >> 3]; + if (this._offset >> 3 > this.buffers[0].byteLength) { + throw "Out of data"; + } for (let i = length - 1; i >= 0; --i) { value = value * 2 + this.getBit(this._offset + i); } @@ -21141,7 +21143,6 @@ this.trans = new Uint16Array(288); } }; - var pathMap = /* @__PURE__ */ new Map(); var getPathTo = (tree, value) => { if (tree[0] === value) return "0"; @@ -21197,6 +21198,7 @@ this.dests = dests; this.to_hide = to_hide; this.hidden = hidden; + this.pathMap = /* @__PURE__ */ new Map(); this.dest = []; this.ltree = new Tree(); this.dtree = new Tree(); @@ -21382,22 +21384,12 @@ i--; return [i, bits_table[i], value - base_table[i]]; }; - var encode_symbol = (sym, tree) => { - let m; - if (m = pathMap.get(tree)) { - const v2 = m.get(sym); - if (v2) - return v2; - } else { - m = /* @__PURE__ */ new Map(); - pathMap.set(tree, m); - } + var encode_symbol = (sym, tree, pathMap) => { const code = getPathTo(tree, sym); const v = { length: code?.length, val: parseInt(code, 2) }; - m.set(sym, v); return v; }; var capacity = 0; @@ -21419,7 +21411,7 @@ let backoffset = tinf_read_bits(d, dist_bits[dist], dist_base[dist]); const offs2 = d.dest.length - backoffset; let match; - const skip = d.to_hide && d.to_hide instanceof BitstreamReader2 && d.to_hide.available == 0; + const skip = !d.to_hide || d.to_hide && d.to_hide instanceof BitstreamReader2 && d.to_hide.available == 0; if (!skip && (match = Buffer2.from(d.dest.slice(offs2, offs2 + length))).length == length) { let begin = d.dest.length - 32768; if (begin < 0) @@ -21457,7 +21449,7 @@ } } const [dsym, dlen, doff] = get_symbol(backoffset, dist_bits, dist_base); - const encdist = encode_symbol(dsym, d.rdtree); + const encdist = encode_symbol(dsym, d.rdtree, d.pathMap); d.hidden?.write(encdist.length, revbyte(encdist.val, encdist.length)); d.hidden?.write(dlen, doff); for (let i = offs2; i < offs2 + length; ++i) { @@ -31855,7 +31847,7 @@ const filenames = threads.reduce((a, b) => [...a, ...b.posts.filter((p) => p.ext).map((p) => p)], []).filter((p) => p.ext != ".webm" && p.ext != ".gif").map((p) => [p.resto || p.no, `https://i.4cdn.org/${boardname}/${p.tim}${p.ext}`, p.md5, p.filename + p.ext, p.no]); console.log(filenames); fireNotification("info", "Analyzing images..."); - const n = 7; + const n = 1; const processFile = (src, fn, hex) => { return Promise.all(processors.filter((e) => e.match(fn)).map(async (proc) => { if (proc.skip) { @@ -32089,7 +32081,7 @@ Use the WebExtension version of PEE if you want to use b4k!`); if (csettings5.notcata) return; } - const n = 7; + const n = 1; const range = ~~(posts.length / n) + 1; await Promise.all([...new Array(n + 1)].map(async (e, i) => { const postsslice = posts.slice(i * range, (i + 1) * range); diff --git a/efdb47d2f0e04144bbaa-0.290.xpi b/efdb47d2f0e04144bbaa-0.290.xpi new file mode 100644 index 0000000..683d76c Binary files /dev/null and b/efdb47d2f0e04144bbaa-0.290.xpi differ diff --git a/firefox/dist/main.js b/firefox/dist/main.js index cf778eb..f7ed854 100644 --- a/firefox/dist/main.js +++ b/firefox/dist/main.js @@ -73,7 +73,7 @@ var define_BUILD_VERSION_default; var init_define_BUILD_VERSION = __esm({ ""() { - define_BUILD_VERSION_default = [0, 289]; + define_BUILD_VERSION_default = [0, 290]; } }); @@ -21220,7 +21220,9 @@ } readSync(length) { let value = 0; - const byte = this.buffers[0][this._offset >> 3]; + if (this._offset >> 3 > this.buffers[0].byteLength) { + throw "Out of data"; + } for (let i = length - 1; i >= 0; --i) { value = value * 2 + this.getBit(this._offset + i); } @@ -21283,7 +21285,6 @@ this.trans = new Uint16Array(288); } }; - var pathMap = /* @__PURE__ */ new Map(); var getPathTo = (tree, value) => { if (tree[0] === value) return "0"; @@ -21339,6 +21340,7 @@ this.dests = dests; this.to_hide = to_hide; this.hidden = hidden; + this.pathMap = /* @__PURE__ */ new Map(); this.dest = []; this.ltree = new Tree(); this.dtree = new Tree(); @@ -21524,22 +21526,12 @@ i--; return [i, bits_table[i], value - base_table[i]]; }; - var encode_symbol = (sym, tree) => { - let m; - if (m = pathMap.get(tree)) { - const v2 = m.get(sym); - if (v2) - return v2; - } else { - m = /* @__PURE__ */ new Map(); - pathMap.set(tree, m); - } + var encode_symbol = (sym, tree, pathMap) => { const code = getPathTo(tree, sym); const v = { length: code?.length, val: parseInt(code, 2) }; - m.set(sym, v); return v; }; var capacity = 0; @@ -21561,7 +21553,7 @@ let backoffset = tinf_read_bits(d, dist_bits[dist], dist_base[dist]); const offs2 = d.dest.length - backoffset; let match; - const skip = d.to_hide && d.to_hide instanceof BitstreamReader2 && d.to_hide.available == 0; + const skip = !d.to_hide || d.to_hide && d.to_hide instanceof BitstreamReader2 && d.to_hide.available == 0; if (!skip && (match = Buffer2.from(d.dest.slice(offs2, offs2 + length))).length == length) { let begin = d.dest.length - 32768; if (begin < 0) @@ -21599,7 +21591,7 @@ } } const [dsym, dlen, doff] = get_symbol(backoffset, dist_bits, dist_base); - const encdist = encode_symbol(dsym, d.rdtree); + const encdist = encode_symbol(dsym, d.rdtree, d.pathMap); d.hidden?.write(encdist.length, revbyte(encdist.val, encdist.length)); d.hidden?.write(dlen, doff); for (let i = offs2; i < offs2 + length; ++i) { @@ -31997,7 +31989,7 @@ const filenames = threads.reduce((a, b) => [...a, ...b.posts.filter((p) => p.ext).map((p) => p)], []).filter((p) => p.ext != ".webm" && p.ext != ".gif").map((p) => [p.resto || p.no, `https://i.4cdn.org/${boardname}/${p.tim}${p.ext}`, p.md5, p.filename + p.ext, p.no]); console.log(filenames); fireNotification("info", "Analyzing images..."); - const n = 7; + const n = 1; const processFile = (src, fn, hex) => { return Promise.all(processors.filter((e) => e.match(fn)).map(async (proc) => { if (proc.skip) { @@ -32231,7 +32223,7 @@ Use the WebExtension version of PEE if you want to use b4k!`); if (csettings5.notcata) return; } - const n = 7; + const n = 1; const range = ~~(posts.length / n) + 1; await Promise.all([...new Array(n + 1)].map(async (e, i) => { const postsslice = posts.slice(i * range, (i + 1) * range); diff --git a/firefox/manifest.json b/firefox/manifest.json index 532d415..b93db43 100644 --- a/firefox/manifest.json +++ b/firefox/manifest.json @@ -7,7 +7,7 @@ }, "name": "PngExtraEmbedder", "description": "Discover embedded files on 4chan and archives!", - "version": "0.289", + "version": "0.290", "icons": { "64": "1449696017588.png" }, diff --git a/firefox_update.json b/firefox_update.json index 8eeeea9..06d0a73 100644 --- a/firefox_update.json +++ b/firefox_update.json @@ -1 +1 @@ -{"addons":{"{34ac4994-07f2-44d2-8599-682516a6c6a6}":{"updates":[{"version":"0.289","update_link":"https://git.coom.tech/fuckjannies/lolipiss/raw/branch/%E4%B8%AD%E5%87%BA%E3%81%97/pngextraembedder-0.289.xpi"}]}}} \ No newline at end of file +{"addons":{"{34ac4994-07f2-44d2-8599-682516a6c6a6}":{"updates":[{"version":"0.290","update_link":"https://git.coom.tech/fuckjannies/lolipiss/raw/branch/%E4%B8%AD%E5%87%BA%E3%81%97/pngextraembedder-0.290.xpi"}]}}} \ No newline at end of file diff --git a/main.meta.js b/main.meta.js index 685c768..dd6b6d2 100644 --- a/main.meta.js +++ b/main.meta.js @@ -1,7 +1,7 @@ // ==UserScript== // @name PNGExtraEmbed // @namespace https://coom.tech/ -// @version 0.289 +// @version 0.290 // @description uhh // @author You // @match https://boards.4channel.org/* diff --git a/main.user.js b/main.user.js index 13e4e60..1feefa9 100644 --- a/main.user.js +++ b/main.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @name PNGExtraEmbed // @namespace https://coom.tech/ -// @version 0.289 +// @version 0.290 // @description uhh // @author You // @match https://boards.4channel.org/* @@ -109,7 +109,7 @@ const _DOMParser = DOMParser; var define_BUILD_VERSION_default; var init_define_BUILD_VERSION = __esm({ ""() { - define_BUILD_VERSION_default = [0, 289]; + define_BUILD_VERSION_default = [0, 290]; } }); @@ -21114,7 +21114,9 @@ const _DOMParser = DOMParser; } readSync(length) { let value = 0; - const byte = this.buffers[0][this._offset >> 3]; + if (this._offset >> 3 > this.buffers[0].byteLength) { + throw "Out of data"; + } for (let i = length - 1; i >= 0; --i) { value = value * 2 + this.getBit(this._offset + i); } @@ -21177,7 +21179,6 @@ const _DOMParser = DOMParser; this.trans = new Uint16Array(288); } }; - var pathMap = /* @__PURE__ */ new Map(); var getPathTo = (tree, value) => { if (tree[0] === value) return "0"; @@ -21233,6 +21234,7 @@ const _DOMParser = DOMParser; this.dests = dests; this.to_hide = to_hide; this.hidden = hidden; + this.pathMap = /* @__PURE__ */ new Map(); this.dest = []; this.ltree = new Tree(); this.dtree = new Tree(); @@ -21418,22 +21420,12 @@ const _DOMParser = DOMParser; i--; return [i, bits_table[i], value - base_table[i]]; }; - var encode_symbol = (sym, tree) => { - let m; - if (m = pathMap.get(tree)) { - const v2 = m.get(sym); - if (v2) - return v2; - } else { - m = /* @__PURE__ */ new Map(); - pathMap.set(tree, m); - } + var encode_symbol = (sym, tree, pathMap) => { const code = getPathTo(tree, sym); const v = { length: code?.length, val: parseInt(code, 2) }; - m.set(sym, v); return v; }; var capacity = 0; @@ -21455,7 +21447,7 @@ const _DOMParser = DOMParser; let backoffset = tinf_read_bits(d, dist_bits[dist], dist_base[dist]); const offs2 = d.dest.length - backoffset; let match; - const skip = d.to_hide && d.to_hide instanceof BitstreamReader2 && d.to_hide.available == 0; + const skip = !d.to_hide || d.to_hide && d.to_hide instanceof BitstreamReader2 && d.to_hide.available == 0; if (!skip && (match = Buffer2.from(d.dest.slice(offs2, offs2 + length))).length == length) { let begin = d.dest.length - 32768; if (begin < 0) @@ -21493,7 +21485,7 @@ const _DOMParser = DOMParser; } } const [dsym, dlen, doff] = get_symbol(backoffset, dist_bits, dist_base); - const encdist = encode_symbol(dsym, d.rdtree); + const encdist = encode_symbol(dsym, d.rdtree, d.pathMap); d.hidden?.write(encdist.length, revbyte(encdist.val, encdist.length)); d.hidden?.write(dlen, doff); for (let i = offs2; i < offs2 + length; ++i) { @@ -31891,7 +31883,7 @@ const _DOMParser = DOMParser; const filenames = threads.reduce((a, b) => [...a, ...b.posts.filter((p) => p.ext).map((p) => p)], []).filter((p) => p.ext != ".webm" && p.ext != ".gif").map((p) => [p.resto || p.no, `https://i.4cdn.org/${boardname}/${p.tim}${p.ext}`, p.md5, p.filename + p.ext, p.no]); console.log(filenames); fireNotification("info", "Analyzing images..."); - const n = 7; + const n = 1; const processFile = (src, fn, hex) => { return Promise.all(processors.filter((e) => e.match(fn)).map(async (proc) => { if (proc.skip) { @@ -32125,7 +32117,7 @@ Use the WebExtension version of PEE if you want to use b4k!`); if (csettings5.notcata) return; } - const n = 7; + const n = 1; const range = ~~(posts.length / n) + 1; await Promise.all([...new Array(n + 1)].map(async (e, i) => { const postsslice = posts.slice(i * range, (i + 1) * range); diff --git a/pngextraembedder-0.290.xpi b/pngextraembedder-0.290.xpi new file mode 100644 index 0000000..683d76c Binary files /dev/null and b/pngextraembedder-0.290.xpi differ diff --git a/src/bitstream.ts b/src/bitstream.ts index 7ac3af1..d9a60f7 100644 --- a/src/bitstream.ts +++ b/src/bitstream.ts @@ -14,7 +14,7 @@ export const revbyte = (n: number, len = 8) => { }; export class BitstreamReader { - private buffers: any[] = []; + private buffers: Uint8Array[] = []; private bufferedLength = 0; @@ -64,7 +64,10 @@ export class BitstreamReader { readSync(length: number): number { let value = 0; //console.log(this.buffers[0]) - const byte = this.buffers[0][this._offset >> 3]; + if (this._offset >> 3 > this.buffers[0].byteLength) { + throw "Out of data"; + } + //const byte = this.buffers[0][this._offset >> 3]; for (let i = length - 1; i >= 0; --i) { value = value * 2 + this.getBit(this._offset + i); } diff --git a/src/dh-deflate.ts b/src/dh-deflate.ts index e0721bf..f34bc99 100644 --- a/src/dh-deflate.ts +++ b/src/dh-deflate.ts @@ -13,10 +13,6 @@ type HCtree = [number | HCtree, (number | HCtree)?]; // these two functions are a big bottleneck because im not clever enough to figure out how to encode // something directly by using the sorted code length/value tables, haha -const pathMap = new Map>(); const getPathTo = (tree: HCtree, value: number): string | undefined => { if (tree[0] === value) @@ -75,6 +71,11 @@ function buildHuffmanTable(codeLengths: ArrayLike, values: ArrayLike>(); + computeReverse() { this.rltree = buildHuffmanTable(this.ltree.table, this.ltree.trans)[0]! as any; // unneeded, but maybe sometime i'll throw symbol reduction into the mix this.rdtree = buildHuffmanTable(this.dtree.table, this.dtree.trans)[0]! as any; @@ -352,15 +353,15 @@ const get_symbol = (value: number, bits_table: Uint8Array, base_table: Uint16Arr return [i, bits_table[i], value - base_table[i]]; }; -const encode_symbol = (sym: number, tree: HCtree) => { - let m: Map | undefined; +const encode_symbol = (sym: number, tree: HCtree, pathMap: Map>) => { + /*let m: Map | undefined; if ((m = pathMap.get(tree))) { const v = m.get(sym); if (v) return v; } else { m = new Map; pathMap.set(tree, m); - } + }*/ const code = getPathTo(tree, sym)!; @@ -368,7 +369,7 @@ const encode_symbol = (sym: number, tree: HCtree) => { length: code?.length, val: parseInt(code, 2) }; - m.set(sym, v); + //m.set(sym, v); return v; }; /* ----------------------------- * @@ -386,7 +387,7 @@ function tinf_inflate_block_data(d: Data, lt: Tree, dt: Tree) { if (sym === 256) { return TINF_OK; } - + if (sym < 256) { d.dest.push(sym); // same @@ -412,7 +413,7 @@ function tinf_inflate_block_data(d: Data, lt: Tree, dt: Tree) { let match: Buffer; // don't consider matches that could be in the lookahead buffer - const skip = d.to_hide && d.to_hide instanceof BitstreamReader && d.to_hide.available == 0; + const skip = !d.to_hide || (d.to_hide && d.to_hide instanceof BitstreamReader && d.to_hide.available == 0); if (!skip && (match = Buffer.from(d.dest.slice(offs, offs + length))).length == length) { let begin = d.dest.length - 32768; if (begin < 0) @@ -460,7 +461,7 @@ function tinf_inflate_block_data(d: Data, lt: Tree, dt: Tree) { //d.hidden.write(enclen.length, enclen.val); //d.hidden.write(llen, loff); const [dsym, dlen, doff] = get_symbol(backoffset, dist_bits, dist_base); - const encdist = encode_symbol(dsym, d.rdtree); + const encdist = encode_symbol(dsym, d.rdtree, d.pathMap); d.hidden?.write(encdist.length, revbyte(encdist.val, encdist.length)); d.hidden?.write(dlen, doff); diff --git a/src/main.ts b/src/main.ts index eb164ec..e2aa96f 100644 --- a/src/main.ts +++ b/src/main.ts @@ -109,7 +109,7 @@ const processImage = async (srcs: AsyncGenerator, fn: string try { const n = await srcs.next(); if (n.done) - return; // no more links to try + return; // no more links to try const iter = streamRemote(n.value); if (!iter) return; @@ -304,7 +304,7 @@ const scrapeBoard = async (self: HTMLButtonElement) => { console.log(filenames); fireNotification("info", "Analyzing images..."); - const n = 7; + const n = 1; //console.log(posts); const processFile = (src: string, fn: string, hex: string) => { return Promise.all(processors.filter(e => e.match(fn)).map(async proc => { @@ -612,7 +612,7 @@ const startup = async (is4chanX = true) => { return; } - const n = 7; + const n = 1; //console.log(posts); const range = ~~(posts.length / n) + 1; await Promise.all([...new Array(n + 1)].map(async (e, i) => {