From 4f6c2fd6fabeea7972e5b7d26e1715e2b9944008 Mon Sep 17 00:00:00 2001 From: Luke Schoen Date: Sun, 13 Jan 2019 19:30:38 +1100 Subject: [PATCH 01/67] feat: Security aspects for fether-electron. See #124 --- packages/fether-electron/package.json | 1 + .../src/main/app/options/config/index.js | 46 +++++++++++-- .../src/main/app/options/index.js | 13 +++- packages/fether-electron/src/main/index.js | 64 ++++++++++++++++++- .../fether-react/src/stores/parityStore.js | 1 + yarn.lock | 32 +++++++++- 6 files changed, 147 insertions(+), 10 deletions(-) diff --git a/packages/fether-electron/package.json b/packages/fether-electron/package.json index 9a6873fce..9a4a5cd9e 100644 --- a/packages/fether-electron/package.json +++ b/packages/fether-electron/package.json @@ -47,6 +47,7 @@ "electron-settings": "^3.2.0", "extend": "^3.0.2", "fether-react": "^0.2.0", + "parse-url": "^5.0.1", "pino": "^4.16.1", "pino-multi-stream": "^3.1.2", "source-map-support": "^0.5.6" diff --git a/packages/fether-electron/src/main/app/options/config/index.js b/packages/fether-electron/src/main/app/options/config/index.js index 552e3ed56..78ffbdb24 100644 --- a/packages/fether-electron/src/main/app/options/config/index.js +++ b/packages/fether-electron/src/main/app/options/config/index.js @@ -8,6 +8,9 @@ import url from 'url'; import staticPath from '../../utils/staticPath'; +// https://electronjs.org/docs/tutorial/security#electron-security-warnings +process.env.ELECTRON_ENABLE_SECURITY_WARNINGS = true; + const INDEX_HTML_PATH = process.env.ELECTRON_START_URL || url.format({ @@ -33,10 +36,6 @@ const DEFAULT_OPTIONS = { resizable: false, show: true, tabbingIdentifier: 'parity', - webPreferences: { - devTools: shouldUseDevTools, // Security - enableRemoteModule: false - }, width: 360, withTaskbar: false }; @@ -58,4 +57,41 @@ const TASKBAR_OPTIONS = { withTaskbar: true }; -export { DEFAULT_OPTIONS, TASKBAR_OPTIONS }; +const SECURITY_OPTIONS = { + webPreferences: { + /** + * Potential security risk options set explicitly even when default is favourable. + * Reference: https://electronjs.org/docs/tutorial/security + */ + devTools: shouldUseDevTools, + /** + * `nodeIntegration` when enabled allows the software to use Electron's APIs + * and gain access to Node.js and requires the user to sanitise user inputs + * to reduce the possible XSS attack surface. + */ + // nodeIntegration: true, // FIXME - should be disabled but causes error + nodeIntegrationInWorker: false, + sandbox: false, + enableRemoteModule: false, + webSecurity: true, + allowRunningInsecureContent: false, + plugins: false, + experimentalFeatures: false, + // contextIsolation: true, // FIXME - should be enabled but causes error + nativeWindowOpen: true, + /** + * `webviewTag` when enabled allows content to be embedded into the + * Electron app and to be run as a separate process when Electron handles + * new browser windows. It is important to reduce privileges + * to try and prevent attackers from controlling the new browser windows + * with the `window.open` command and passing a WebView tag + * (see `webView`) to enable `nodeIntegration`. + */ + webviewTag: false, + safeDialogs: true, + safeDialogsMessage: 'Electron consecutive dialog protection was triggered', + navigateOnDragDrop: false + } +}; + +export { DEFAULT_OPTIONS, SECURITY_OPTIONS, TASKBAR_OPTIONS }; diff --git a/packages/fether-electron/src/main/app/options/index.js b/packages/fether-electron/src/main/app/options/index.js index 35742514e..0cc3c2c6c 100644 --- a/packages/fether-electron/src/main/app/options/index.js +++ b/packages/fether-electron/src/main/app/options/index.js @@ -5,7 +5,7 @@ import extend from 'extend'; -import { DEFAULT_OPTIONS, TASKBAR_OPTIONS } from './config'; +import { DEFAULT_OPTIONS, SECURITY_OPTIONS, TASKBAR_OPTIONS } from './config'; let hasCalledInitFetherAppOptions = false; @@ -18,14 +18,21 @@ class FetherAppOptions { } // Allow user to get/set options prior or to pass custom options + // Security options should be extended last this.options = withTaskbar ? extend( this.options, DEFAULT_OPTIONS, TASKBAR_OPTIONS, - customOptions || {} + customOptions || {}, + SECURITY_OPTIONS ) - : extend(this.options, DEFAULT_OPTIONS, customOptions || {}); + : extend( + this.options, + DEFAULT_OPTIONS, + customOptions || {}, + SECURITY_OPTIONS + ); return this.options; }; diff --git a/packages/fether-electron/src/main/index.js b/packages/fether-electron/src/main/index.js index eca994a4c..20d74fe0d 100644 --- a/packages/fether-electron/src/main/index.js +++ b/packages/fether-electron/src/main/index.js @@ -5,6 +5,7 @@ import { killParity } from '@parity/electron'; import electron from 'electron'; +import parseUrl from 'parse-url'; import Pino from './app/utils/pino'; import FetherApp from './app'; @@ -25,7 +26,7 @@ const fetherAppInstance = new FetherApp(); const fetherAppOptionsInstance = new FetherAppOptions(); const options = fetherAppOptionsInstance.create(withTaskbar, {}); -app.on('ready', () => { +app.once('ready', () => { fetherAppInstance.create(app, options); }); @@ -63,3 +64,64 @@ app.on('quit', () => { pino.info('Leaving Fether'); killParity(); }); + +/** + * Security. Intercept new-window events (i.e. `window.open`) by + * overriding event.newGuest without using the supplied options tag + * to try to mitigate risk of an exploit re-enabling node integration + * despite being turned off in the configuration + * (i.e. `nodeIntegration: false`). + * + * References: + * - https://www.electronjs.org/blog/webview-fix + * - https://blog.scottlogic.com/2016/03/09/As-It-Stands-Electron-Security.html + */ +app.on('web-contents-created', (event, win) => { + win.on( + 'new-window', + (event, newURL, frameName, disposition, options, additionalFeatures) => { + event.newGuest = null; + + if (!options.webPreferences) { + options.webPreferences = {}; + } + + options.webPreferences.nodeIntegration = false; + options.webPreferences.nodeIntegrationInWorker = false; + options.webPreferences.webviewTag = false; + delete options.webPreferences.preload; + } + ); +}); + +/** + * Security. Intercept and prevent new WebView (that may be used + * by an attacker to gain access to the file system) in addition + * to setting `webviewTag: false` + * + * Reference: https://www.electronjs.org/blog/webview-fix + */ +app.on('web-contents-created', (eventOuter, contents) => { + contents.on('will-attach-webview', (eventInner, webPreferences, params) => { + // Strip away preload scripts if unused or verify their location is legitimate + delete webPreferences.preload; + delete webPreferences.preloadURL; + + // Disable Node.js integration + webPreferences.nodeIntegration = false; + + // Verify URL being loaded + if (!params.src.startsWith('http://localhost.3000/')) { + eventOuter.preventDefault(); + eventInner.preventDefault(); + } + }); + + contents.on('will-navigate', (event, navigationUrl) => { + const parsedUrl = parseUrl(navigationUrl); + + if (parsedUrl.origin !== 'http://localhost:3000') { + event.preventDefault(); + } + }); +}); diff --git a/packages/fether-react/src/stores/parityStore.js b/packages/fether-react/src/stores/parityStore.js index 15925fa32..247643b4f 100644 --- a/packages/fether-react/src/stores/parityStore.js +++ b/packages/fether-react/src/stores/parityStore.js @@ -15,6 +15,7 @@ import Debug from '../utils/debug'; import LS_PREFIX from './utils/lsPrefix'; const debug = Debug('parityStore'); + const electron = isElectron() ? window.require('electron') : null; const LS_KEY = `${LS_PREFIX}::secureToken`; diff --git a/yarn.lock b/yarn.lock index 2447d6966..8f0f83727 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9359,6 +9359,13 @@ is-scoped@^1.0.0: dependencies: scoped-regex "^1.0.0" +is-ssh@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.3.1.tgz#f349a8cadd24e65298037a522cf7520f2e81a0f3" + integrity sha512-0eRIASHZt1E68/ixClI8bp2YK2wmBPVWEismTs6M+M099jKgrzl/3E976zIbImSIob48N2/XGe9y7ZiYdImSlg== + dependencies: + protocols "^1.1.0" + is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -11565,7 +11572,7 @@ normalize-url@^1.4.0, normalize-url@^1.9.1: query-string "^4.1.0" sort-keys "^1.0.0" -normalize-url@^3.0.0: +normalize-url@^3.0.0, normalize-url@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== @@ -12100,6 +12107,24 @@ parse-passwd@^1.0.0: resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= +parse-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.1.tgz#0ec769704949778cb3b8eda5e994c32073a1adff" + integrity sha512-d7yhga0Oc+PwNXDvQ0Jv1BuWkLVPXcAoQ/WREgd6vNNoKYaW52KI+RdOFjI63wjkmps9yUE8VS4veP+AgpQ/hA== + dependencies: + is-ssh "^1.3.0" + protocols "^1.4.0" + +parse-url@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-5.0.1.tgz#99c4084fc11be14141efa41b3d117a96fcb9527f" + integrity sha512-flNUPP27r3vJpROi0/R3/2efgKkyXqnXwyP1KQ2U0SfFRgdizOdWfvrrvJg1LuOoxs7GQhmxJlq23IpQ/BkByg== + dependencies: + is-ssh "^1.3.0" + normalize-url "^3.3.0" + parse-path "^4.0.0" + protocols "^1.4.0" + parse5@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" @@ -13374,6 +13399,11 @@ prop-types@^15.5.10, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2: loose-envify "^1.3.1" object-assign "^4.1.1" +protocols@^1.1.0, protocols@^1.4.0: + version "1.4.7" + resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.7.tgz#95f788a4f0e979b291ffefcf5636ad113d037d32" + integrity sha512-Fx65lf9/YDn3hUX08XUc0J8rSux36rEsyiv21ZGUC1mOyeM3lTRpZLcrm8aAolzS4itwVfm7TAPyxC2E5zd6xg== + proxy-addr@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341" From 0f9c3d124da4f6d136d011d0b47ed5787a751d3a Mon Sep 17 00:00:00 2001 From: Luke Schoen Date: Mon, 25 Feb 2019 22:34:09 +0100 Subject: [PATCH 02/67] feat: Add Source Maps support --- packages/fether-electron/package.json | 1 + packages/fether-electron/src/main/index.js | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/packages/fether-electron/package.json b/packages/fether-electron/package.json index 1ec3ae567..b07e75194 100644 --- a/packages/fether-electron/package.json +++ b/packages/fether-electron/package.json @@ -57,6 +57,7 @@ "electron": "^4.0.1", "electron-builder": "^20.38.5", "electron-webpack": "^2.6.1", + "source-map-support": "^0.5.10", "webpack": "^4.29.1" } } \ No newline at end of file diff --git a/packages/fether-electron/src/main/index.js b/packages/fether-electron/src/main/index.js index 06ba62a6f..7b6fc0cd4 100644 --- a/packages/fether-electron/src/main/index.js +++ b/packages/fether-electron/src/main/index.js @@ -5,12 +5,19 @@ import electron from 'electron'; import parseUrl from 'parse-url'; +// https://webpack.electron.build/development +import sourceMapSupport from 'source-map-support'; import { killParity } from '@parity/electron'; import Pino from './app/utils/pino'; import FetherApp from './app'; import fetherAppOptions from './app/options'; +sourceMapSupport.install({ + environment: 'node', + handleUncaughtExceptions: true, + hookRequire: true +}); const { app } = electron; const pino = Pino(); From 845c0ccb9faaa0fb1d61ebc0370563ff61c68154 Mon Sep 17 00:00:00 2001 From: Luke Schoen Date: Mon, 25 Feb 2019 22:34:52 +0100 Subject: [PATCH 03/67] docs: Add Source Maps guide to Readme --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 33edbdd90..e8f7bffa2 100644 --- a/README.md +++ b/README.md @@ -123,6 +123,16 @@ yarn start TASKBAR=false yarn start ``` +# Development + +## Debugging in development + +* Terminal - shows `pino.info`'s + +* Right-click Fether window to display "window context menu" and select 'Toggle Developer Tools' + * Console tab - shows `console.log`'s + * Sources tab - choose 'Page > top > webpack-internal://' then set breakpoints and run app and introspect values in Console tab + # Usage of taskbar mode ### macOS From 944bd9df6c7b4b23100a3565b0144e89f8914f68 Mon Sep 17 00:00:00 2001 From: Luke Schoen Date: Mon, 25 Feb 2019 23:55:23 +0100 Subject: [PATCH 04/67] feat: Add webpack-build-notifier add-on with custom Webpack config --- .../custom.webpack.additions.js | 18 +++++++++++++++++ .../fether-electron/electron-webpack.json | 6 +++++- packages/fether-electron/package.json | 3 ++- .../static/assets/icons/webpack/compile.png | Bin 0 -> 25108 bytes .../static/assets/icons/webpack/failure.png | Bin 0 -> 17576 bytes .../static/assets/icons/webpack/success.png | Bin 0 -> 17380 bytes .../static/assets/icons/webpack/warning.png | Bin 0 -> 17023 bytes yarn.lock | 19 ++++++++++++++++++ 8 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 packages/fether-electron/custom.webpack.additions.js create mode 100644 packages/fether-electron/static/assets/icons/webpack/compile.png create mode 100644 packages/fether-electron/static/assets/icons/webpack/failure.png create mode 100644 packages/fether-electron/static/assets/icons/webpack/success.png create mode 100644 packages/fether-electron/static/assets/icons/webpack/warning.png diff --git a/packages/fether-electron/custom.webpack.additions.js b/packages/fether-electron/custom.webpack.additions.js new file mode 100644 index 000000000..8eed1eff0 --- /dev/null +++ b/packages/fether-electron/custom.webpack.additions.js @@ -0,0 +1,18 @@ +// https://webpack.electron.build/add-ons +// https://www.npmjs.com/package/webpack-build-notifier +const path = require('path'); +const WebpackBuildNotifierPlugin = require('webpack-build-notifier'); + +module.exports = { + plugins: [ + new WebpackBuildNotifierPlugin({ + title: 'Fether Webpack Build', + logo: path.resolve('./build/favicon.ico'), + suppressSuccess: false, + compileIcon: path.resolve('./static/assets/icons/webpack/compile.png'), + failureIcon: path.resolve('./static/assets/icons/webpack/failure.png'), + successIcon: path.resolve('./static/assets/icons/webpack/success.png'), + warningIcon: path.resolve('./static/assets/icons/webpack/warning.png') + }) + ] +}; diff --git a/packages/fether-electron/electron-webpack.json b/packages/fether-electron/electron-webpack.json index 021c27ab4..df173bc1b 100644 --- a/packages/fether-electron/electron-webpack.json +++ b/packages/fether-electron/electron-webpack.json @@ -1,5 +1,9 @@ { + "main": { + "webpackConfig": "custom.webpack.additions.js" + }, "renderer": { "sourceDirectory": null - } + }, + "title": "Fether" } diff --git a/packages/fether-electron/package.json b/packages/fether-electron/package.json index b07e75194..72f080505 100644 --- a/packages/fether-electron/package.json +++ b/packages/fether-electron/package.json @@ -58,6 +58,7 @@ "electron-builder": "^20.38.5", "electron-webpack": "^2.6.1", "source-map-support": "^0.5.10", - "webpack": "^4.29.1" + "webpack": "^4.29.1", + "webpack-build-notifier": "^0.1.30" } } \ No newline at end of file diff --git a/packages/fether-electron/static/assets/icons/webpack/compile.png b/packages/fether-electron/static/assets/icons/webpack/compile.png new file mode 100644 index 0000000000000000000000000000000000000000..0233a849262f2c32dde1651407385bed4a7e7636 GIT binary patch literal 25108 zcmX_H18}8Hu#J-&+qO5hlZ|Z~8{4*ZV;dV|W82u+#>UxXW4-&os`pZLQi6$}iV@xKoo4Cp`J{t512V5DF&5~Au}xtDpKxw#r0 zV|}N2o&1}Yt<>vwK4M~gKPf3O!AC+wv*8TU%ILX7B(A^rv?4^28;fJ6GUKAL!U3o# z!zd}qdNQuuEv-B(JzjmUNvybosBpQIb?2 zM=TJVLfQ82`-S#y@DfHyr{>v+f<#x0VVPkyA)mm$f%U;EPM9mhtcU-Jjm2fCA)Djv zZwq!!{A=Z~7qF*N$Q93uXHFJjj8{6yxCgU`5OfSB+(qzA*Fbpty|gNdXD$qS<{u2d6VolHu^s$sG{jtyrvBy|DRU@U2keIVAeN2NwFV&}7!(jipF(7-WpeWWdL#3^OODV69K1-#C_0k9F!0Lq<=dcKWA zIV3nl<@<`Gvc^3O4CuwcoTzUVQjL)~s#J;}d<&U|8gb2W#Tz2H()zy&TZ2vz$6Uxg zAcVp4XWU3(vW8G=ilVWWW$!f#IffelMey8WSN(X{MjSIu0!JLc*VPWP=+Eo_g*XO; z7v1yTW8Rat6layDi7-Y&VyyJ3A_2FW_Y5z{D#uFOeTCkeaAJh9?nkY;v_h|HJ;QHW zRs4f$v)oPyXT^gZ8ZZnRD1&RqYlj}6b7DL@P}uV|_~ImgIwAyjsdq28)%0E_;ki z4P}B9N?=3s12bb8EgS^N9P(4oKR=M)+9HWGFx1|p2aF8ZKq!jUbpD3Y4tu>}{zeGs zXUs59ms9pC{)^?Gh~*yhs?_YF6pA{4?*j^`FHy6Pw(1u;s4hiv^iO~75EsaTYT zY{1gTsM4po>*7-<2XLU;)TwhP-(nssg+41EQjMMl>4)@;Ig0ZfH0Biw!|dI!P{|e^ z$3aU17~HgP*sU;If%5i${sl+6idbth5&Hln5{l<#&dhzZBLquP2{kf;2!N=Wk;a6f z0c~3Fghi#m^3SaH4t{d)E`_FMA~ArIwnQJ(h&}!vIAk|zn-D%VJ}3lPs38|N;O;9= z1KhIqhkxArN)Slv!6W4AwiD#9j(bDSfMJsog4Q;d z^3NsQ`Yu+L=6x{Jogh9{DXjmbW-1;;$5M;H(KZ22u!ok!frvKxcw%{;t~=SnryEC{!f>iUT!zt_*y!mIF% z32oljbmP)1;>_#-?BYW7Mt6ehR301F@IQU3dWdAr&GjAcmePhXOH|nGsNuE1 zWl6jTyB&zwebVJmf7VlMI7S3hp-~t;K%u!Uy%bYDPkuYLZ-m4*r!lnR!M3a|i1y5M z3vUzaI6nu9ub)H6`my*ALR=W&OKyXkwLl7R8A|XDOARH?wXpNu&F<3w85<2csua`M0DwUr^DKH%(@{tBYl?Z3@4CvGJ=$NHO?J+9p!Uf;~QS{Nb6@oF0 z7H|Ty)+RhQ7f+mQr0U5~gz(ZUt-<^?Tz-~CvXBwz>2)6tEHF2}WFMb-biHg80`1qG z_O$vRDu>e3tP@EQSfLm=;g!d>+6sy1e-%S6i)ydZ^Im3Ta%e!X47;5V!TnjGc2vJ} z3DtFHqD70Fnj5!e&wGl8yb;Y}Mt+H<1MbLmL5TQc+HFw2qCfl7W>|%G zw|1_GQ0Xi85e|kf!ZVzq~keAY% zvnIyoGy_hNZd_VgP33T`4*VKw#hfxmG>lApY%C5x@1f7U^0t|ZQD>8ycddv~ml6L6 zw+G-amLQ`swhBX~KsMp)9a3gtKFFgCCI^DYzCz8vQVT@G#sjD|U&A3)6|ZPcFnB!L zcVosSQcW`yfHNEZ6j9;Ini0x=^N@Dr$PeHvsXQ}~k#RzL|0hv9{4*^Gvl04J9%*5C zB8+S^pSK8{D{w4RWDeUL@rj!lxjR3V%3? z&`nZY^#zd>-s$~zgJo4_<-(1DScJX4nRVZf)nLW};cM$w445J{ct zHG&QdT&|85;`h&WYH}A=3FrInhp~KZ7SuS{RH*pj06l6&9@L3y_hWJWcU?D}OXMp* z8yG5t%k(^EgjE7%rfMl`p9ITBa`NCJbiZ&=g-RXCO_^|5@R0JSmmmHzTQVL+PbJ^W z=C#IyIy83h1kVeB^3f0DMW`-+zQ_-dB@7Ir2QysFXl1IbNRWuyqmh_L;lm<-AIOfS zS9^xC2~X23=Bx3P^YAGuQZwZaUZhT1K&=jzZ2Qs-)?iMWbgm* z9Lo$Hn>WiHaTVghNZj`%%ZNdE29mUjS8V#^EDsPS*J|dyf=QI|y)4EZCWuDQlty^` z3fo_%o~T2f2r-TS>upXxz=`q9-$2MYZ?3mNAy06!I%UgpljkPyMuS<-i8-vpGFn zL}e&td zbb|1BPE9t{lP;EXLcH^#5B(G^jtD-=Dq^p@tU-Y>wnUqDiI!j5*C@uXt{0&?DUkMs zqGQYS_y%2xZ^nunrmY~`-HkSJjy-WG<>v9a zW*TG&KLy6GAp1^?O9pYE5ok%iRhE~rwIWV#E%$Q z{d--7l&3_Vg^`A0Zpm~HYmaWJ&O+){{0|YN0Z0uk#OCFqyf6gYKm`XGd6M^94j4$t zU^WzvoIR1qBaujR!)Rkrb_V<$wF#PoI0Z*3fmedHGkXxhs>!NE4`&$fZ{5_@g^ z1hjwgl@U|1(vdWtUpU#83iTHOj%~8YFUyZ}CfIO@MdtuIvHEpZT#2R z>u4cMh53297b)qcDH?5M2(vr3yW+eEU5i=~9Ztsy3DmDyk%o*8+;*hQMXkU8VE!MJ zkv$aFkMPCZ?I>lv+yEmU1MjAp*O)YZhse(+?y;r3lo}}cEXd40%zlW@U4+;6F^zW=3ob&M-&|eS@ z#zv-{R(Z7JZf-1xFVip7ca+CgjeH!%|wafI|!Ju^0z`VT(!E&6nGQK z1pOwuR$n+ z@8iwOXse>lZP>UOw$;mRqr|4nc<`C@p9Dt{j78k6mUqw3C_z~x$?IMF%nnsn8ZyeC$ROuu@CaUF*KBgU%Q z!!Vj>Si$E7T;Te~WCuoU`_-1pbe*hyv96wWQyG!R3uT`3!*R-|b5LkxnEG7b_fVDp zQV_fu$8eRMyD!+w%UFcRG~?}rCKCnz&&*fsfVmR-C1}|i!~}&WNc&}D`CfWy!sL_< zP69tPV!x6EE3TG#%(&lptBqOE#~qq=JhgG(@`Z8%7C*O3sSvC6+>l|HR+bs#o;qj_ zUf){6Q(}!xq9fQ{AM_&6O2Xxh04qI}mdC%);;R4ZTx_F8$(l_$K~PqGPSgz0MphkX zsV8k9oLt4-KSxj#>l)07I^tH#43YO!hM`N+MN_&(9P2)>tW$K@De_{`X$lguIJ|LM2 zGzen+CM%b#BE(7@lRZx7XT-ryw~3pQt2S7e$7Ix~FKJ$6Uy7LjnB}bE?ghpJy){5wxu0nxy6ix-9_2qGo zj5H8)4k|z_A|T}f37fMO&ES?BlPk?_#Riwi2hPeuRDEq6@Ag|!h4pl%V)?h1euX!j zW=}N#pz}_)g@9nqb0U@WZp>54*PV8^iZfQMqKQGH(%szDaIzeld~JtQ5Bxz3Ugk0I zk391*Wb2bRWX5Fx*wA5cR|l&re!ky~x7l|{-j!{p03mt$GrzBDYf169SR>R^x9(KR z4Oeqp3kC;LM(xd*cAFH&c;@Wd0U>ji&gAOc&(dPjmwI1=s{G&a#ChjI=#ChYOopI1 zeQwXxI%GXkWz(DJUOfk8TZsGYk6VNu_F0L}P?CQxj7FOrb7s>Z`aNNfBg5Fm#Kv9r z(8zq<~rqc^6&HS z5>(toXfksAM}YP&wKb9qxj~DJr0q)N*<(hcoCZ0jqMQ9a>>n!!hB(!}M&V4D-J#j~8mkidvD>a!~uUMt2qrrN^3 zM#1~oHu(wXqc4)o6l=+SSumEDVK=SAtrgQMWRInV30K#>N<*b~9F7_lX4Yo#J0J_m z*|U?NiUC5b>m#+Nnyij);E$LGF@Gi@e0{ryF*J+<#MeU^a5LbH-Fim{(Feko79wd( ze*my69YcwF>x2eGv>*cD1f4q7X#$a(tMr9>BuaQjQt|{9^0vNwnEJdc0B%HD*Zus4 z_hAQc3b#hhQ|%@ba3}GKwW6~`!4D33c~_`^d;}v^iHzj6=2X6G_3g(M|ME+S$TxOB zjHT?J}Lw()t^k4Q7^W)tU9>Y?CCIw|hB;<}sT{_Kb5a$kFt*FuaS+Ne0jl<2K9_ltpSK>6 z)zu$KNth?uthT1gQOmGsL0#-HVhs)S1>f?7;uuaejg|I?$*4^-w3>F9tdXkKR_rp* zDO4ijusT9U$|eC2IPw~>cDmzH)qNx!210F5bww~HH%&53t;1369=6lX%1vV#@vGOvy+?2oUL zgmTsbw+(h=EbX1(wDhZ%O?#23kE_Fcs;;Q?E+Dtsnj-pc+zw;Ujxsqe*IReN2LUo1 zMP}UAe&&8;o`x(Di>fu5Ph)#mTzNeKw^Hga`n=H)9H@HXLMEmoCDCjExcJR>^8tau4jwXHGLY=;V^|rhIP}o-RyX`;8l`8kb~44Y8xJRFbVRr3j%K%^r<(vOXQ2* z{`bk+OKqI3_Ar8^G*H6^RQ8X)(9;+w9LimHoN$6D?ljl$9kph*D9(@#_hHH2n|PRc zf4uVHBD(Ge+7|T}BeiRY@S%xF$h$pDqB<4hXBX*WyRFWAokHhG~e}4G78QiTt>3W+RKz_Tq4Fb~& zI1zAyrO!7;BnPC+J39~I4e4+-BkI9p-ES+l5o}j2kL3sd6xy$2onJIK$L!e3e|N=H zq)pyfv*1XweRW#w2GxZ2v_qB^D8V~Z5$BdOuh6HRr~|WUgU`Xbx2bv2l{be!g?iIP z7>n%qEjyNgg3Ig93{PHOUiOf4S576KqZ8j6OgWKy(Zk(tdttROYp9uX4-Q7DhIk!a zoMl(-6J?Km&Vy&$hk+3gC)X|+`yEwOw)&uG8sWJai7o0l3lq zfRoWBpn7{JKg&%NS+7?=f_rrD_d)R*JXhOU9W3)Cg0+RPZ2yCi^2`1KoH(F5|FpHk z`Yyb2efo&^N}3L-kq=q5>Z!1OUY3;F+eC_hp!y?Mczt5VD&E}E!ev6dLZjgqVL8@7 zC)b2x!3NfkfBw}xqy7;SZwd1`kx4 zNYps+*lFuwy70DBJ*ngK7$u^POp@0gC(P{g)P>B zovE7S(-Hd(o?r`@XDDNJaCD9Zy8&;j4AA7>hE7Lj$UVWF_9#ntvb)H(ZtoM%>!f6l z{$A{Yz=b5qv&6k0=9jE`><_Zt-|h-qJx$pgB8WLMpvqJ^nR5C3?jQ8QPDLJOJOkt7 zld?2F6O-?gwL)(nKzI8pO7f~|QIsD4HaF4*3la`yBPYo$>8m{%Eem+ZHW>)CLL5^Y zxE0nvwZ`rxB~>X?u28XZCZ?h`4|;F!HcCbq>bAEj{%c|YDs2jvRJ}t)Et~L&WUmmM z)>h}6DqXIXXXm5L#vh?p>q2W$pr}hb+g;_?>!C?ikf|#s3SYtI4A2ui@2EqOS=P7b z>qt3s(wg-s6*u!>ou-xj6qS|cAxx^V58Viow;4#GYXBg^p zG2ozx=Tywm_d!A}8}F)> zC^lHHxe^Kb^;4HZz)Fx(X94149YkC06>tbV^D0C~(P`c13to>iQ;QL|;M@92U1Jf_ zyR(d;R%4+=?WLHrMzzZd%YZak{k~G*_e1!U&hqV2UEOkQcrG8xoNd0(=ST!4XjJ)1^N()y_;4!a z++o+vcwrd54U=Z61>)o*i}kRdHQFZb6w14BMPcUJb$2`kXROl<>?jh66o)K8cczH70E*m$JPf;RwE(Y)wf}XsEc?8 zxkFg4lO4z1RizPTZWtNL1Yygy=#CODl36Zl(k-4I_FC7Rb=BLFMroRe90QY+N>L(A zV;JZ*5WrEzi7+vq5>PF2*hLSl0u!#vMQsW;2*2Q=!d>A#zyNYnPfVg15JPA~AK&;! z;DvdbDYLd0^=(>dxANG?cT1nw6L*!FShB9=2_;0Q@~03MZ%CMW{LRDyu|~xvEWbMQ zGWqzc^&cHN?d?pcO!=yOi+UVnPiae!7WN~mWLH@#0Dk<%yS*L(O0UY8Z+spU27r({ zzFQvwUAzW{UJ60Ul~KZdV&w$YSCjCh{-(ugaRJTG#)pnq2J?o_L`E@ZTwd`1xBxXF z&S@1JN9j@*u+0XQof9?#=jC18^kiv$N}i?xF8hs}Xs_r7vO9cx#{=Bw-p+}zlxs5~ zXunKhgXQiX$_cgULOWN($nG3zZ7d>xxiAX<|Yc)lOkXo(m zzyTrk0W-=fGvR2wl_s0NgkixGrmXsoZK$4Ao7RgV5@*r5r8FpnS%O<)5Z+enM6&1N z$Evzny_4Fayl8iHH9%^^8#H&bD zuqV{v4sN$u30$qkkgMFNDcU+^p@gm`hy-bz-S|+>9#dTY0GPC8HrSdY zsoU3Cn7v`f&ERV)Ub!=dT7xq0FOd5uTde}Tgm9udcDcrR-TF9}w=oLVu>LeUeunU` zR6{1mox;Yvq9mdwiK+6pKQ^$w;%4o`(RFcZ|90 zMVUEs_!A+l{weyfQ5O)+Nuj2t+T|=z7d&vkpVUgN;>Hgf=afudRx|_NGzGslPD`5A zDrn~_-AF3oL~!;1!(cp~z!ZXvxV=So*|$%_kK1Vrf(T=aAPaWc|Kf8%TY0ikpT=1J zD;W7$+!V-Cz#!oig1ECuchJnXq6F%U1VRYX5yx1SPezbLL4*cWkJwQV{O{fImTi6M zGWGdYgSQFGs^mk@JZI1F@a>&N73(N$c?|sM_0hyi^Vg`fO5zazW!QSNrb)7=<+!xC zgQs+UlX0x~@;m%c`y~xepR*6b(F!6^pZo4Fo)}ngSOPchVR2Sj_scTg`|kI{6l?~% z{d_GOFN?McM@XV#+>kVK1tOK+*FjO{_bW}1gDSl8-Am!zZq6wl)En`obqo=CkpqeW z(GHhriy_FvZZf_c14}@{{I`Rj0N=W0l}3b z$+Ie^$1_`U)7s#Ym~k@VKoKaaASQ`=~H8-voi>P%yL0BU+%|k0dC0h z7_F45Xu|rip;DOKS3~UF^pAalQ+4OpwZT&0S?nlw)1TL~_cPETwV^JV`>7>#Mxt@s z&d>D;f~=n?L0sKxe+{Cy`v;HKEI~Rjars177^T~AtmK9(6lR30StWZR5hO!N8W66D zWc}MKKn~$+ZE+R}A;S4^VY0N1sKAINF4i*rZi@T7Bha0Qsg~?6)^1H6zq3ex>^nw? zvKY;uSe6=&jBkPFxZF%cqB;S07Vwc9VgemSSp_{Rk*hdGmGhREU*+K94X?@9k!|h$ z5yEx%v07C+9jimj2$A+3WP#^PKZmQG9f? zE>1BBaymXrN_gzeZ%&i4I0tkvVlvs;3jV8p_G)lm+8{t0uSS$RomB>t@Uc|QkG9R? zPf)o|(#o1}tbV4W3hO#&o_e$cJVqNfXLzPZFURGL;WS~!Ic<-!Ir&Wa=5E}Y8#m_4 zn&nsS9)fP(B|k&wR-wLS#%ARY*8mpaj-iM#v{bs zMtZ6f-eG71hs4CK&pBR=IclSpz;*xE-t!m?EV2On7J=k#+nD#eM z<4sq_kM7lpig>=Z&Q3m8ZN2O1prm7JPRKe;iGF}WiwOsK2Q`&`q<~8A`&K~y#?oNz zX~MylT5cxrIW?DWdcf?9Gn~Q0yZ!4ySM$h3fP+t zwL*C7GB=5DD3FbTDarl{2I5nJi+O&eZ=0XAd>9(??;XA_MmjHMrO6Yehbgf;ePZH( z+~n?d1LpHrQSuYAr}1oal}oH>_XfHMX&nYYB1=`Le;I-Pd2sNk6TXvo3HxBR`l910 zo=$;mdOv77Q4&QXc1^@Nz1`b+&gKecc%Kin{LJZH{MmU$}0rt}b&-bYu|0e^j%q_RWT5NeLH z6hzw;1Dqe9!a>SoI$Km zwqPZ4PV4fc zBO?!F&dPNO+SMRA4Pesjb{R9405eyL0nbbS&}Xx?hs|y{T)%SM3GXBuY|g=qMcQFy z|H%ItcE`?u?SGB3IzWd&8Wq~wj=TNpoGGh9B=bIYKu#K`Y+zRQS$!{lZ zj*Suk@%Gjv!JD7o%RdwSK644xms-EBtomHu5DWI0j<;p}&(7L-J|n2E<8j=`hjWptf_H&E7D6%t*N=V~kPOoCacHm;z)>Ns5RD(piA{+=U0;9D06@vHx8(Wz+k1>WbWrO@rQjBi`7vbe9pmP|H&3#yQhtaQCGFPZHE-h(~6KB zP_B9Ge4j<}G8nRCXS7rMct4-hBGB0Z9b2xFYpea&91=9YOR0LT5Le34H$7c1YbAao z1CCsRbY!d4>L+_TP-drbPyhU1#`5I>*=MlWpPa6EiHy)e7iS_&%xZA(G)BwZ=)d3oG%#E`pV1i?P7kYG>8F)?n7~C#1r0q zXR(FQ((+Gd9b@eRxjft+i|tWnAur+SHTT8K<|9|Hzaf^^Y;AwG1bGkR?&Md14WrgH z(`ldOXx1VRK41yU87KobLW#1Xn_&ilVIBYuau$#h86@l=~_v@Z!U5*h5)Z&aifaRVb^)#CMq4nu4_77d)uQk@^RV73Fxlh13 z@VP?qrXLw7d2)H&jkOUxKXgj+Q8>rAGKEf>3>G?qR1;M!C*zy|>fhXLF1x?`SLE2@ zARl(J1FJ)u^f(-Zs)0)KOrZ21dzN=(WEyi46W2_AM zzUr6fM&hU~%P&@_DX^deLU!kzXiwxfuL{L9QNOF2}1XNX5Tie(amz9N=ms3A- zz1@1a6?%H0ULZmwMMWem90mpr1a+QBao@Zl*1lr27KP-Hr5OruUuiel!DHbaZQ=x(jg^EIs9 zk3UDg%>I+Dm{JxF&n9~qOeD}4i1qe(b$Gi!K%iUJMSk(2n=+zNq{ zU}8pFnJqFP!JwOAs|}Yfh8HCQWH6%a%y;7b$e`&{0IT*Wtv!4+aV%Vsav40blN) zUL5i7XopS;+3^>tyhmD!B0oa!r~X@G%0X!S@)UPlgK0sABQxFrXKVy(>(MY57g8@= zp#JJG$fFLdQB;m5C#qm9$f&*-;m7oJIln%cCPcCkEvS^%Evj@CBy4;T>bxLgOM#ay zDpuH?n8Hgb5vdXw&YSnP};%LH&B7_N%6$%|tnPb4j6HYHbO`us)0D&(xHdLz8$+56MFmu2! z9q;Vc$^4jIz1|1=ba*{Z--m4WFFQNYiZjUANui;>dmxl!T+(tVBw4Z3ozDG(T2Ydo z^y|V~Y0cld{hP8AibhA3-;;BDxh?T|%Ni$e&z?HV6B^7acIFSdMZv-YkmY}5DRyV# z-CvQ9T)25AKyJR6@O7^7NuNyAN0!53R}Py(WrPeRrbS$4ud>EUn2nH+1bT$ba9;W! zIQTh!#ZTtcSxnMZnDbGJHy|P=gbSh>yDi%C^mMTi$&Om{btgLR`Y_0)Gwx^G)(srH zSTLp!xaM0MCs9YVI9j}ZMj|!7f~m^x_}wcwwC}@wKGX-2vAYf1!leg`;_y0?s3i)F z{E5KIL{FBFWG4l{gbLjDL;5{+?UuE0e!K|$Co_m`*P)!~8S-V|Tt1SGcCFQ(!02UC zOS{L%UH1kw(Lj>qI1k3f*F<|KPMn6uH_#+o{!iQQ2RMDC`0?e(`Jl@lh&rHsEGG%b zHN9yCO;V}T;X>86smr~D^n?gciQSLzRnrG1U`UJX$ zz!*v?i)7Wiaf-y-=flLOmlmV}HeB>L>wr*`T1P9sII@vN zCE=NpM4^p}RSsQO#HM_eTHDGWzBG#_h%))U*Syn~t_2D#teV;|ItpdJ6hnF|rEc-X z#pDr41S?W#NP_tRuh#sxGrjHUpbIuSa^a3N6giq@eniddapl(PnwpQI>f-6X!EMV#-HE^qR%IyB zpZ$8{I7w-u!9KwV!B?n#(Lnptl#tt=2;iK1(m4|&Pu`m^68~TA&wah4h!jMnPnZ{% zmO{mjgp^xTqSG5zFTWNUZHHhbjzvq5OO&V(B9HyHm8Of9EP)CYg$M?}VsL~`hja}t z&E^8BW}H4Oj=j;6_r%L;*Pz+94DvRVw>K}2z7u#^ zS=rH1t`~#~_r6o+%8I68z>7t8cJ>cj+meO`RE5PqmzTp=9#4F|9Ln(TSlWpHI$c&l zJ6mHaHpK9;<8Tj}JLty$##fro+SZnTe@>4PdvaCbr!#8r@GE_`n$V3)tDiN zHg=aI>E8F_ZzLZ*v$KlCf$z@e7Z;7XwV5-PAdyicrgYoYiCIVjaQcgzeLq0)b4B@N zGp|+hr0cpfmgId8R+=uc3)r}Bmzt5Grma0bo=nm4`FfF9xAYpjwWVLz^SDv+^~K%y zg2bE=`}pYLCqyDtP;Ydzi_i;K1Cf6@V+1lgQik#9H{9)KmyK(hu)SISo1-z|&&F(? z`{3XAFE1}Vd5V&8xC50cCGB^U42#&SeXbu5tB|)xDN3qpYU1whoJ2%Kkl)*h#i;g_ z_zFO=QB;$q?z+JGshKTH-tUxucb`W11pvYe3gSdHb@gEoYGm;^lV=!s=;$7vMKjd3 zLj+kB_@_g{A}ecYN%{Kn2lNT2m|%e?LRh&1hlu_&?th4myVmhwr?{rlnWm%}X@<%&4B`7huAK^k~$?G4Oegs~`J+80x!2 zmTgAP+<-YbawaBZAmz(3cToQHHS&L0*7w>E-*R6y(5_wi)gD0{Dz-$l(X#DPnP*IqE}^FB%-$b5?G>gtp}<9m*pD=GaF)A9ccBDz)hT9$la zhG>an-hYZB*ZKm5JL@o_B|rwwue%?><`%0>p8Tx5Uo~M)jtV!wwl=Qk*fWyJYS#XD zl)zWx!u>SQ^X|gv3twTevbI*i^CA)K8usM3IK&QWjgYajyPE}|jL6q144<87R0brZ z+L`~ljYge~ zN;dYBgX+nC*RBO-XA5Onx8PmJ zUV)%$5y{`bYOy*GEjj|vX8^{U$uW|cL%>h7vtI$i7Q7<^puC99Q{Q9Vf>FOcDJCX{L&7Unr{8<*6;iw*L0n%fW9MJY zMLObX8G+SpU;+Nvuql83BMVU@)R}>X)iA zjk4DX!qWd-tg0H2>nS)r=+kf5C)8 zGEQ2}?MHt`!b6TYF+jq-!TNSWHa=Dgp8DuX;aUc)nc=?u3kc};SVUybF%)AdU(8CP zgvp@sj7U!PYO~^t5;{!azs6NAemJkL&!6uwS#PqC&*5UqV+{-rT&yHx(gpxn4WcJO zY@y{t4$H3Birh(u-#oU!6sfxGX)`T(QL{6Lj@B5#gUgx$bb|SSfAMgb3|6h}?2hzyU$Kjn=juj=B2j2SKL&b3XtdmsC5RJ)Dh3|4mGUfHB*l0& z(}Dkb&cJyD%Wl0Xd~k5kjVB`jrX3*NkBY_!KHNEpN$ p68S;XRKhtxriAubH!&# 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 literal 0 HcmV?d00001 diff --git a/packages/fether-electron/static/assets/icons/webpack/failure.png b/packages/fether-electron/static/assets/icons/webpack/failure.png new file mode 100644 index 0000000000000000000000000000000000000000..7554523c33b49b68844ee619d23a75ab34ec532f GIT binary patch literal 17576 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 wPRFOwXf(e}=(F6l-(?#uVxd!L8p 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 U6P!p*1^@s607*qoM6N<$f@@ZV6#xJL literal 0 HcmV?d00001 diff --git a/packages/fether-electron/static/assets/icons/webpack/warning.png b/packages/fether-electron/static/assets/icons/webpack/warning.png new file mode 100644 index 0000000000000000000000000000000000000000..f92a4beb2754a8a01dae03f34c9990de32b17b11 GIT binary patch literal 17023 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 literal 0 HcmV?d00001 diff --git a/yarn.lock b/yarn.lock index 56a11c8cc..edbaed5a2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9686,6 +9686,16 @@ node-loader@^0.6.0: resolved "https://registry.yarnpkg.com/node-loader/-/node-loader-0.6.0.tgz#c797ef51095ed5859902b157f6384f6361e05ae8" integrity sha1-x5fvUQle1YWZArFX9jhPY2HgWug= +node-notifier@5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" + integrity sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg== + dependencies: + growly "^1.3.0" + semver "^5.4.1" + shellwords "^0.1.1" + which "^1.3.0" + node-notifier@^5.2.1: version "5.4.0" resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.0.tgz#7b455fdce9f7de0c63538297354f3db468426e6a" @@ -14760,6 +14770,15 @@ webidl-conversions@^4.0.2: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== +webpack-build-notifier@^0.1.30: + version "0.1.30" + resolved "https://registry.yarnpkg.com/webpack-build-notifier/-/webpack-build-notifier-0.1.30.tgz#837e9002d13c1d76bdf954ccafe0b824b38bb789" + integrity sha512-HeZ4Wr8XP7W0kSmPQkZCXARQVIjVFNPyJBdUqkqcE0ySYNjr6vOH3ufHESLPuy5KmMRUjHJdqJ6y3McDfCjJxQ== + dependencies: + ansi-regex "^2.0.0" + node-notifier "5.2.1" + strip-ansi "^3.0.1" + webpack-cli@^3.2.1: version "3.2.3" resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.2.3.tgz#13653549adfd8ccd920ad7be1ef868bacc22e346" From 3bb2208a1e46f2d06f0a07ec77d63ae910cb2837 Mon Sep 17 00:00:00 2001 From: Luke Schoen Date: Thu, 28 Feb 2019 10:49:05 +0100 Subject: [PATCH 05/67] fix: Remove duplicate dependency --- packages/fether-electron/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/fether-electron/package.json b/packages/fether-electron/package.json index 72f080505..8f90b68aa 100644 --- a/packages/fether-electron/package.json +++ b/packages/fether-electron/package.json @@ -57,7 +57,6 @@ "electron": "^4.0.1", "electron-builder": "^20.38.5", "electron-webpack": "^2.6.1", - "source-map-support": "^0.5.10", "webpack": "^4.29.1", "webpack-build-notifier": "^0.1.30" } From c54c4ed2696558581a79083d0d4f9fe8b9946241 Mon Sep 17 00:00:00 2001 From: Luke Schoen Date: Fri, 1 Mar 2019 10:46:12 +0100 Subject: [PATCH 06/67] WIP --- packages/fether-electron/package.json | 2 +- .../main/app/methods/setupRequestListeners.js | 53 +++++++++++++++++++ .../src/main/app/methods/setupWinListeners.js | 17 ++++-- .../src/main/app/options/config/index.js | 21 +++++--- packages/fether-electron/src/main/index.js | 48 +++++++++++++++-- packages/fether-react/public/index.html | 2 +- 6 files changed, 125 insertions(+), 18 deletions(-) diff --git a/packages/fether-electron/package.json b/packages/fether-electron/package.json index 8f90b68aa..16ce96da2 100644 --- a/packages/fether-electron/package.json +++ b/packages/fether-electron/package.json @@ -30,7 +30,7 @@ "scripts": { "prebuild": "copyfiles -u 2 \"../fether-react/build/**/*\" static/ && ./scripts/fixElectronBug.sh", "build": "electron-webpack", - "electron": "cross-env SKIP_PREFLIGHT_CHECK=true electron dist/main/main.js", + "electron": "cross-env SKIP_PREFLIGHT_CHECK=true electron --enable-sandbox dist/main/main.js", "prepackage": "./scripts/revertElectronBug.sh", "package": "electron-builder", "prerelease": "./scripts/revertElectronBug.sh", diff --git a/packages/fether-electron/src/main/app/methods/setupRequestListeners.js b/packages/fether-electron/src/main/app/methods/setupRequestListeners.js index 6fdb84f68..a848f3920 100644 --- a/packages/fether-electron/src/main/app/methods/setupRequestListeners.js +++ b/packages/fether-electron/src/main/app/methods/setupRequestListeners.js @@ -30,6 +30,59 @@ function setupRequestListeners (fetherApp) { callback({ requestHeaders: details.requestHeaders }); // eslint-disable-line } ); + + // Content Security Policy (CSP) + session.defaultSession.webRequest.onHeadersReceived((details, callback) => { + /* eslint-disable */ + callback({ + responseHeaders: { + ...details.responseHeaders, + "Content-Security-Policy": [ + ` + default-src 'self'; + script-src 'self' file: http: blob: 'unsafe-inline' 'unsafe-eval'; + connect-src 'self' file: http: https: ws: wss:; + img-src 'self' 'unsafe-inline' file: data: blob: http: https:; + style-src 'self' 'unsafe-inline' file: blob:; + object-src 'none'; + ` + ] + } + }); + /* eslint-enable */ + }); + + // Limit specific permissions (i.e. `openExternal`) in response to events from particular origins + // to limit the exploitability of applications that load remote content + // References: + // https://electronjs.org/docs/api/session#sessetpermissionrequesthandlerhandler + // https://doyensec.com/resources/us-17-Carettoni-Electronegativity-A-Study-Of-Electron-Security-wp.pdf + session.defaultSession.setPermissionRequestHandler( + (webContents, permission, callback, details) => { + let permissionGranted = false; + const trustedURLs = [ + 'https://parity.io', + 'https://github.com/paritytech/fether/issues/new', + 'https://api.github.com/repos/paritytech/fether/releases/latest' + ]; + + // FIXME - does not work + if ( + webContents.getURL() !== 'https://localhost:3000/' && + permission === 'openExternal' + ) { + if (trustedURLs.includes(details.externalURL)) { + permissionGranted = true; + } + + return callback(permissionGranted); + } else { + permissionGranted = true; + + return callback(permissionGranted); + } + } + ); } export default setupRequestListeners; diff --git a/packages/fether-electron/src/main/app/methods/setupWinListeners.js b/packages/fether-electron/src/main/app/methods/setupWinListeners.js index 9279f9187..44d9f3835 100644 --- a/packages/fether-electron/src/main/app/methods/setupWinListeners.js +++ b/packages/fether-electron/src/main/app/methods/setupWinListeners.js @@ -3,7 +3,6 @@ // // SPDX-License-Identifier: BSD-3-Clause -import electron from 'electron'; import debounce from 'lodash/debounce'; import Pino from '../utils/pino'; @@ -13,10 +12,18 @@ const pino = Pino(); function setupWinListeners (fetherApp) { const { onWindowClose, processSaveWinPosition, win } = fetherApp; - // Open external links in browser - win.webContents.on('new-window', (event, url) => { - event.preventDefault(); - electron.shell.openExternal(url); + // Insecure TLS Validation - verify the application does not explicitly opt-out of TLS validation + // Reference: https://doyensec.com/resources/us-17-Carettoni-Electronegativity-A-Study-Of-Electron-Security-wp.pdf + win.webContents.session.setCertificateVerifyProc((request, callback) => { + const { hostname } = request; + + if (hostname === 'https://localhost:3000/') { + // Success and disables certificate verification + callback(0); // eslint-disable-line + } else { + // Use the verification result from Chromium + callback(-3); // eslint-disable-line + } }); // Windows and Linux (unchecked on others) diff --git a/packages/fether-electron/src/main/app/options/config/index.js b/packages/fether-electron/src/main/app/options/config/index.js index 66d4b5435..0d93a5d85 100644 --- a/packages/fether-electron/src/main/app/options/config/index.js +++ b/packages/fether-electron/src/main/app/options/config/index.js @@ -87,15 +87,24 @@ const SECURITY_OPTIONS = { * and gain access to Node.js and requires the user to sanitise user inputs * to reduce the possible XSS attack surface. */ - // nodeIntegration: true, // FIXME - should be disabled but causes error + // nodeIntegration: false, // FIXME - should be disabled but causes error nodeIntegrationInWorker: false, - sandbox: false, + // contextIsolation: true, // FIXME - should be enabled but causes error + // preload: './preload.js', // TODO + + /** + * Sandbox the BrowserWindow renderer associated with the window still allowing access to + * all underlying Electron/Node.js primitives using `remote` or internal IPC + * Reference: https://doyensec.com/resources/us-17-Carettoni-Electronegativity-A-Study-Of-Electron-Security-wp.pdf + */ + sandbox: false, // Do not set to false. Run electron with `electron --enable-sandbox` to sandbox all BrowserWindow instances enableRemoteModule: true, // Remote is required in fether-react parityStore.js + // Enables same origin policy to prevent execution of insecure code. Do not set to false webSecurity: true, - allowRunningInsecureContent: false, + allowRunningInsecureContent: false, // Do not set to true plugins: false, - experimentalFeatures: false, - // contextIsolation: true, // FIXME - should be enabled but causes error + experimentalFeatures: false, // Do not set to true + enableBlinkFeatures: '', // Do not enable any of them nativeWindowOpen: true, /** * `webviewTag` when enabled allows content to be embedded into the @@ -105,7 +114,7 @@ const SECURITY_OPTIONS = { * with the `window.open` command and passing a WebView tag * (see `webView`) to enable `nodeIntegration`. */ - webviewTag: false, + webviewTag: false, // Associated with `will-attach-webview` safeDialogs: true, safeDialogsMessage: 'Electron consecutive dialog protection was triggered', navigateOnDragDrop: false diff --git a/packages/fether-electron/src/main/index.js b/packages/fether-electron/src/main/index.js index 7b6fc0cd4..83f74ef5b 100644 --- a/packages/fether-electron/src/main/index.js +++ b/packages/fether-electron/src/main/index.js @@ -18,12 +18,15 @@ sourceMapSupport.install({ handleUncaughtExceptions: true, hookRequire: true }); -const { app } = electron; +const { app, shell } = electron; const pino = Pino(); let withTaskbar = process.env.TASKBAR !== 'false'; pino.info('Platform detected: ', process.platform); +pino.info('Process type: ', process.type); +pino.info('Process ID: ', process.pid); +pino.info('Process args: ', process.argv); // Disable gpu acceleration on linux // https://github.com/parity-js/fether/issues/85 @@ -118,17 +121,52 @@ app.on('web-contents-created', (eventOuter, contents) => { webPreferences.nodeIntegration = false; // Verify URL being loaded - if (!params.src.startsWith('http://localhost.3000/')) { + if (!params.src.startsWith('https://localhost.3000/')) { eventOuter.preventDefault(); eventInner.preventDefault(); } }); - contents.on('will-navigate', (event, navigationUrl) => { - const parsedUrl = parseUrl(navigationUrl); + // Insecure TLS Validation - verify the application does not explicitly opt-out of TLS validation + // Reference: https://doyensec.com/resources/us-17-Carettoni-Electronegativity-A-Study-Of-Electron-Security-wp.pdf + app.on( + 'certificate-error', + (event, webContents, url, error, certificate, callback) => { + if (url === 'https://localhost:3000/') { + // Proceed anyway + callback(true); // eslint-disable-line + } else { + callback(false); // eslint-disable-line + } + } + ); - if (parsedUrl.origin !== 'http://localhost:3000') { + contents.on('will-navigate', (event, url) => { + const parsedUrl = parseUrl(url); + + if (parsedUrl.origin !== 'https://localhost:3000') { event.preventDefault(); } }); + + // Security vulnerability fix https://electronjs.org/blog/window-open-fix + contents.on('-add-new-contents', event => { + event.preventDefault(); + }); + + // Open external links in browser + contents.on('new-window', (event, url) => { + event.preventDefault(); + + // const parsedUrl = parseUrl(url); + + // if (parsedUrl.origin !== 'https://localhost:3000') { + // pino.info('Unable to open external link to untrusted content'); + // return; + // } + + // FIXME - determine how to modify this so it only works for trusted content. + // See https://electronjs.org/docs/tutorial/security#14-do-not-use-openexternal-with-untrusted-content + shell.openExternal(url); + }); }); diff --git a/packages/fether-react/public/index.html b/packages/fether-react/public/index.html index e6e279423..9401b38d9 100644 --- a/packages/fether-react/public/index.html +++ b/packages/fether-react/public/index.html @@ -4,7 +4,7 @@ - +