Selaa lähdekoodia

Работа над ServerStorage

Book Pauk 6 vuotta sitten
vanhempi
commit
3a46a157f9

+ 20 - 7
client/components/Reader/ServerStorage/ServerStorage.vue

@@ -17,6 +17,9 @@ const maxSetTries = 5;
 
 export default @Component({
     watch: {
+        serverStorageKey: function() {
+            this.serverStorageKeyChanged();
+        },
         profiles: function() {
             this.saveProfiles();
         },
@@ -25,17 +28,27 @@ export default @Component({
 class ServerStorage extends Vue {
     created() {
         this.commit = this.$store.commit;
+        this.prevServerStorageKey = null;
+        this.$root.$on('generateNewServerStorageKey', () => {this.generateNewServerStorageKey()});
     }
 
     async init() {
         if (!this.serverStorageKey) {
             //генерируем новый ключ
-            this.generateNewServerStorageKey();
+            await this.generateNewServerStorageKey();
+        } else {
+            await this.serverStorageKeyChanged();
         }
-        this.hashedStorageKey = utils.toBase58(cryptoUtils.sha256(this.serverStorageKey));
+    }
 
-        await this.loadProfiles();
-        this.checkCurrentProfile();
+    async serverStorageKeyChanged() {
+        if (this.prevServerStorageKey != this.serverStorageKey) {
+            this.prevServerStorageKey = this.serverStorageKey;
+            this.hashedStorageKey = utils.toBase58(cryptoUtils.sha256(this.serverStorageKey));
+
+            await this.loadProfiles();
+            this.checkCurrentProfile();
+        }
     }
 
     get serverSyncEnabled() {
@@ -94,11 +107,10 @@ class ServerStorage extends Vue {
             if (prof.rev == 0)
                 prof.data = {};
 
+            this.oldProfiles = prof.data;
             this.commit('reader/setProfiles', prof.data);
             this.commit('reader/setProfilesRev', prof.rev);
 
-            this.oldProfiles = this.profiles;
-
             this.notifySuccessIfNeeded(oldRev, prof.rev);
         } else {
             this.warning(`Неверный ответ сервера: ${prof.state}`);
@@ -142,9 +154,10 @@ class ServerStorage extends Vue {
         }
     }
 
-    generateNewServerStorageKey() {
+    async generateNewServerStorageKey() {
         const key = utils.toBase58(utils.randomArray(32));
         this.commit('reader/setServerStorageKey', key);
+        await this.serverStorageKeyChanged();
     }
 
     async storageCheck(items) {

+ 19 - 2
client/components/Reader/SettingsPage/SettingsPage.vue

@@ -10,7 +10,7 @@
                     <!-- Профили ------------------------------------------------------------------------->
                     <el-tab-pane label="Профили">
                         <el-form :model="form" size="small" label-width="80px" @submit.native.prevent>
-                            <div class="partHeader">Управление синхронизацией настроек</div>
+                            <div class="partHeader">Управление синхронизацией данных</div>
                             <el-form-item label="">
                                 <el-checkbox v-model="serverSyncEnabled">Включить синхронизацию с сервером</el-checkbox>
                             </el-form-item>
@@ -51,7 +51,7 @@
                             <el-form-item label="">
                                 <div class="text">
                                     Ключ доступа позволяет восстановить профили с настройками и список читаемых книг.
-                                    Для этого необходимо передать ключ на устройство через почту, мессенджер или другим способом.
+                                    Для этого необходимо передать ключ на новое устройство через почту, мессенджер или другим способом.
                                 </div>
                             </el-form-item>
 
@@ -729,6 +729,23 @@ class SettingsPage extends Vue {
     }
 
     async generateServerStorageKey() {
+        try {
+            const result = await this.$prompt(`<b>Предупреждение!</b> Изменение ключа доступа приведет к потере всех профилей и читаемых книг, привязанных к предыдущему ключу.` +
+                    `<br><br>Введите 'да' для подтверждения генерации нового ключа:`, '', {
+                dangerouslyUseHTMLString: true,
+                confirmButtonText: 'OK',
+                cancelButtonText: 'Отмена',
+                inputValidator: (str) => { if (str && str.toLowerCase() === 'да') return true; else return 'Генерация не подтверждена'; },
+                type: 'warning'
+            });
+
+            if (result.value && result.value.toLowerCase() == 'да') {
+                this.$root.$emit('generateNewServerStorageKey');
+            }
+        } catch (e) {
+            //
+        }
+
     }
 
     keyHook(event) {