Exemplo n.º 1
0
    def __init__(self, database_filepath):
        self.filepath = database_filepath

        db_file_data = self.loadUserData()

        self.users = db_file_data["users"]
        self.client_data = ClientDataManager(db_file_data["client_data"])
        self.settings = db_file_data["settings"]
Exemplo n.º 2
0
class RMUserDatabase:
    def __init__(self, database_filepath):
        self.filepath = database_filepath

        db_file_data = self.loadUserData()

        self.users = db_file_data["users"]
        self.client_data = ClientDataManager(db_file_data["client_data"])
        self.settings = db_file_data["settings"]

        # enable the use of the with keyword (removes the need to call saveUserData() manually)

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        self.saveUserData()

    def loadUserData(self):
        global default_json_object

        try:
            database_text = ""
            with open(self.filepath) as db_file:
                database_text = db_file.readline().rstrip("\n")
            if len(database_text) == 0:
                raise Exception("Database empty")
            return json.loads(database_text)
        except (FileNotFoundError, Exception):
            print("File '", self.filepath, "' does not exist.")
            return default_json_object

    def saveUserData(self):
        with open(self.filepath, "w") as db_file:
            db_file.write(
                json.dumps({"settings": self.settings, "users": self.users, "client_data": self.client_data.getData()})
            )

            # Utility methods

    def checkPassword(self, username, password):
        if self.getUserData(username)["password_hash"] == hashPassword(password.encode("utf-16")).decode("utf-16"):
            return True
        return False

    def getNextId(self):
        if len(self.settings["deleted_ids"]) > 0:
            return self.settings["deleted_ids"].pop()
        else:
            self.settings["next_id"] += 1
            return self.settings["next_id"] - 1

            # Getters

    def getUserData(self, username):
        try:
            return self.users[username]
        except KeyError:
            print("Error: user is not in the database")
            return {}

    def getClientIPs(self, username):
        return self.getUserData(username)["ip_addresses"]

        # Setters

    def setUserData(self, username, data):
        self.users[username] = data

        # Database modification methods

    def addUser(self, username, ip_addresses, password):
        self.setUserData(
            username,
            {
                "id": self.getNextId(),
                "ip_addresses": [],
                "password_hash": hashPassword(password.encode("utf-16")).decode("utf-16"),
            },
        )
        for ip in ip_addresses:
            self.addIPAddress(username, ip)

    def removeUser(self, username):
        user_data = self.users.pop(username)
        self.settings["deleted_ids"].append(user_data["id"])

    def addIPAddress(self, username, ip):
        self.getClientIPs(username).append(ip)
        self.client_data.addIP(ip, "")