diff --git a/frontend/src/lib/storage-manager/storage-manager.js b/frontend/src/lib/storage-manager/storage-manager.js index 5ddc1c566..01ff44580 100644 --- a/frontend/src/lib/storage-manager/storage-manager.js +++ b/frontend/src/lib/storage-manager/storage-manager.js @@ -19,7 +19,8 @@ export class StorageManager { _options; _global; - _encryptionKey; + + _encryptionKey = {}; constructor(namespace, version, options) { this.namespace = namespace; @@ -43,30 +44,11 @@ export class StorageManager { else throw new Error('Cannot setup StorageManager without window or global'); - // TODO handle salt and timestamp separately per location if (this._options.encryption) { - const requestBody = { - type : this._options.encryption, - length : 42, - ...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); + Object.values(LOCATION).forEach((location) => { + const encryption = this._options.encryption.all || this._options.encryption[location]; + if (encryption) this._requestStorageKey({ location: location, encryption: encryption }); + }); } } @@ -149,6 +131,7 @@ export class StorageManager { return this._saveToLocalStorage(val); } + // TODO add LOCATION.SESSION case LOCATION.WINDOW: { let val = this._getFromWindow(); @@ -173,6 +156,7 @@ export class StorageManager { switch (location) { case LOCATION.LOCAL: return this._clearLocalStorage(); + // TODO add LOCATION.SESSION case LOCATION.WINDOW: return this._clearWindow(); default: @@ -302,4 +286,34 @@ export class StorageManager { _clearSessionStorage() { 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); + } + } diff --git a/frontend/src/utils/exam-correct/exam-correct.js b/frontend/src/utils/exam-correct/exam-correct.js index 13a73f821..e3c531f4a 100644 --- a/frontend/src/utils/exam-correct/exam-correct.js +++ b/frontend/src/utils/exam-correct/exam-correct.js @@ -64,7 +64,7 @@ export class ExamCorrect { this._element = element; 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._userInput = document.getElementById(EXAM_CORRECT_USER_INPUT_ID);