From e2ae88894b84b000b36c6f53949004b90b3f9532 Mon Sep 17 00:00:00 2001 From: Keith Maika Date: Wed, 5 Jan 2022 03:52:42 -0500 Subject: [PATCH] Update to Electron 16. Application needed to be re-worked to not rely on nodeIntegration/contextIsolation for the upgrade to be possible. --- app/controllers/about-controller.js | 2 +- app/controllers/default-controller.js | 2 +- app/controllers/footer-controller.js | 2 +- app/controllers/login-controller.js | 2 +- app/controllers/settings-controller.js | 2 +- app/init.js | 6 +-- app/services/app-state-service.js | 2 +- app/services/credentials-service.js | 25 ++++------ app/services/desktop-service.js | 5 +- app/services/settings-service.js | 25 +++++----- app/services/system-service.js | 11 ++--- app/services/xmpp-helper-service.js | 2 +- index.html | 38 +++------------ .../converse-desktop/desktop-plugin.js | 4 +- main.js | 48 ++++++++++++++----- modules/settings-service.js | 4 +- package.json | 2 +- preload.js | 37 ++++++++++++++ renderer.js | 42 ++++++++-------- 19 files changed, 142 insertions(+), 119 deletions(-) create mode 100644 preload.js diff --git a/app/controllers/about-controller.js b/app/controllers/about-controller.js index 72366bb..8d1fb7d 100644 --- a/app/controllers/about-controller.js +++ b/app/controllers/about-controller.js @@ -1,4 +1,4 @@ -let angApp = require(__dirname+'/../init') +const angApp = (await import('../init.js')).default; angApp.controller('AboutController', function($scope, AppStateService, AppInfo) { diff --git a/app/controllers/default-controller.js b/app/controllers/default-controller.js index f2ebe99..1f3b695 100644 --- a/app/controllers/default-controller.js +++ b/app/controllers/default-controller.js @@ -1,4 +1,4 @@ -let angApp = require(__dirname+'/../init') +const angApp = (await import('../init.js')).default; angApp.controller('DefaultController', function($scope, $timeout, $http, AppInfo) { diff --git a/app/controllers/footer-controller.js b/app/controllers/footer-controller.js index 6747c82..1b291c2 100644 --- a/app/controllers/footer-controller.js +++ b/app/controllers/footer-controller.js @@ -1,4 +1,4 @@ -let angApp = require(__dirname+'/../init') +const angApp = (await import('../init.js')).default; angApp.controller('FooterController', function($scope, AppInfo) { diff --git a/app/controllers/login-controller.js b/app/controllers/login-controller.js index c364351..a846229 100644 --- a/app/controllers/login-controller.js +++ b/app/controllers/login-controller.js @@ -1,4 +1,4 @@ -let angApp = require(__dirname+'/../init') +const angApp = (await import('../init.js')).default; angApp.controller('LoginController', function($scope, DesktopService, CredentialsService) { diff --git a/app/controllers/settings-controller.js b/app/controllers/settings-controller.js index be5154f..7896f65 100644 --- a/app/controllers/settings-controller.js +++ b/app/controllers/settings-controller.js @@ -1,4 +1,4 @@ -let angApp = require(__dirname+'/../init') +const angApp = (await import('../init.js')).default; angApp.controller('SettingsController', function ($scope, $rootScope, AppStateService, SettingsService) { diff --git a/app/init.js b/app/init.js index 6b654f1..06d647b 100644 --- a/app/init.js +++ b/app/init.js @@ -1,6 +1,4 @@ -const angular = require('angular') -let angApp = angular.module('app', []) - +const angApp = angular.module('app', []) angApp.constant('AppInfo', { APP_NAME: 'Converse Desktop', APP_VERSION: 'v0.1.0', @@ -11,4 +9,4 @@ angApp.constant('AppInfo', { ELECTRON_VERSION: '13.6.6' }); -module.exports = angApp +export default angApp; diff --git a/app/services/app-state-service.js b/app/services/app-state-service.js index 9c4ba66..cd61c89 100644 --- a/app/services/app-state-service.js +++ b/app/services/app-state-service.js @@ -1,4 +1,4 @@ -let angApp = require(__dirname + '/../init') +const angApp = (await import('../init.js')).default; angApp.factory('AppStateService', [ '$rootScope', ($rootScope) => { diff --git a/app/services/credentials-service.js b/app/services/credentials-service.js index cd6831f..d7e8d59 100644 --- a/app/services/credentials-service.js +++ b/app/services/credentials-service.js @@ -1,26 +1,20 @@ -let angApp = require(__dirname+'/../init') +const angApp = (await import('../init.js')).default; angApp.factory('CredentialsService', () => { - - const keytar = require('keytar') - const settings = require('electron-settings') - let credentialsService = {} - credentialsService.getCredentials = () => { let credentials = {} - credentials.login = settings.getSync('login') + credentials.login = api.electronSettings.getSync('login') let promise = new Promise((resolve, reject) => { if (credentials.login) { - credentials.connectionManager = settings.getSync('connectionManager') + credentials.connectionManager = api.electronSettings.getSync('connectionManager') credentials.xmppService = credentials.login.split('@').pop() let password = keytar.getPassword(credentials.xmppService, credentials.login) password.then((result) => { credentials.password = result resolve(credentials) }) - } - else { + } else { reject(Error('No login stored')) } }) @@ -29,18 +23,18 @@ angApp.factory('CredentialsService', () => { credentialsService.addCredentials = (connectionManager, login, password) => { let xmppService = login.split('@').pop() - settings.setSync('connectionManager', connectionManager) - settings.setSync('login', login) + api.electronSettings.setSync('connectionManager', connectionManager) + api.electronSettings.setSync('login', login) keytar.setPassword(xmppService, login, password) } credentialsService.removeCredentials = (login) => { let xmppService = login.split('@').pop() - passwordDelete = keytar.deletePassword(xmppService, login) + keytar.deletePassword(xmppService, login) let promise = new Promise((resolve, reject) => { passwordDelete.then((result) => { - settings.unsetSync('login') - settings.unsetSync('connectionManager') + api.electronSettings.unsetSync('login') + api.electronSettings.unsetSync('connectionManager') resolve() }, (error) => { reject(error) @@ -51,4 +45,3 @@ angApp.factory('CredentialsService', () => { return credentialsService }) - diff --git a/app/services/desktop-service.js b/app/services/desktop-service.js index ebaec6a..f4f1894 100644 --- a/app/services/desktop-service.js +++ b/app/services/desktop-service.js @@ -1,6 +1,5 @@ -let angApp = require(__dirname + '/../init') - -const desktopPlugin = require(__dirname +'/../../libs/converse.js/converse-desktop/desktop-plugin') +const angApp = (await import('../init.js')).default; +const desktopPlugin = (await import('../../libs/converse.js/converse-desktop/desktop-plugin.js')).desktopPlugin; angApp.factory('DesktopService', ( $window, $timeout, CredentialsService, SystemService, AppStateService, diff --git a/app/services/settings-service.js b/app/services/settings-service.js index 0d19ac6..2756971 100644 --- a/app/services/settings-service.js +++ b/app/services/settings-service.js @@ -1,11 +1,8 @@ -let angApp = require(__dirname+'/../init') +const angApp = (await import('../init.js')).default; angApp.factory('SettingsService', () => { let settingsService = {} - - const electronSettings = require('electron-settings') - const settings = { converseDesktop: { runMinimized: { @@ -44,7 +41,7 @@ angApp.factory('SettingsService', () => { } const iterateSettings = (callback, settingsObj) => { - if(typeof settingsObj === "undefined") { + if (typeof settingsObj === "undefined") { settingsObj = settings } angular.forEach(settingsObj, (value, key) => { @@ -59,23 +56,23 @@ angApp.factory('SettingsService', () => { // Callback // TODO: replace with promise? const saveDefault = (key, value) => { - if (!electronSettings.hasSync(key)) { - electronSettings.setSync(key, value) + if (!api.electronSettings.hasSync(key)) { + api.electronSettings.setSync(key, value) } } // Callback const save = (key, defaultValue, settingsList) => { let value = settingsList[key]['value'] - electronSettings.setSync(key, value) + api.electronSettings.setSync(key, value) } // Callback const loadAll = (key, defaultValue, settingsList) => { - if (!electronSettings.hasSync(key)) { + if (!api.electronSettings.hasSync(key)) { settingsList[key]['value'] = defaultValue } - settingsList[key]['value'] = electronSettings.getSync(key) + settingsList[key]['value'] = api.electronSettings.getSync(key) } /** @@ -84,14 +81,14 @@ angApp.factory('SettingsService', () => { settingsService.initDefaults = () => { iterateSettings(saveDefault) // Logout for versions with BOSH only - if (electronSettings.hasSync('bosh')) { - electronSettings.unsetSync('bosh') - electronSettings.unsetSync('login') + if (api.electronSettings.hasSync('bosh')) { + api.electronSettings.unsetSync('bosh') + api.electronSettings.unsetSync('login') } } settingsService.get = (key) => { - return electronSettings.getSync(key) + return api.electronSettings.getSync(key) } settingsService.loadAll = () => { diff --git a/app/services/system-service.js b/app/services/system-service.js index 98f2af1..bb7759a 100644 --- a/app/services/system-service.js +++ b/app/services/system-service.js @@ -1,9 +1,6 @@ -let angApp = require(__dirname + '/../init') +const angApp = (await import('../init.js')).default; angApp.factory('SystemService', () => { - - const remote = require('electron').remote - let systemService = {} systemService.playAudio = () => { @@ -12,15 +9,15 @@ angApp.factory('SystemService', () => { } systemService.showEnvelope = () => { - remote.require('./main').trayService.showEnvelope() + api.trayService.showEnvelope() } systemService.hideEnvelope = () => { - remote.require('./main').trayService.hideEnvelope() + api.trayService.hideEnvelope() } systemService.reloadWindow = () => { - remote.getCurrentWindow().reload() + api.reload() } return systemService diff --git a/app/services/xmpp-helper-service.js b/app/services/xmpp-helper-service.js index 74408ab..de0bb9d 100644 --- a/app/services/xmpp-helper-service.js +++ b/app/services/xmpp-helper-service.js @@ -1,4 +1,4 @@ -let angApp = require(__dirname + '/../init') +const angApp = (await import('../init.js')).default; angApp.factory('XmppHelperService', [() => { diff --git a/index.html b/index.html index 436a80c..eaef17f 100644 --- a/index.html +++ b/index.html @@ -11,9 +11,15 @@ + + + + + + - +
@@ -28,35 +34,5 @@
- - - - - - - \ No newline at end of file diff --git a/libs/converse.js/converse-desktop/desktop-plugin.js b/libs/converse.js/converse-desktop/desktop-plugin.js index 931f59a..848cf75 100644 --- a/libs/converse.js/converse-desktop/desktop-plugin.js +++ b/libs/converse.js/converse-desktop/desktop-plugin.js @@ -1,4 +1,4 @@ -let desktopPlugin = {} +const desktopPlugin = {} desktopPlugin.register = (login) => { converse.plugins.add('converseDesktop', { @@ -64,4 +64,4 @@ desktopPlugin.register = (login) => { }) } -module.exports = desktopPlugin \ No newline at end of file +export default desktopPlugin; \ No newline at end of file diff --git a/main.js b/main.js index 6335b91..f280bf8 100644 --- a/main.js +++ b/main.js @@ -1,14 +1,16 @@ // Modules to control application life and create native browser window -const { app, BrowserWindow, ipcMain, shell } = require('electron') +const {app, BrowserWindow, ipcMain, shell} = require('electron') +const path = require('path'); // Keep a global reference of the window object, if you don't, the window will // be closed automatically when the JavaScript object is garbage collected. let mainWindow // Require other app modules -const trayService = require(__dirname+'/modules/tray-service') -const menuService = require(__dirname+'/modules/menu-service') -const settingsService = require(__dirname+'/modules/settings-service') +const trayService = require(__dirname + '/modules/tray-service') +const menuService = require(__dirname + '/modules/menu-service') +const settingsService = require(__dirname + '/modules/settings-service') +const electronSettings = require("electron-settings"); const isMac = process.platform === 'darwin' const isWin = process.platform === 'win32' @@ -21,7 +23,7 @@ function initApp() { } } -function createWindow () { +function createWindow() { // Main window options let mainWindowOptions = { width: 800, @@ -29,9 +31,7 @@ function createWindow () { minWidth: 780, minHeight: 560, webPreferences: { - nodeIntegration: true, - contextIsolation: false, - enableRemoteModule: true + preload: path.join(__dirname, 'preload.js') } } @@ -107,7 +107,7 @@ function createWindow () { // Handle shutdown event on Mac with minimizeOnClose // to prevent shutdown interrupt if (isMac && minimizeOnClose) { - const { powerMonitor } = require('electron') + const {powerMonitor} = require('electron') powerMonitor.on('shutdown', () => { app.isQuitting = true app.quit() @@ -121,6 +121,32 @@ function createWindow () { app.exit() }) + ipcMain.on('electron-settings', (event, method, ...args) => { + switch (method) { + case 'hasSync': + event.returnValue = electronSettings.hasSync(...args); + break; + case 'getSync': + event.returnValue = electronSettings.getSync(...args); + break; + case 'setSync': + electronSettings.setSync(...args); + break; + case 'unsetSync': + electronSettings.unsetSync(...args); + } + + return event.returnValue; + }) + + ipcMain.on('tray-service', (event, method) => { + return trayService[method].call(); + }) + + ipcMain.on('reload', () => { + return mainWindow.reload(); + }) + // Emitted when the window is closed. mainWindow.on('closed', function () { // Dereference the window object, usually you would store windows @@ -130,7 +156,7 @@ function createWindow () { }) // Open links on system default browser - mainWindow.webContents.on('new-window', function(e, url) { + mainWindow.webContents.on('new-window', function (e, url) { e.preventDefault() shell.openExternal(url) }) @@ -152,7 +178,7 @@ app.on('window-all-closed', function () { }) app.on('activate', function () { - if (mainWindow === null){ + if (mainWindow === null) { createWindow() } else { mainWindow.show(); diff --git a/modules/settings-service.js b/modules/settings-service.js index 1f93bb0..39128c9 100644 --- a/modules/settings-service.js +++ b/modules/settings-service.js @@ -1,5 +1,5 @@ /** - * Module for getting settigns in Main process. + * Module for getting settings in Main process. */ const electronSettings = require('electron-settings') @@ -7,7 +7,7 @@ const electronSettings = require('electron-settings') let settingsService = {} settingsService.get = (itemKey) => { - settingValue = electronSettings.getSync(itemKey) + let settingValue = electronSettings.getSync(itemKey) if (typeof settingValue === 'undefined' || settingValue === null) { return false } diff --git a/package.json b/package.json index 8332fa1..369773d 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "author": "Nick Denry ", "license": "MPL-2.0", "devDependencies": { - "electron": "^13.0.0", + "electron": "^16.0.0", "electron-builder": "^22.9.1", "electron-packager": "^15.2.0" }, diff --git a/preload.js b/preload.js new file mode 100644 index 0000000..42364f3 --- /dev/null +++ b/preload.js @@ -0,0 +1,37 @@ +const {ipcRenderer, contextBridge} = require('electron'); +contextBridge.exposeInMainWorld('api', { + send(channel, ...data) { + return ipcRenderer.send(channel, ...data); + }, + + receive(channel, cb) { + ipcRenderer.on(channel, (event, ...args) => cb(...args)); + }, + + reload() { + ipcRenderer.send('reload') + }, + + electronSettings: { + hasSync(setting) { + return ipcRenderer.sendSync('electron-settings', 'hasSync', setting) + }, + setSync(setting, value) { + ipcRenderer.send('electron-settings', 'setSync', setting, value) + }, + unsetSync(setting) { + ipcRenderer.send('electron-settings', 'unsetSync', setting) + }, + getSync(setting) { + return ipcRenderer.sendSync('electron-settings', 'getSync', setting); + } + }, + trayService: { + showEnvelope() { + ipcRenderer.send('tray-service', 'showEnvelope') + }, + hideEnvelope() { + ipcRenderer.send('tray-service', 'hideEnvelope') + } + } +}); \ No newline at end of file diff --git a/renderer.js b/renderer.js index ccb308d..5ab3b88 100644 --- a/renderer.js +++ b/renderer.js @@ -1,44 +1,42 @@ // This file is required by the index.html file and will // be executed in the renderer process for that window. -// All of the Node.js APIs are available in this process. -var angApp = require('./app/init') +const angApp = (await import('./app/init.js')).default; + +await import('./app/services/credentials-service.js') +await import('./app/services/settings-service.js') +await import('./app/services/system-service.js') +await import('./app/services/app-state-service.js') +await import('./app/services/xmpp-helper-service.js') +await import('./app/services/desktop-service.js') +await import('./app/controllers/settings-controller.js') +await import('./app/controllers/login-controller.js') +await import('./app/controllers/default-controller.js') +await import('./app/controllers/about-controller.js') +await import('./app/controllers/footer-controller.js') -require('./app/services/credentials-service') -require('./app/services/settings-service') -require('./app/services/system-service') -require('./app/services/app-state-service') -require('./app/services/xmpp-helper-service') -require('./app/services/desktop-service') -require('./app/controllers/settings-controller') -require('./app/controllers/login-controller') -require('./app/controllers/default-controller') -require('./app/controllers/about-controller') -require('./app/controllers/footer-controller') angApp.controller('AppController', function ($scope, $timeout, DesktopService, SettingsService, AppStateService) { - const { ipcRenderer } = require('electron') - // Menu force logout event - ipcRenderer.on('force-logout-event', () => { + api.receive('force-logout-event', () => { DesktopService.logout() let event = new CustomEvent("converse-force-logout") // Dispatch to the plugin document.dispatchEvent(event) }) // Menu settings event - ipcRenderer.on('preferences-event', () => { + api.receive('preferences-event', () => { AppStateService.set(AppStateService.APP_STATE_SETTINGS) }) // Menu about event - ipcRenderer.on('about-page-event', () => { + api.receive('about-page-event', () => { AppStateService.set(AppStateService.APP_STATE_ABOUT) }) // Menu about event - ipcRenderer.on('open-unread-chat', () => { + api.receive('open-unread-chat', () => { let event = new CustomEvent('conversejs-open-chat', {detail: DesktopService.chatToOpen}) document.dispatchEvent(event) }) @@ -54,11 +52,13 @@ angApp.controller('AppController', function ($scope, $timeout, DesktopService, S }) $scope.$on('app:restart', (event, data) => { - ipcRenderer.send('app-restart') + api.send('app-restart') }) SettingsService.initDefaults() DesktopService.getCredentialsAndLogin() -}) +}); + +angular.bootstrap(document.body, ['app']);