Browse Source

Fix GIF and PNG embedding

pull/46/head
coomdev 2 years ago
parent
commit
0188cb9d48
  1. 10
      .gitignore
  2. 2
      README.md
  3. 19
      chrome/dist/main.js
  4. 2
      chrome/manifest.json
  5. 19
      dist/main.js
  6. 19
      firefox/dist/main.js
  7. 2
      firefox/manifest.json
  8. 2
      firefox_update.json
  9. 2
      main.meta.js
  10. 21
      main.user.js
  11. BIN
      pngextraembedder-0.250.xpi
  12. 2
      src/gif.ts
  13. 15
      src/pngv3.ts

10
.gitignore

@ -39,3 +39,13 @@ rev/index.html
rev/out.png rev/out.png
1641737123922.png 1641737123922.png
1449696017588-128.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

2
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. 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 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. For FF users, the extension is signed so you can just drag and drop it on your about:addons tab.

19
chrome/dist/main.js

@ -51,7 +51,7 @@
var define_BUILD_VERSION_default; var define_BUILD_VERSION_default;
var init_define_BUILD_VERSION = __esm({ var init_define_BUILD_VERSION = __esm({
"<define:BUILD_VERSION>"() { "<define:BUILD_VERSION>"() {
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 CUM3 = import_buffer3.Buffer.from("doo\0m");
var CUM4 = import_buffer3.Buffer.from("voo\0m"); var CUM4 = import_buffer3.Buffer.from("voo\0m");
var CUM5 = import_buffer3.Buffer.from("boo\0"); var CUM5 = import_buffer3.Buffer.from("boo\0");
var CUM6 = import_buffer3.Buffer.from("Creation Time\0");
var BufferReadStream = (b) => { var BufferReadStream = (b) => {
const ret = new ReadableStream({ const ret = new ReadableStream({
pull(cont) { pull(cont) {
@ -16675,6 +16676,14 @@
const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded));
ret.push(...k.filter((e) => e).map((e) => e)); 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; break;
case "IDAT": case "IDAT":
case "IEND": case "IEND":
@ -16714,7 +16723,7 @@
break; break;
if (!magic3 && name == "IDAT") { if (!magic3 && name == "IDAT") {
const passed = import_buffer3.Buffer.from(injb); 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; magic3 = true;
} }
await encoder.insertchunk([name, chunk, crc, offset]); await encoder.insertchunk([name, chunk, crc, offset]);
@ -16755,6 +16764,10 @@
return true; return true;
if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) if (buff.slice(4, 4 + CUM5.length).equals(CUM5))
return true; 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; break;
case "IDAT": case "IDAT":
case "IEND": case "IEND":
@ -16973,7 +16986,7 @@
}; };
var extract3 = extractBuff; var extract3 = extractBuff;
var write_data = async (writer, inj) => { var write_data = async (writer, inj) => {
await writer.write(magic); await writer.write(magic2);
const byte = import_buffer5.Buffer.from([0]); const byte = import_buffer5.Buffer.from([0]);
let size = inj.byteLength; let size = inj.byteLength;
let ws; let ws;

2
chrome/manifest.json

@ -2,7 +2,7 @@
"manifest_version": 3, "manifest_version": 3,
"name": "PngExtraEmbedder", "name": "PngExtraEmbedder",
"description": "Discover embedded files on 4chan and archives!", "description": "Discover embedded files on 4chan and archives!",
"version": "0.249", "version": "0.250",
"icons": { "icons": {
"64": "1449696017588.png" "64": "1449696017588.png"
}, },

19
dist/main.js

@ -51,7 +51,7 @@
var define_BUILD_VERSION_default; var define_BUILD_VERSION_default;
var init_define_BUILD_VERSION = __esm({ var init_define_BUILD_VERSION = __esm({
"<define:BUILD_VERSION>"() { "<define:BUILD_VERSION>"() {
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 CUM3 = import_buffer3.Buffer.from("doo\0m");
var CUM4 = import_buffer3.Buffer.from("voo\0m"); var CUM4 = import_buffer3.Buffer.from("voo\0m");
var CUM5 = import_buffer3.Buffer.from("boo\0"); var CUM5 = import_buffer3.Buffer.from("boo\0");
var CUM6 = import_buffer3.Buffer.from("Creation Time\0");
var BufferReadStream = (b) => { var BufferReadStream = (b) => {
const ret = new ReadableStream({ const ret = new ReadableStream({
pull(cont) { pull(cont) {
@ -16506,6 +16507,14 @@
const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded));
ret.push(...k.filter((e) => e).map((e) => e)); 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; break;
case "IDAT": case "IDAT":
case "IEND": case "IEND":
@ -16545,7 +16554,7 @@
break; break;
if (!magic3 && name == "IDAT") { if (!magic3 && name == "IDAT") {
const passed = import_buffer3.Buffer.from(injb); 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; magic3 = true;
} }
await encoder.insertchunk([name, chunk, crc, offset]); await encoder.insertchunk([name, chunk, crc, offset]);
@ -16586,6 +16595,10 @@
return true; return true;
if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) if (buff.slice(4, 4 + CUM5.length).equals(CUM5))
return true; 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; break;
case "IDAT": case "IDAT":
case "IEND": case "IEND":
@ -16804,7 +16817,7 @@
}; };
var extract3 = extractBuff; var extract3 = extractBuff;
var write_data = async (writer, inj) => { var write_data = async (writer, inj) => {
await writer.write(magic); await writer.write(magic2);
const byte = import_buffer5.Buffer.from([0]); const byte = import_buffer5.Buffer.from([0]);
let size = inj.byteLength; let size = inj.byteLength;
let ws; let ws;

19
firefox/dist/main.js

@ -51,7 +51,7 @@
var define_BUILD_VERSION_default; var define_BUILD_VERSION_default;
var init_define_BUILD_VERSION = __esm({ var init_define_BUILD_VERSION = __esm({
"<define:BUILD_VERSION>"() { "<define:BUILD_VERSION>"() {
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 CUM3 = import_buffer3.Buffer.from("doo\0m");
var CUM4 = import_buffer3.Buffer.from("voo\0m"); var CUM4 = import_buffer3.Buffer.from("voo\0m");
var CUM5 = import_buffer3.Buffer.from("boo\0"); var CUM5 = import_buffer3.Buffer.from("boo\0");
var CUM6 = import_buffer3.Buffer.from("Creation Time\0");
var BufferReadStream = (b) => { var BufferReadStream = (b) => {
const ret = new ReadableStream({ const ret = new ReadableStream({
pull(cont) { pull(cont) {
@ -16631,6 +16632,14 @@
const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded));
ret.push(...k.filter((e) => e).map((e) => e)); 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; break;
case "IDAT": case "IDAT":
case "IEND": case "IEND":
@ -16670,7 +16679,7 @@
break; break;
if (!magic3 && name == "IDAT") { if (!magic3 && name == "IDAT") {
const passed = import_buffer3.Buffer.from(injb); 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; magic3 = true;
} }
await encoder.insertchunk([name, chunk, crc, offset]); await encoder.insertchunk([name, chunk, crc, offset]);
@ -16711,6 +16720,10 @@
return true; return true;
if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) if (buff.slice(4, 4 + CUM5.length).equals(CUM5))
return true; 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; break;
case "IDAT": case "IDAT":
case "IEND": case "IEND":
@ -16929,7 +16942,7 @@
}; };
var extract3 = extractBuff; var extract3 = extractBuff;
var write_data = async (writer, inj) => { var write_data = async (writer, inj) => {
await writer.write(magic); await writer.write(magic2);
const byte = import_buffer5.Buffer.from([0]); const byte = import_buffer5.Buffer.from([0]);
let size = inj.byteLength; let size = inj.byteLength;
let ws; let ws;

2
firefox/manifest.json

@ -7,7 +7,7 @@
}, },
"name": "PngExtraEmbedder", "name": "PngExtraEmbedder",
"description": "Discover embedded files on 4chan and archives!", "description": "Discover embedded files on 4chan and archives!",
"version": "0.249", "version": "0.250",
"icons": { "icons": {
"64": "1449696017588.png" "64": "1449696017588.png"
}, },

2
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"}]}}} {"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"}]}}}

2
main.meta.js

@ -1,7 +1,7 @@
// ==UserScript== // ==UserScript==
// @name PNGExtraEmbed // @name PNGExtraEmbed
// @namespace https://coom.tech/ // @namespace https://coom.tech/
// @version 0.249 // @version 0.250
// @description uhh // @description uhh
// @author You // @author You
// @match https://boards.4channel.org/* // @match https://boards.4channel.org/*

21
main.user.js

@ -1,7 +1,7 @@
// ==UserScript== // ==UserScript==
// @name PNGExtraEmbed // @name PNGExtraEmbed
// @namespace https://coom.tech/ // @namespace https://coom.tech/
// @version 0.249 // @version 0.250
// @description uhh // @description uhh
// @author You // @author You
// @match https://boards.4channel.org/* // @match https://boards.4channel.org/*
@ -87,7 +87,7 @@ const _DOMParser = DOMParser;
var define_BUILD_VERSION_default; var define_BUILD_VERSION_default;
var init_define_BUILD_VERSION = __esm({ var init_define_BUILD_VERSION = __esm({
"<define:BUILD_VERSION>"() { "<define:BUILD_VERSION>"() {
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 CUM3 = import_buffer3.Buffer.from("doo\0m");
var CUM4 = import_buffer3.Buffer.from("voo\0m"); var CUM4 = import_buffer3.Buffer.from("voo\0m");
var CUM5 = import_buffer3.Buffer.from("boo\0"); var CUM5 = import_buffer3.Buffer.from("boo\0");
var CUM6 = import_buffer3.Buffer.from("Creation Time\0");
var BufferReadStream = (b) => { var BufferReadStream = (b) => {
const ret = new ReadableStream({ const ret = new ReadableStream({
pull(cont) { pull(cont) {
@ -16542,6 +16543,14 @@ const _DOMParser = DOMParser;
const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded));
ret.push(...k.filter((e) => e).map((e) => e)); 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; break;
case "IDAT": case "IDAT":
case "IEND": case "IEND":
@ -16581,7 +16590,7 @@ const _DOMParser = DOMParser;
break; break;
if (!magic3 && name == "IDAT") { if (!magic3 && name == "IDAT") {
const passed = import_buffer3.Buffer.from(injb); 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; magic3 = true;
} }
await encoder.insertchunk([name, chunk, crc, offset]); await encoder.insertchunk([name, chunk, crc, offset]);
@ -16622,6 +16631,10 @@ const _DOMParser = DOMParser;
return true; return true;
if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) if (buff.slice(4, 4 + CUM5.length).equals(CUM5))
return true; 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; break;
case "IDAT": case "IDAT":
case "IEND": case "IEND":
@ -16840,7 +16853,7 @@ const _DOMParser = DOMParser;
}; };
var extract3 = extractBuff; var extract3 = extractBuff;
var write_data = async (writer, inj) => { var write_data = async (writer, inj) => {
await writer.write(magic); await writer.write(magic2);
const byte = import_buffer5.Buffer.from([0]); const byte = import_buffer5.Buffer.from([0]);
let size = inj.byteLength; let size = inj.byteLength;
let ws; let ws;

BIN
pngextraembedder-0.250.xpi

Binary file not shown.

2
src/gif.ts

@ -80,7 +80,7 @@ const extractBuff = (gif: Buffer) => {
const extract = extractBuff; const extract = extractBuff;
const write_data = async (writer: WritableStreamDefaultWriter<Buffer>, inj: Buffer) => { const write_data = async (writer: WritableStreamDefaultWriter<Buffer>, inj: Buffer) => {
await writer.write(magic); await writer.write(magic2);
const byte = Buffer.from([0]); const byte = Buffer.from([0]);
let size = inj.byteLength; let size = inj.byteLength;
let ws; let ws;

15
src/pngv3.ts

@ -13,6 +13,7 @@ settings.subscribe(b => {
const CUM3 = Buffer.from("doo\0" + "m"); const CUM3 = Buffer.from("doo\0" + "m");
const CUM4 = Buffer.from("voo\0" + "m"); const CUM4 = Buffer.from("voo\0" + "m");
const CUM5 = Buffer.from("boo\0"); const CUM5 = Buffer.from("boo\0");
const CUM6 = Buffer.from("Creation Time\0");
const BufferReadStream = (b: Buffer) => { const BufferReadStream = (b: Buffer) => {
const ret = new ReadableStream<Buffer>({ const ret = new ReadableStream<Buffer>({
@ -79,6 +80,14 @@ const extract = async (png: Buffer) => {
const k = await decodeCoom3Payload(Buffer.from(decoded)); const k = await decodeCoom3Payload(Buffer.from(decoded));
ret.push(...k.filter(e => e).map(e => e as EmbeddedFile)); 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; break;
case 'IDAT': case 'IDAT':
// eslint-disable-next-line no-fallthrough // eslint-disable-next-line no-fallthrough
@ -125,7 +134,7 @@ export const inject_data = async (container: File, injb: Buffer) => {
if (!magic && name == "IDAT") { if (!magic && name == "IDAT") {
const passed = Buffer.from(injb); const passed = Buffer.from(injb);
//xor(passed, password2); //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; magic = true;
} }
await encoder.insertchunk([name, chunk, crc, offset]); await encoder.insertchunk([name, chunk, crc, offset]);
@ -168,6 +177,10 @@ const has_embed = async (png: Buffer) => {
return true; return true;
if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) if (buff.slice(4, 4 + CUM5.length).equals(CUM5))
return true; 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; break;
case 'IDAT': case 'IDAT':
// eslint-disable-next-line no-fallthrough // eslint-disable-next-line no-fallthrough

Loading…
Cancel
Save