templateGen/js/2.0.3/storage.js
2023-11-10 23:13:18 +01:00

355 lines
9.0 KiB
JavaScript

import XORCipher from "./xorc.js";
import sha256 from "./sha256.min.js";
import { cyrb53, getCurrentDate, passwordHash, sanitize } from "./scripts.js";
const store = {
getItem: function (key) {
return debug("GET", key, getStor().getItem(sha256(key + activeState.userId)));
},
setItem: function (key, data) {
debug("SET", key, "setItem: "+data);
getStor().setItem(sha256(key + activeState.userId), data);
},
removeItem: function (key) {
getStor().removeItem(sha256(key + activeState.userId));
},
clear: function () {
getStor().clear();
},
};
const tempStore = {
setItem: function (key, data) {
globalThis.activeState.storage[key] = data;
},
getItem: function (key) {
return globalThis.activeState.storage[key];
},
removeItem: function (key) {
globalThis.activeState.storage[key] = "";
},
clear: function () {
globalThis.activeState.storage = [];
},
};
function getStor() {
if (window.activeState.settings.persistentStorage == "true") {
return window.localStorage;
} else {
return tempStore;
}
}
function debug(mode, key, data) {
if (activeState.settings.debug == "false") return data;
console.log({
mode: mode,
key: key,
data: (data != null) ? data.substring(0,10): "",
persistent: activeState.settings.persistentStorage
});
return data;
}
function createStorageObj(ref = "none") {
let x = document.getElementById("mainFormObj");
let dataArray = [];
if (x == null) {
return;
}
for (let i = 0; i < x.length; i++) {
dataArray.push({
value: x.elements[i].value,
name: x.elements[i].name,
});
}
//console.log(this, dataArray);
//set current filename according to filenamefield
setCurrentFileName();
//set savetime in templateFiles
setTimeStamp(ref);
storeData("userInput", dataArray);
}
function storeData(name, data) {
if (passwordHash == "") return;
data = JSON.stringify(data);
//setCookie(name, btoa(data), 7);
if (name == "userInput") {
name = getFileName();
}
if (name == "userInputForce") {
name = "userInput";
}
let lT = activeState.loadedTemplate;
let key = name + "_m21_" + lT;
if (name == "templateFiles") {
key = name + "_m21_" + activeState.userId;
}
store.setItem(key, obfuscate(data));
}
function retrieveData(name, template = "none") {
if (passwordHash == "") return null;
if (name == "userInput") {
if (activeState.fileName != "") {
name = activeState.fileName;
} else {
return [];
}
}
if (name == "userInputForce") {
name = "userInput";
}
let cdata;
let key;
if (template == "none") {
let lT = activeState.loadedTemplate;
key = name + "_m21_" + lT;
if (name == "templateFiles") {
key = name + "_m21_" + activeState.userId;
}
} else {
key = name + "_m21_" + template;
}
cdata = store.getItem(key);
if (cdata != null) {
cdata = obfuscate(cdata, false);
let data;
try {
data = JSON.parse(cdata);
} catch (e) {
data = null;
}
return data;
} else {
return [];
}
}
function clearData(name, template = "none") {
let lT;
let key;
if (name == "userInputForce") name = "userInput";
if (template == "none") {
lT = activeState.loadedTemplate;
key = name + "_m21_" + lT;
if (name == "templateFiles") {
key = name + "_m21_" + activeState.userId;
}
} else {
lT = template;
key = name + "_m21_" + template;
}
store.removeItem(key);
}
function getFileName() {
let currentFileName = activeState.fileName;
let lT = activeState.loadedTemplate;
if (currentFileName == "none" || currentFileName == "") {
let date = getCurrentDate();
currentFileName = date.current_time + "_" + date.current_date + " " + lT;
//console.log(currentFileName);
}
let tF = retrieveData("templateFiles");
const metadata = {
ts_create: getCurrentDate(),
ts_save: "",
ts_copy: "",
ts_edit: "",
id: cyrb53(currentFileName),
editor: (activeState.settings.enablePell == "true") ? "pell": "textarea"
};
if (tF.length != 0) {
for (let tFi of tF) {
if (tFi.fileName == currentFileName) {
return currentFileName;
}
}
tF.push({
fileName: currentFileName,
template: lT,
metadata: metadata,
pos: tF.length,
});
} else {
tF = [
{ fileName: currentFileName, template: lT, metadata: metadata, pos: 0 },
];
}
storeData("templateFiles", tF);
activeState.fileName = currentFileName;
return currentFileName;
}
function obfuscate(data, mode = true) {
if ((data == null) | (data == "")) return "";
if (mode) {
return XORCipher.encode(passwordHash, data);
} else {
return XORCipher.decode(passwordHash, data);
}
}
function popFromTemplateFiles(fileName) {
let tF = retrieveData("templateFiles");
let newArray = [];
for (let obj of tF) {
if (obj.fileName != fileName) {
newArray.push(obj);
}
}
storeData("templateFiles", newArray);
}
function createBookShelf() {
let tF = retrieveData("templateFiles");
let bookShelf = {};
let date = getCurrentDate();
let saveFileName = date.current_time + "_" + date.current_date;
if (tF != null) {
bookShelf[0] = { name: "hash", data: activeState.userId, ts: saveFileName };
let i = 1;
for (let tFi of tF) {
let data = retrieveData(tFi.fileName, tFi.template);
bookShelf[i] = {};
bookShelf[i].name = tFi.fileName + "_m21_" + tFi.template;
if (activeState.settings.localOnly == "true") {
bookShelf[i].data = data;
} else {
bookShelf[i].data = obfuscate(data);
}
i++;
}
}
return bookShelf;
}
function importBookShelf() {
localStorage.clear();
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200) {
if (this.responseText == "none") {
console.log("no files saved on server");
} else {
let respText = decodeURIComponent(this.responseText);
let mainArray = JSON.parse(respText);
let templateFilesArray = [];
for (let file of mainArray) {
if (file.name == "hash") continue;
store.setItem(file.name, file.data);
templateFilesArray.push({
fileName: file.name.split("_m21_")[0],
template: file.name.split("_m21_")[1],
});
}
store.setItem(
"templateFiles_m21_" + activeState.userId,
obfuscate(JSON.stringify(templateFilesArray))
);
}
}
};
xhttp.open("GET", "php/?getStoredFiles=" + activeState.userId, true);
xhttp.setRequestHeader(
"Content-type",
"application/x-www-form-urlencoded; charset=UTF-8"
);
xhttp.send();
}
function storeSettings(data, get = false) {
let key = "settings_m21_" + activeState.userId;
if (get) {
let cdata = "";
if (data == "getInit") {
activeState.settings.persistentStorage = "true";
}
try {
cdata = JSON.parse(obfuscate(store.getItem(key), false));
} catch (e) {
cdata = "";
}
if (data == "getInit") {
activeState.settings.persistentStorage = "false";
}
return cdata;
} else {
store.setItem(key, obfuscate(JSON.stringify(data)));
}
}
function clearStorage() {
store.clear();
}
function setCurrentFileName() {
activeState.fileName = "";
let userFileNameField = document.getElementById("userFileName");
let userFileName = sanitize(userFileNameField.value);
let userFileNamePH = userFileNameField.getAttribute("placeholder");
if (userFileName.length != 0) {
activeState.fileName = userFileName;
//clear old data as file switches to new filename
if (userFileNamePH.length != 0) {
clearData(userFileNamePH);
popFromTemplateFiles(userFileNamePH);
}
} else if (userFileNamePH.length != 0) {
activeState.fileName = userFileNamePH;
}
}
function setTimeStamp(type) {
if (activeState.fileName != "") {
let tF = retrieveData("templateFiles");
if (tF.length != 0) {
let c = 0;
for (let tFi of tF) {
if (tFi.fileName == activeState.fileName) {
switch (type) {
case "save":
tF[c].metadata.ts_save = getCurrentDate();
break;
case "copy":
console.log("copy");
tF[c].metadata.ts_copy = getCurrentDate();
break;
case "edit":
tF[c].metadata.ts_edit = getCurrentDate();
break;
}
storeData("templateFiles", tF);
}
c += 1;
}
}
}
}
export {
createStorageObj,
storeData,
retrieveData,
clearData,
getFileName,
createBookShelf,
importBookShelf,
storeSettings,
clearStorage,
setCurrentFileName,
setTimeStamp
};