def main(environ, start_response): request_start = time.time() db = dbutils.Database() user = None try: try: req = request.Request(db, environ, start_response) if req.user is None: if configuration.base.AUTHENTICATION_MODE == "critic": if configuration.base.SESSION_TYPE == "httpauth": req.setStatus(401) req.addResponseHeader("WWW-Authenticate", "Basic realm=\"Critic\"") req.start() return elif configuration.base.ALLOW_ANONYMOUS_USER or req.path in ("login", "validatelogin"): user = dbutils.User.makeAnonymous() elif req.method == "GET": raise page.utils.NeedLogin, req else: # Don't try to redirect POST requests to the login page. req.setStatus(403) req.start() return else: try: user = dbutils.User.fromName(db, req.user) except dbutils.NoSuchUser: cursor = db.cursor() cursor.execute("""INSERT INTO users (name, email, fullname) VALUES (%s, %s, %s) RETURNING id""", (req.user, getUserEmailAddress(req.user), req.user)) user = dbutils.User.fromId(db, cursor.fetchone()[0]) db.commit() user.loadPreferences(db) if user.status == 'retired': cursor = db.cursor() cursor.execute("UPDATE users SET status='current' WHERE id=%s", (user.id,)) user = dbutils.User.fromId(db, user.id) db.commit() if not user.getPreference(db, "debug.profiling.databaseQueries"): db.disableProfiling() if not req.path: if user.isAnonymous(): location = "tutorial" else: location = user.getPreference(db, "defaultPage") if req.query: location += "?" + req.query req.setStatus(307) req.addResponseHeader("Location", location) req.start() return if req.path == "redirect": target = req.getParameter("target", "/") if req.method == "POST": # Don't use HTTP redirect for POST requests. req.setContentType("text/html") req.start() yield "<meta http-equiv='refresh' content='0; %s'>" % htmlify(target) return else: raise page.utils.MovedTemporarily, target if req.path.startswith("!/"): req.path = req.path[2:] elif configuration.extensions.ENABLED: handled = extensions.executePage(db, req, user) if handled: req.start() yield handled return if req.path.startswith("r/"): req.query = "id=" + req.path[2:] + ("&" + req.query if req.query else "") req.path = "showreview" if configuration.extensions.ENABLED: match = RE_EXTENSION_RESOURCE.match(req.path) if match: content_type, resource = extensions.getExtensionResource(req, db, user, match.group(1)) if resource: req.setContentType(content_type) req.start() yield resource return else: req.setStatus(404) req.start() return if req.path.startswith("download/"): operation = download else: operation = operations.get(req.path) if operation: req.setContentType("text/plain") try: result = operation(req, db, user) except OperationError, error: result = error except page.utils.DisplayMessage, message: result = "error:" + message.title if message.body: result += " " + message.body except Exception, exception: result = "error:\n" + "".join(traceback.format_exception(*sys.exc_info())) if isinstance(result, (OperationResult, OperationError)): req.setContentType("text/json") if isinstance(result, OperationResult): if db.profiling: result.set("__profiling__", formatDBProfiling(db)) result.addResponseHeaders(req) else: req.setContentType("text/plain") req.start() if isinstance(result, unicode): yield result.encode("utf8") else: yield str(result) return
def main(environ, start_response): request_start = time.time() db = dbutils.Database() user = None try: try: req = request.Request(db, environ, start_response) if req.user is None: if configuration.base.AUTHENTICATION_MODE == "critic": if configuration.base.SESSION_TYPE == "httpauth": req.setStatus(401) req.addResponseHeader("WWW-Authenticate", "Basic realm=\"Critic\"") req.start() return elif configuration.base.ALLOW_ANONYMOUS_USER or req.path in ( "login", "validatelogin"): user = dbutils.User.makeAnonymous() elif req.method == "GET": raise page.utils.NeedLogin, req else: # Don't try to redirect POST requests to the login page. req.setStatus(403) req.start() return else: try: user = dbutils.User.fromName(db, req.user) except dbutils.NoSuchUser: cursor = db.cursor() cursor.execute( """INSERT INTO users (name, email, fullname) VALUES (%s, %s, %s) RETURNING id""", (req.user, getUserEmailAddress(req.user), req.user)) user = dbutils.User.fromId(db, cursor.fetchone()[0]) db.commit() user.loadPreferences(db) if user.status == 'retired': cursor = db.cursor() cursor.execute("UPDATE users SET status='current' WHERE id=%s", (user.id, )) user = dbutils.User.fromId(db, user.id) db.commit() if not user.getPreference(db, "debug.profiling.databaseQueries"): db.disableProfiling() if not req.path: if user.isAnonymous(): location = "tutorial" else: location = user.getPreference(db, "defaultPage") if req.query: location += "?" + req.query req.setStatus(307) req.addResponseHeader("Location", location) req.start() return if req.path == "redirect": target = req.getParameter("target", "/") if req.method == "POST": # Don't use HTTP redirect for POST requests. req.setContentType("text/html") req.start() yield "<meta http-equiv='refresh' content='0; %s'>" % htmlify( target) return else: raise page.utils.MovedTemporarily, target if req.path.startswith("!/"): req.path = req.path[2:] elif configuration.extensions.ENABLED: handled = extensions.executePage(db, req, user) if handled: req.start() yield handled return if req.path.startswith("r/"): req.query = "id=" + req.path[2:] + ("&" + req.query if req.query else "") req.path = "showreview" if configuration.extensions.ENABLED: match = RE_EXTENSION_RESOURCE.match(req.path) if match: content_type, resource = extensions.getExtensionResource( req, db, user, match.group(1)) if resource: req.setContentType(content_type) req.start() yield resource return else: req.setStatus(404) req.start() return if req.path.startswith("download/"): operation = download else: operation = operations.get(req.path) if operation: req.setContentType("text/plain") try: result = operation(req, db, user) except OperationError, error: result = error except page.utils.DisplayMessage, message: result = "error:" + message.title if message.body: result += " " + message.body except Exception, exception: result = "error:\n" + "".join( traceback.format_exception(*sys.exc_info()))
def main(environ, start_response): request_start = time.time() db = dbutils.Database() user = None try: try: req = request.Request(db, environ, start_response) if configuration.base.AUTHENTICATION_MODE == "critic" and req.user is None: req.setStatus(401) req.addResponseHeader("WWW-Authenticate", "Basic realm=\"Critic\"") req.start() return try: user = dbutils.User.fromName(db, req.user) except dbutils.NoSuchUser: cursor.execute("""INSERT INTO users (name, email, fullname) VALUES (%s, %s, %s) RETURNING id""", (req.user, getUserEmailAddress(req.user), req.user)) user = dbutils.User.fromId(db, cursor.fetchone()[0]) db.commit() user.loadPreferences(db) if user.status == 'retired': cursor = db.cursor() cursor.execute("UPDATE users SET status='current' WHERE id=%s", (user.id,)) user = dbutils.User.fromId(db, user.id) db.commit() if not user.getPreference(db, "debug.profiling.databaseQueries"): db.disableProfiling() if not req.path: location = user.getPreference(db, "defaultPage") if req.query: location += "?" + req.query req.setStatus(307) req.addResponseHeader("Location", location) req.start() return if req.path.startswith("!/"): req.path = req.path[2:] elif configuration.extensions.ENABLED: handled = extensions.executePage(db, req, user) if handled: req.start() yield handled return if req.path.startswith("r/"): req.query = "id=" + req.path[2:] + ("&" + req.query if req.query else "") req.path = "showreview" if configuration.extensions.ENABLED: match = RE_EXTENSION_RESOURCE.match(req.path) if match: content_type, resource = extensions.getExtensionResource(req, db, user, match.group(1)) if resource: req.setContentType(content_type) req.start() yield resource return else: req.setStatus(404) req.start() return if req.path.startswith("download/"): operation = download else: operation = operations.get(req.path) if operation: req.setContentType("text/plain") try: result = operation(req, db, user) except OperationError, error: result = error except page.utils.DisplayMessage, message: result = "error:" + message.title if message.body: result += " " + message.body except Exception, exception: result = "error:\n" + "".join(traceback.format_exception(*sys.exc_info())) if isinstance(result, (OperationResult, OperationError)): req.setContentType("text/json") if db.profiling and isinstance(result, OperationResult): result.set("__profiling__", formatDBProfiling(db)) else: req.setContentType("text/plain") req.start() if isinstance(result, unicode): yield result.encode("utf8") else: yield str(result) return