annotate tcb.js @ 27:69622f55fcf6

Made a simple SafeWrapper membrane to mediate between trust boundaries.
author Atul Varma <varmaa@toolness.com>
date Mon, 22 Jun 2009 10:59:51 -0700
parents 777839fbafeb
children 64de55cd54a4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
24
777839fbafeb Added some documentation to the TCB.
Atul Varma <varmaa@toolness.com>
parents: 21
diff changeset
1 // This script represents the Trusted Code Base (TCB) of the
777839fbafeb Added some documentation to the TCB.
Atul Varma <varmaa@toolness.com>
parents: 21
diff changeset
2 // playground; it alone has access to all privileged functionality and
777839fbafeb Added some documentation to the TCB.
Atul Varma <varmaa@toolness.com>
parents: 21
diff changeset
3 // can load SecurableModules as needed, exporting capabilities to them
777839fbafeb Added some documentation to the TCB.
Atul Varma <varmaa@toolness.com>
parents: 21
diff changeset
4 // as necessary.
777839fbafeb Added some documentation to the TCB.
Atul Varma <varmaa@toolness.com>
parents: 21
diff changeset
5
10
16a605ff036c The TCB can now define a global checkAccess() handler. It also has access to a lookupProperty() function that can retrieve an attribute of an object without initiating security checks or property getters.
Atul Varma <varmaa@toolness.com>
parents: 8
diff changeset
6 // This security function is called by the platform whenever a
16a605ff036c The TCB can now define a global checkAccess() handler. It also has access to a lookupProperty() function that can retrieve an attribute of an object without initiating security checks or property getters.
Atul Varma <varmaa@toolness.com>
parents: 8
diff changeset
7 // particular property needs to be accessed on a particular object.
24
777839fbafeb Added some documentation to the TCB.
Atul Varma <varmaa@toolness.com>
parents: 21
diff changeset
8
10
16a605ff036c The TCB can now define a global checkAccess() handler. It also has access to a lookupProperty() function that can retrieve an attribute of an object without initiating security checks or property getters.
Atul Varma <varmaa@toolness.com>
parents: 8
diff changeset
9 function checkAccess(obj, id) {
11
bde6607a3620 changed TCB/sample module code a bit.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
10 var frame = stack().caller;
15
1d73446eef62 added functionInfo() native function.
Atul Varma <varmaa@toolness.com>
parents: 14
diff changeset
11 var isSuspicious = false;
11
bde6607a3620 changed TCB/sample module code a bit.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
12 if (!(frame.filename == null ||
15
1d73446eef62 added functionInfo() native function.
Atul Varma <varmaa@toolness.com>
parents: 14
diff changeset
13 frame.filename == "tcb.js")) {
1d73446eef62 added functionInfo() native function.
Atul Varma <varmaa@toolness.com>
parents: 14
diff changeset
14 isSuspicious = true;
11
bde6607a3620 changed TCB/sample module code a bit.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
15 print("access request from " + frame.filename + " on property '" + id +
bde6607a3620 changed TCB/sample module code a bit.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
16 "' of " + obj);
15
1d73446eef62 added functionInfo() native function.
Atul Varma <varmaa@toolness.com>
parents: 14
diff changeset
17 }
12
e14f433f3a58 Function objects are now attached to stack frames returned by stack().
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
18 if (id == 'caller') {
15
1d73446eef62 added functionInfo() native function.
Atul Varma <varmaa@toolness.com>
parents: 14
diff changeset
19 if (frame.caller &&
1d73446eef62 added functionInfo() native function.
Atul Varma <varmaa@toolness.com>
parents: 14
diff changeset
20 frame.caller.functionObject &&
1d73446eef62 added functionInfo() native function.
Atul Varma <varmaa@toolness.com>
parents: 14
diff changeset
21 !(isSuspicious &&
1d73446eef62 added functionInfo() native function.
Atul Varma <varmaa@toolness.com>
parents: 14
diff changeset
22 (functionInfo(frame.caller.functionObject).filename !=
1d73446eef62 added functionInfo() native function.
Atul Varma <varmaa@toolness.com>
parents: 14
diff changeset
23 frame.filename))) {
12
e14f433f3a58 Function objects are now attached to stack frames returned by stack().
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
24 return frame.caller.functionObject;
15
1d73446eef62 added functionInfo() native function.
Atul Varma <varmaa@toolness.com>
parents: 14
diff changeset
25 } else
12
e14f433f3a58 Function objects are now attached to stack frames returned by stack().
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
26 return null;
e14f433f3a58 Function objects are now attached to stack frames returned by stack().
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
27 }
10
16a605ff036c The TCB can now define a global checkAccess() handler. It also has access to a lookupProperty() function that can retrieve an attribute of an object without initiating security checks or property getters.
Atul Varma <varmaa@toolness.com>
parents: 8
diff changeset
28 return lookupProperty(obj, id);
16a605ff036c The TCB can now define a global checkAccess() handler. It also has access to a lookupProperty() function that can retrieve an attribute of an object without initiating security checks or property getters.
Atul Varma <varmaa@toolness.com>
parents: 8
diff changeset
29 }
16a605ff036c The TCB can now define a global checkAccess() handler. It also has access to a lookupProperty() function that can retrieve an attribute of an object without initiating security checks or property getters.
Atul Varma <varmaa@toolness.com>
parents: 8
diff changeset
30
8
e14f496e6e08 added a handleError() function to the TCB, which is called whenever an unhandled exception occurs. Also fixed a bug in the setting of lastException.
Atul Varma <varmaa@toolness.com>
parents: 7
diff changeset
31 // This function is called by the platform whenever an uncaught exception
e14f496e6e08 added a handleError() function to the TCB, which is called whenever an unhandled exception occurs. Also fixed a bug in the setting of lastException.
Atul Varma <varmaa@toolness.com>
parents: 7
diff changeset
32 // occurs.
24
777839fbafeb Added some documentation to the TCB.
Atul Varma <varmaa@toolness.com>
parents: 21
diff changeset
33
8
e14f496e6e08 added a handleError() function to the TCB, which is called whenever an unhandled exception occurs. Also fixed a bug in the setting of lastException.
Atul Varma <varmaa@toolness.com>
parents: 7
diff changeset
34 function handleError() {
e14f496e6e08 added a handleError() function to the TCB, which is called whenever an unhandled exception occurs. Also fixed a bug in the setting of lastException.
Atul Varma <varmaa@toolness.com>
parents: 7
diff changeset
35 printTraceback(lastExceptionTraceback);
e14f496e6e08 added a handleError() function to the TCB, which is called whenever an unhandled exception occurs. Also fixed a bug in the setting of lastException.
Atul Varma <varmaa@toolness.com>
parents: 7
diff changeset
36 print(lastException);
e14f496e6e08 added a handleError() function to the TCB, which is called whenever an unhandled exception occurs. Also fixed a bug in the setting of lastException.
Atul Varma <varmaa@toolness.com>
parents: 7
diff changeset
37 }
e14f496e6e08 added a handleError() function to the TCB, which is called whenever an unhandled exception occurs. Also fixed a bug in the setting of lastException.
Atul Varma <varmaa@toolness.com>
parents: 7
diff changeset
38
24
777839fbafeb Added some documentation to the TCB.
Atul Varma <varmaa@toolness.com>
parents: 21
diff changeset
39 // This function uses the Python-inspired traceback functionality of the
777839fbafeb Added some documentation to the TCB.
Atul Varma <varmaa@toolness.com>
parents: 21
diff changeset
40 // playground to print a stack trace that looks much like Python's.
777839fbafeb Added some documentation to the TCB.
Atul Varma <varmaa@toolness.com>
parents: 21
diff changeset
41
5
1f38f4f61768 added global lastException and lastExceptionTraceback properties to the TCB global, which are similar to python's exc_info().
Atul Varma <varmaa@toolness.com>
parents: 4
diff changeset
42 function printTraceback(frame) {
4
71de19be1054 Added a native stack() function.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
43 print("Traceback (most recent call last):");
5
1f38f4f61768 added global lastException and lastExceptionTraceback properties to the TCB global, which are similar to python's exc_info().
Atul Varma <varmaa@toolness.com>
parents: 4
diff changeset
44 if (frame === undefined)
1f38f4f61768 added global lastException and lastExceptionTraceback properties to the TCB global, which are similar to python's exc_info().
Atul Varma <varmaa@toolness.com>
parents: 4
diff changeset
45 frame = stack();
4
71de19be1054 Added a native stack() function.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
46 var lines = [];
71de19be1054 Added a native stack() function.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
47 while (frame) {
71de19be1054 Added a native stack() function.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
48 var line = (' File "' + frame.filename + '", line ' +
71de19be1054 Added a native stack() function.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
49 frame.lineNo + ', in ' + frame.functionName);
71de19be1054 Added a native stack() function.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
50 lines.splice(0, 0, line);
71de19be1054 Added a native stack() function.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
51 frame = frame.caller;
71de19be1054 Added a native stack() function.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
52 }
71de19be1054 Added a native stack() function.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
53 print(lines.join('\n'));
71de19be1054 Added a native stack() function.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
54 }
71de19be1054 Added a native stack() function.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
55
24
777839fbafeb Added some documentation to the TCB.
Atul Varma <varmaa@toolness.com>
parents: 21
diff changeset
56 // An example of some of the Python-inspired traceback functionality of
777839fbafeb Added some documentation to the TCB.
Atul Varma <varmaa@toolness.com>
parents: 21
diff changeset
57 // the playground.
777839fbafeb Added some documentation to the TCB.
Atul Varma <varmaa@toolness.com>
parents: 21
diff changeset
58
5
1f38f4f61768 added global lastException and lastExceptionTraceback properties to the TCB global, which are similar to python's exc_info().
Atul Varma <varmaa@toolness.com>
parents: 4
diff changeset
59 function throwError() {
1f38f4f61768 added global lastException and lastExceptionTraceback properties to the TCB global, which are similar to python's exc_info().
Atul Varma <varmaa@toolness.com>
parents: 4
diff changeset
60 function innerThrowError() {
13
d200a8158bd5 Fixed a bug in the throw hook, added a 'scopeChain' property to stack frames.
Atul Varma <varmaa@toolness.com>
parents: 12
diff changeset
61 var x = 1;
5
1f38f4f61768 added global lastException and lastExceptionTraceback properties to the TCB global, which are similar to python's exc_info().
Atul Varma <varmaa@toolness.com>
parents: 4
diff changeset
62 throw new Error("hi");
1f38f4f61768 added global lastException and lastExceptionTraceback properties to the TCB global, which are similar to python's exc_info().
Atul Varma <varmaa@toolness.com>
parents: 4
diff changeset
63 }
1f38f4f61768 added global lastException and lastExceptionTraceback properties to the TCB global, which are similar to python's exc_info().
Atul Varma <varmaa@toolness.com>
parents: 4
diff changeset
64 innerThrowError();
1f38f4f61768 added global lastException and lastExceptionTraceback properties to the TCB global, which are similar to python's exc_info().
Atul Varma <varmaa@toolness.com>
parents: 4
diff changeset
65 }
1f38f4f61768 added global lastException and lastExceptionTraceback properties to the TCB global, which are similar to python's exc_info().
Atul Varma <varmaa@toolness.com>
parents: 4
diff changeset
66
1f38f4f61768 added global lastException and lastExceptionTraceback properties to the TCB global, which are similar to python's exc_info().
Atul Varma <varmaa@toolness.com>
parents: 4
diff changeset
67 try {
1f38f4f61768 added global lastException and lastExceptionTraceback properties to the TCB global, which are similar to python's exc_info().
Atul Varma <varmaa@toolness.com>
parents: 4
diff changeset
68 throwError();
1f38f4f61768 added global lastException and lastExceptionTraceback properties to the TCB global, which are similar to python's exc_info().
Atul Varma <varmaa@toolness.com>
parents: 4
diff changeset
69 } catch (e) {
13
d200a8158bd5 Fixed a bug in the throw hook, added a 'scopeChain' property to stack frames.
Atul Varma <varmaa@toolness.com>
parents: 12
diff changeset
70 print("caught an intentional error. local variables in scope chain: ");
d200a8158bd5 Fixed a bug in the throw hook, added a 'scopeChain' property to stack frames.
Atul Varma <varmaa@toolness.com>
parents: 12
diff changeset
71 var scopeChain = lastExceptionTraceback.scopeChain;
d200a8158bd5 Fixed a bug in the throw hook, added a 'scopeChain' property to stack frames.
Atul Varma <varmaa@toolness.com>
parents: 12
diff changeset
72 for (name in scopeChain)
d200a8158bd5 Fixed a bug in the throw hook, added a 'scopeChain' property to stack frames.
Atul Varma <varmaa@toolness.com>
parents: 12
diff changeset
73 print(" " + name + ": " + scopeChain[name]);
5
1f38f4f61768 added global lastException and lastExceptionTraceback properties to the TCB global, which are similar to python's exc_info().
Atul Varma <varmaa@toolness.com>
parents: 4
diff changeset
74 }
2
1f3e9c8df4f0 Script is now read from tcb.js.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
75
24
777839fbafeb Added some documentation to the TCB.
Atul Varma <varmaa@toolness.com>
parents: 21
diff changeset
76 // Load a sample SecurableModule and run some code in it.
777839fbafeb Added some documentation to the TCB.
Atul Varma <varmaa@toolness.com>
parents: 21
diff changeset
77
27
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
78 function SafeWrapper(object) {
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
79 var existingWrapper = getWrapper(object);
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
80 if (existingWrapper)
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
81 return existingWrapper;
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
82 this._wrappee = object;
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
83 return wrap(object, this);
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
84 }
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
85
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
86 SafeWrapper.prototype = {
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
87 _maybeWrap: function(object) {
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
88 switch (typeof(object)) {
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
89 case "object":
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
90 case "function":
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
91 if (object == null)
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
92 return null;
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
93 return new SafeWrapper(object);
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
94 case "string":
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
95 case "boolean":
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
96 case "undefined":
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
97 case "number":
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
98 return object;
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
99 default:
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
100 throw new Error("Unexpected type: " + typeof(object));
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
101 }
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
102 },
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
103
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
104 convert: function(wrappee, wrapper, type) {
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
105 switch (type) {
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
106 case "function":
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
107 if (typeof(wrappee) == "function")
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
108 return wrapper;
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
109 return undefined;
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
110 case "undefined":
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
111 // TODO: Malicious getter could destroy us here.
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
112 return wrappee.toString();
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
113 case "object":
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
114 if (typeof(wrappee) == "object")
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
115 return wrapper;
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
116 return undefined;
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
117 default:
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
118 throw new Error("unexpected type: " + type);
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
119 }
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
120 },
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
121
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
122 getProperty: function(wrappee, wrapper, id, defaultValue) {
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
123 if (id && id != "prototype" && id[0] != "_") {
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
124 if (defaultValue === undefined) {
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
125 defaultValue = lookupProperty(wrappee, id);
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
126 }
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
127 return this._maybeWrap(defaultValue);
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
128 }
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
129 return undefined;
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
130 },
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
131
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
132 setProperty: function() {
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
133 throw new Error("Can't set properties on this object.");
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
134 },
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
135
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
136 delProperty: function() {
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
137 throw new Error("Can't delete properties on this object.");
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
138 },
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
139
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
140 _callOrConstruct: function(wrapee, wrapper, thisObj, args) {
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
141 if (typeof(this._wrappee) == "function") {
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
142 var wrappedArgs = [];
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
143 for (var i = 0; i < args.length; i++)
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
144 wrappedArgs.push(this._maybeWrap(args[i]));
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
145 var result;
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
146 try {
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
147 // TODO: What if the wrappee has a malicious getter for
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
148 // apply()?
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
149 result = this._wrappee.apply(this._maybeWrap(thisObj), wrappedArgs);
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
150 } catch (e) {
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
151 throw this._maybeWrap(e);
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
152 }
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
153 return this._maybeWrap(result);
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
154 }
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
155 },
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
156
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
157 construct: function() {
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
158 return this._callOrConstruct.apply(this, arguments);
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
159 },
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
160
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
161 call: function() {
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
162 return this._callOrConstruct.apply(this, arguments);
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
163 }
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
164 };
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
165
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
166 var module = require("sample-module.js", {blop: "hello",
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
167 print: new SafeWrapper(print)});
69622f55fcf6 Made a simple SafeWrapper membrane to mediate between trust boundaries.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
168 module = new SafeWrapper(module);
6
500e267ed094 Added a really simple securableModule require() implementation.
Atul Varma <varmaa@toolness.com>
parents: 5
diff changeset
169
14
1f48075a404e changed tcb and sample module again
Atul Varma <varmaa@toolness.com>
parents: 13
diff changeset
170 (function() {
1f48075a404e changed tcb and sample module again
Atul Varma <varmaa@toolness.com>
parents: 13
diff changeset
171 print("module.foo() is " + module.foo());
1f48075a404e changed tcb and sample module again
Atul Varma <varmaa@toolness.com>
parents: 13
diff changeset
172 })();
6
500e267ed094 Added a really simple securableModule require() implementation.
Atul Varma <varmaa@toolness.com>
parents: 5
diff changeset
173
24
777839fbafeb Added some documentation to the TCB.
Atul Varma <varmaa@toolness.com>
parents: 21
diff changeset
174 // Some unit tests.
777839fbafeb Added some documentation to the TCB.
Atul Varma <varmaa@toolness.com>
parents: 21
diff changeset
175
20
802ab1d478c6 Added getWrapper() and unwrap() functions.
Atul Varma <varmaa@toolness.com>
parents: 15
diff changeset
176 var wrapper = {};
802ab1d478c6 Added getWrapper() and unwrap() functions.
Atul Varma <varmaa@toolness.com>
parents: 15
diff changeset
177 var wrappee = {};
802ab1d478c6 Added getWrapper() and unwrap() functions.
Atul Varma <varmaa@toolness.com>
parents: 15
diff changeset
178 var wrapped = wrap(wrappee, wrapper);
802ab1d478c6 Added getWrapper() and unwrap() functions.
Atul Varma <varmaa@toolness.com>
parents: 15
diff changeset
179
21
cd5faa0bb46c Added more tests for unwrap()/getWrapper().
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
180 if (unwrap({}) !== null)
cd5faa0bb46c Added more tests for unwrap()/getWrapper().
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
181 throw new Error("Unwrapping a non-wrapped object should return null!");
cd5faa0bb46c Added more tests for unwrap()/getWrapper().
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
182
cd5faa0bb46c Added more tests for unwrap()/getWrapper().
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
183 if (getWrapper({}) !== null)
cd5faa0bb46c Added more tests for unwrap()/getWrapper().
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
184 throw new Error("Getting the wrapper of a non-wrapped object should " +
cd5faa0bb46c Added more tests for unwrap()/getWrapper().
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
185 "return null!");
cd5faa0bb46c Added more tests for unwrap()/getWrapper().
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
186
cd5faa0bb46c Added more tests for unwrap()/getWrapper().
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
187 if (unwrap(wrapped) !== wrappee ||
cd5faa0bb46c Added more tests for unwrap()/getWrapper().
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
188 unwrap(unwrap(wrapped)) !== null)
20
802ab1d478c6 Added getWrapper() and unwrap() functions.
Atul Varma <varmaa@toolness.com>
parents: 15
diff changeset
189 throw new Error("Unwrapping doesn't work!");
802ab1d478c6 Added getWrapper() and unwrap() functions.
Atul Varma <varmaa@toolness.com>
parents: 15
diff changeset
190
21
cd5faa0bb46c Added more tests for unwrap()/getWrapper().
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
191 if (getWrapper(wrapped) !== wrapper ||
cd5faa0bb46c Added more tests for unwrap()/getWrapper().
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
192 getWrapper(getWrapper(wrapped)) !== null)
20
802ab1d478c6 Added getWrapper() and unwrap() functions.
Atul Varma <varmaa@toolness.com>
parents: 15
diff changeset
193 throw new Error("Getting the wrapper doesn't work!");