forked from cadence/out-of-your-element
m->d support encrypted files
This commit is contained in:
parent
dd4e3aa8e0
commit
be2cdd1186
5 changed files with 127 additions and 15 deletions
|
@ -1,6 +1,9 @@
|
|||
// @ts-check
|
||||
|
||||
const assert = require("assert").strict
|
||||
const crypto = require("crypto")
|
||||
const {pipeline} = require("stream")
|
||||
const {promisify} = require("util")
|
||||
const Ty = require("../../types")
|
||||
const DiscordTypes = require("discord-api-types/v10")
|
||||
const passthrough = require("../../passthrough")
|
||||
|
@ -14,16 +17,29 @@ const eventToMessage = sync.require("../converters/event-to-message")
|
|||
const api = sync.require("../../matrix/api")
|
||||
|
||||
/**
|
||||
* @param {DiscordTypes.RESTPostAPIWebhookWithTokenJSONBody & {pendingFiles?: {name: string, url: string}[]}} message
|
||||
* @param {DiscordTypes.RESTPostAPIWebhookWithTokenJSONBody & {pendingFiles?: ({name: string, url: string} | {name: string, url: string, key: string, iv: string})[]}} message
|
||||
* @returns {Promise<DiscordTypes.RESTPostAPIWebhookWithTokenJSONBody & {files?: {name: string, file: Buffer}[]}>}
|
||||
*/
|
||||
async function resolvePendingFiles(message) {
|
||||
if (!message.pendingFiles) return message
|
||||
const files = await Promise.all(message.pendingFiles.map(async p => {
|
||||
const file = await fetch(p.url).then(res => res.arrayBuffer()).then(x => Buffer.from(x))
|
||||
let fileBuffer
|
||||
if ("key" in p) {
|
||||
// Encrypted
|
||||
const d = crypto.createDecipheriv("aes-256-ctr", Buffer.from(p.key, "base64url"), Buffer.from(p.iv, "base64url"))
|
||||
fileBuffer = await fetch(p.url).then(res => res.arrayBuffer()).then(x => {
|
||||
return Buffer.concat([
|
||||
d.update(Buffer.from(x)),
|
||||
d.final()
|
||||
])
|
||||
})
|
||||
} else {
|
||||
// Unencrypted
|
||||
fileBuffer = await fetch(p.url).then(res => res.arrayBuffer()).then(x => Buffer.from(x))
|
||||
}
|
||||
return {
|
||||
name: p.name,
|
||||
file
|
||||
file: fileBuffer // TODO: Once SnowTransfer supports ReadableStreams for attachment uploads, pass in those instead of Buffers
|
||||
}
|
||||
}))
|
||||
const newMessage = {
|
||||
|
@ -34,7 +50,7 @@ async function resolvePendingFiles(message) {
|
|||
return newMessage
|
||||
}
|
||||
|
||||
/** @param {Ty.Event.M_Outer_M_Room_Message | Ty.Event.M_Outer_M_Room_Message_File | Ty.Event.M_Outer_M_Sticker} event */
|
||||
/** @param {Ty.Event.Outer_M_Room_Message | Ty.Event.Outer_M_Room_Message_File | Ty.Event.Outer_M_Sticker} event */
|
||||
async function sendEvent(event) {
|
||||
// TODO: we just assume the bridge has already been created, is that really ok?
|
||||
const row = db.prepare("SELECT channel_id, thread_parent FROM channel_room WHERE room_id = ?").get(event.room_id)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue