@foreverrbum/ethsign
Version:
This package will allow you to electronically sign documents within your application
117 lines (101 loc) • 3.8 kB
JavaScript
import CryptoJS from 'crypto-js';
import fleekStorage from '@fleekhq/fleek-storage-js'
import { storeNotif } from './dashboard';
export const isFileWithPassword = async (fileHash) => {
// TODO: integrate storageProvider
if (!fileHash) return false;
const myFile = await fleekStorage.getFileFromHash({
hash: fileHash,
})
let decryptedDataArray;
try {
decryptedDataArray = decryptDataArrayFromStringAES(
myFile,
""
);
} catch (error) {
//doc has password
return true;
}
//doc has no password
return false;
}
const getFileArrayFL = async (password, fileHash, returnPromise, formatMessage) => {
const myFile = await fleekStorage.getFileFromHash({
hash: fileHash,
})
let decryptedDataArray;
try {
decryptedDataArray = decryptDataArrayFromStringAES(
myFile,
password
);
} catch (error) {
storeNotif(formatMessage({id: 'INVALID_PASSWORD'}), formatMessage({id: 'PASSWORD_ENTERED_UNABLE_TO_DECRYPT'}), 'danger')
return false;
}
if(returnPromise){
return Promise.resolve(decryptedDataArray)
}else{
return decryptedDataArray
}
}
export const getFileArray = async (password, fileHash, storageProvider, returnPromise, formatMessage) => {
if (!fileHash) return false;
if (storageProvider='FL'){
const decryptedDataArray = await getFileArrayFL(password, fileHash, returnPromise, formatMessage);
return(decryptedDataArray);
}else if (storageProvider == 'IP'){
// TODO: add getFileArrayIP code and add chinese transalations
}else{
storeNotif(formatMessage({id: 'ERROR'}), formatMessage({id: 'NO_DOCUMENT_FOUND'}), 'danger')
return false;
}
}
export const getCommentArrs = async (commentData, password, formatMessage) => {
return Promise.all(commentData.map(comment => getFileArray(password, comment.commentHash, comment.provider, true, formatMessage)))
}
export const downloadFile = async (password, fileHash, name, close, storageProvider, formatMessage) => {
const decryptedDataArray = await getFileArray(password, fileHash, storageProvider, false, formatMessage)
if (decryptedDataArray != false) {
createAndDownloadBlobFile(
decryptedDataArray,
name
);
storeNotif(formatMessage({id: 'DOWNLOAD'}), formatMessage({id: 'DOWNLOAD_STARTING'}), 'info')
close();
} else {
return false;
}
}
function decryptDataArrayFromStringAES(encryptedString, password) {
if (password == undefined) password = "";
const bytes = CryptoJS.AES.decrypt(encryptedString, password);
const decrypted = JSON.parse(bytes.toString(CryptoJS.enc.Utf8));
const decryptedDataArray = new Uint8Array(decrypted.data);
return decryptedDataArray;
}
export const createAndDownloadBlobFile = (body, fileName) => {
const blob = new Blob([body]);
downloadBlob(blob, fileName);
}
export const downloadBlob = (blob, fileName) => {
if (navigator.msSaveBlob) {
// IE 10+
navigator.msSaveBlob(blob, fileName);
} else {
const link = document.createElement('a');
// Browsers that support HTML5 download attribute
if (link.download !== undefined) {
const url = URL.createObjectURL(blob);
link.setAttribute('href', url);
// link.setAttribute('download', fileName);
link.setAttribute('target', '_blank');
link.style.visibility = 'hidden';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
}
}
export default { downloadFile, getFileArray, isFileWithPassword, downloadBlob}