From e91e692def6c6248ce0f9b15f23207a412e1295d Mon Sep 17 00:00:00 2001 From: coomdev Date: Sun, 24 Jul 2022 19:18:02 +0200 Subject: [PATCH] Allow user to pick a PNG embedding method --- src/Components/App.svelte | 14 ++++++++++++-- src/pngv3.ts | 28 ++++++++++++++++++++++++---- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/Components/App.svelte b/src/Components/App.svelte index ff64ec4..c55c64b 100644 --- a/src/Components/App.svelte +++ b/src/Components/App.svelte @@ -34,7 +34,6 @@ function appendBooru() { if (execution_mode != "userscript") { request(newbooru.domain!); - alert("Requested! Please click the PEE icon to validate"); } $settings.rsources = [...$settings.rsources, newbooru as any]; @@ -119,6 +118,7 @@ File Host updateThreads()}>Thread Watcher updateNews()}>Reminder + Advanced {#if $appState.akValid} Hydrus {/if} @@ -395,6 +395,16 @@ {/if} + + + {#if $appState.akValid} @@ -445,7 +455,7 @@ text-align: center; margin: 0; } - + .form { display: flex; flex-direction: column; diff --git a/src/pngv3.ts b/src/pngv3.ts index da4d55e..6d8d227 100644 --- a/src/pngv3.ts +++ b/src/pngv3.ts @@ -57,6 +57,8 @@ const extract = async (png: Buffer) => { const sneed = new PNGDecoder(reader); const ret: EmbeddedFile[] = []; let w: Buffer | undefined; + if (!csettings) + throw new Error("Settings uninit"); try { for await (const [name, chunk, crc, offset] of sneed.chunks()) { @@ -103,7 +105,7 @@ const extract = async (png: Buffer) => { }).join(' '); const k = await decodeCoom3Payload(Buffer.from(decoded)); ret.push(...k.filter(e => e).map(e => e as EmbeddedFile)); - } catch(e) { + } catch (e) { // } } @@ -144,6 +146,8 @@ export const BufferWriteStream = () => { }; export const inject_data = async (container: File, injb: Buffer) => { + if (!csettings) + throw new Error("Settings uninit"); let magic = false; const [writestream, extract] = BufferWriteStream(); const encoder = new PNGEncoder(writestream); @@ -154,8 +158,24 @@ export const inject_data = async (container: File, injb: Buffer) => { break; if (!magic && name == "IDAT") { const passed = Buffer.from(injb); - //xor(passed, password2); - await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", Buffer.concat([CUM7, passed])), () => Promise.resolve(0), 0]); + switch (csettings.pmeth) { + case 0: + await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", Buffer.concat([CUM3, passed])), () => Promise.resolve(0), 0]); + break; + case 1: + xor(passed, password); + await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", Buffer.concat([CUM4, Buffer.from(Buffer.from(passed).toString("base64"))])), () => Promise.resolve(0), 0]); + break; + case 2: + await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", Buffer.concat([CUM5, Buffer.from(Buffer.from(passed).toString("base64"))])), () => Promise.resolve(0), 0]); + break; + case 3: + await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", Buffer.concat([CUM6, Buffer.from(Buffer.from(passed).toString("base64"))])), () => Promise.resolve(0), 0]); + break; + case 4: + await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", Buffer.concat([CUM7, Buffer.from(bs58.encode(passed))])), () => Promise.resolve(0), 0]); + break; + } magic = true; } await encoder.insertchunk([name, chunk, crc, offset]); @@ -178,7 +198,7 @@ const inject = async (container: File, links: string[]) => { } return ''; }); - const injb = Buffer.from(bs58.encode(Buffer.from(links.join(' ')))); + const injb = Buffer.from(links.join(' ')); return inject_data(container, injb); };