Skip to content

Commit 82d915c

Browse files
committed
worker - block some globals from being used
1 parent df880b0 commit 82d915c

1 file changed

Lines changed: 27 additions & 9 deletions

File tree

src/vs/workbench/services/extensions/worker/extensionHostWorker.ts

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,31 @@ import { ExtensionHostMain } from 'vs/workbench/services/extensions/common/exten
1212
import { IHostUtils } from 'vs/workbench/api/common/extHostExtensionService';
1313
import 'vs/workbench/services/extensions/worker/extHost.services';
1414

15-
// worker-self
15+
//#region --- Define, capture, and override some globals
16+
//todo@joh do not allow extensions to call postMessage and other globals...
17+
1618
declare namespace self {
17-
function close(): void;
19+
let close: any;
20+
let postMessage: any;
21+
let addEventLister: any;
22+
let indexedDB: any;
23+
let caches: any;
1824
}
1925

20-
// do not allow extensions to call terminate
2126
const nativeClose = self.close.bind(self);
22-
self.close = () => console.trace('An extension called terminate and this was prevented');
23-
let onTerminate = nativeClose;
27+
self.close = () => console.trace(`'close' has been blocked`);
28+
29+
const nativePostMessage = postMessage.bind(self);
30+
self.postMessage = () => console.trace(`'postMessage' has been blocked`);
31+
32+
const nativeAddEventLister = addEventListener.bind(self);
33+
self.addEventLister = () => console.trace(`'addEventListener' has been blocked`);
34+
35+
// readonly, cannot redefine...
36+
// self.indexedDB = undefined;
37+
// self.caches = undefined;
38+
39+
//#endregion ---
2440

2541
const hostUtil = new class implements IHostUtils {
2642
_serviceBrand: any;
@@ -35,7 +51,6 @@ const hostUtil = new class implements IHostUtils {
3551
}
3652
};
3753

38-
//todo@joh do not allow extensions to call postMessage and other globals...
3954

4055
class ExtensionWorker {
4156

@@ -47,7 +62,8 @@ class ExtensionWorker {
4762
let emitter = new Emitter<VSBuffer>();
4863
let terminating = false;
4964

50-
onmessage = event => {
65+
66+
nativeAddEventLister('message', event => {
5167
const { data } = event;
5268
if (!(data instanceof ArrayBuffer)) {
5369
console.warn('UNKNOWN data received', data);
@@ -64,14 +80,14 @@ class ExtensionWorker {
6480

6581
// emit non-terminate messages to the outside
6682
emitter.fire(msg);
67-
};
83+
});
6884

6985
this.protocol = {
7086
onMessage: emitter.event,
7187
send: vsbuf => {
7288
if (!terminating) {
7389
const data = vsbuf.buffer.buffer.slice(vsbuf.buffer.byteOffset, vsbuf.buffer.byteOffset + vsbuf.buffer.byteLength);
74-
postMessage(data, [data]);
90+
nativePostMessage(data, [data]);
7591
}
7692
}
7793
};
@@ -94,6 +110,8 @@ function connectToRenderer(protocol: IMessagePassingProtocol): Promise<IRenderer
94110
});
95111
}
96112

113+
let onTerminate = nativeClose;
114+
97115
(function create(): void {
98116
const res = new ExtensionWorker();
99117

0 commit comments

Comments
 (0)