feat(storage-manager): store encryption info per location
This commit is contained in:
parent
8bee033efa
commit
8122ab10b0
@ -19,7 +19,8 @@ export class StorageManager {
|
|||||||
|
|
||||||
_options;
|
_options;
|
||||||
_global;
|
_global;
|
||||||
_encryptionKey;
|
|
||||||
|
_encryptionKey = {};
|
||||||
|
|
||||||
constructor(namespace, version, options) {
|
constructor(namespace, version, options) {
|
||||||
this.namespace = namespace;
|
this.namespace = namespace;
|
||||||
@ -43,30 +44,11 @@ export class StorageManager {
|
|||||||
else
|
else
|
||||||
throw new Error('Cannot setup StorageManager without window or global');
|
throw new Error('Cannot setup StorageManager without window or global');
|
||||||
|
|
||||||
// TODO handle salt and timestamp separately per location
|
|
||||||
if (this._options.encryption) {
|
if (this._options.encryption) {
|
||||||
const requestBody = {
|
Object.values(LOCATION).forEach((location) => {
|
||||||
type : this._options.encryption,
|
const encryption = this._options.encryption.all || this._options.encryption[location];
|
||||||
length : 42,
|
if (encryption) this._requestStorageKey({ location: location, encryption: encryption });
|
||||||
...this.load('encryption'),
|
});
|
||||||
};
|
|
||||||
this._global.App.httpClient.post({
|
|
||||||
url: '../../../../../../user/storage-key', // TODO use APPROOT instead
|
|
||||||
headers: {
|
|
||||||
'Content-Type' : HttpClient.ACCEPT.JSON,
|
|
||||||
'Accept' : HttpClient.ACCEPT.JSON,
|
|
||||||
},
|
|
||||||
body: JSON.stringify(requestBody),
|
|
||||||
}).then(
|
|
||||||
(response) => response.json()
|
|
||||||
).then((response) => {
|
|
||||||
console.log('storage-manager got key from response:', response);
|
|
||||||
if (response.salt !== requestBody.salt || response.timestamp !== requestBody.timestamp) {
|
|
||||||
this.clear();
|
|
||||||
}
|
|
||||||
this.save('encryption', { salt: response.salt, timestamp: response.timestamp });
|
|
||||||
this._encryptionKey = response.key;
|
|
||||||
}).catch(console.error);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -149,6 +131,7 @@ export class StorageManager {
|
|||||||
|
|
||||||
return this._saveToLocalStorage(val);
|
return this._saveToLocalStorage(val);
|
||||||
}
|
}
|
||||||
|
// TODO add LOCATION.SESSION
|
||||||
case LOCATION.WINDOW: {
|
case LOCATION.WINDOW: {
|
||||||
let val = this._getFromWindow();
|
let val = this._getFromWindow();
|
||||||
|
|
||||||
@ -173,6 +156,7 @@ export class StorageManager {
|
|||||||
switch (location) {
|
switch (location) {
|
||||||
case LOCATION.LOCAL:
|
case LOCATION.LOCAL:
|
||||||
return this._clearLocalStorage();
|
return this._clearLocalStorage();
|
||||||
|
// TODO add LOCATION.SESSION
|
||||||
case LOCATION.WINDOW:
|
case LOCATION.WINDOW:
|
||||||
return this._clearWindow();
|
return this._clearWindow();
|
||||||
default:
|
default:
|
||||||
@ -302,4 +286,34 @@ export class StorageManager {
|
|||||||
_clearSessionStorage() {
|
_clearSessionStorage() {
|
||||||
window.sessionStorage.removeItem(this.namespace);
|
window.sessionStorage.removeItem(this.namespace);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_requestStorageKey(options=this._options) {
|
||||||
|
if (!(options && options.location && options.encryption))
|
||||||
|
throw new Error('Storage Manager cannot request storage key with unsupported options!');
|
||||||
|
|
||||||
|
const requestBody = {
|
||||||
|
type : options.encryption,
|
||||||
|
length : 42,
|
||||||
|
...this.load('encryption', options),
|
||||||
|
};
|
||||||
|
|
||||||
|
this._global.App.httpClient.post({
|
||||||
|
url: '../../../../../../user/storage-key', // TODO use APPROOT instead
|
||||||
|
headers: {
|
||||||
|
'Content-Type' : HttpClient.ACCEPT.JSON,
|
||||||
|
'Accept' : HttpClient.ACCEPT.JSON,
|
||||||
|
},
|
||||||
|
body: JSON.stringify(requestBody),
|
||||||
|
}).then(
|
||||||
|
(response) => response.json()
|
||||||
|
).then((response) => {
|
||||||
|
console.log('storage-manager got key from response:', response, 'with options:', options);
|
||||||
|
if (response.salt !== requestBody.salt || response.timestamp !== requestBody.timestamp) {
|
||||||
|
this.clear(options);
|
||||||
|
}
|
||||||
|
this.save('encryption', { salt: response.salt, timestamp: response.timestamp }, options);
|
||||||
|
this._encryptionKey[options.location] = response.key;
|
||||||
|
}).catch(console.error);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -64,7 +64,7 @@ export class ExamCorrect {
|
|||||||
this._element = element;
|
this._element = element;
|
||||||
this._app = app;
|
this._app = app;
|
||||||
|
|
||||||
this._storageManager = new StorageManager('EXAM_CORRECT', '0.0.0', { location: LOCATION.SESSION, encryption: { tag: 'exam-correct', exam: this._element.getAttribute('uw-exam-correct') } });
|
this._storageManager = new StorageManager('EXAM_CORRECT', '0.0.0', { location: LOCATION.SESSION, encryption: { all: { tag: 'exam-correct', exam: this._element.getAttribute('uw-exam-correct') } } });
|
||||||
|
|
||||||
this._sendBtn = document.getElementById(EXAM_CORRECT_SEND_BTN_ID);
|
this._sendBtn = document.getElementById(EXAM_CORRECT_SEND_BTN_ID);
|
||||||
this._userInput = document.getElementById(EXAM_CORRECT_USER_INPUT_ID);
|
this._userInput = document.getElementById(EXAM_CORRECT_USER_INPUT_ID);
|
||||||
|
|||||||
Reference in New Issue
Block a user