Beispiel #1
0
    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
Beispiel #2
0
    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
Beispiel #3
0
    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
Beispiel #4
0
    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
Beispiel #5
0
    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
Beispiel #6
0
    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
Beispiel #7
0
    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
Beispiel #8
0
    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
Beispiel #9
0
    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
Beispiel #10
0
    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
Beispiel #11
0
    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)