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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 import __builtin__
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
257 return m
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
360
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
382
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
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()