@@ -32,6 +32,8 @@ const packageJson = require('../package.json');
32
32
const isWindows = os . platform ( ) === 'win32' ;
33
33
34
34
const APP_URL = process . env . APP_URL || 'https://app.httptoolkit.tech' ;
35
+ const hasTrustedOrigin = ( url : URL ) => url . origin === APP_URL ;
36
+
35
37
const AUTH_TOKEN = crypto . randomBytes ( 20 ) . toString ( 'base64url' ) ;
36
38
const DESKTOP_VERSION = packageJson . version ;
37
39
const BUNDLED_SERVER_VERSION = packageJson . config [ 'httptoolkit-server-version' ] ;
@@ -103,6 +105,14 @@ const createWindow = (logStream: WriteStream) => {
103
105
logStream . write ( `${ levelName } : ${ message } \n` ) ;
104
106
} ) ;
105
107
108
+ // Limit permissions to our trusted origin only. This shouldn't be required (we don't allow loading
109
+ // 3rd party sites) but it's good practice for defense-in-depth etc. We don't limit permissions
110
+ // on the other hand - for *our* code, we trust it to do whatever it needs.
111
+ window . webContents . session . setPermissionRequestHandler ( ( wc , _perm , callback ) => {
112
+ const pageUrl = new URL ( wc . getURL ( ) ) ;
113
+ return callback ( hasTrustedOrigin ( pageUrl ) ) ;
114
+ } ) ;
115
+
106
116
window . loadURL ( APP_URL + '?' + querystring . stringify ( {
107
117
authToken : AUTH_TOKEN ,
108
118
desktopVersion : DESKTOP_VERSION
@@ -204,7 +214,7 @@ if (!amMainInstance) {
204
214
const parsedUrl = new URL ( navigationUrl ) ;
205
215
206
216
checkForUnsafeNavigation ( parsedUrl ) ;
207
- if ( ! isLocalNavigation ( parsedUrl ) ) {
217
+ if ( ! hasTrustedOrigin ( parsedUrl ) ) {
208
218
event . preventDefault ( ) ;
209
219
handleExternalNavigation ( parsedUrl ) ;
210
220
}
@@ -213,7 +223,7 @@ if (!amMainInstance) {
213
223
const parsedUrl = new URL ( openDetails . url ) ;
214
224
215
225
checkForUnsafeNavigation ( parsedUrl ) ;
216
- if ( ! isLocalNavigation ( parsedUrl ) ) {
226
+ if ( ! hasTrustedOrigin ( parsedUrl ) ) {
217
227
handleExternalNavigation ( parsedUrl ) ;
218
228
return { action : 'deny' } ;
219
229
} else {
@@ -268,10 +278,6 @@ if (!amMainInstance) {
268
278
}
269
279
}
270
280
271
- function isLocalNavigation ( url : URL ) {
272
- return url . origin === APP_URL ;
273
- }
274
-
275
281
function handleExternalNavigation ( url : URL ) {
276
282
shell . openExternal ( url . toString ( ) )
277
283
. catch ( ( error ) => {
0 commit comments