def logout(env, path, user, database): response = responder.Response() # if not user: # response.set_status_code(409) # Conflict # return response response.set_cookie(database.users().revoke_session(user)) response.set_redirect("{_root_}/{_session_}/{_login_}") return response
def serve(self, _env, path, user, database): response = responder.Response() server = path[1].lower() in_fmt = path[2].lower() s_name = path[3].lower() protein_db = database.proteins() source = protein_db.find_source(server, in_fmt) if not source: response.set_status_code(response.NOT_FOUND) return response protein = protein_db.get_protein_info(source, s_name) if not protein: logging.debug("Protein not in db") # Try downloading a new one! if source.is_private(): response.set_status_code(response.NOT_FOUND) return response # Return processing for now; we've queued the request !? getter = ProteinGetter(database, source, s_name) getter.start() if len(path) == 4: # Serve an html page for that protein! return self.__serve_html(s_name, user, response) response.set_status_code(response.PROCESSING) return response if len(path) == 4: # Serve an html page for that protein! return self.__serve_html(s_name, user, response) mid = path[4] if protein.is_processing(): logging.debug("Protein not ready yet") response.set_status_code(response.PROCESSING) return response model = None if mid in protein.get_models(): model = protein_db.load_model(protein, mid) else: # Load first model (?) for mid in protein.get_models(): model = protein_db.load_model(protein, mid) break if model: response.set_body(model, "application/octet-stream") return response
def lost(env, _, user, database): response = responder.Response() if user: response.set_status_code(409) # Conflict return response data = parse(env) if database.users().initiate_reset(data): response.set_status_code(response.NO_CONTENT) sleep(2) # Don't allow mass-spamming return response
def register(env, _, user, database): response = responder.Response() if user: response.set_status_code(409) # Conflict return response data = parse(env) if database.users().register(data): response.set_status_code(response.NO_CONTENT) else: response.set_status_code(409) # Conflict sleep(2) # Don't allow mass-spamming return response
def serve(self, env, path, user, database): response = responder.Response() if len(path) <= 1: logging.debug("Missing path") response.set_status_code(response.BAD_REQUEST) return response filename = os.path.join(os.environ["WORKDIR"], "/".join(path)) with open(filename, "rb") as static: mtype, menc = mimetypes.guess_type(filename) if not mtype: mtype = "application/octet-stream" response.set_body(static.read(), mtype) static.close() return response
def login(env, _, user, database): response = responder.Response() # if user: # response.set_status_code(409) # Conflict # return response data = parse(env) (user, cookie) = database.users().find_user(data) if user: response.set_status_code(response.NO_CONTENT) response.set_cookie(cookie) else: response.set_status_code(401) sleep(2) # Don't allow mass-spamming return response
def activate(_, path, user, database): response = responder.Response() if user: response.set_status_code(409) # Conflict return response if len(path) != 3: response.set_status_code(response.BAD_REQUEST) return response result = database.users().activate(path[2]) if result == 0: response.set_redirect("{_root_}/{_session_}/{_activated_}") elif result == 1: response.set_status_code(response.GONE) return response
def serve(self, env, path, user, database): method = env["REQUEST_METHOD"] response = responder.Response() special_get = ["activate", "logout", "reset"] if method == "POST" or path[1] in special_get: fun = getattr(self, path[1]) if fun: response = fun(env, path, user, database) elif method == "GET": if path[1] == "activate": response = self.activate(env, path, user, database) else: response.set_html("session/" + path[1] + ".html", user) else: response.set_status_code(405) # Method Not Allowed return response
def reset(env, path, user, database): response = responder.Response() if user: response.set_status_code(409) # Conflict return response if env["REQUEST_METHOD"] == "POST": data = parse(env) logging.debug("post") if len(path) > 2: # Last reset step with session ID result = database.users().finish_reset(path[2], data) if result == 410: response.set_status_code(response.GONE) elif result == 412: response.set_status_code(response.PRECONDITION_FAILED) elif result: response.set_status_code(response.NO_CONTENT) else: if database.users().initiate_reset(data, User.NORMAL): response.set_status_code(response.NO_CONTENT) elif database.users().initiate_reset(data, User.EXPERT): response.set_status_code(response.NO_CONTENT) sleep(2) # Don't allow mass-spamming else: # Information page or actual reset page? if path[-1] == "reset": # Display information page response.set_html("session/reset.html") # Check validity (expiration) elif database.users().reset_valid(path[-1]): response.set_html("session/reset_form.html") else: response.set_status_code(response.GONE) return response
def reset_form(env, path, user, database): response = responder.Response() if user: response.set_status_code(409) # Conflict return response if env["REQUEST_METHOD"] == "POST": data = parse(env) if database.users().confirm_reset(path[-1], data): response.set_status_code(response.NO_CONTENT) sleep(2) # Don't allow mass-spamming else: # Information page or actual reset page? if path[-1] == "reset": # Display information page response.set_html("session/reset.html") # Check validity (expiration) elif database.users().reset_valid(path[-1]): response.set_html("session/reset_success.html") else: response.set_status_code(response.GONE) return response
def __call__(self, env, start_response): """ Entry point """ database = None user = None response = responder.Response() # First' check for session cookie try: database = self.__database.connect() if "HTTP_COOKIE" in env: #args = post_parser.parse(data=env["HTTP_COOKIE"]) #if args: cookies = cookie.Cookie.restore(env["HTTP_COOKIE"]) for c in cookies: #cookie = cookie.Cookie(client_string = env["HTTP_COOKIE"]) user = database.users().find_session(c) if user: logging.debug(user) break # # Check there is a valid path # path = env["PATH_INFO"] # if path[0:len(self.__root)] != self.__root: # logging.error("Can't handle this path!") # response.set_status_code(response.BAD_REQUEST) # return path = env["PATH_INFO"][1:].split("/") # Special paths: "", "favicon.ico", "sitemap.xml", "robots.txt" special = ["favicon.ico", "sitemap.xml", "robots.txt"] if len(path) == 1 and path[0] in special: path.append(path[0]) path[0] = "static" # if not path[1]: # path[1] = "index.html" # if path[1].endswith(".html"): # response.set_body(html_format_file("protein", protein_name.upper()), "text/html") # return response try: logging.debug("Now serving " + str(path)) if len(path) == 1: if not path[0]: path[0] = "index.html" if path[0].endswith(".html"): response.set_html(path[0], user) else: module = importlib.import_module("server." + path[0]) factory = getattr(module, path[0].title()) server = factory() response = server.serve(env, path, user, database) assert response finally: pass except Exception as exc: logging.error("Exception in main: " + str(exc)) logging.error(traceback.format_exc()) logging.error("--------") finally: response.finalise(user) logging.debug(response.get_status_code()) if database: database.close() return self.__server.serve(start_response, response)