~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to ivle/dispatch/request.py

  • Committer: William Grant
  • Date: 2009-05-27 06:49:25 UTC
  • Revision ID: grantw@unimelb.edu.au-20090527064925-avjig8opo22t1lur
Drop ivle.conf usage from ivle.pulldown_subj.

Show diffs side-by-side

added added

removed removed

Lines of Context:
33
33
    # This needs to be importable from outside Apache.
34
34
    pass
35
35
 
 
36
import os.path
 
37
 
36
38
import ivle.util
37
 
import ivle.conf
38
39
import ivle.database
39
 
import plugins.console # XXX: Relies on www/ being in the Python path.
 
40
from ivle.webapp.base.plugins import CookiePlugin
40
41
 
41
42
class Request:
42
43
    """An IVLE request object. This is presented to the IVLE apps as a way of
78
79
        location (write)
79
80
            String. Response "Location" header value. Used with HTTP redirect
80
81
            responses.
81
 
        title (write)
82
 
            String. HTML page title. Used if write_html_head_foot is True, in
83
 
            the HTML title element text.
84
82
        styles (write)
85
83
            List of strings. Write a list of URLs to CSS files here, and they
86
84
            will be incorporated as <link rel="stylesheet" type="text/css">
99
97
            in the head, if write_html_head_foot is True.
100
98
            This is the propper way to specify functions that need to run at 
101
99
            page load time.
102
 
        write_html_head_foot (write)
103
 
            Boolean. If True, dispatch assumes that this is an XHTML page, and
104
 
            will immediately write a full HTML head, open the body element,
105
 
            and write heading contents to the page, before any bytes are
106
 
            written. It will then write footer contents and close the body and
107
 
            html elements at the end of execution.  
108
 
 
109
 
            This value should be set to true by all applications for all HTML
110
 
            output (unless there is a good reason, eg. exec). The
111
 
            applications should therefore output HTML content assuming that
112
 
            it will be written inside the body tag. Do not write opening or
113
 
            closing <html> or <body> tags.
114
100
    """
115
101
 
116
102
    # Special code for an OK response.
169
155
    HTTP_INSUFFICIENT_STORAGE         = 507
170
156
    HTTP_NOT_EXTENDED                 = 510
171
157
 
172
 
    def __init__(self, req, write_html_head):
173
 
        """Builds an IVLE request object from a mod_python request object.
174
 
        This results in an object with all of the necessary methods and
175
 
        additional fields.
 
158
    def __init__(self, req, config):
 
159
        """Create an IVLE request from a mod_python one.
176
160
 
177
 
        req: A mod_python request object.
178
 
        write_html_head: Function which is called when writing the automatic
179
 
            HTML header. Accepts a single argument, the IVLE request object.
 
161
        @param req: A mod_python request.
 
162
        @param config: An IVLE configuration.
180
163
        """
181
164
 
182
165
        # Methods are mostly wrappers around the Apache request object
183
166
        self.apache_req = req
184
 
        self.func_write_html_head = write_html_head
 
167
        self.config = config
185
168
        self.headers_written = False
186
169
 
187
170
        # Determine if the browser used the public host name to make the
188
171
        # request (in which case we are in "public mode")
189
 
        if req.hostname == ivle.conf.public_host:
 
172
        if req.hostname == config['urls']['public_host']:
190
173
            self.publicmode = True
191
174
        else:
192
175
            self.publicmode = False
196
179
        self.uri = req.uri
197
180
        # Split the given path into the app (top-level dir) and sub-path
198
181
        # (after first stripping away the root directory)
199
 
        path = ivle.util.unmake_path(req.uri)
 
182
        path = self.unmake_path(req.uri)
200
183
        (self.app, self.path) = (ivle.util.split_path(path))
201
184
        self.user = None
202
185
        self.hostname = req.hostname
205
188
 
206
189
        # Open a database connection and transaction, keep it around for users
207
190
        # of the Request object to use
208
 
        self.store = ivle.database.get_store()
 
191
        self.store = ivle.database.get_store(config)
209
192
 
210
193
        # Default values for the output members
211
194
        self.status = Request.HTTP_OK
212
195
        self.content_type = None        # Use Apache's default
213
196
        self.location = None
214
 
        self.title = None     # Will be set by dispatch before passing to app
215
197
        self.styles = []
216
198
        self.scripts = []
217
199
        self.scripts_init = []
218
 
        self.write_html_head_foot = False
219
200
        # In some cases we don't want the template JS (such as the username
220
201
        # and public FQDN) in the output HTML. In that case, set this to 0.
221
202
        self.write_javascript_settings = True
229
210
        """Writes out the HTTP and HTML headers before any real data is
230
211
        written."""
231
212
        self.headers_written = True
232
 
        
233
 
        # app is the App object for the chosen app
234
 
        try:
235
 
            app = ivle.conf.apps.app_url[self.app]
236
 
        except KeyError:
237
 
            app = None
238
 
 
239
 
        # Write any final modifications to header content
240
 
        if app and app.useconsole and self.user:
241
 
            plugins.console.insert_scripts_styles(self.scripts, self.styles, \
242
 
                self.scripts_init)
243
213
 
244
214
        # Prepare the HTTP and HTML headers before the first write is made
245
215
        if self.content_type != None:
247
217
        self.apache_req.status = self.status
248
218
        if self.location != None:
249
219
            self.apache_req.headers_out['Location'] = self.location
250
 
        if self.write_html_head_foot:
251
 
            # Write the HTML header, pass "self" (request object)
252
 
            self.func_write_html_head(self)
253
220
 
254
221
    def ensure_headers_written(self):
255
222
        """Writes out the HTTP and HTML headers if they haven't already been
275
242
    def logout(self):
276
243
        """Log out the current user by destroying the session state.
277
244
        Then redirect to the top-level IVLE page."""
278
 
        # List of cookies that IVLE uses (to be removed at logout)
279
 
        ivle_cookies = ["ivleforumcookie", "clipboard"]
280
 
        
281
245
        if hasattr(self, 'session'):
282
246
            self.session.invalidate()
283
247
            self.session.delete()
284
248
            # Invalidates all IVLE cookies
285
249
            all_cookies = mod_python.Cookie.get_cookies(self)
286
 
            for cookie in all_cookies:
287
 
                if cookie in ivle_cookies:
288
 
                    self.add_cookie(mod_python.Cookie.Cookie(cookie,'',expires=1,path='/'))
289
 
        self.throw_redirect(ivle.util.make_path('')) 
 
250
 
 
251
            # Create cookies for plugins that might request them.
 
252
            for plugin in self.config.plugin_index[CookiePlugin]:
 
253
                for cookie in plugin.cookies:
 
254
                    self.add_cookie(mod_python.Cookie.Cookie(cookie, '',
 
255
                                                    expires=1, path='/'))
 
256
        self.throw_redirect(self.make_path(''))
290
257
 
291
258
 
292
259
    def flush(self):
307
274
        else:
308
275
            return self.apache_req.read(len)
309
276
 
310
 
    def throw_error(self, httpcode, message=None):
311
 
        """Writes out an HTTP error of the specified code. Raises an exception
312
 
        which is caught by the dispatch or web server, so any code following
313
 
        this call will not be executed.
314
 
 
315
 
        httpcode: An HTTP response status code. Pass a constant from the
316
 
        Request class.
317
 
        """
318
 
        raise ivle.util.IVLEError(httpcode, message)
319
 
 
320
277
    def throw_redirect(self, location):
321
278
        """Writes out an HTTP redirect to the specified URL. Raises an
322
279
        exception which is caught by the dispatch or web server, so any
336
293
        else:
337
294
            mod_python.Cookie.add_cookie(self.apache_req, cookie, value, **attributes)
338
295
 
 
296
    def make_path(self, path):
 
297
        """Prepend the IVLE URL prefix to the given path.
 
298
 
 
299
        This is used when generating URLs to send to the client.
 
300
 
 
301
        This method is DEPRECATED. We no longer support use of a prefix.
 
302
        """
 
303
        return os.path.join(self.config['urls']['root'], path)
 
304
 
 
305
    def unmake_path(self, path):
 
306
        """Strip the IVLE URL prefix from the given path, if present.
 
307
 
 
308
        Also normalises the path.
 
309
 
 
310
        This method is DEPRECATED. We no longer support use of a prefix.
 
311
        """
 
312
        path = os.path.normpath(path)
 
313
        root = os.path.normpath(self.config['urls']['root'])
 
314
 
 
315
        if path.startswith(root):
 
316
            path = path[len(root):]
 
317
            # Take out the slash as well
 
318
            if len(path) > 0 and path[0] == os.sep:
 
319
                path = path[1:]
 
320
 
 
321
        return path
 
322
 
339
323
    def get_session(self):
340
324
        """Returns a mod_python Session object for this request.
341
325
        Note that this is dependent on mod_python and may need to change
342
 
        interface if porting away from mod_python."""
 
326
        interface if porting away from mod_python.
 
327
 
 
328
        IMPORTANT: Call unlock() on the session as soon as you are done with
 
329
                   it! If you don't, all other requests will block!
 
330
        """
343
331
        # Cache the session object and set the timeout to 24 hours.
344
332
        if not hasattr(self, 'session'):
345
333
            self.session = mod_python.Session.FileSession(self.apache_req,