Browse Source

Fix detection of gif and webms

pull/46/head
coomdev 2 years ago
parent
commit
0929da359b
  1. 2
      main.meta.js
  2. 14
      main.user.js
  3. 8
      src/gif.ts
  4. 8
      src/webm.ts

2
main.meta.js

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

14
main.user.js

@ -1,7 +1,7 @@
// ==UserScript== // ==UserScript==
// @name PNGExtraEmbed // @name PNGExtraEmbed
// @namespace https://coom.tech/ // @namespace https://coom.tech/
// @version 0.135 // @version 0.136
// @description uhh // @description uhh
// @author You // @author You
// @match https://boards.4channel.org/* // @match https://boards.4channel.org/*
@ -11598,7 +11598,7 @@
var extract2 = (webm) => { var extract2 = (webm) => {
const dec = new ebml.Decoder(); const dec = new ebml.Decoder();
const chunks = dec.decode(webm); const chunks = dec.decode(webm);
const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && e.value == "COOM"); const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && e.value == "DOOM");
const cl = chunks.find((e) => e.name == "Cluster"); const cl = chunks.find((e) => e.name == "Cluster");
if (cl && embed2 == -1) if (cl && embed2 == -1)
return; return;
@ -11606,7 +11606,7 @@
return; return;
const chk = chunks[embed2 + 1]; const chk = chunks[embed2 + 1];
if (chk.type == "b" && chk.name == "TagBinary") if (chk.type == "b" && chk.name == "TagBinary")
return [{ filename: "string", data: chk.data }]; return decodeCoom3Payload(chk.data);
}; };
var inject2 = async (container, injs) => { var inject2 = async (container, injs) => {
const links = await uploadFiles(injs); const links = await uploadFiles(injs);
@ -11615,7 +11615,7 @@
var has_embed2 = (webm) => { var has_embed2 = (webm) => {
const dec = new ebml.Decoder(); const dec = new ebml.Decoder();
const chunks = dec.decode(webm); const chunks = dec.decode(webm);
const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && e.value == "COOM"); const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && e.value == "DOOM");
const cl = chunks.find((e) => e.name == "Cluster"); const cl = chunks.find((e) => e.name == "Cluster");
if (cl && embed2 == -1) if (cl && embed2 == -1)
return false; return false;
@ -11662,7 +11662,7 @@
} }
while (gif[end] == "!".charCodeAt(0)) { while (gif[end] == "!".charCodeAt(0)) {
let sec = read_section(gif, end); let sec = read_section(gif, end);
if (sec.appname == "COOMTECH") { if (sec.appname == "DOOMTECH") {
const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0));
let ptr = 0; let ptr = 0;
do { do {
@ -11670,8 +11670,8 @@
sec.data.copy(ret, ptr); sec.data.copy(ret, ptr);
ptr += sec.data.byteLength; ptr += sec.data.byteLength;
end = sec.end; end = sec.end;
} while (sec.appname == "COOMTECH" && gif[end] == "!".charCodeAt(0)); } while (sec.appname == "DOOMTECH" && gif[end] == "!".charCodeAt(0));
return [{ data: ret, filename: "embedded" }]; return decodeCoom3Payload(ret);
} }
end = sec.end; end = sec.end;
} }

8
src/gif.ts

@ -1,7 +1,7 @@
import { Buffer } from "buffer"; import { Buffer } from "buffer";
import type { EmbeddedFile, ImageProcessor } from "./main"; import type { EmbeddedFile, ImageProcessor } from "./main";
import { BufferWriteStream } from "./png"; import { BufferWriteStream } from "./png";
import { uploadFiles } from "./utils"; import { decodeCoom3Payload, uploadFiles } from "./utils";
const netscape = Buffer.from("!\xFF\x0BNETSCAPE2.0", 'ascii'); const netscape = Buffer.from("!\xFF\x0BNETSCAPE2.0", 'ascii');
const magic = Buffer.from("!\xFF\x0B" + "DOOMTECH1.1", 'ascii'); const magic = Buffer.from("!\xFF\x0B" + "DOOMTECH1.1", 'ascii');
@ -35,7 +35,7 @@ const extractBuff = (gif: Buffer) => {
// skip beeg blocks // skip beeg blocks
while (gif[end] == '!'.charCodeAt(0)) { while (gif[end] == '!'.charCodeAt(0)) {
let sec = read_section(gif, end); // this section contains the size to more easily preallocate a buffer size, but you don't need to care care let sec = read_section(gif, end); // this section contains the size to more easily preallocate a buffer size, but you don't need to care care
if (sec.appname == "COOMTECH") { if (sec.appname == "DOOMTECH") {
const ret = Buffer.alloc(sec.data.readInt32LE(0)); const ret = Buffer.alloc(sec.data.readInt32LE(0));
let ptr = 0; let ptr = 0;
do { do {
@ -43,8 +43,8 @@ const extractBuff = (gif: Buffer) => {
sec.data.copy(ret, ptr); sec.data.copy(ret, ptr);
ptr += sec.data.byteLength; ptr += sec.data.byteLength;
end = sec.end; end = sec.end;
} while (sec.appname == "COOMTECH" && gif[end] == '!'.charCodeAt(0)); } while (sec.appname == "DOOMTECH" && gif[end] == '!'.charCodeAt(0));
return [{ data: ret, filename: 'embedded' }] as EmbeddedFile[]; return decodeCoom3Payload(ret);
} }
end = sec.end; end = sec.end;
} }

8
src/webm.ts

@ -1,7 +1,7 @@
import { Buffer } from "buffer"; import { Buffer } from "buffer";
import * as ebml from "ts-ebml"; import * as ebml from "ts-ebml";
import type { ImageProcessor } from "./main"; import type { ImageProcessor } from "./main";
import { uploadFiles } from "./utils"; import { decodeCoom3Payload, uploadFiles } from "./utils";
// unused, but will in case 4chan does file sig checks // unused, but will in case 4chan does file sig checks
const password = Buffer.from("NOA"); const password = Buffer.from("NOA");
@ -113,7 +113,7 @@ const extract = (webm: Buffer) => {
const dec = new ebml.Decoder(); const dec = new ebml.Decoder();
const chunks = dec.decode(webm); const chunks = dec.decode(webm);
const embed = chunks.findIndex(e => e.name == "TagName" && e.type == '8' && e.value == "COOM"); const embed = chunks.findIndex(e => e.name == "TagName" && e.type == '8' && e.value == "DOOM");
const cl = chunks.find(e => e.name == "Cluster"); const cl = chunks.find(e => e.name == "Cluster");
if (cl && embed == -1) if (cl && embed == -1)
return; return;
@ -121,7 +121,7 @@ const extract = (webm: Buffer) => {
return; return;
const chk = chunks[embed + 1]; const chk = chunks[embed + 1];
if (chk.type == "b" && chk.name == "TagBinary") if (chk.type == "b" && chk.name == "TagBinary")
return [{ filename: 'string', data: chk.data }]; return decodeCoom3Payload(chk.data);
}; };
const inject = async (container: File, injs: File[]): Promise<Buffer> => { const inject = async (container: File, injs: File[]): Promise<Buffer> => {
@ -133,7 +133,7 @@ const has_embed = (webm: Buffer) => {
const dec = new ebml.Decoder(); const dec = new ebml.Decoder();
const chunks = dec.decode(webm); const chunks = dec.decode(webm);
const embed = chunks.findIndex(e => e.name == "TagName" && e.type == '8' && e.value == "COOM"); const embed = chunks.findIndex(e => e.name == "TagName" && e.type == '8' && e.value == "DOOM");
const cl = chunks.find(e => e.name == "Cluster"); const cl = chunks.find(e => e.name == "Cluster");
if (cl && embed == -1) if (cl && embed == -1)
return false; // Tags appear before Cluster, so if we have a Cluster and no coomtag, then it's a definite no return false; // Tags appear before Cluster, so if we have a Cluster and no coomtag, then it's a definite no

Loading…
Cancel
Save