From da3bf022e8ac936eb5517310011bb0cdfd8059d4 Mon Sep 17 00:00:00 2001 From: Kristijan Mitrovic Date: Wed, 2 Sep 2020 01:45:15 +0200 Subject: [PATCH] Add UI support for restoring from backup package --- src/_services/user.service.js | 9 ++++++ src/_store/account.module.js | 6 ++++ src/auth/RestorePage.vue | 58 ++++++++++++++++++++++++++--------- 3 files changed, 59 insertions(+), 14 deletions(-) diff --git a/src/_services/user.service.js b/src/_services/user.service.js index 87ace74..c5dc559 100644 --- a/src/_services/user.service.js +++ b/src/_services/user.service.js @@ -10,6 +10,7 @@ export const userService = { appLogin, logout, restore, + restoreFromPackage, forgotPassword, register, searchAccounts, @@ -77,6 +78,14 @@ function restore(shortKey, longKey, password, messages, errors) { .then(handleAuthResponse(messages, errors)); } +function restoreFromPackage(shortKey, backupFileRef, password, messages, errors) { + let formData = new FormData(); + formData.append('file', backupFileRef); + formData.append('password', password); + return fetch(`${config.apiUrl}/auth/restore/apply/${shortKey}`, util.putWithAuth(formData)) + .then(util.handleAuthResponse(messages, errors)); +} + function logout(messages, errors) { if (util.currentUser() === null) { console.log('userService.logout: already logged out'); diff --git a/src/_store/account.module.js b/src/_store/account.module.js index 81360f6..a20293e 100644 --- a/src/_store/account.module.js +++ b/src/_store/account.module.js @@ -164,6 +164,12 @@ const actions = { (error) => commit('restoreFailure', systemConfigs, error) ); }, + restoreFromPackage({ commit }, { shortKey, backupFileRef, password, systemConfigs, messages, errors }) { + commit('restoreRequest', systemConfigs); + userService.restoreFromPackage(shortKey, backupFileRef, password, messages, errors) + .then(ok => commit('restoreSuccess', systemConfigs), + error => commit('restoreFailure', systemConfigs, error)); + }, forgotPassword({ commit }, { username, messages, errors }) { commit('forgotPasswordRequest'); return userService.forgotPassword(username, messages, errors).then( diff --git a/src/auth/RestorePage.vue b/src/auth/RestorePage.vue index 5b87eec..88605f3 100644 --- a/src/auth/RestorePage.vue +++ b/src/auth/RestorePage.vue @@ -24,15 +24,29 @@ -
- - -
- {{ messages.err_restoreLongNetworkKey_required }} +
+
+ + +
+ {{ errors.first('restoreLongNetworkKey') }} +
+
+ {{ messages.label_or }} +
+ + +
+ {{ errors.first('restoreLongNetworkKey') }} +
-
- {{ errors.first('restoreLongNetworkKey') }} + +
+ {{ messages.err_restoreFile_constraint }}
@@ -68,6 +82,7 @@ export default { return { restoreShortKey: (this.$route.query && this.$route.query.k) ? this.$route.query.k : null, restoreLongNetworkKey: null, + restoreBackupPackageFileRef: null, password: '', submitted: false, loadingImgSrc: loadingImgSrc @@ -78,25 +93,40 @@ export default { }, computed: { ...mapState('account', [ 'status' ]), - ...mapState('system', [ 'configs', 'messages' ]) + ...mapState('system', [ 'configs', 'messages' ]), + fileFieldsConstaintFailed() { + // only and exactly 1 file may be uploaded - either file including long network key, or full backup package + return this.submitted && ((!this.restoreLongNetworkKey && !this.restoreBackupPackageFileRef) + || (this.restoreLongNetworkKey && this.restoreBackupPackageFileRef)) + } }, methods: { - ...mapActions('account', [ 'restore' ]), + ...mapActions('account', [ 'restore', 'restoreFromPackage' ]), ...mapActions('system', [ 'loadSystemConfigs' ]), handleSubmit (e) { this.errors.clear(); const { restoreShortKey, password } = this; this.submitted = true; - this.restore({ - shortKey: restoreShortKey, longKey: this.restoreLongNetworkKey, password: password, - systemConfigs: this.configs, messages: this.messages, errors: this.errors - }); + if (this.restoreLongNetworkKey) { + this.restore({ + shortKey: restoreShortKey, longKey: this.restoreLongNetworkKey, password: password, + systemConfigs: this.configs, messages: this.messages, errors: this.errors + }); + } else { + this.restoreFromPackage({ + shortKey: restoreShortKey, backupFileRef: this.restoreBackupPackageFileRef, password: password, + systemConfigs: this.configs, messages: this.messages, errors: this.errors + }); + } }, readUploadedKeyFile() { var uploadedFile = this.$refs.restoreLongNetworkKeyFile.files[0]; var reader = new FileReader(); reader.onload = (event) => this.restoreLongNetworkKey = event.target.result; reader.readAsText(uploadedFile); + }, + setBackupFileForUpload() { + this.restoreBackupPackageFileRef = this.$refs.restoreBackupPackageFile.files[0]; } } };