import {makeFetch} from "../../../../../ChillMainBundle/Resources/public/lib/api/apiMethods"; import {PostStoreObjectSignature, StoredObject} from "../../types"; const algo = 'AES-CBC'; const URL_POST = '/asyncupload/temp_url/generate/post'; const keyDefinition = { name: algo, length: 256 }; const createFilename = (): string => { var text = ""; var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; for (let i = 0; i < 7; i++) { text += possible.charAt(Math.floor(Math.random() * possible.length)); } return text; }; /** * Fetches a new stored object from the server. * * @async * @function fetchNewStoredObject * @returns {Promise} A Promise that resolves to the newly created StoredObject. */ export const fetchNewStoredObject = async (): Promise => { return makeFetch("POST", '/api/1.0/doc-store/stored-object/create', null); } export const uploadVersion = async (uploadFile: ArrayBuffer, storedObject: StoredObject): Promise => { const params = new URLSearchParams(); params.append('expires_delay', "180"); params.append('submit_delay', "180"); const asyncData: PostStoreObjectSignature = await makeFetch("GET", `/api/1.0/doc-store/async-upload/temp_url/${storedObject.uuid}/generate/post` + "?" + params.toString()); const suffix = createFilename(); const filename = asyncData.prefix + suffix; const formData = new FormData(); formData.append("redirect", asyncData.redirect); formData.append("max_file_size", asyncData.max_file_size.toString()); formData.append("max_file_count", asyncData.max_file_count.toString()); formData.append("expires", asyncData.expires.toString()); formData.append("signature", asyncData.signature); formData.append(filename, new Blob([uploadFile]), suffix); const response = await window.fetch(asyncData.url, { method: "POST", body: formData, }) if (!response.ok) { console.error("Error while sending file to store", response); throw new Error(response.statusText); } return Promise.resolve(filename); } export const encryptFile = async (originalFile: ArrayBuffer): Promise<[ArrayBuffer, Uint8Array, JsonWebKey]> => { const iv = crypto.getRandomValues(new Uint8Array(16)); const key = await window.crypto.subtle.generateKey(keyDefinition, true, [ "encrypt", "decrypt" ]); const exportedKey = await window.crypto.subtle.exportKey('jwk', key); const encrypted = await window.crypto.subtle.encrypt({ name: algo, iv: iv}, key, originalFile); return Promise.resolve([encrypted, iv, exportedKey]); };