annotate Lib/rexec.py @ 5817:48b94de85bf3 legacy-trunk

Extensive changes by AMK.
author Guido van Rossum <guido@python.org>
date Thu, 17 Jul 1997 16:29:42 +0000
parents 67a0b5aaae43
children 1aff19783d74
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 ihooks
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
25
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
26
2926
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
27 class FileBase:
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
28
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
29 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
30 'readlines', 'seek', 'tell', 'write', 'writelines')
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
31
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 class FileWrapper(FileBase):
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
34
3734
04c07538cac4 Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents: 3648
diff changeset
35 # 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
36
2926
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
37 def __init__(self, f):
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
38 self.f = f
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
39 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
40 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
41 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
42
4334
f37cbfaa7328 1. Correct typo in FileWrapper.close() (fix by AMK).
Guido van Rossum <guido@python.org>
parents: 4075
diff changeset
43 def close(self):
2926
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
44 self.flush()
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
45
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 TEMPLATE = """
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
48 def %s(self, *args):
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
49 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
50 """
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 class FileDelegate(FileBase):
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
53
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
54 def __init__(self, mod, name):
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
55 self.mod = mod
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
56 self.name = name
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
57
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
58 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
59 exec TEMPLATE % (m, m)
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
60
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
61
2886
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
62 class RHooks(ihooks.Hooks):
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
63
3637
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
64 def __init__(self, *args):
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
65 # Hacks to support both old and new interfaces:
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
66 # old interface was RHooks(rexec[, verbose])
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
67 # new interface is RHooks([verbose])
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
68 verbose = 0
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
69 rexec = None
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
70 if args and type(args[-1]) == type(0):
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
71 verbose = args[-1]
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
72 args = args[:-1]
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
73 if args and hasattr(args[0], '__class__'):
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
74 rexec = args[0]
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
75 args = args[1:]
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
76 if args:
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
77 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
78 ihooks.Hooks.__init__(self, verbose)
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
79 self.rexec = rexec
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
80
3637
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
81 def set_rexec(self, rexec):
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
82 # Called by RExec instance to complete initialization
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
83 self.rexec = rexec
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
84
2886
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
85 def is_builtin(self, name):
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
86 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
87
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
88 def init_builtin(self, name):
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
89 m = __import__(name)
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
90 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
91
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
92 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
93 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
94 def load_compiled(self, *args): raise SystemError, "don't use this"
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
95
3637
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
96 def load_dynamic(self, name, filename, file):
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
97 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
98
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
99 def add_module(self, name):
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
100 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
101
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
102 def modules_dict(self):
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
103 return self.rexec.modules
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
104
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
105 def default_path(self):
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
106 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
107
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 class RModuleLoader(ihooks.FancyModuleLoader):
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
110
2926
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
111 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
112 file, filename, info = stuff
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
113 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
114 m.__filename__ = filename
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
115 return m
2886
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
116
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 class RModuleImporter(ihooks.ModuleImporter):
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
119
2926
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
120 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
121 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
122 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
123 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
124 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
125
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 class RExec(ihooks._Verbose):
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
128
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
129 """Restricted Execution environment."""
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
130
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
131 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
132
4334
f37cbfaa7328 1. Correct typo in FileWrapper.close() (fix by AMK).
Guido van Rossum <guido@python.org>
parents: 4075
diff changeset
133 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
134 'cmath', 'errno', 'imageop',
5342
67a0b5aaae43 Alas, I have to restore 'marshal', since it is needed by the new
Guido van Rossum <guido@python.org>
parents: 5208
diff changeset
135 'marshal', 'math', 'md5', 'operator',
4334
f37cbfaa7328 1. Correct typo in FileWrapper.close() (fix by AMK).
Guido van Rossum <guido@python.org>
parents: 4075
diff changeset
136 'parser', 'regex', 'rotor', 'select',
2886
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
137 'strop', 'struct', 'time')
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
138
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
139 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
140 'stat', 'times', 'uname', 'getpid', 'getppid',
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
141 'getcwd', 'getuid', 'getgid', 'geteuid', 'getegid')
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
142
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
143 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
144 'platform', 'exit', 'maxint')
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
145
2926
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
146 nok_builtin_names = ('open', 'reload', '__import__')
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
147
2886
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
148 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
149 ihooks._Verbose.__init__(self, verbose)
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
150 # XXX There's a circular reference here:
3637
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
151 self.hooks = hooks or RHooks(verbose)
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
152 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
153 self.modules = {}
3637
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
154 self.ok_dynamic_modules = self.ok_builtin_modules
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
155 list = []
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
156 for mname in self.ok_builtin_modules:
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
157 if mname in sys.builtin_module_names:
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
158 list.append(mname)
4699
a1694e95bcba Make sure ok_builtin_modules, ok_dynamic_modules and
Guido van Rossum <guido@python.org>
parents: 4351
diff changeset
159 self.ok_builtin_modules = tuple(list)
3637
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
160 self.set_trusted_path()
2886
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
161 self.make_builtin()
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
162 self.make_initial_modules()
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
163 # 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
164 # 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
165 self.make_sys()
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
166 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
167 self.importer = RModuleImporter(self.loader, verbose)
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
168
3637
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
169 def set_trusted_path(self):
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
170 # 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
171 # 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
172 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
173
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
174 def load_dynamic(self, name, filename, file):
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
175 if name not in self.ok_dynamic_modules:
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
176 raise ImportError, "untrusted dynamic module: %s" % name
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
177 if sys.modules.has_key(name):
3648
a9fb5a895fa1 fix typo in load_dynamic
Guido van Rossum <guido@python.org>
parents: 3637
diff changeset
178 src = sys.modules[name]
3637
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
179 else:
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
180 import imp
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
181 src = imp.load_dynamic(name, filename, file)
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
182 dst = self.copy_except(src, [])
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
183 return dst
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
184
2886
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
185 def make_initial_modules(self):
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
186 self.make_main()
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
187 self.make_osname()
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
188
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
189 # Helpers for RHooks
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
190
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
191 def is_builtin(self, mname):
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
192 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
193
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
194 # 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
195
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
196 def make_builtin(self):
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
197 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
198 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
199 m.reload = self.r_reload
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
200 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
201
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
202 def make_main(self):
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
203 m = self.add_module('__main__')
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
204
2886
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
205 def make_osname(self):
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
206 osname = os.name
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
207 src = __import__(osname)
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
208 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
209 dst.environ = e = {}
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
210 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
211 e[key] = value
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
212
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
213 def make_sys(self):
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
214 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
215 m.modules = self.modules
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
216 m.argv = ['RESTRICTED']
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
217 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
218 m = self.modules['sys']
4699
a1694e95bcba Make sure ok_builtin_modules, ok_dynamic_modules and
Guido van Rossum <guido@python.org>
parents: 4351
diff changeset
219 l = self.modules.keys() + list(self.ok_builtin_modules)
a1694e95bcba Make sure ok_builtin_modules, ok_dynamic_modules and
Guido van Rossum <guido@python.org>
parents: 4351
diff changeset
220 l.sort()
a1694e95bcba Make sure ok_builtin_modules, ok_dynamic_modules and
Guido van Rossum <guido@python.org>
parents: 4351
diff changeset
221 m.builtin_module_names = tuple(l)
2886
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
222
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
223 # The copy_* methods copy existing modules with some changes
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
224
2886
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
225 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
226 dst = self.copy_none(src)
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
227 for name in dir(src):
3637
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
228 setattr(dst, name, getattr(src, name))
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
229 for name in exceptions:
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
230 try:
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
231 delattr(dst, name)
4075
4a7038e7a313 delattr() can raise AttributeError, not KeyError.
Guido van Rossum <guido@python.org>
parents: 3734
diff changeset
232 except AttributeError:
3637
6c0086f9270c Fix some obsolete names comments.
Guido van Rossum <guido@python.org>
parents: 2965
diff changeset
233 pass
2886
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
234 return dst
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
235
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
236 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
237 dst = self.copy_none(src)
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
238 for name in names:
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
239 try:
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
240 value = getattr(src, name)
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
241 except AttributeError:
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
242 continue
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
243 setattr(dst, name, value)
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
244 return dst
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
245
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
246 def copy_none(self, src):
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
247 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
248
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
249 # 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
250
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
251 def add_module(self, mname):
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
252 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
253 return self.modules[mname]
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
254 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
255 m.__builtins__ = self.modules['__builtin__']
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
256 return m
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
257
2886
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
258 # The r* methods are public interfaces
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
259
2886
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
260 def r_exec(self, code):
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
261 m = self.add_module('__main__')
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
262 exec code in m.__dict__
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
263
2886
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
264 def r_eval(self, code):
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
265 m = self.add_module('__main__')
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
266 return eval(code, m.__dict__)
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
267
2886
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
268 def r_execfile(self, file):
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
269 m = self.add_module('__main__')
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
270 return execfile(file, m.__dict__)
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
271
2886
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
272 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
273 return self.importer.import_module(mname, globals, locals, fromlist)
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
274
2926
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
275 def r_reload(self, m):
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
276 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
277
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 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
279 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
280
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
281 # 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
282
3734
04c07538cac4 Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents: 3648
diff changeset
283 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
284 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
285 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
286 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
287 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
288 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
289 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
290 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
291
2926
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
292 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
293 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
294 self.save_files()
04c07538cac4 Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents: 3648
diff changeset
295 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
296 self.make_delegate_files()
2926
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
297 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
298 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
299 s.stdout = self.restricted_stdout
4351
02a24e48b376 Don't mix stdout/stderr.
Guido van Rossum <guido@python.org>
parents: 4343
diff changeset
300 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
301 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
302 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
303 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
304
04c07538cac4 Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents: 3648
diff changeset
305 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
306 self.restore_files()
04c07538cac4 Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents: 3648
diff changeset
307 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
308 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
309 self.restricted_stdout = s.stdout
4351
02a24e48b376 Don't mix stdout/stderr.
Guido van Rossum <guido@python.org>
parents: 4343
diff changeset
310 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
311
2926
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
312
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
313 def save_files(self):
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
314 self.save_stdin = sys.stdin
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
315 self.save_stdout = sys.stdout
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
316 self.save_stderr = sys.stderr
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
317
3734
04c07538cac4 Fixed restore_files(); added reset_files(); made these more flexible.
Guido van Rossum <guido@python.org>
parents: 3648
diff changeset
318 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
319 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
320 sys.stdout = self.save_stdout
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
321 sys.stderr = self.save_stderr
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
322
4334
f37cbfaa7328 1. Correct typo in FileWrapper.close() (fix by AMK).
Guido van Rossum <guido@python.org>
parents: 4075
diff changeset
323 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
324 self.save_files()
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
325 try:
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
326 self.set_files()
4334
f37cbfaa7328 1. Correct typo in FileWrapper.close() (fix by AMK).
Guido van Rossum <guido@python.org>
parents: 4075
diff changeset
327 if kw:
f37cbfaa7328 1. Correct typo in FileWrapper.close() (fix by AMK).
Guido van Rossum <guido@python.org>
parents: 4075
diff changeset
328 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
329 else:
f37cbfaa7328 1. Correct typo in FileWrapper.close() (fix by AMK).
Guido van Rossum <guido@python.org>
parents: 4075
diff changeset
330 r = apply(func, args)
2926
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
331 finally:
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
332 self.restore_files()
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
333
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
334 def s_exec(self, *args):
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
335 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
336
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
337 def s_eval(self, *args):
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
338 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
339
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
340 def s_execfile(self, *args):
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
341 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
342
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
343 def s_import(self, *args):
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
344 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
345
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
346 def s_reload(self, *args):
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
347 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
348
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
349 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
350 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
351
2926
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
352 # Restricted open(...)
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
353
4a53483939c1 added sys.std files, read-only open, reload
Guido van Rossum <guido@python.org>
parents: 2886
diff changeset
354 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
355 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
356 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
357 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
358
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
359
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
360 def test():
2886
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
361 import traceback
4075
4a7038e7a313 delattr() can raise AttributeError, not KeyError.
Guido van Rossum <guido@python.org>
parents: 3734
diff changeset
362 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
363 print "*** RESTRICTED *** Python", sys.version
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
364 print sys.copyright
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
365 while 1:
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
366 try:
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 s = raw_input('>>> ')
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
369 except EOFError:
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
370 print
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
371 break
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
372 if s and s[0] != '#':
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
373 s = s + '\n'
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
374 c = compile(s, '<stdin>', 'single')
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
375 r.r_exec(c)
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
376 except SystemExit, n:
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
377 sys.exit(n)
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
378 except:
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
379 traceback.print_exc()
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
380
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
381
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
382 if __name__ == '__main__':
2886
21e105460a49 new package support, import hooks, restricted execution support
Guido van Rossum <guido@python.org>
parents: 2776
diff changeset
383 test()