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

« back to all changes in this revision

Viewing changes to lib/fileservice_lib/__init__.py

  • Committer: William Grant
  • Date: 2009-01-13 01:36:15 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:1123
Merge setup-refactor branch. This completely breaks existing installations;
every path (both filesystem and Python) has changed. Do not upgrade without
knowing what you are doing.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# IVLE
2
 
# Copyright (C) 2007-2008 The University of Melbourne
3
 
#
4
 
# This program is free software; you can redistribute it and/or modify
5
 
# it under the terms of the GNU General Public License as published by
6
 
# the Free Software Foundation; either version 2 of the License, or
7
 
# (at your option) any later version.
8
 
#
9
 
# This program is distributed in the hope that it will be useful,
10
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 
# GNU General Public License for more details.
13
 
#
14
 
# You should have received a copy of the GNU General Public License
15
 
# along with this program; if not, write to the Free Software
16
 
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17
 
 
18
 
# App: File Service (AJAX server)
19
 
# Author: Matt Giuca
20
 
# Date: 9/1/2008
21
 
 
22
 
# This application is an AJAX service. Receives file handling instructions as
23
 
# requests. Performs actions on the student's workspace, and returns directory
24
 
# listings in JSON.
25
 
 
26
 
# This rather large documentation explains the request and response to the
27
 
# file service app (it should probably be taken to a separate document).
28
 
 
29
 
# This is not intended to be accessed directly by the user. It is targeted by
30
 
# AJAX calls in applications such as browser and editor.
31
 
 
32
 
# Application usage: The input to the application is determined by the fields
33
 
# passed in as HTTP variables (either in the URL or message body). Also, in
34
 
# keeping with REST, actions only take effect if this is a POST request as
35
 
# opposed to a GET request (although a GET request is still allowed to just
36
 
# get a listing or file dump). Also, the "path" (the part of the URL
37
 
# after "fileservice" and before the GET variables) is taken into account.
38
 
 
39
 
# Aside from the side-effects to the server (note: side-effects are only
40
 
# possible for POST requests), the response takes two parts. The response
41
 
# header contains information about success or failure of the operation. The
42
 
# response body may contain the requested file.
43
 
 
44
 
# Fileservice has two separate roles: First, an action is performed. This may
45
 
# be a copy, write, or svn up operation. Then, either a directory listing or
46
 
# file contents are returned.
47
 
# This listing/contents may be completely separate from the action,
48
 
# but they are performed together because the client will usually want to
49
 
# perform some action, then update its display as a result of the action.
50
 
 
51
 
# The special "return" variable can be "listing" or "contents" - listing is
52
 
# the default if unspecified. If "listing", it will return a directory listing
53
 
# of the file specified. If the file is not a directory, it just returns a
54
 
# single "." object, with details about the file.
55
 
# If "contents", it will return the contents of the file specified. If the
56
 
# file is a directory, it will simply return the listing again.
57
 
 
58
 
# GET requests will have all variables other than "return" ignored, and the
59
 
# only behaviour will be to generate the directory or file listing. POST
60
 
# requests will result in an action if one is specified. If the action is
61
 
# UNSUCCESSFUL, returns the header "X-IVLE-Action-Error: <errormessage>".
62
 
# Successful actions succeed silently. Note that the action does not affect
63
 
# the HTTP response code (it may be 200 even upon failure).
64
 
 
65
 
# The path (req.path) controls which file or directory will be
66
 
# returned. If it is a file, returns the header "X-IVLE-Return: File" and
67
 
# status 200 OK. The response body is either a verbatim dump of the file
68
 
# specified, or a single-file directory listing, as described above.
69
 
# The Content-Type will probably be text/plain but should not be relied upon.
70
 
# If it is a directory, returns the header "X-IVLE-Return: Dir" and status
71
 
# 200 OK. The response body is a JSON directory listing (see below). The
72
 
# Content-Type cannot be relied upon. If the file is not found or there is
73
 
# some other read error, returns no X-IVLE-Return header, a 400-level
74
 
# response status. (404 File Not Found, 403 Forbidden, etc), and a header
75
 
# "X-IVLE-Return-Error: <errormessage>".
76
 
 
77
 
# See action.py for a full description of the actions.
78
 
# See listing.py for a full description of the output format of the directory
79
 
# listing.
80
 
 
81
 
import os
82
 
import shutil
83
 
import stat
84
 
import time
85
 
import mimetypes
86
 
import urllib
87
 
 
88
 
import cjson
89
 
import pysvn
90
 
 
91
 
from common import (util, studpath)
92
 
import conf.mimetypes
93
 
 
94
 
import action, listing
95
 
 
96
 
# Mime types
97
 
# application/json is the "best" content type but is not good for
98
 
# debugging because Firefox just tries to download it
99
 
mime_dirlisting = "text/html"
100
 
#mime_dirlisting = "application/json"
101
 
 
102
 
def handle(req):
103
 
    """Handler for the File Services application."""
104
 
    # Make sure the logged in user has permission to see this file
105
 
    # FIXME: Still need to authorize subpaths in actions
106
 
    #studpath.authorize(req)
107
 
 
108
 
    # Set request attributes
109
 
    req.write_html_head_foot = False     # No HTML
110
 
 
111
 
    # We really, really don't want the responses to be cached.
112
 
    req.headers_out['Cache-Control'] = 'no-store, must-revalidate'
113
 
 
114
 
    # Get all the arguments, if POST.
115
 
    # Ignore arguments if not POST, since we aren't allowed to cause
116
 
    # side-effects on the server.
117
 
    act = None
118
 
    fields = req.get_fieldstorage()
119
 
    if req.method == 'POST':
120
 
        act = fields.getfirst('action')
121
 
    
122
 
    if act is not None:
123
 
        try:
124
 
            action.handle_action(req, act, fields)
125
 
        except action.ActionError, message:
126
 
            req.headers_out['X-IVLE-Action-Error'] = \
127
 
                urllib.quote(str(message))
128
 
 
129
 
    return_type = fields.getfirst('return')
130
 
    listing.handle_return(req, return_type == "contents")