From c8253caae933f4c7a4bafce571176e8e9bbda036 Mon Sep 17 00:00:00 2001 From: azivner Date: Wed, 25 Jul 2018 08:30:41 +0200 Subject: [PATCH] #98 proxy support for sync setup --- src/public/javascripts/setup.js | 11 +++++++---- src/routes/api/setup.js | 4 ++-- src/routes/api/sync.js | 20 ++++++++++++-------- src/services/options_init.js | 4 ++-- src/services/setup.js | 10 +++++++--- src/services/sql_init.js | 4 ++-- src/views/setup.ejs | 12 ++++++++---- 7 files changed, 40 insertions(+), 25 deletions(-) diff --git a/src/public/javascripts/setup.js b/src/public/javascripts/setup.js index b10325a51..daccd98ef 100644 --- a/src/public/javascripts/setup.js +++ b/src/public/javascripts/setup.js @@ -16,7 +16,8 @@ function SetupModel() { this.password1 = ko.observable(); this.password2 = ko.observable(); - this.serverAddress = ko.observable(); + this.syncServerHost = ko.observable(); + this.syncProxy = ko.observable(); this.instanceType = utils.isElectron() ? "desktop" : "server"; @@ -68,11 +69,12 @@ function SetupModel() { }); } else if (this.setupSyncFromServer()) { - const serverAddress = this.serverAddress(); + const syncServerHost = this.syncServerHost(); + const syncProxy = this.syncProxy(); const username = this.username(); const password = this.password1(); - if (!serverAddress) { + if (!syncServerHost) { showAlert("Trilium server address can't be empty"); return; } @@ -89,7 +91,8 @@ function SetupModel() { // not using server.js because it loads too many dependencies const resp = await $.post('/api/setup/sync-from-server', { - serverAddress: serverAddress, + syncServerHost: syncServerHost, + syncProxy: syncProxy, username: username, password: password }); diff --git a/src/routes/api/setup.js b/src/routes/api/setup.js index 297a60002..54777ef3e 100644 --- a/src/routes/api/setup.js +++ b/src/routes/api/setup.js @@ -10,9 +10,9 @@ async function setupNewDocument(req) { } async function setupSyncFromServer(req) { - const { serverAddress, username, password } = req.body; + const { syncServerHost, syncProxy, username, password } = req.body; - return await setupService.setupSyncFromSyncServer(serverAddress, username, password); + return await setupService.setupSyncFromSyncServer(syncServerHost, syncProxy, username, password); } async function setupSyncFromClient(req) { diff --git a/src/routes/api/sync.js b/src/routes/api/sync.js index cbe6e74a7..3e18c22dd 100644 --- a/src/routes/api/sync.js +++ b/src/routes/api/sync.js @@ -115,19 +115,23 @@ async function getDocument() { async function syncToServer() { log.info("Initiating sync to server"); - // FIXME: add proxy support const syncServerHost = await optionService.getOption('syncServerHost'); + const syncProxy = await optionService.getOption('syncProxy'); - const payload = { - options: await getDocumentOptions() - }; - - await rp({ + const rpOpts = { uri: syncServerHost + '/api/setup/sync-from-client', method: 'POST', json: true, - body: payload - }); + body: { + options: await getDocumentOptions() + } + }; + + if (syncProxy) { + rpOpts.proxy = syncProxy; + } + + await rp(rpOpts); // this is completely new sync, need to reset counters. If this would not be new sync, // the previous request would have failed. diff --git a/src/services/options_init.js b/src/services/options_init.js index b3b7aac90..a07314b4f 100644 --- a/src/services/options_init.js +++ b/src/services/options_init.js @@ -29,7 +29,7 @@ async function initSyncedOptions(username, password) { await passwordEncryptionService.setDataKey(password, utils.randomSecureToken(16)); } -async function initNotSyncedOptions(initialized, startNotePath = '', syncServerHost = '') { +async function initNotSyncedOptions(initialized, startNotePath = '', syncServerHost = '', syncProxy = '') { await optionService.createOption('startNotePath', startNotePath, false); await optionService.createOption('lastBackupDate', dateUtils.nowDate(), false); await optionService.createOption('dbVersion', appInfo.dbVersion, false); @@ -42,7 +42,7 @@ async function initNotSyncedOptions(initialized, startNotePath = '', syncServerH await optionService.createOption('syncServerHost', syncServerHost, false); await optionService.createOption('syncServerTimeout', 5000, false); - await optionService.createOption('syncProxy', '', false); + await optionService.createOption('syncProxy', syncProxy, false); await optionService.createOption('initialized', initialized ? 'true' : 'false', false); } diff --git a/src/services/setup.js b/src/services/setup.js index 2093a312d..f4de0b61f 100644 --- a/src/services/setup.js +++ b/src/services/setup.js @@ -14,7 +14,7 @@ function triggerSync() { }); } -async function setupSyncFromSyncServer(serverAddress, username, password) { +async function setupSyncFromSyncServer(syncServerHost, syncProxy, username, password) { if (await sqlInit.isDbInitialized()) { return { result: 'failure', @@ -27,7 +27,7 @@ async function setupSyncFromSyncServer(serverAddress, username, password) { // response is expected to contain documentId and documentSecret options const options = await rp.get({ - uri: serverAddress + '/api/sync/document', + uri: syncServerHost + '/api/sync/document', auth: { 'user': username, 'pass': password @@ -35,7 +35,11 @@ async function setupSyncFromSyncServer(serverAddress, username, password) { json: true }); - await sqlInit.createDatabaseForSync(options, serverAddress); + if (syncProxy) { + options.proxy = syncProxy; + } + + await sqlInit.createDatabaseForSync(options, syncServerHost, syncProxy); triggerSync(); diff --git a/src/services/sql_init.js b/src/services/sql_init.js index 3e06184e6..39e0a5a55 100644 --- a/src/services/sql_init.js +++ b/src/services/sql_init.js @@ -99,7 +99,7 @@ async function createInitialDatabase(username, password) { await initDbConnection(); } -async function createDatabaseForSync(options, syncServerHost = '') { +async function createDatabaseForSync(options, syncServerHost = '', syncProxy = '') { log.info("Creating database for sync"); if (await isDbInitialized()) { @@ -111,7 +111,7 @@ async function createDatabaseForSync(options, syncServerHost = '') { await sql.transactional(async () => { await sql.executeScript(schema); - await require('./options_init').initNotSyncedOptions(false, '', syncServerHost); + await require('./options_init').initNotSyncedOptions(false, '', syncServerHost, syncProxy); // document options required for sync to kick off for (const opt of options) { diff --git a/src/views/setup.ejs b/src/views/setup.ejs index 2d9c5a3f9..25f131370 100644 --- a/src/views/setup.ejs +++ b/src/views/setup.ejs @@ -68,16 +68,20 @@

Please enter Trilium server address and credentials below. This will download the whole Trilium document from server and setup sync to it. Depending on the document size and your connection speed, this may take a while.

- - + + +
+
+ +
- +
- +