Mercurial > spidermonkey-playground
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 |
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!"); |