From f13c28db739053cd4bd65160dab3c29fe4fdd7b4 Mon Sep 17 00:00:00 2001 From: Zhongyi Tong Date: Tue, 15 Aug 2017 16:58:26 -0400 Subject: [PATCH 1/4] Generate stored icon path using url hash. --- app/renderer/js/utils/domain-util.js | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/app/renderer/js/utils/domain-util.js b/app/renderer/js/utils/domain-util.js index c3e498a0..7a585fe2 100644 --- a/app/renderer/js/utils/domain-util.js +++ b/app/renderer/js/utils/domain-util.js @@ -162,14 +162,8 @@ class DomainUtil { saveServerIcon(url) { // The save will always succeed. If url is invalid, downgrade to default icon. - const dir = `${app.getPath('userData')}/server-icons`; - - if (!fs.existsSync(dir)) { - fs.mkdirSync(dir); - } - return new Promise(resolve => { - const filePath = `${dir}/${new Date().getMilliseconds()}${path.extname(url).split('?')[0]}`; + const filePath = this.generateFilePath(url); const file = fs.createWriteStream(filePath); try { request(url).on('response', response => { @@ -194,6 +188,25 @@ class DomainUtil { reloadDB() { this.db = new JsonDB(app.getPath('userData') + '/domain.json', true, true); } + + generateFilePath(url) { + const dir = `${app.getPath('userData')}/server-icons`; + const extension = path.extname(url).split('?')[0]; + + let hash = 5381; + let len = url.length; + + while(len) { + hash = (hash * 33) ^ url.charCodeAt(--len) + } + + // Create 'server-icons' directory if not existed + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir); + } + + return `${dir}/${hash >>> 0}${extension}`; + } } module.exports = new DomainUtil(); From 48b829b77138db38f0dd547d8442253dd4e303a4 Mon Sep 17 00:00:00 2001 From: Zhongyi Tong Date: Tue, 15 Aug 2017 17:41:23 -0400 Subject: [PATCH 2/4] Lazy update server settings on reload. --- app/renderer/js/main.js | 1 + app/renderer/js/utils/domain-util.js | 60 +++++++++++++++++++--------- 2 files changed, 43 insertions(+), 18 deletions(-) diff --git a/app/renderer/js/main.js b/app/renderer/js/main.js index 3f98f19b..132aced0 100644 --- a/app/renderer/js/main.js +++ b/app/renderer/js/main.js @@ -49,6 +49,7 @@ class ServerManagerView { if (servers.length > 0) { for (let i = 0; i < servers.length; i++) { this.initServer(servers[i], i); + DomainUtil.updateSavedServer(servers[i].url, i); } this.activateTab(0); } else { diff --git a/app/renderer/js/utils/domain-util.js b/app/renderer/js/utils/domain-util.js index 7a585fe2..06c2bf64 100644 --- a/app/renderer/js/utils/domain-util.js +++ b/app/renderer/js/utils/domain-util.js @@ -45,6 +45,11 @@ class DomainUtil { return this.db.getData(`/domains[${index}]`); } + updateDomain(index, server) { + this.reloadDB(); + this.db.push(`/domains[${index}]`, server, true); + } + addDomain(server) { return new Promise(resolve => { if (server.icon) { @@ -84,8 +89,8 @@ class DomainUtil { return false; } - checkDomain(domain) { - if (this.duplicateDomain(domain)) { + checkDomain(domain, silent = false) { + if (silent && this.duplicateDomain(domain)) { alert('This Server Address already exists.'); return; } @@ -117,22 +122,30 @@ class DomainUtil { resolve(serverConf); }); } else if (certsError.indexOf(error.toString()) >= 0) { - dialog.showMessageBox({ - type: 'question', - buttons: ['Yes', 'No'], - defaultId: 0, - message: `Do you trust certificate from ${domain}? \n ${error}` - }, response => { - if (response === 0) { - this.getServerSettings(domain).then(serverSettings => { - resolve(serverSettings); - }, () => { - resolve(serverConf); - }); - } else { - reject('Untrusted Certificate.'); - } - }); + if (silent) { + this.getServerSettings(domain).then(serverSettings => { + resolve(serverSettings); + }, () => { + resolve(serverConf); + }); + } else { + dialog.showMessageBox({ + type: 'question', + buttons: ['Yes', 'No'], + defaultId: 0, + message: `Do you trust certificate from ${domain}? \n ${error}` + }, response => { + if (response === 0) { + this.getServerSettings(domain).then(serverSettings => { + resolve(serverSettings); + }, () => { + resolve(serverConf); + }); + } else { + reject('Untrusted Certificate.'); + } + }); + } } else { reject('Not a valid Zulip server'); } @@ -185,6 +198,17 @@ class DomainUtil { }); } + updateSavedServer(url, index) { + // Does not promise successful update + this.checkDomain(url, false).then(newServerConf => { + this.saveServerIcon(newServerConf.icon).then(localIconUrl => { + newServerConf.icon = localIconUrl; + this.updateDomain(index, newServerConf); + this.reloadDB(); + }); + }); + } + reloadDB() { this.db = new JsonDB(app.getPath('userData') + '/domain.json', true, true); } From 965b55ba5f3c12ccf2de5388a85c8ad20fca2d3a Mon Sep 17 00:00:00 2001 From: Zhongyi Tong Date: Wed, 16 Aug 2017 12:48:31 -0400 Subject: [PATCH 3/4] Fix regression of avoiding duplicated servers. --- app/renderer/js/main.js | 2 +- app/renderer/js/utils/domain-util.js | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/app/renderer/js/main.js b/app/renderer/js/main.js index 132aced0..0837255f 100644 --- a/app/renderer/js/main.js +++ b/app/renderer/js/main.js @@ -49,7 +49,7 @@ class ServerManagerView { if (servers.length > 0) { for (let i = 0; i < servers.length; i++) { this.initServer(servers[i], i); - DomainUtil.updateSavedServer(servers[i].url, i); + DomainUtil.updateSavedServer(servers[i].url, i); } this.activateTab(0); } else { diff --git a/app/renderer/js/utils/domain-util.js b/app/renderer/js/utils/domain-util.js index 06c2bf64..5d395582 100644 --- a/app/renderer/js/utils/domain-util.js +++ b/app/renderer/js/utils/domain-util.js @@ -90,8 +90,9 @@ class DomainUtil { } checkDomain(domain, silent = false) { - if (silent && this.duplicateDomain(domain)) { - alert('This Server Address already exists.'); + if (!silent && this.duplicateDomain(domain)) { + // Do not check duplicate in silent mode + alert('This server has been added.'); return; } @@ -200,7 +201,7 @@ class DomainUtil { updateSavedServer(url, index) { // Does not promise successful update - this.checkDomain(url, false).then(newServerConf => { + this.checkDomain(url, true).then(newServerConf => { this.saveServerIcon(newServerConf.icon).then(localIconUrl => { newServerConf.icon = localIconUrl; this.updateDomain(index, newServerConf); @@ -220,8 +221,8 @@ class DomainUtil { let hash = 5381; let len = url.length; - while(len) { - hash = (hash * 33) ^ url.charCodeAt(--len) + while (len) { + hash = (hash * 33) ^ url.charCodeAt(--len); } // Create 'server-icons' directory if not existed From c2fab2c7bc7ab6ee5c29f5cae6ed520b76bee5b4 Mon Sep 17 00:00:00 2001 From: Zhongyi Tong Date: Wed, 16 Aug 2017 13:22:59 -0400 Subject: [PATCH 4/4] Fix duplicate checking. --- app/renderer/js/utils/domain-util.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/app/renderer/js/utils/domain-util.js b/app/renderer/js/utils/domain-util.js index 5d395582..ac10f71b 100644 --- a/app/renderer/js/utils/domain-util.js +++ b/app/renderer/js/utils/domain-util.js @@ -80,6 +80,7 @@ class DomainUtil { // Check if domain is already added duplicateDomain(domain) { + domain = this.formatUrl(domain); const servers = this.getDomains(); for (const i in servers) { if (servers[i].url === domain) { @@ -96,10 +97,7 @@ class DomainUtil { return; } - const hasPrefix = (domain.indexOf('http') === 0); - if (!hasPrefix) { - domain = (domain.indexOf('localhost:') >= 0) ? `http://${domain}` : `https://${domain}`; - } + domain = this.formatUrl(domain); const checkDomain = domain + '/static/audio/zulip.ogg'; @@ -232,6 +230,15 @@ class DomainUtil { return `${dir}/${hash >>> 0}${extension}`; } + + formatUrl(domain) { + const hasPrefix = (domain.indexOf('http') === 0); + if (hasPrefix) { + return domain; + } else { + return (domain.indexOf('localhost:') >= 0) ? `http://${domain}` : `https://${domain}`; + } + } } module.exports = new DomainUtil();