|
@@ -22,7 +22,6 @@ import { saveFilesToFirebase } from "./firebase";
|
|
|
|
|
|
const byteToHex = (byte: number): string => `0${byte.toString(16)}`.slice(-2);
|
|
|
|
|
|
-const BACKEND_GET = process.env.REACT_APP_BACKEND_V1_GET_URL;
|
|
|
const BACKEND_V2_GET = process.env.REACT_APP_BACKEND_V2_GET_URL;
|
|
|
const BACKEND_V2_POST = process.env.REACT_APP_BACKEND_V2_POST_URL;
|
|
|
|
|
@@ -176,44 +175,36 @@ export const decryptImported = async (
|
|
|
};
|
|
|
|
|
|
const importFromBackend = async (
|
|
|
- id: string | null,
|
|
|
- privateKey?: string | null,
|
|
|
+ id: string,
|
|
|
+ privateKey: string,
|
|
|
): Promise<ImportedDataState> => {
|
|
|
try {
|
|
|
- const response = await fetch(
|
|
|
- privateKey ? `${BACKEND_V2_GET}${id}` : `${BACKEND_GET}${id}.json`,
|
|
|
- );
|
|
|
+ const response = await fetch(`${BACKEND_V2_GET}${id}`);
|
|
|
|
|
|
if (!response.ok) {
|
|
|
window.alert(t("alerts.importBackendFailed"));
|
|
|
return {};
|
|
|
}
|
|
|
- let data: ImportedDataState;
|
|
|
- if (privateKey) {
|
|
|
- const buffer = await response.arrayBuffer();
|
|
|
-
|
|
|
- let decrypted: ArrayBuffer;
|
|
|
- try {
|
|
|
- // Buffer should contain both the IV (fixed length) and encrypted data
|
|
|
- const iv = buffer.slice(0, IV_LENGTH_BYTES);
|
|
|
- const encrypted = buffer.slice(IV_LENGTH_BYTES, buffer.byteLength);
|
|
|
- decrypted = await decryptImported(iv, encrypted, privateKey);
|
|
|
- } catch (error: any) {
|
|
|
- // Fixed IV (old format, backward compatibility)
|
|
|
- const fixedIv = new Uint8Array(IV_LENGTH_BYTES);
|
|
|
- decrypted = await decryptImported(fixedIv, buffer, privateKey);
|
|
|
- }
|
|
|
-
|
|
|
- // We need to convert the decrypted array buffer to a string
|
|
|
- const string = new window.TextDecoder("utf-8").decode(
|
|
|
- new Uint8Array(decrypted),
|
|
|
- );
|
|
|
- data = JSON.parse(string);
|
|
|
- } else {
|
|
|
- // Legacy format
|
|
|
- data = await response.json();
|
|
|
+ const buffer = await response.arrayBuffer();
|
|
|
+
|
|
|
+ let decrypted: ArrayBuffer;
|
|
|
+ try {
|
|
|
+ // Buffer should contain both the IV (fixed length) and encrypted data
|
|
|
+ const iv = buffer.slice(0, IV_LENGTH_BYTES);
|
|
|
+ const encrypted = buffer.slice(IV_LENGTH_BYTES, buffer.byteLength);
|
|
|
+ decrypted = await decryptImported(iv, encrypted, privateKey);
|
|
|
+ } catch (error: any) {
|
|
|
+ // Fixed IV (old format, backward compatibility)
|
|
|
+ const fixedIv = new Uint8Array(IV_LENGTH_BYTES);
|
|
|
+ decrypted = await decryptImported(fixedIv, buffer, privateKey);
|
|
|
}
|
|
|
|
|
|
+ // We need to convert the decrypted array buffer to a string
|
|
|
+ const string = new window.TextDecoder("utf-8").decode(
|
|
|
+ new Uint8Array(decrypted),
|
|
|
+ );
|
|
|
+ const data: ImportedDataState = JSON.parse(string);
|
|
|
+
|
|
|
return {
|
|
|
elements: data.elements || null,
|
|
|
appState: data.appState || null,
|
|
@@ -234,7 +225,7 @@ export const loadScene = async (
|
|
|
localDataState: ImportedDataState | undefined | null,
|
|
|
) => {
|
|
|
let data;
|
|
|
- if (id != null) {
|
|
|
+ if (id != null && privateKey != null) {
|
|
|
// the private key is used to decrypt the content from the server, take
|
|
|
// extra care not to leak it
|
|
|
data = restore(
|