From 866ad8b13b796e363ca3f8e8d22aecd67b0bb22c Mon Sep 17 00:00:00 2001 From: Jiiks Date: Sat, 11 Aug 2018 15:29:30 +0300 Subject: [PATCH] Tons of stuff --- client/src/builtin/E2EE.js | 52 ++++++++++++++++++++++++++++ client/src/builtin/E2EEComponent.vue | 29 +++++++++++++--- common/modules/utils.js | 35 +++++++++++++++++++ 3 files changed, 112 insertions(+), 4 deletions(-) diff --git a/client/src/builtin/E2EE.js b/client/src/builtin/E2EE.js index 8be72a91..4c0fe99f 100644 --- a/client/src/builtin/E2EE.js +++ b/client/src/builtin/E2EE.js @@ -13,11 +13,14 @@ import BuiltinModule from './BuiltinModule'; import { WebpackModules, ReactComponents, MonkeyPatch, Patcher, DiscordApi } from 'modules'; import { VueInjector, Reflection } from 'ui'; import { ClientLogger as Logger } from 'common'; +import { request } from 'vendor'; +import { Utils } from 'common'; import E2EEComponent from './E2EEComponent.vue'; import E2EEMessageButton from './E2EEMessageButton.vue'; import aes256 from 'aes256'; let seed = Math.random().toString(36).replace(/[^a-z]+/g, ''); +const decryptCache = []; export default new class E2EE extends BuiltinModule { @@ -70,6 +73,8 @@ export default new class E2EE extends BuiltinModule { const MessageContent = await ReactComponents.getComponent('MessageContent', { selector }); MonkeyPatch('BD:E2EE', MessageContent.component.prototype).before('render', this.beforeRenderMessageContent.bind(this)); MonkeyPatch('BD:E2EE', MessageContent.component.prototype).after('render', this.renderMessageContent.bind(this)); + const ImageWrapper = await ReactComponents.getComponent('ImageWrapper', { selector: '.' + WebpackModules.getClassName('imageWrapper') }); + MonkeyPatch('BD:E2EE', ImageWrapper.component.prototype).before('render', this.beforeRenderImageWrapper.bind(this)); } beforeRenderMessageContent(component, args, retVal) { @@ -107,6 +112,53 @@ export default new class E2EE extends BuiltinModule { })); } + beforeRenderImageWrapper(component, args, retVal) { + if (!component.props || !component.props.src) return; + if (component.props.decrypting) return; + + const src = component.props.src; + if (!src.includes('bde2ee')) return; + + const alreadyDecrypted = decryptCache.find(item => item.src === component.props.src); + if (alreadyDecrypted) { + component.props.className = 'bd-decryptedImage'; + component.props.src = component.props.original = alreadyDecrypted.encodedImage; + component.props.width = alreadyDecrypted.width; + component.props.height = alreadyDecrypted.height; + return; + } + + let resolution = null; + try { + resolution = src.match(/_(.*?)\./)[1].split('x'); + } catch (err) { } + + component.props.className = 'bd-encryptedImage'; + component.props.decrypting = true; + + request.get(component.props.src, { encoding: 'binary' }).then(res => { + const arr = new Uint8Array(new ArrayBuffer(res.length)); + for (let i = 0; i < res.length; i++) arr[i] = res.charCodeAt(i); + const aobindex = Utils.aobscan(arr, [73, 69, 78, 68]) + 8; + + const sliced = arr.slice(aobindex, arr.length - aobindex); + const encoded = Utils.arrayBufferToBase64(sliced); + const base64enc = 'data:image/png;base64,' + encoded; + + if (!component || !component.props) return; + if (resolution && resolution.length >= 2) { + component.props.width = parseInt(resolution[0]); + component.props.height = parseInt(resolution[1]); + } + + decryptCache.push({ src, width: component.props.width, height: component.props.height, encodedImage: base64enc }); + component.props.decrypting = false; + component.forceUpdate(); + }).catch(err => { + console.log('request error', err); + }); + } + patchChannelTextArea(cta) { MonkeyPatch('BD:E2EE', cta.component.prototype).after('render', this.renderChannelTextArea); } diff --git a/client/src/builtin/E2EEComponent.vue b/client/src/builtin/E2EEComponent.vue index cd8fdb38..589d5341 100644 --- a/client/src/builtin/E2EEComponent.vue +++ b/client/src/builtin/E2EEComponent.vue @@ -24,16 +24,23 @@
+
+ +