+ if not email.endswith('@MIT.EDU'):
+ return None
+ return email[:-8]
+
+class App:
+ def __init__(self, environ, start_response):
+ self.environ = environ
+ self.start = start_response
+
+ self.username = getUser(environ)
+ self.state = State(self.username)
+ self.state.environ = environ
+
+ def __iter__(self):
+ fields = cgi.FieldStorage(fp=self.environ['wsgi.input'], environ=self.environ)
+ print >> sys.stderr, fields
+ operation = self.environ.get('PATH_INFO', '')
+ if not operation:
+ self.start("301 Moved Permanently", [('Location',
+ self.environ['SCRIPT_NAME']+'/')])
+ return
+ if self.username is None:
+ operation = 'unauth'
+ if operation.startswith('/'):
+ operation = operation[1:]
+ if not operation:
+ operation = 'list'
+ print 'Starting', operation
+
+ start_time = time.time()
+ fun = mapping.get(operation, badOperation)
+ try:
+ checkpoint.checkpoint('Before')
+ output = fun(self.username, self.state, fields)
+ checkpoint.checkpoint('After')
+
+ headers = dict(DEFAULT_HEADERS)
+ if isinstance(output, tuple):
+ new_headers, output = output
+ headers.update(new_headers)
+ print 'MOO2'
+ e = revertStandardError()
+ if e:
+ if isinstance(output, basestring):
+ sys.stderr = StringIO()
+ x = str(output)
+ print >> sys.stderr, x
+ print >> sys.stderr, 'XXX'
+ print >> sys.stderr, e
+ raise Exception()
+ output.addError(e)
+ output_string = str(output)
+ checkpoint.checkpoint('output as a string')
+ except Exception, err:
+ if not fields.has_key('js'):
+ if isinstance(err, CodeError):
+ self.start('500 Internal Server Error', [('Content-Type', 'text/html')])
+ e = revertStandardError()
+ s = error(operation, self.username, fields, err, e)
+ yield str(s)
+ return
+ if isinstance(err, InvalidInput):
+ self.start('200 OK', [('Content-Type', 'text/html')])
+ e = revertStandardError()
+ yield str(invalidInput(operation, self.username, fields, err, e))
+ return
+ self.start('500 Internal Server Error', [('Content-Type', 'text/plain')])
+ import traceback
+ yield '''Uh-oh! We experienced an error.'
+Please email xvm-dev@mit.edu with the contents of this page.'
+----
+%s
+----
+%s
+----''' % (str(err), traceback.format_exc())
+ self.start('200 OK', headers.items())
+ yield output_string
+ if fields.has_key('timedebug'):
+ yield '<pre>%s</pre>' % cgi.escape(str(checkpoint))