Mercurial > cpython-lru_cache-weakref
annotate Lib/rexec.py @ 4566:6403c94de50d legacy-trunk
Added safeguard against failure in __del__.
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Wed, 27 Nov 1996 19:39:58 +0000 |
| parents | 02a24e48b376 |
| children | a1694e95bcba |
| rev | line source |
|---|---|
|
2886
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
1 """Restricted execution facilities. |
| 2135 | 2 |
|
3637
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
3 The class RExec exports methods r_exec(), r_eval(), r_execfile(), and |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
4 r_import(), which correspond roughly to the built-in operations |
|
2886
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
5 exec, eval(), execfile() and import, but executing the code in an |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
6 environment that only exposes those built-in operations that are |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
7 deemed safe. To this end, a modest collection of 'fake' modules is |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
8 created which mimics the standard modules by the same names. It is a |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
9 policy decision which built-in modules and operations are made |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
10 available; this module provides a reasonable default, but derived |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
11 classes can change the policies e.g. by overriding or extending class |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
12 variables like ok_builtin_modules or methods like make_sys(). |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
13 |
|
2926
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
14 XXX To do: |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
15 - r_open should allow writing tmp dir |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
16 - r_exec etc. with explicit globals/locals? (Use rexec("exec ... in ...")?) |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
17 |
|
2886
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
18 """ |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
19 |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
20 |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
21 import sys |
| 2135 | 22 import __builtin__ |
| 23 import os | |
|
2886
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
24 import marshal |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
25 import ihooks |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
26 |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
27 |
|
2926
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
28 class FileBase: |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
29 |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
30 ok_file_methods = ('fileno', 'flush', 'isatty', 'read', 'readline', |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
31 'readlines', 'seek', 'tell', 'write', 'writelines') |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
32 |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
33 |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
34 class FileWrapper(FileBase): |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
35 |
|
3734
04c07538cac4
Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents:
3648
diff
changeset
|
36 # XXX This is just like a Bastion -- should use that! |
|
04c07538cac4
Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents:
3648
diff
changeset
|
37 |
|
2926
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
38 def __init__(self, f): |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
39 self.f = f |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
40 for m in self.ok_file_methods: |
|
4343
4bbde804b697
Don't die if an ok file method (e.g. fileno) doesn't exist.
Guido van Rossum <guido@python.org>
parents:
4334
diff
changeset
|
41 if not hasattr(self, m) and hasattr(f, m): |
|
2926
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
42 setattr(self, m, getattr(f, m)) |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
43 |
|
4334
f37cbfaa7328
1. Correct typo in FileWrapper.close() (fix by AMK).
Guido van Rossum <guido@python.org>
parents:
4075
diff
changeset
|
44 def close(self): |
|
2926
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
45 self.flush() |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
46 |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
47 |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
48 TEMPLATE = """ |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
49 def %s(self, *args): |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
50 return apply(getattr(self.mod, self.name).%s, args) |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
51 """ |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
52 |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
53 class FileDelegate(FileBase): |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
54 |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
55 def __init__(self, mod, name): |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
56 self.mod = mod |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
57 self.name = name |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
58 |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
59 for m in FileBase.ok_file_methods + ('close',): |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
60 exec TEMPLATE % (m, m) |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
61 |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
62 |
|
2886
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
63 class RHooks(ihooks.Hooks): |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
64 |
|
3637
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
65 def __init__(self, *args): |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
66 # Hacks to support both old and new interfaces: |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
67 # old interface was RHooks(rexec[, verbose]) |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
68 # new interface is RHooks([verbose]) |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
69 verbose = 0 |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
70 rexec = None |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
71 if args and type(args[-1]) == type(0): |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
72 verbose = args[-1] |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
73 args = args[:-1] |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
74 if args and hasattr(args[0], '__class__'): |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
75 rexec = args[0] |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
76 args = args[1:] |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
77 if args: |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
78 raise TypeError, "too many arguments" |
|
2886
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
79 ihooks.Hooks.__init__(self, verbose) |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
80 self.rexec = rexec |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
81 |
|
3637
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
82 def set_rexec(self, rexec): |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
83 # Called by RExec instance to complete initialization |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
84 self.rexec = rexec |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
85 |
|
2886
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
86 def is_builtin(self, name): |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
87 return self.rexec.is_builtin(name) |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
88 |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
89 def init_builtin(self, name): |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
90 m = __import__(name) |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
91 return self.rexec.copy_except(m, ()) |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
92 |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
93 def init_frozen(self, name): raise SystemError, "don't use this" |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
94 def load_source(self, *args): raise SystemError, "don't use this" |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
95 def load_compiled(self, *args): raise SystemError, "don't use this" |
| 2135 | 96 |
|
3637
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
97 def load_dynamic(self, name, filename, file): |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
98 return self.rexec.load_dynamic(name, filename, file) |
|
2886
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
99 |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
100 def add_module(self, name): |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
101 return self.rexec.add_module(name) |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
102 |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
103 def modules_dict(self): |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
104 return self.rexec.modules |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
105 |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
106 def default_path(self): |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
107 return self.rexec.modules['sys'].path |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
108 |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
109 |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
110 class RModuleLoader(ihooks.FancyModuleLoader): |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
111 |
|
2926
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
112 def load_module(self, name, stuff): |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
113 file, filename, info = stuff |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
114 m = ihooks.FancyModuleLoader.load_module(self, name, stuff) |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
115 m.__filename__ = filename |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
116 return m |
|
2886
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
117 |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
118 |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
119 class RModuleImporter(ihooks.ModuleImporter): |
| 2135 | 120 |
|
2926
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
121 def reload(self, module, path=None): |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
122 if path is None and hasattr(module, '__filename__'): |
|
2957
cc9222b947ee
fix reload use of __filename__
Guido van Rossum <guido@python.org>
parents:
2934
diff
changeset
|
123 head, tail = os.path.split(module.__filename__) |
|
2965
d0072d1df82c
make sure the path ends in a slash in reload()
Guido van Rossum <guido@python.org>
parents:
2957
diff
changeset
|
124 path = [os.path.join(head, '')] |
|
2926
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
125 return ihooks.ModuleImporter.reload(self, module, path) |
|
2886
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
126 |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
127 |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
128 class RExec(ihooks._Verbose): |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
129 |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
130 """Restricted Execution environment.""" |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
131 |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
132 ok_path = tuple(sys.path) # That's a policy decision |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
133 |
|
4334
f37cbfaa7328
1. Correct typo in FileWrapper.close() (fix by AMK).
Guido van Rossum <guido@python.org>
parents:
4075
diff
changeset
|
134 ok_builtin_modules = ('audioop', 'array', 'binascii', |
|
f37cbfaa7328
1. Correct typo in FileWrapper.close() (fix by AMK).
Guido van Rossum <guido@python.org>
parents:
4075
diff
changeset
|
135 'cmath', 'errno', 'imageop', |
|
f37cbfaa7328
1. Correct typo in FileWrapper.close() (fix by AMK).
Guido van Rossum <guido@python.org>
parents:
4075
diff
changeset
|
136 'marshal', 'math', 'md5', 'operator', |
|
f37cbfaa7328
1. Correct typo in FileWrapper.close() (fix by AMK).
Guido van Rossum <guido@python.org>
parents:
4075
diff
changeset
|
137 'parser', 'regex', 'rotor', 'select', |
|
2886
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
138 'strop', 'struct', 'time') |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
139 |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
140 ok_posix_names = ('error', 'fstat', 'listdir', 'lstat', 'readlink', |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
141 'stat', 'times', 'uname', 'getpid', 'getppid', |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
142 'getcwd', 'getuid', 'getgid', 'geteuid', 'getegid') |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
143 |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
144 ok_sys_names = ('ps1', 'ps2', 'copyright', 'version', |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
145 'platform', 'exit', 'maxint') |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
146 |
|
2926
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
147 nok_builtin_names = ('open', 'reload', '__import__') |
| 2135 | 148 |
|
2886
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
149 def __init__(self, hooks = None, verbose = 0): |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
150 ihooks._Verbose.__init__(self, verbose) |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
151 # XXX There's a circular reference here: |
|
3637
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
152 self.hooks = hooks or RHooks(verbose) |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
153 self.hooks.set_rexec(self) |
|
2886
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
154 self.modules = {} |
|
3637
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
155 self.ok_dynamic_modules = self.ok_builtin_modules |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
156 list = [] |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
157 for mname in self.ok_builtin_modules: |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
158 if mname in sys.builtin_module_names: |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
159 list.append(mname) |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
160 self.ok_builtin_modules = list |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
161 self.set_trusted_path() |
|
2886
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
162 self.make_builtin() |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
163 self.make_initial_modules() |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
164 # make_sys must be last because it adds the already created |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
165 # modules to its builtin_module_names |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
166 self.make_sys() |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
167 self.loader = RModuleLoader(self.hooks, verbose) |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
168 self.importer = RModuleImporter(self.loader, verbose) |
| 2135 | 169 |
|
3637
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
170 def set_trusted_path(self): |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
171 # Set the path from which dynamic modules may be loaded. |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
172 # Those dynamic modules must also occur in ok_builtin_modules |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
173 self.trusted_path = filter(os.path.isabs, sys.path) |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
174 |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
175 def load_dynamic(self, name, filename, file): |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
176 if name not in self.ok_dynamic_modules: |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
177 raise ImportError, "untrusted dynamic module: %s" % name |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
178 if sys.modules.has_key(name): |
|
3648
a9fb5a895fa1
fix typo in load_dynamic
Guido van Rossum <guido@python.org>
parents:
3637
diff
changeset
|
179 src = sys.modules[name] |
|
3637
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
180 else: |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
181 import imp |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
182 src = imp.load_dynamic(name, filename, file) |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
183 dst = self.copy_except(src, []) |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
184 return dst |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
185 |
|
2886
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
186 def make_initial_modules(self): |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
187 self.make_main() |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
188 self.make_osname() |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
189 |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
190 # Helpers for RHooks |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
191 |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
192 def is_builtin(self, mname): |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
193 return mname in self.ok_builtin_modules |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
194 |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
195 # The make_* methods create specific built-in modules |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
196 |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
197 def make_builtin(self): |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
198 m = self.copy_except(__builtin__, self.nok_builtin_names) |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
199 m.__import__ = self.r_import |
|
2926
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
200 m.reload = self.r_reload |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
201 m.open = self.r_open |
|
2886
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
202 |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
203 def make_main(self): |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
204 m = self.add_module('__main__') |
| 2135 | 205 |
|
2886
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
206 def make_osname(self): |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
207 osname = os.name |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
208 src = __import__(osname) |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
209 dst = self.copy_only(src, self.ok_posix_names) |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
210 dst.environ = e = {} |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
211 for key, value in os.environ.items(): |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
212 e[key] = value |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
213 |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
214 def make_sys(self): |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
215 m = self.copy_only(sys, self.ok_sys_names) |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
216 m.modules = self.modules |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
217 m.argv = ['RESTRICTED'] |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
218 m.path = map(None, self.ok_path) |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
219 m = self.modules['sys'] |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
220 m.builtin_module_names = \ |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
221 self.modules.keys() + self.ok_builtin_modules |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
222 m.builtin_module_names.sort() |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
223 |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
224 # The copy_* methods copy existing modules with some changes |
| 2135 | 225 |
|
2886
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
226 def copy_except(self, src, exceptions): |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
227 dst = self.copy_none(src) |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
228 for name in dir(src): |
|
3637
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
229 setattr(dst, name, getattr(src, name)) |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
230 for name in exceptions: |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
231 try: |
|
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
232 delattr(dst, name) |
|
4075
4a7038e7a313
delattr() can raise AttributeError, not KeyError.
Guido van Rossum <guido@python.org>
parents:
3734
diff
changeset
|
233 except AttributeError: |
|
3637
6c0086f9270c
Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents:
2965
diff
changeset
|
234 pass |
|
2886
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
235 return dst |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
236 |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
237 def copy_only(self, src, names): |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
238 dst = self.copy_none(src) |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
239 for name in names: |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
240 try: |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
241 value = getattr(src, name) |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
242 except AttributeError: |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
243 continue |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
244 setattr(dst, name, value) |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
245 return dst |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
246 |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
247 def copy_none(self, src): |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
248 return self.add_module(src.__name__) |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
249 |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
250 # Add a module -- return an existing module or create one |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
251 |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
252 def add_module(self, mname): |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
253 if self.modules.has_key(mname): |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
254 return self.modules[mname] |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
255 self.modules[mname] = m = self.hooks.new_module(mname) |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
256 m.__builtins__ = self.modules['__builtin__'] |
| 2135 | 257 return m |
| 258 | |
|
2886
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
259 # The r* methods are public interfaces |
| 2135 | 260 |
|
2886
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
261 def r_exec(self, code): |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
262 m = self.add_module('__main__') |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
263 exec code in m.__dict__ |
| 2135 | 264 |
|
2886
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
265 def r_eval(self, code): |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
266 m = self.add_module('__main__') |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
267 return eval(code, m.__dict__) |
| 2135 | 268 |
|
2886
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
269 def r_execfile(self, file): |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
270 m = self.add_module('__main__') |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
271 return execfile(file, m.__dict__) |
| 2135 | 272 |
|
2886
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
273 def r_import(self, mname, globals={}, locals={}, fromlist=[]): |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
274 return self.importer.import_module(mname, globals, locals, fromlist) |
| 2135 | 275 |
|
2926
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
276 def r_reload(self, m): |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
277 return self.importer.reload(m) |
|
2934
cb5ccbba1856
add module binascii; add r_unload/s_unload; don't change 'rb' to 'r' in open
Guido van Rossum <guido@python.org>
parents:
2926
diff
changeset
|
278 |
|
cb5ccbba1856
add module binascii; add r_unload/s_unload; don't change 'rb' to 'r' in open
Guido van Rossum <guido@python.org>
parents:
2926
diff
changeset
|
279 def r_unload(self, m): |
|
cb5ccbba1856
add module binascii; add r_unload/s_unload; don't change 'rb' to 'r' in open
Guido van Rossum <guido@python.org>
parents:
2926
diff
changeset
|
280 return self.importer.unload(m) |
|
2926
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
281 |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
282 # The s_* methods are similar but also swap std{in,out,err} |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
283 |
|
3734
04c07538cac4
Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents:
3648
diff
changeset
|
284 def make_delegate_files(self): |
|
04c07538cac4
Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents:
3648
diff
changeset
|
285 s = self.modules['sys'] |
|
04c07538cac4
Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents:
3648
diff
changeset
|
286 self.delegate_stdin = FileDelegate(s, 'stdin') |
|
04c07538cac4
Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents:
3648
diff
changeset
|
287 self.delegate_stdout = FileDelegate(s, 'stdout') |
|
04c07538cac4
Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents:
3648
diff
changeset
|
288 self.delegate_stderr = FileDelegate(s, 'stderr') |
|
04c07538cac4
Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents:
3648
diff
changeset
|
289 self.restricted_stdin = FileWrapper(sys.stdin) |
|
04c07538cac4
Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents:
3648
diff
changeset
|
290 self.restricted_stdout = FileWrapper(sys.stdout) |
|
04c07538cac4
Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents:
3648
diff
changeset
|
291 self.restricted_stderr = FileWrapper(sys.stderr) |
|
04c07538cac4
Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents:
3648
diff
changeset
|
292 |
|
2926
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
293 def set_files(self): |
|
3734
04c07538cac4
Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents:
3648
diff
changeset
|
294 if not hasattr(self, 'save_stdin'): |
|
04c07538cac4
Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents:
3648
diff
changeset
|
295 self.save_files() |
|
04c07538cac4
Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents:
3648
diff
changeset
|
296 if not hasattr(self, 'delegate_stdin'): |
|
04c07538cac4
Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents:
3648
diff
changeset
|
297 self.make_delegate_files() |
|
2926
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
298 s = self.modules['sys'] |
|
3734
04c07538cac4
Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents:
3648
diff
changeset
|
299 s.stdin = self.restricted_stdin |
|
04c07538cac4
Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents:
3648
diff
changeset
|
300 s.stdout = self.restricted_stdout |
|
4351
02a24e48b376
Don't mix stdout/stderr.
Guido van Rossum <guido@python.org>
parents:
4343
diff
changeset
|
301 s.stderr = self.restricted_stderr |
|
3734
04c07538cac4
Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents:
3648
diff
changeset
|
302 sys.stdin = self.delegate_stdin |
|
04c07538cac4
Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents:
3648
diff
changeset
|
303 sys.stdout = self.delegate_stdout |
|
04c07538cac4
Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents:
3648
diff
changeset
|
304 sys.stderr = self.delegate_stderr |
|
04c07538cac4
Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents:
3648
diff
changeset
|
305 |
|
04c07538cac4
Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents:
3648
diff
changeset
|
306 def reset_files(self): |
|
04c07538cac4
Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents:
3648
diff
changeset
|
307 self.restore_files() |
|
04c07538cac4
Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents:
3648
diff
changeset
|
308 s = self.modules['sys'] |
|
04c07538cac4
Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents:
3648
diff
changeset
|
309 self.restricted_stdin = s.stdin |
|
04c07538cac4
Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents:
3648
diff
changeset
|
310 self.restricted_stdout = s.stdout |
|
4351
02a24e48b376
Don't mix stdout/stderr.
Guido van Rossum <guido@python.org>
parents:
4343
diff
changeset
|
311 self.restricted_stderr = s.stderr |
|
3734
04c07538cac4
Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents:
3648
diff
changeset
|
312 |
|
2926
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
313 |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
314 def save_files(self): |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
315 self.save_stdin = sys.stdin |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
316 self.save_stdout = sys.stdout |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
317 self.save_stderr = sys.stderr |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
318 |
|
3734
04c07538cac4
Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents:
3648
diff
changeset
|
319 def restore_files(self): |
|
04c07538cac4
Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents:
3648
diff
changeset
|
320 sys.stdin = self.save_stdin |
|
2926
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
321 sys.stdout = self.save_stdout |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
322 sys.stderr = self.save_stderr |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
323 |
|
4334
f37cbfaa7328
1. Correct typo in FileWrapper.close() (fix by AMK).
Guido van Rossum <guido@python.org>
parents:
4075
diff
changeset
|
324 def s_apply(self, func, args=(), kw=None): |
|
2926
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
325 self.save_files() |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
326 try: |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
327 self.set_files() |
|
4334
f37cbfaa7328
1. Correct typo in FileWrapper.close() (fix by AMK).
Guido van Rossum <guido@python.org>
parents:
4075
diff
changeset
|
328 if kw: |
|
f37cbfaa7328
1. Correct typo in FileWrapper.close() (fix by AMK).
Guido van Rossum <guido@python.org>
parents:
4075
diff
changeset
|
329 r = apply(func, args, kw) |
|
f37cbfaa7328
1. Correct typo in FileWrapper.close() (fix by AMK).
Guido van Rossum <guido@python.org>
parents:
4075
diff
changeset
|
330 else: |
|
f37cbfaa7328
1. Correct typo in FileWrapper.close() (fix by AMK).
Guido van Rossum <guido@python.org>
parents:
4075
diff
changeset
|
331 r = apply(func, args) |
|
2926
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
332 finally: |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
333 self.restore_files() |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
334 |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
335 def s_exec(self, *args): |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
336 self.s_apply(self.r_exec, args) |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
337 |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
338 def s_eval(self, *args): |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
339 self.s_apply(self.r_eval, args) |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
340 |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
341 def s_execfile(self, *args): |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
342 self.s_apply(self.r_execfile, args) |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
343 |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
344 def s_import(self, *args): |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
345 self.s_apply(self.r_import, args) |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
346 |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
347 def s_reload(self, *args): |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
348 self.s_apply(self.r_reload, args) |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
349 |
|
2934
cb5ccbba1856
add module binascii; add r_unload/s_unload; don't change 'rb' to 'r' in open
Guido van Rossum <guido@python.org>
parents:
2926
diff
changeset
|
350 def s_unload(self, *args): |
|
cb5ccbba1856
add module binascii; add r_unload/s_unload; don't change 'rb' to 'r' in open
Guido van Rossum <guido@python.org>
parents:
2926
diff
changeset
|
351 self.s_apply(self.r_unload, args) |
|
cb5ccbba1856
add module binascii; add r_unload/s_unload; don't change 'rb' to 'r' in open
Guido van Rossum <guido@python.org>
parents:
2926
diff
changeset
|
352 |
|
2926
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
353 # Restricted open(...) |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
354 |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
355 def r_open(self, file, mode='r', buf=-1): |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
356 if mode not in ('r', 'rb'): |
|
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
357 raise IOError, "can't open files for writing in restricted mode" |
|
2934
cb5ccbba1856
add module binascii; add r_unload/s_unload; don't change 'rb' to 'r' in open
Guido van Rossum <guido@python.org>
parents:
2926
diff
changeset
|
358 return open(file, mode, buf) |
|
2926
4a53483939c1
added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents:
2886
diff
changeset
|
359 |
| 2135 | 360 |
| 361 def test(): | |
|
2886
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
362 import traceback |
|
4075
4a7038e7a313
delattr() can raise AttributeError, not KeyError.
Guido van Rossum <guido@python.org>
parents:
3734
diff
changeset
|
363 r = RExec(verbose=('-v' in sys.argv[1:])) |
|
2886
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
364 print "*** RESTRICTED *** Python", sys.version |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
365 print sys.copyright |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
366 while 1: |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
367 try: |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
368 try: |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
369 s = raw_input('>>> ') |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
370 except EOFError: |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
371 print |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
372 break |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
373 if s and s[0] != '#': |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
374 s = s + '\n' |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
375 c = compile(s, '<stdin>', 'single') |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
376 r.r_exec(c) |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
377 except SystemExit, n: |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
378 sys.exit(n) |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
379 except: |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
380 traceback.print_exc() |
|
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
381 |
| 2135 | 382 |
| 383 if __name__ == '__main__': | |
|
2886
21e105460a49
new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents:
2776
diff
changeset
|
384 test() |
