Mercurial > scratch
annotate pydershell/pydershell.py @ 28:f974d4a80473 default tip
Some fixes.
author | Atul Varma <varmaa@toolness.com> |
---|---|
date | Tue, 08 Sep 2009 15:27:02 -0700 |
parents | 7f12db104246 |
children |
rev | line source |
---|---|
10 | 1 import sys |
2 import time | |
3 import threading | |
4 import traceback | |
12
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
5 import weakref |
21
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
6 import types |
12
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
7 |
10 | 8 import pydermonkey |
9 | |
12
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
10 class ContextWatchdogThread(threading.Thread): |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
11 """ |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
12 Watches active JS contexts and triggers their operation callbacks |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
13 at a regular interval. |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
14 """ |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
15 |
23 | 16 # Default interval, in seconds, that the operation callbacks are |
17 # triggered at. | |
13 | 18 DEFAULT_INTERVAL = 0.25 |
19 | |
20 def __init__(self, interval=DEFAULT_INTERVAL): | |
12
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
21 threading.Thread.__init__(self) |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
22 self._lock = threading.Lock() |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
23 self._stop = threading.Event() |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
24 self._contexts = [] |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
25 self.interval = interval |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
26 self.setDaemon(True) |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
27 |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
28 def add_context(self, cx): |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
29 self._lock.acquire() |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
30 try: |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
31 self._contexts.append(weakref.ref(cx)) |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
32 finally: |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
33 self._lock.release() |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
34 |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
35 def join(self): |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
36 self._stop.set() |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
37 threading.Thread.join(self) |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
38 |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
39 def run(self): |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
40 while not self._stop.isSet(): |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
41 time.sleep(self.interval) |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
42 new_list = [] |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
43 self._lock.acquire() |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
44 try: |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
45 for weakcx in self._contexts: |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
46 cx = weakcx() |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
47 if cx: |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
48 new_list.append(weakcx) |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
49 cx.trigger_operation_callback() |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
50 self._contexts = new_list |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
51 finally: |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
52 self._lock.release() |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
53 |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
54 # Create a global watchdog. |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
55 watchdog = ContextWatchdogThread() |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
56 watchdog.start() |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
57 |
11 | 58 class InternalError(BaseException): |
12
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
59 """ |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
60 Represents an error in a JS-wrapped Python function that wasn't |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
61 expected to happen; because it's derived from BaseException, it |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
62 unrolls the whole JS/Python stack so that the error can be |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
63 reported to the outermost calling code. |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
64 """ |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
65 |
11 | 66 def __init__(self): |
67 BaseException.__init__(self) | |
68 self.exc_info = sys.exc_info() | |
69 | |
17
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
70 class SafeJsObjectWrapper(object): |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
71 """ |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
72 Securely wraps a JS object to behave like any normal Python object. |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
73 """ |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
74 |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
75 __slots__ = ['_jsobject', '_sandbox', '_this'] |
17
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
76 |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
77 def __init__(self, sandbox, jsobject, this): |
17
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
78 if not isinstance(jsobject, pydermonkey.Object): |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
79 raise TypeError("Cannot wrap '%s' object" % |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
80 type(jsobject).__name__) |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
81 object.__setattr__(self, '_sandbox', sandbox) |
17
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
82 object.__setattr__(self, '_jsobject', jsobject) |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
83 object.__setattr__(self, '_this', this) |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
84 |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
85 @property |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
86 def wrapped_jsobject(self): |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
87 return self._jsobject |
17
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
88 |
18
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
89 def _wrap_to_python(self, jsvalue): |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
90 return self._sandbox.wrap_jsobject(jsvalue, self._jsobject) |
18
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
91 |
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
92 def _wrap_to_js(self, value): |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
93 return self._sandbox.wrap_pyobject(value) |
17
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
94 |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
95 def __eq__(self, other): |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
96 if isinstance(other, SafeJsObjectWrapper): |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
97 return self._jsobject == other._jsobject |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
98 else: |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
99 return False |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
100 |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
101 def __str__(self): |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
102 return self.toString() |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
103 |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
104 def __unicode__(self): |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
105 return self.toString() |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
106 |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
107 def __setitem__(self, item, value): |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
108 self.__setattr__(item, value) |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
109 |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
110 def __setattr__(self, name, value): |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
111 cx = self._sandbox.cx |
17
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
112 jsobject = self._jsobject |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
113 |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
114 cx.define_property(jsobject, name, |
18
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
115 self._wrap_to_js(value)) |
17
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
116 |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
117 def __getitem__(self, item): |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
118 return self.__getattr__(item) |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
119 |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
120 def __getattr__(self, name): |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
121 cx = self._sandbox.cx |
17
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
122 jsobject = self._jsobject |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
123 |
18
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
124 return self._wrap_to_python(cx.get_property(jsobject, name)) |
17
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
125 |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
126 def __contains__(self, item): |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
127 cx = self._sandbox.cx |
17
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
128 jsobject = self._jsobject |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
129 |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
130 return cx.has_property(jsobject, item) |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
131 |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
132 def __iter__(self): |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
133 cx = self._sandbox.cx |
17
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
134 jsobject = self._jsobject |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
135 |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
136 properties = cx.enumerate(jsobject) |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
137 for property in properties: |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
138 yield property |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
139 |
18
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
140 class SafeJsFunctionWrapper(SafeJsObjectWrapper): |
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
141 """ |
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
142 Securely wraps a JS function to behave like any normal Python object. |
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
143 """ |
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
144 |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
145 def __init__(self, sandbox, jsfunction, this): |
18
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
146 if not isinstance(jsfunction, pydermonkey.Function): |
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
147 raise TypeError("Cannot wrap '%s' object" % |
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
148 type(jsobject).__name__) |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
149 SafeJsObjectWrapper.__init__(self, sandbox, jsfunction, this) |
18
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
150 |
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
151 def __call__(self, *args): |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
152 cx = self._sandbox.cx |
18
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
153 jsobject = self._jsobject |
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
154 this = self._this |
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
155 |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
156 arglist = [] |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
157 for arg in args: |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
158 arglist.append(self._wrap_to_js(arg)) |
12
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
159 |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
160 obj = cx.call_function(this, jsobject, tuple(arglist)) |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
161 return self._wrap_to_python(obj) |
11 | 162 |
12
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
163 def format_stack(js_stack): |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
164 """ |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
165 Returns a formatted Python-esque stack traceback of the given |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
166 JS stack. |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
167 """ |
10 | 168 |
12
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
169 STACK_LINE =" File \"%(filename)s\", line %(lineno)d, in %(name)s" |
10 | 170 |
171 lines = [] | |
172 while js_stack: | |
12
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
173 script = js_stack['script'] |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
174 function = js_stack['function'] |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
175 if script: |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
176 frameinfo = dict(filename = script.filename, |
16
a78570a423ea
Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents:
15
diff
changeset
|
177 lineno = js_stack['lineno'], |
a78570a423ea
Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents:
15
diff
changeset
|
178 name = '<module>') |
12
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
179 elif function and not function.is_python: |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
180 frameinfo = dict(filename = function.filename, |
16
a78570a423ea
Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents:
15
diff
changeset
|
181 lineno = js_stack['lineno'], |
a78570a423ea
Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents:
15
diff
changeset
|
182 name = function.name) |
10 | 183 else: |
12
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
184 frameinfo = None |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
185 if frameinfo: |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
186 lines.insert(0, STACK_LINE % frameinfo) |
16
a78570a423ea
Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents:
15
diff
changeset
|
187 try: |
a78570a423ea
Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents:
15
diff
changeset
|
188 filelines = open(frameinfo['filename']).readlines() |
a78570a423ea
Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents:
15
diff
changeset
|
189 line = filelines[frameinfo['lineno'] - 1].strip() |
a78570a423ea
Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents:
15
diff
changeset
|
190 lines.insert(1, " %s" % line) |
a78570a423ea
Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents:
15
diff
changeset
|
191 except Exception: |
a78570a423ea
Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents:
15
diff
changeset
|
192 pass |
10 | 193 js_stack = js_stack['caller'] |
194 lines.insert(0, "Traceback (most recent call last):") | |
195 return '\n'.join(lines) | |
196 | |
24
dace90a7f5e3
Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents:
23
diff
changeset
|
197 def jsexposed(name=None, on=None): |
dace90a7f5e3
Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents:
23
diff
changeset
|
198 """ |
dace90a7f5e3
Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents:
23
diff
changeset
|
199 Decorator used to expose the decorated function or method to |
dace90a7f5e3
Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents:
23
diff
changeset
|
200 untrusted JS. |
dace90a7f5e3
Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents:
23
diff
changeset
|
201 |
dace90a7f5e3
Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents:
23
diff
changeset
|
202 'name' is an optional alternative name for the function. |
dace90a7f5e3
Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents:
23
diff
changeset
|
203 |
dace90a7f5e3
Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents:
23
diff
changeset
|
204 'on' is an optional SafeJsObjectWrapper that the function can be |
dace90a7f5e3
Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents:
23
diff
changeset
|
205 automatically attached as a property to. |
dace90a7f5e3
Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents:
23
diff
changeset
|
206 """ |
dace90a7f5e3
Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents:
23
diff
changeset
|
207 |
dace90a7f5e3
Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents:
23
diff
changeset
|
208 if callable(name): |
dace90a7f5e3
Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents:
23
diff
changeset
|
209 func = name |
dace90a7f5e3
Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents:
23
diff
changeset
|
210 func.__jsexposed__ = True |
dace90a7f5e3
Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents:
23
diff
changeset
|
211 return func |
dace90a7f5e3
Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents:
23
diff
changeset
|
212 |
dace90a7f5e3
Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents:
23
diff
changeset
|
213 def make_exposed(func): |
dace90a7f5e3
Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents:
23
diff
changeset
|
214 if name: |
dace90a7f5e3
Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents:
23
diff
changeset
|
215 func.__name__ = name |
dace90a7f5e3
Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents:
23
diff
changeset
|
216 func.__jsexposed__ = True |
dace90a7f5e3
Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents:
23
diff
changeset
|
217 if on: |
dace90a7f5e3
Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents:
23
diff
changeset
|
218 on[func.__name__] = func |
dace90a7f5e3
Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents:
23
diff
changeset
|
219 return func |
dace90a7f5e3
Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents:
23
diff
changeset
|
220 return make_exposed |
dace90a7f5e3
Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents:
23
diff
changeset
|
221 |
21
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
222 class JsExposedObject(object): |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
223 """ |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
224 Trivial base/mixin class for any Python classes that choose to |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
225 expose themselves to JS code. |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
226 """ |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
227 |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
228 pass |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
229 |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
230 class JsSandbox(object): |
12
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
231 """ |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
232 A JS runtime and associated functionality capable of securely |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
233 loading and executing scripts. |
12
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
234 """ |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
235 |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
236 def __init__(self, watchdog=watchdog): |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
237 rt = pydermonkey.Runtime() |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
238 cx = rt.new_context() |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
239 root = cx.new_object() |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
240 cx.init_standard_classes(root) |
12
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
241 |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
242 cx.set_operation_callback(self._opcb) |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
243 cx.set_throw_hook(self._throwhook) |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
244 watchdog.add_context(cx) |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
245 |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
246 self.rt = rt |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
247 self.cx = cx |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
248 self.curr_exc = None |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
249 self.py_stack = None |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
250 self.js_stack = None |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
251 self.__py_to_js = {} |
21
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
252 self.__type_protos = {} |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
253 self.root = self.wrap_jsobject(root, root) |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
254 |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
255 def finish(self): |
23 | 256 """ |
257 Cleans up all resources used by the sandbox, breaking any reference | |
258 cycles created due to issue #2 in pydermonkey: | |
259 | |
260 http://code.google.com/p/pydermonkey/issues/detail?id=2 | |
261 """ | |
262 | |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
263 for jsobj in self.__py_to_js.values(): |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
264 self.cx.clear_object_private(jsobj) |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
265 del self.__py_to_js |
21
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
266 del self.__type_protos |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
267 del self.curr_exc |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
268 del self.py_stack |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
269 del self.js_stack |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
270 del self.cx |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
271 del self.rt |
12
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
272 |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
273 def _opcb(self, cx): |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
274 # Don't do anything; if a keyboard interrupt was triggered, |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
275 # it'll get raised here automatically. |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
276 pass |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
277 |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
278 def _throwhook(self, cx): |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
279 curr_exc = cx.get_pending_exception() |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
280 if self.curr_exc != curr_exc: |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
281 self.curr_exc = curr_exc |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
282 self.py_stack = traceback.extract_stack() |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
283 self.js_stack = cx.get_stack() |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
284 |
21
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
285 def __wrap_pycallable(self, func, pyproto=None): |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
286 if func in self.__py_to_js: |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
287 return self.__py_to_js[func] |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
288 |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
289 if hasattr(func, '__name__'): |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
290 name = func.__name__ |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
291 else: |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
292 name = "" |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
293 |
21
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
294 if pyproto: |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
295 def wrapper(func_cx, this, args): |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
296 try: |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
297 arglist = [] |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
298 for arg in args: |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
299 arglist.append(self.wrap_jsobject(arg)) |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
300 instance = func_cx.get_object_private(this) |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
301 if instance is None or not isinstance(instance, pyproto): |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
302 raise pydermonkey.error("Method type mismatch") |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
303 |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
304 # TODO: Fill in extra required params with |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
305 # pymonkey.undefined? or automatically throw an |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
306 # exception to calling js code? |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
307 return self.wrap_pyobject(func(instance, *arglist)) |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
308 except pydermonkey.error: |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
309 raise |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
310 except Exception: |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
311 raise InternalError() |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
312 else: |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
313 def wrapper(func_cx, this, args): |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
314 try: |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
315 arglist = [] |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
316 for arg in args: |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
317 arglist.append(self.wrap_jsobject(arg)) |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
318 |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
319 # TODO: Fill in extra required params with |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
320 # pymonkey.undefined? or automatically throw an |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
321 # exception to calling js code? |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
322 return self.wrap_pyobject(func(*arglist)) |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
323 except pydermonkey.error: |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
324 raise |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
325 except Exception: |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
326 raise InternalError() |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
327 wrapper.wrapped_pyobject = func |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
328 wrapper.__name__ = name |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
329 |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
330 jsfunc = self.cx.new_function(wrapper, name) |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
331 self.__py_to_js[func] = jsfunc |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
332 |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
333 return jsfunc |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
334 |
21
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
335 def __wrap_pyinstance(self, value): |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
336 pyproto = type(value) |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
337 if pyproto not in self.__type_protos: |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
338 jsproto = self.cx.new_object() |
26
b7037cd0f375
Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents:
24
diff
changeset
|
339 if hasattr(pyproto, '__jsprops__'): |
b7037cd0f375
Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents:
24
diff
changeset
|
340 define_getter = self.cx.get_property(jsproto, |
b7037cd0f375
Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents:
24
diff
changeset
|
341 '__defineGetter__') |
b7037cd0f375
Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents:
24
diff
changeset
|
342 define_setter = self.cx.get_property(jsproto, |
b7037cd0f375
Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents:
24
diff
changeset
|
343 '__defineSetter__') |
b7037cd0f375
Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents:
24
diff
changeset
|
344 for name in pyproto.__jsprops__: |
b7037cd0f375
Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents:
24
diff
changeset
|
345 prop = getattr(pyproto, name) |
b7037cd0f375
Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents:
24
diff
changeset
|
346 if not type(prop) == property: |
b7037cd0f375
Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents:
24
diff
changeset
|
347 raise TypeError("Expected attribute '%s' to " |
b7037cd0f375
Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents:
24
diff
changeset
|
348 "be a property" % name) |
b7037cd0f375
Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents:
24
diff
changeset
|
349 getter = None |
b7037cd0f375
Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents:
24
diff
changeset
|
350 setter = None |
b7037cd0f375
Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents:
24
diff
changeset
|
351 if prop.fget: |
b7037cd0f375
Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents:
24
diff
changeset
|
352 getter = self.__wrap_pycallable(prop.fget, |
b7037cd0f375
Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents:
24
diff
changeset
|
353 pyproto) |
b7037cd0f375
Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents:
24
diff
changeset
|
354 if prop.fset: |
b7037cd0f375
Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents:
24
diff
changeset
|
355 setter = self.__wrap_pycallable(prop.fset, |
b7037cd0f375
Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents:
24
diff
changeset
|
356 pyproto) |
b7037cd0f375
Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents:
24
diff
changeset
|
357 if getter: |
b7037cd0f375
Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents:
24
diff
changeset
|
358 self.cx.call_function(jsproto, |
b7037cd0f375
Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents:
24
diff
changeset
|
359 define_getter, |
b7037cd0f375
Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents:
24
diff
changeset
|
360 (name, getter)) |
b7037cd0f375
Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents:
24
diff
changeset
|
361 if setter: |
b7037cd0f375
Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents:
24
diff
changeset
|
362 self.cx.call_function(jsproto, |
b7037cd0f375
Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents:
24
diff
changeset
|
363 define_setter, |
b7037cd0f375
Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents:
24
diff
changeset
|
364 (name, setter,)) |
21
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
365 for name in dir(pyproto): |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
366 attr = getattr(pyproto, name) |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
367 if (isinstance(attr, types.UnboundMethodType) and |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
368 hasattr(attr, '__jsexposed__') and |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
369 attr.__jsexposed__): |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
370 jsmethod = self.__wrap_pycallable(attr, pyproto) |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
371 self.cx.define_property(jsproto, name, jsmethod) |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
372 self.__type_protos[pyproto] = jsproto |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
373 return self.cx.new_object(value, self.__type_protos[pyproto]) |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
374 |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
375 def wrap_pyobject(self, value): |
23 | 376 """ |
377 Wraps the given Python object for export to untrusted JS. | |
378 | |
379 If the Python object isn't of a type that can be exposed to JS, | |
380 a TypeError is raised. | |
381 """ | |
382 | |
21
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
383 if (isinstance(value, (int, basestring, float, bool)) or |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
384 value is pydermonkey.undefined or |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
385 value is None): |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
386 return value |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
387 if isinstance(value, SafeJsObjectWrapper): |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
388 # It's already wrapped, just unwrap it. |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
389 return value.wrapped_jsobject |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
390 elif callable(value): |
24
dace90a7f5e3
Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents:
23
diff
changeset
|
391 if not (hasattr(value, '__jsexposed__') and |
dace90a7f5e3
Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents:
23
diff
changeset
|
392 value.__jsexposed__): |
dace90a7f5e3
Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents:
23
diff
changeset
|
393 raise ValueError("Callable isn't configured for exposure " |
dace90a7f5e3
Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents:
23
diff
changeset
|
394 "to untrusted JS code") |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
395 return self.__wrap_pycallable(value) |
21
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
396 elif isinstance(value, JsExposedObject): |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
397 return self.__wrap_pyinstance(value) |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
398 else: |
28 | 399 raise TypeError("Can't expose objects of type '%s' to JS." % |
21
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
400 type(value).__name__) |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
401 |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
402 def wrap_jsobject(self, jsvalue, this=None): |
23 | 403 """ |
404 Wraps the given pydermonkey.Object for import to trusted | |
405 Python code. If the type is just a primitive, it's simply | |
406 returned, since no wrapping is needed. | |
407 """ | |
408 | |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
409 if this is None: |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
410 this = self.root.wrapped_jsobject |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
411 if isinstance(jsvalue, pydermonkey.Function): |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
412 if jsvalue.is_python: |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
413 # It's a Python function, just unwrap it. |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
414 return self.cx.get_object_private(jsvalue).wrapped_pyobject |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
415 return SafeJsFunctionWrapper(self, jsvalue, this) |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
416 elif isinstance(jsvalue, pydermonkey.Object): |
21
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
417 # It's a wrapped Python object instance, just unwrap it. |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
418 instance = self.cx.get_object_private(jsvalue) |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
419 if instance: |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
420 if not isinstance(instance, JsExposedObject): |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
421 raise AssertionError("Object private is not of type " |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
422 "JsExposedObject") |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
423 return instance |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
424 else: |
1950b0b5bcd8
It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents:
20
diff
changeset
|
425 return SafeJsObjectWrapper(self, jsvalue, this) |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
426 else: |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
427 # It's a primitive value. |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
428 return jsvalue |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
429 |
27
7f12db104246
Added evaluate, new_array, and new_object functions to JsSandbox class.
Atul Varma <varmaa@toolness.com>
parents:
26
diff
changeset
|
430 def new_array(self, *contents): |
7f12db104246
Added evaluate, new_array, and new_object functions to JsSandbox class.
Atul Varma <varmaa@toolness.com>
parents:
26
diff
changeset
|
431 array = self.wrap_jsobject(self.cx.new_array_object()) |
7f12db104246
Added evaluate, new_array, and new_object functions to JsSandbox class.
Atul Varma <varmaa@toolness.com>
parents:
26
diff
changeset
|
432 for item in contents: |
28 | 433 array.push(item) |
27
7f12db104246
Added evaluate, new_array, and new_object functions to JsSandbox class.
Atul Varma <varmaa@toolness.com>
parents:
26
diff
changeset
|
434 return array |
7f12db104246
Added evaluate, new_array, and new_object functions to JsSandbox class.
Atul Varma <varmaa@toolness.com>
parents:
26
diff
changeset
|
435 |
7f12db104246
Added evaluate, new_array, and new_object functions to JsSandbox class.
Atul Varma <varmaa@toolness.com>
parents:
26
diff
changeset
|
436 def new_object(self, **contents): |
7f12db104246
Added evaluate, new_array, and new_object functions to JsSandbox class.
Atul Varma <varmaa@toolness.com>
parents:
26
diff
changeset
|
437 obj = self.wrap_jsobject(self.cx.new_object()) |
7f12db104246
Added evaluate, new_array, and new_object functions to JsSandbox class.
Atul Varma <varmaa@toolness.com>
parents:
26
diff
changeset
|
438 for name in contents: |
28 | 439 obj[name] = contents[name] |
440 return obj | |
27
7f12db104246
Added evaluate, new_array, and new_object functions to JsSandbox class.
Atul Varma <varmaa@toolness.com>
parents:
26
diff
changeset
|
441 |
7f12db104246
Added evaluate, new_array, and new_object functions to JsSandbox class.
Atul Varma <varmaa@toolness.com>
parents:
26
diff
changeset
|
442 def evaluate(self, code, filename='<string>', lineno=1): |
7f12db104246
Added evaluate, new_array, and new_object functions to JsSandbox class.
Atul Varma <varmaa@toolness.com>
parents:
26
diff
changeset
|
443 retval = self.cx.evaluate_script(self.root.wrapped_jsobject, |
7f12db104246
Added evaluate, new_array, and new_object functions to JsSandbox class.
Atul Varma <varmaa@toolness.com>
parents:
26
diff
changeset
|
444 code, filename, lineno) |
7f12db104246
Added evaluate, new_array, and new_object functions to JsSandbox class.
Atul Varma <varmaa@toolness.com>
parents:
26
diff
changeset
|
445 return self.wrap_jsobject(retval) |
7f12db104246
Added evaluate, new_array, and new_object functions to JsSandbox class.
Atul Varma <varmaa@toolness.com>
parents:
26
diff
changeset
|
446 |
28 | 447 def run_script(self, filename, callback=None): |
23 | 448 """ |
449 Runs the given JS script, returning 0 on success, -1 on failure. | |
450 """ | |
451 | |
20
8dd18f864351
pydershell now exits with a nonzero return code if the script it calls throws an exception.
Atul Varma <varmaa@toolness.com>
parents:
19
diff
changeset
|
452 retval = -1 |
12
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
453 contents = open(filename).read() |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
454 cx = self.cx |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
455 try: |
28 | 456 result = cx.evaluate_script(self.root.wrapped_jsobject, |
457 contents, filename, 1) | |
458 if callback: | |
459 callback(self.wrap_jsobject(result)) | |
20
8dd18f864351
pydershell now exits with a nonzero return code if the script it calls throws an exception.
Atul Varma <varmaa@toolness.com>
parents:
19
diff
changeset
|
460 retval = 0 |
12
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
461 except pydermonkey.error, e: |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
462 print format_stack(self.js_stack) |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
463 print e.args[1] |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
464 except InternalError, e: |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
465 print "An internal error occurred." |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
466 traceback.print_tb(e.exc_info[2]) |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
467 print e.exc_info[1] |
20
8dd18f864351
pydershell now exits with a nonzero return code if the script it calls throws an exception.
Atul Varma <varmaa@toolness.com>
parents:
19
diff
changeset
|
468 return retval |