~launchpad-pqm/launchpad/devel

« back to all changes in this revision

Viewing changes to lib/lp/testing/keyserver/web.py

[r=benji][bug=795573,
 796233] On DistroSeries:+localpackagediffs ensure that the comment
 form is hidden after adding a new comment to a DistroSeriesDifference,
 prevent empty comments from being submitted,
 and add some animations and effects to make the UI less jarring and easier to
 follow.

Show diffs side-by-side

added added

removed removed

Lines of Context:
32
32
    'KeyServerResource',
33
33
    ]
34
34
 
 
35
import cgi
35
36
import glob
36
37
import os
37
 
import cgi
 
38
from time import sleep
38
39
 
39
40
from twisted.web.resource import Resource
40
41
 
69
70
        # fingerprint. Let's glob.
70
71
        if suffix.startswith('0x'):
71
72
            suffix = suffix[2:]
72
 
        keys = glob.glob(os.path.join(root, '*'+suffix))
 
73
        keys = glob.glob(os.path.join(root, '*' + suffix))
73
74
        if len(keys) == 1:
74
75
            path = keys[0]
75
76
        else:
110
111
        return 'Welcome To Fake SKS service.\n'
111
112
 
112
113
 
 
114
KEY_NOT_FOUND_BODY = (
 
115
    "<html><head><title>Error handling request</title></head>\n"
 
116
    "<body><h1>Error handling request</h1>Error handling request: "
 
117
    "No keys found</body></html>")
 
118
 
 
119
 
113
120
class LookUp(Resource):
114
121
 
115
122
    isLeaf = True
126
133
        except KeyError:
127
134
            return 'Invalid Arguments %s' % request.args
128
135
 
129
 
        return self.processRequest(action, keyid)
 
136
        return self.processRequest(action, keyid, request)
130
137
 
131
 
    def processRequest(self, action, keyid):
 
138
    def processRequest(self, action, keyid, request):
 
139
        # Sleep a short time so that tests can ensure that timeouts
 
140
        # are properly handled by setting an even shorter timeout.
 
141
        sleep(0.02)
132
142
        if (action not in self.permitted_actions) or not keyid:
133
143
            return 'Forbidden: "%s" on ID "%s"' % (action, keyid)
134
144
 
135
 
        page = ('<html>\n<head>\n'
136
 
                '<title>Results for Key %s</title>\n'
137
 
                '</head>\n<body>'
138
 
                '<h1>Results for Key %s</h1>\n'
139
 
                % (keyid, keyid))
140
 
 
141
145
        filename = '%s.%s' % (keyid, action)
142
146
 
143
147
        path = locate_key(self.root, filename)
144
148
        if path is not None:
145
149
            content = cgi.escape(open(path).read())
 
150
            page = ('<html>\n<head>\n'
 
151
                    '<title>Results for Key %s</title>\n'
 
152
                    '</head>\n<body>'
 
153
                    '<h1>Results for Key %s</h1>\n'
 
154
                    '<pre>\n%s\n</pre>\n</html>') % (keyid, keyid, content)
 
155
            return page
146
156
        else:
147
 
            content = 'Key Not Found'
148
 
 
149
 
        page += '<pre>\n%s\n</pre>\n</html>' % content
150
 
 
151
 
        return page
 
157
            # No joke: our real-world keyserver returns a 500 error
 
158
            # if it does not know about a key with the given ID.
 
159
            request.setResponseCode(500)
 
160
            return KEY_NOT_FOUND_BODY
152
161
 
153
162
 
154
163
SUBMIT_KEY_PAGE = """