37
37
serveservice_path = "/opt/ivle/scripts/serveservice"
39
def determine_file_type(filename):
40
filetype = mimetypes.guess_type(filename)[0]
42
filetype = conf.mimetypes.default_mimetype
39
45
req = cgirequest.CGIRequest()
40
46
req.install_error_handler()
48
python = "/usr/bin/python"
42
50
# Work out the parts of the URL
43
url = urlparse.urlparse(req.path)
46
username, _, filename = studpath.url_to_jailpaths(urlpath)
51
urlpath = urlparse.urlparse(req.path)[2]
52
filename = studpath.url_to_jailpaths(urlpath)[2]
56
req.throw_error(req.HTTP_NOT_FOUND, "The path specified is invalid.")
58
if not os.access(filename, os.F_OK):
59
# The given path doesn't exist. CGI lets us backtrack and put the path
60
# elements through which we pass into PATH_INFO, so we try that.
61
while not os.access(filename, os.F_OK):
62
filename, path_info_frag = os.path.split(filename)
64
# os.path.join tacks a / on the end even if the second fragment is
65
# empty, which we don't want.
66
if len(path_info) > 0:
67
path_info = os.path.join(path_info_frag, path_info)
69
path_info = path_info_frag
71
# PATH_INFO is meant to start with a /.
72
path_info = os.path.join(os.sep, path_info)
74
# We now have a file that exists, but is it something that we're allowed
75
# to execute? If not, we should 404 anyway.
76
if determine_file_type(filename) not in conf.app.server.interpreters:
77
req.throw_error(req.HTTP_NOT_FOUND,
78
"The specified file (%s) does not exist." % urlpath)
47
80
path = os.path.split(filename)[0]
49
python = "/usr/bin/python"
51
82
# Everything should be done from the same directory as the script
52
# If we can't chdir, a 404 will be thrown later when we can't access the file.
86
req.throw_error(req.HTTP_NOT_FOUND,
87
"The specified file (%s) does not exist." % urlpath)
58
89
# Search the path for modules first
61
(type, _) = mimetypes.guess_type(filename)
63
type = conf.mimetypes.default_mimetype
66
req.throw_error(req.HTTP_NOT_FOUND, "The path specified is invalid.")
67
elif not os.access(filename, os.R_OK):
92
# Now we have lots of fun mangling environment variables to fix PATH_INFO
94
os.environ['PATH_INFO'] = path_info
95
if len(path_info) > 0:
96
os.environ['SCRIPT_NAME'] = os.environ['SCRIPT_NAME'][:-len(path_info)]
98
# Set PATH_TRANSLATED. We trim the leading / from path_info or things go bad.
99
path_translated = studpath.url_to_jailpaths(path_info[1:])[2]
100
if path_translated is not None:
101
if len(path_translated) == 0 or path_translated[0] != os.sep:
102
path_translated = os.sep + path_translated
103
os.environ['PATH_TRANSLATED'] = path_translated
105
if not os.access(filename, os.R_OK):
68
106
req.throw_error(req.HTTP_NOT_FOUND,
69
107
"The specified file (%s) does not exist." % urlpath)
70
108
elif os.path.isdir(filename):
84
122
# Otherwise, use the blacklist/whitelist to see if this file should be
85
123
# served or disallowed
86
124
if (conf.app.server.blacklist_served_filetypes and \
87
type in conf.app.server.served_filetypes_blacklist) or \
125
determine_file_type(filename) in \
126
conf.app.server.served_filetypes_blacklist) or \
88
127
(conf.app.server.served_filetypes_whitelist and \
89
type not in conf.app.server.served_filetypes_whitelist):
128
determine_file_type(filename) not in \
129
conf.app.server.served_filetypes_whitelist):
90
130
req.throw_error(req.HTTP_FORBIDDEN,
91
131
"Files of this type are not allowed to be served.")