diff --git a/.gitignore b/.gitignore index 3a963ae..8269eae 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,13 @@ rev/index.html rev/out.png 1641737123922.png 1449696017588-128.png +a.js +a.py +aa +aa.json +bu.json +efdb47d2f0e04144bbaa-0.235.xpi +efdb47d2f0e04144bbaa-0.245.xpi +build-test.js +dist/test.js +src/pngv4.ts diff --git a/README.md b/README.md index b1110a2..8169c79 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/coomdev/PEE/raw/branch/%E4%B8%AD%E5%87%BA%E3%81%97/pngextraembedder-0.249.xpi) or [Chrome-based](https://chrome.google.com/webstore/detail/pngextraembedder/bfhpobiikighljcapcfmfganodihbicj)) +- Install the correct WebExtension for your Browser ([Firefox](https://git.coom.tech/coomdev/PEE/raw/branch/%E4%B8%AD%E5%87%BA%E3%81%97/pngextraembedder-0.250.xpi) or [Chrome-based](https://chrome.google.com/webstore/detail/pngextraembedder/bfhpobiikighljcapcfmfganodihbicj)) 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 f095af7..300b3d7 100644 --- a/chrome/dist/main.js +++ b/chrome/dist/main.js @@ -51,7 +51,7 @@ var define_BUILD_VERSION_default; var init_define_BUILD_VERSION = __esm({ ""() { - define_BUILD_VERSION_default = [0, 249]; + define_BUILD_VERSION_default = [0, 250]; } }); @@ -16617,6 +16617,7 @@ var CUM3 = import_buffer3.Buffer.from("doo\0m"); var CUM4 = import_buffer3.Buffer.from("voo\0m"); var CUM5 = import_buffer3.Buffer.from("boo\0"); + var CUM6 = import_buffer3.Buffer.from("Creation Time\0"); var BufferReadStream = (b) => { const ret = new ReadableStream({ pull(cont) { @@ -16675,6 +16676,14 @@ const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); ret.push(...k.filter((e) => e).map((e) => e)); } + if (buff.slice(4, 4 + CUM6.length).equals(CUM6)) { + const passed = buff.slice(4 + CUM6.length); + const decoded = import_buffer3.Buffer.from(passed.toString(), "base64").toString().split(" ").map((e) => { + return `https://${rprefs[e[0]]}/${e.slice(1)}`; + }).join(" "); + const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); + ret.push(...k.filter((e) => e).map((e) => e)); + } break; case "IDAT": case "IEND": @@ -16714,7 +16723,7 @@ break; if (!magic3 && name == "IDAT") { const passed = import_buffer3.Buffer.from(injb); - await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM5, passed])), () => Promise.resolve(0), 0]); + await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM6, passed])), () => Promise.resolve(0), 0]); magic3 = true; } await encoder.insertchunk([name, chunk, crc, offset]); @@ -16755,6 +16764,10 @@ return true; if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) return true; + if (buff.slice(4, 4 + CUM6.length).equals(CUM6)) { + const passed = buff.slice(4 + CUM6.length).toString(); + return !!passed.match(/[0-9a-zA-Z+/]+/g); + } break; case "IDAT": case "IEND": @@ -16973,7 +16986,7 @@ }; var extract3 = extractBuff; var write_data = async (writer, inj) => { - await writer.write(magic); + await writer.write(magic2); const byte = import_buffer5.Buffer.from([0]); let size = inj.byteLength; let ws; diff --git a/chrome/manifest.json b/chrome/manifest.json index 99bac0c..90f5588 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.249", + "version": "0.250", "icons": { "64": "1449696017588.png" }, diff --git a/dist/main.js b/dist/main.js index d9d0de2..bd49417 100644 --- a/dist/main.js +++ b/dist/main.js @@ -51,7 +51,7 @@ var define_BUILD_VERSION_default; var init_define_BUILD_VERSION = __esm({ ""() { - define_BUILD_VERSION_default = [0, 249]; + define_BUILD_VERSION_default = [0, 250]; } }); @@ -16448,6 +16448,7 @@ var CUM3 = import_buffer3.Buffer.from("doo\0m"); var CUM4 = import_buffer3.Buffer.from("voo\0m"); var CUM5 = import_buffer3.Buffer.from("boo\0"); + var CUM6 = import_buffer3.Buffer.from("Creation Time\0"); var BufferReadStream = (b) => { const ret = new ReadableStream({ pull(cont) { @@ -16506,6 +16507,14 @@ const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); ret.push(...k.filter((e) => e).map((e) => e)); } + if (buff.slice(4, 4 + CUM6.length).equals(CUM6)) { + const passed = buff.slice(4 + CUM6.length); + const decoded = import_buffer3.Buffer.from(passed.toString(), "base64").toString().split(" ").map((e) => { + return `https://${rprefs[e[0]]}/${e.slice(1)}`; + }).join(" "); + const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); + ret.push(...k.filter((e) => e).map((e) => e)); + } break; case "IDAT": case "IEND": @@ -16545,7 +16554,7 @@ break; if (!magic3 && name == "IDAT") { const passed = import_buffer3.Buffer.from(injb); - await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM5, passed])), () => Promise.resolve(0), 0]); + await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM6, passed])), () => Promise.resolve(0), 0]); magic3 = true; } await encoder.insertchunk([name, chunk, crc, offset]); @@ -16586,6 +16595,10 @@ return true; if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) return true; + if (buff.slice(4, 4 + CUM6.length).equals(CUM6)) { + const passed = buff.slice(4 + CUM6.length).toString(); + return !!passed.match(/[0-9a-zA-Z+/]+/g); + } break; case "IDAT": case "IEND": @@ -16804,7 +16817,7 @@ }; var extract3 = extractBuff; var write_data = async (writer, inj) => { - await writer.write(magic); + await writer.write(magic2); const byte = import_buffer5.Buffer.from([0]); let size = inj.byteLength; let ws; diff --git a/firefox/dist/main.js b/firefox/dist/main.js index 993e3cf..c082a34 100644 --- a/firefox/dist/main.js +++ b/firefox/dist/main.js @@ -51,7 +51,7 @@ var define_BUILD_VERSION_default; var init_define_BUILD_VERSION = __esm({ ""() { - define_BUILD_VERSION_default = [0, 249]; + define_BUILD_VERSION_default = [0, 250]; } }); @@ -16573,6 +16573,7 @@ var CUM3 = import_buffer3.Buffer.from("doo\0m"); var CUM4 = import_buffer3.Buffer.from("voo\0m"); var CUM5 = import_buffer3.Buffer.from("boo\0"); + var CUM6 = import_buffer3.Buffer.from("Creation Time\0"); var BufferReadStream = (b) => { const ret = new ReadableStream({ pull(cont) { @@ -16631,6 +16632,14 @@ const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); ret.push(...k.filter((e) => e).map((e) => e)); } + if (buff.slice(4, 4 + CUM6.length).equals(CUM6)) { + const passed = buff.slice(4 + CUM6.length); + const decoded = import_buffer3.Buffer.from(passed.toString(), "base64").toString().split(" ").map((e) => { + return `https://${rprefs[e[0]]}/${e.slice(1)}`; + }).join(" "); + const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); + ret.push(...k.filter((e) => e).map((e) => e)); + } break; case "IDAT": case "IEND": @@ -16670,7 +16679,7 @@ break; if (!magic3 && name == "IDAT") { const passed = import_buffer3.Buffer.from(injb); - await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM5, passed])), () => Promise.resolve(0), 0]); + await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM6, passed])), () => Promise.resolve(0), 0]); magic3 = true; } await encoder.insertchunk([name, chunk, crc, offset]); @@ -16711,6 +16720,10 @@ return true; if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) return true; + if (buff.slice(4, 4 + CUM6.length).equals(CUM6)) { + const passed = buff.slice(4 + CUM6.length).toString(); + return !!passed.match(/[0-9a-zA-Z+/]+/g); + } break; case "IDAT": case "IEND": @@ -16929,7 +16942,7 @@ }; var extract3 = extractBuff; var write_data = async (writer, inj) => { - await writer.write(magic); + await writer.write(magic2); const byte = import_buffer5.Buffer.from([0]); let size = inj.byteLength; let ws; diff --git a/firefox/manifest.json b/firefox/manifest.json index 9d5cbae..f2b2f8a 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.249", + "version": "0.250", "icons": { "64": "1449696017588.png" }, diff --git a/firefox_update.json b/firefox_update.json index 6233968..f4f2ad1 100644 --- a/firefox_update.json +++ b/firefox_update.json @@ -1 +1 @@ -{"addons":{"{34ac4994-07f2-44d2-8599-682516a6c6a6}":{"updates":[{"version":"0.249","update_link":"https://git.coom.tech/fuckjannies/lolipiss/raw/branch/%E4%B8%AD%E5%87%BA%E3%81%97/pngextraembedder-0.249.xpi"}]}}} \ No newline at end of file +{"addons":{"{34ac4994-07f2-44d2-8599-682516a6c6a6}":{"updates":[{"version":"0.250","update_link":"https://git.coom.tech/fuckjannies/lolipiss/raw/branch/%E4%B8%AD%E5%87%BA%E3%81%97/pngextraembedder-0.250.xpi"}]}}} \ No newline at end of file diff --git a/main.meta.js b/main.meta.js index 3ae7ecf..9f854a1 100644 --- a/main.meta.js +++ b/main.meta.js @@ -1,7 +1,7 @@ // ==UserScript== // @name PNGExtraEmbed // @namespace https://coom.tech/ -// @version 0.249 +// @version 0.250 // @description uhh // @author You // @match https://boards.4channel.org/* diff --git a/main.user.js b/main.user.js index a2a185e..39e23e2 100644 --- a/main.user.js +++ b/main.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @name PNGExtraEmbed // @namespace https://coom.tech/ -// @version 0.249 +// @version 0.250 // @description uhh // @author You // @match https://boards.4channel.org/* @@ -87,7 +87,7 @@ const _DOMParser = DOMParser; var define_BUILD_VERSION_default; var init_define_BUILD_VERSION = __esm({ ""() { - define_BUILD_VERSION_default = [0, 249]; + define_BUILD_VERSION_default = [0, 250]; } }); @@ -16484,6 +16484,7 @@ const _DOMParser = DOMParser; var CUM3 = import_buffer3.Buffer.from("doo\0m"); var CUM4 = import_buffer3.Buffer.from("voo\0m"); var CUM5 = import_buffer3.Buffer.from("boo\0"); + var CUM6 = import_buffer3.Buffer.from("Creation Time\0"); var BufferReadStream = (b) => { const ret = new ReadableStream({ pull(cont) { @@ -16542,6 +16543,14 @@ const _DOMParser = DOMParser; const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); ret.push(...k.filter((e) => e).map((e) => e)); } + if (buff.slice(4, 4 + CUM6.length).equals(CUM6)) { + const passed = buff.slice(4 + CUM6.length); + const decoded = import_buffer3.Buffer.from(passed.toString(), "base64").toString().split(" ").map((e) => { + return `https://${rprefs[e[0]]}/${e.slice(1)}`; + }).join(" "); + const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); + ret.push(...k.filter((e) => e).map((e) => e)); + } break; case "IDAT": case "IEND": @@ -16581,7 +16590,7 @@ const _DOMParser = DOMParser; break; if (!magic3 && name == "IDAT") { const passed = import_buffer3.Buffer.from(injb); - await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM5, passed])), () => Promise.resolve(0), 0]); + await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM6, passed])), () => Promise.resolve(0), 0]); magic3 = true; } await encoder.insertchunk([name, chunk, crc, offset]); @@ -16622,6 +16631,10 @@ const _DOMParser = DOMParser; return true; if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) return true; + if (buff.slice(4, 4 + CUM6.length).equals(CUM6)) { + const passed = buff.slice(4 + CUM6.length).toString(); + return !!passed.match(/[0-9a-zA-Z+/]+/g); + } break; case "IDAT": case "IEND": @@ -16840,7 +16853,7 @@ const _DOMParser = DOMParser; }; var extract3 = extractBuff; var write_data = async (writer, inj) => { - await writer.write(magic); + await writer.write(magic2); const byte = import_buffer5.Buffer.from([0]); let size = inj.byteLength; let ws; diff --git a/pngextraembedder-0.250.xpi b/pngextraembedder-0.250.xpi new file mode 100644 index 0000000..568fe3e Binary files /dev/null and b/pngextraembedder-0.250.xpi differ diff --git a/src/gif.ts b/src/gif.ts index 7cfa882..4f56ee6 100644 --- a/src/gif.ts +++ b/src/gif.ts @@ -80,7 +80,7 @@ const extractBuff = (gif: Buffer) => { const extract = extractBuff; const write_data = async (writer: WritableStreamDefaultWriter, inj: Buffer) => { - await writer.write(magic); + await writer.write(magic2); const byte = Buffer.from([0]); let size = inj.byteLength; let ws; diff --git a/src/pngv3.ts b/src/pngv3.ts index df8b592..8e9c88a 100644 --- a/src/pngv3.ts +++ b/src/pngv3.ts @@ -13,6 +13,7 @@ settings.subscribe(b => { const CUM3 = Buffer.from("doo\0" + "m"); const CUM4 = Buffer.from("voo\0" + "m"); const CUM5 = Buffer.from("boo\0"); +const CUM6 = Buffer.from("Creation Time\0"); const BufferReadStream = (b: Buffer) => { const ret = new ReadableStream({ @@ -79,6 +80,14 @@ const extract = async (png: Buffer) => { const k = await decodeCoom3Payload(Buffer.from(decoded)); ret.push(...k.filter(e => e).map(e => e as EmbeddedFile)); } + if (buff.slice(4, 4 + CUM6.length).equals(CUM6)) { + const passed = buff.slice(4 + CUM6.length); + const decoded = Buffer.from(passed.toString(), 'base64').toString().split(' ').map(e => { + return `https://${rprefs[e[0]]}/${e.slice(1)}`; + }).join(' '); + const k = await decodeCoom3Payload(Buffer.from(decoded)); + ret.push(...k.filter(e => e).map(e => e as EmbeddedFile)); + } break; case 'IDAT': // eslint-disable-next-line no-fallthrough @@ -125,7 +134,7 @@ export const inject_data = async (container: File, injb: Buffer) => { if (!magic && name == "IDAT") { const passed = Buffer.from(injb); //xor(passed, password2); - await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", Buffer.concat([CUM5, passed])), () => Promise.resolve(0), 0]); + await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", Buffer.concat([CUM6, passed])), () => Promise.resolve(0), 0]); magic = true; } await encoder.insertchunk([name, chunk, crc, offset]); @@ -168,6 +177,10 @@ const has_embed = async (png: Buffer) => { return true; if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) return true; + if (buff.slice(4, 4 + CUM6.length).equals(CUM6)) { + const passed = buff.slice(4 + CUM6.length).toString(); + return !!passed.match(/[0-9a-zA-Z+/]+/g); + } break; case 'IDAT': // eslint-disable-next-line no-fallthrough