From e473dc8843ecdc3da0b690c7bd8b9646fe3981ab Mon Sep 17 00:00:00 2001 From: Book Pauk Date: Tue, 12 Mar 2019 23:34:41 +0700 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=20=D0=BD?= =?UTF-8?q?=D0=B0=D0=B4=20ServerStorage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/api/reader.js | 19 ++---- .../Reader/ServerStorage/ServerStorage.vue | 63 +++++++++++++++++++ client/share/utils.js | 2 +- client/store/modules/reader.js | 4 ++ 4 files changed, 73 insertions(+), 15 deletions(-) diff --git a/client/api/reader.js b/client/api/reader.js index a0b8d329..4e7a99da 100644 --- a/client/api/reader.js +++ b/client/api/reader.js @@ -1,5 +1,8 @@ +import _ from 'lodash'; import axios from 'axios'; -import {sleep} from '../share/utils'; +import {Buffer} from 'safe-buffer'; + +import * as utils from '../share/utils'; const api = axios.create({ baseURL: '/api/reader' @@ -41,7 +44,7 @@ class Reader { throw new Error(errMes); } if (i > 0) - await sleep(refreshPause); + await utils.sleep(refreshPause); i++; if (i > 120*1000/refreshPause) {//2 мин ждем телодвижений воркера @@ -116,18 +119,6 @@ class Reader { return response.data; } - - storageCheck(items) { - return this.storage({action: 'check', items}); - } - - storageGet(items) { - return this.storage({action: 'get', items}); - } - - storageSet(items, force) { - return this.storage({action: 'set', force, items}); - } } export default new Reader(); \ No newline at end of file diff --git a/client/components/Reader/ServerStorage/ServerStorage.vue b/client/components/Reader/ServerStorage/ServerStorage.vue index 20291cb8..22a09db5 100644 --- a/client/components/Reader/ServerStorage/ServerStorage.vue +++ b/client/components/Reader/ServerStorage/ServerStorage.vue @@ -7,10 +7,12 @@ import Vue from 'vue'; import Component from 'vue-class-component'; import {Buffer} from 'safe-buffer'; +import _ from 'lodash'; import bookManager from '../share/bookManager'; import readerApi from '../../../api/reader'; import * as utils from '../../../share/utils'; +import * as cryptoUtils from '../../../share/cryptoUtils'; export default @Component({ }) @@ -20,12 +22,73 @@ class ServerStorage extends Vue { } async init() { + if (!this.serverStorageKey) { + //генерируем новый ключ + this.generateNewServerStorageKey(); + } } get settings() { return this.$store.state.reader.settings; } + get serverStorageKey() { + return this.$store.state.reader.serverStorageKey; + } + + generateNewServerStorageKey() { + const key = utils.toBase58(Buffer.from(utils.randomArray(32))); + this.commit('reader/setServerStorageKey', key); + } + + async storageCheck(items) { + return this.decodeStorageItems(await readerApi.storage({action: 'check', items})); + } + + async storageGet(items) { + return this.decodeStorageItems(await readerApi.storage({action: 'get', items})); + } + + async storageSet(items, force) { + return await readerApi.storage(this.encodeStorageItems({action: 'set', force, items})); + } + + encodeStorageItems(request) { + let result = Object.assign({}, request); + let items = []; + for (const item of request.items) { + if (!_.isObject(item.data)) + throw new Error('encodeStorageItems: data is not an object'); + + let encoded = Object.assign({}, item); + + const comp = utils.pako.deflate(JSON.stringify(item.data), {level: 1}); + encoded.data = utils.toBase64(Buffer.from(comp)); + items.push(encoded); + } + + result.items = items; + return result; + } + + decodeStorageItems(response) { + let result = Object.assign({}, response); + let items = []; + for (const item of response.items) { + let decoded = Object.assign({}, item); + if (item.data) { + if (!_.isString(item.data)) + throw new Error('decodeStorageItems: data is not a string'); + + const a = utils.fromBase64(item.data); + decoded.data = JSON.parse(utils.pako.inflate(a, {to: 'string'})); + } + items.push(decoded); + } + + result.items = items; + return result; + } } //----------------------------------------------------------------------------- diff --git a/client/share/utils.js b/client/share/utils.js index 771f361c..1ae1b03b 100644 --- a/client/share/utils.js +++ b/client/share/utils.js @@ -23,7 +23,7 @@ export function hexToString(str) { export function randomArray(len) { const a = new Uint8Array(len); - crypto.getRandomValues(a); + window.crypto.getRandomValues(a); return a; } diff --git a/client/store/modules/reader.js b/client/store/modules/reader.js index 16485fa1..17d6a3f0 100644 --- a/client/store/modules/reader.js +++ b/client/store/modules/reader.js @@ -177,6 +177,7 @@ for (const font of webFonts) // initial state const state = { toolBarActive: true, + serverStorageKey: '', settings: Object.assign({}, settingDefaults), }; @@ -191,6 +192,9 @@ const mutations = { setToolBarActive(state, value) { state.toolBarActive = value; }, + setServerStorageKey(state, value) { + state.serverStorageKey = value; + }, setSettings(state, value) { state.settings = Object.assign({}, state.settings, value); }