Fix vite build release version

Also, make sure "export" strings are not removed (rename to "room_export") and import quotes in the QuoteView correctly.
This commit is contained in:
N-Pex 2025-04-22 13:01:18 +02:00
parent 4c364f93e6
commit ec992bb14d
34 changed files with 621 additions and 284 deletions

View file

@ -1,21 +1,16 @@
import axios from 'axios';
import * as ContentHelpers from "matrix-js-sdk/lib/content-helpers";
import dataUriToBuffer from "data-uri-to-buffer";
import ImageResize from "image-resize";
import imageResize from "image-resize";
import { AutoDiscovery } from 'matrix-js-sdk';
import User from '../models/user';
import prettyBytes from "pretty-bytes";
import Hammer from "hammerjs";
import { Thread } from 'matrix-js-sdk/lib/models/thread';
import sizeOf from "image-size";
import { imageSize } from "image-size";
import dayjs from "dayjs";
import jssha256 from "js-sha256";
import aesjs from "aes-js";
import { encode, decode } from 'json-web-key/lib/base64url';
import localizedFormat from 'dayjs/plugin/localizedFormat';
import duration from 'dayjs/plugin/duration';
import { Buffer } from 'buffer/'
window.Buffer = Buffer;
export const STATE_EVENT_ROOM_DELETION_NOTICE = "im.keanu.room_deletion_notice";
export const STATE_EVENT_ROOM_DELETED = "im.keanu.room_deleted";
@ -27,9 +22,6 @@ export const ROOM_TYPE_CHANNEL = "im.keanu.room_type_channel";
export const STATE_EVENT_ROOM_TYPE = "im.keanu.room_type";
var sha256 = jssha256.sha256;
// Install extended localized format
dayjs.extend(localizedFormat)
dayjs.extend(duration);
@ -97,11 +89,27 @@ class Util {
var file = null;
let decrypt = true;
if (content.url != null) {
url = matrixClient.mxcUrlToHttp(content.url, undefined, undefined, undefined, undefined, undefined, useAuthedMedia);
url = matrixClient.mxcUrlToHttp(
content.url,
undefined,
undefined,
undefined,
undefined,
undefined,
useAuthedMedia
);
decrypt = false;
} else if (content.file && content.file.url) {
file = content.file;
url = matrixClient.mxcUrlToHttp(file.url, undefined, undefined, undefined, undefined, undefined, useAuthedMedia);
url = matrixClient.mxcUrlToHttp(
file.url,
undefined,
undefined,
undefined,
undefined,
undefined,
useAuthedMedia
);
}
if (url == null) {
@ -123,7 +131,7 @@ class Util {
},
})
.then((response) => {
return decrypt ? this.decryptIfNeeded(file, response) : Promise.resolve({buffer:response.data});
return decrypt ? this.decryptIfNeeded(file, response) : Promise.resolve({ buffer: response.data });
})
.then((bytes) => {
if (asBlob) {
@ -151,7 +159,15 @@ class Util {
var file = null;
let decrypt = true;
if (content.url != null) {
url = matrixClient.mxcUrlToHttp(content.url, undefined, undefined, undefined, undefined, undefined, useAuthedMedia);
url = matrixClient.mxcUrlToHttp(
content.url,
undefined,
undefined,
undefined,
undefined,
undefined,
useAuthedMedia
);
decrypt = false;
} else if (content && content.info && content.info.thumbnail_file && content.info.thumbnail_file.url) {
file = content.info.thumbnail_file;
@ -167,7 +183,15 @@ class Util {
// "scale",
// true
// );
url = matrixClient.mxcUrlToHttp(file.url, undefined, undefined, undefined, undefined, undefined, useAuthedMedia);
url = matrixClient.mxcUrlToHttp(
file.url,
undefined,
undefined,
undefined,
undefined,
undefined,
useAuthedMedia
);
} else if (
content.file &&
content.file.url &&
@ -176,7 +200,15 @@ class Util {
) {
// No thumb, use real url
file = content.file;
url = matrixClient.mxcUrlToHttp(file.url, undefined, undefined, undefined, undefined, undefined, useAuthedMedia);
url = matrixClient.mxcUrlToHttp(
file.url,
undefined,
undefined,
undefined,
undefined,
undefined,
useAuthedMedia
);
}
if (url == null) {
@ -185,11 +217,14 @@ class Util {
}
axios
.get(url, { responseType: "arraybuffer", headers: {
Authorization: `Bearer ${matrixClient.getAccessToken()}`,
}})
.get(url, {
responseType: "arraybuffer",
headers: {
Authorization: `Bearer ${matrixClient.getAccessToken()}`,
},
})
.then((response) => {
return decrypt ? this.decryptIfNeeded(file, response) : Promise.resolve({buffer:response.data});
return decrypt ? this.decryptIfNeeded(file, response) : Promise.resolve({ buffer: response.data });
})
.then((bytes) => {
resolve(URL.createObjectURL(new Blob([bytes.buffer], { type: file.mimetype })));
@ -201,27 +236,34 @@ class Util {
});
}
b64toBuffer(val) {
const baseValue = val.replaceAll("-", "+").replaceAll("_", "/");
return Buffer.from(baseValue, "base64");
}
decryptIfNeeded(file, response) {
return new Promise((resolve, reject) => {
var key = decode(file.key.k);
var iv = decode(file.iv);
var aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(iv));
const key = this.b64toBuffer(file.key.k);
const iv = this.b64toBuffer(file.iv);
const originalHash = this.b64toBuffer(file.hashes.sha256);
var aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(iv));
const data = new Uint8Array(response.data);
// const areEqual = (first, second) =>
// first.length === second.length && first.every((value, index) => value === second[index]);
// Calculate sha256 and compare hashes
var hash = new Uint8Array(sha256.create().update(data).arrayBuffer());
const originalHash = decode(file.hashes.sha256);
if (Buffer.compare(Buffer.from(hash), Buffer.from(originalHash.buffer)) != 0) {
reject("Hashes don't match!");
return;
}
var decryptedBytes = aesCtr.decrypt(data);
resolve(decryptedBytes);
crypto.subtle
.digest("SHA-256", data)
.then((hash) => {
// Calculate sha256 and compare hashes
if (Buffer.compare(Buffer.from(hash), originalHash) != 0) {
reject("Hashes don't match!");
return;
}
var decryptedBytes = aesCtr.decrypt(data);
resolve(decryptedBytes);
})
.catch((err) => {
reject("Failed to calculate hash value");
});
});
}
@ -466,7 +508,7 @@ class Util {
kty: "oct",
key_ops: ["encrypt", "decrypt"],
alg: "A256CTR",
k: encode(key),
k: key.toString("base64").replaceAll(/\//g, "_").replaceAll(/\+/g, "-"),
ext: true,
};
@ -814,8 +856,8 @@ class Util {
return matrixClient.sendStateEvent(roomId, "m.room.avatar", messageContent);
})
.then((result) => {
resolve(matrixClient.mxcUrlToHttp(messageContent.url, 80, 80, "scale", undefined, undefined, true))
// resolve(result);
resolve(matrixClient.mxcUrlToHttp(messageContent.url, 80, 80, "scale", undefined, undefined, true));
// resolve(result);
})
.catch((err) => {
reject(err);
@ -837,7 +879,10 @@ class Util {
try {
var image = e.target.result;
var dimens = sizeOf(dataUriToBuffer(e.target.result));
const buffer = Uint8Array.from(window.atob(e.target.result.replace(/^data[^,]+,/, "")), (v) =>
v.charCodeAt(0)
);
var dimens = imageSize(buffer);
// Need to resize?
const w = dimens.width;
@ -846,14 +891,12 @@ class Util {
var aspect = w / h;
var newWidth = parseInt((w > h ? 640 : 640 * aspect).toFixed());
var newHeight = parseInt((w > h ? 640 / aspect : 640).toFixed());
var imageResize = new ImageResize({
imageResize(image, {
format: "png",
width: newWidth,
height: newHeight,
outputType: "blob",
});
imageResize
.play(event.target)
})
.then((img) => {
var resizedImageFile = new File([img], file.name, {
type: img.type,