Esempio n. 1
0
def encrypt(data: dict, pin: int) -> str:
    string_data = jdump(data)
    encoded = b64encode(string_data)
    keycode_generator = (i for i in encoded)

    encrypted = "=>".join(
        sorted((str((i + v) * pin) + f"x{i}"
                for i, v in enumerate(keycode_generator)),
               reverse=len(data) % 2 == 0))
    return f"{sha256(string_data).hexdigest()}+{encrypted}"
Esempio n. 2
0
def auto_save(option: bool, location: str, memory: list, events: dict,
              encrypted: bool, pin: int):
    if option:
        events["before_save"]()
        with open(location, "w+", encoding="utf-8") as f:
            written_data = jdump({
                "database": memory
            }).decode() if not encrypted else encryption.encrypt(
                {"database": memory}, pin)
            f.write(written_data)

        events["after_save"]()
        gccollect()
Esempio n. 3
0
    def save(self) -> bool:
        """Saves database to JSON file."""

        self.__events["before_save"]()
        with open(self.__location, "w+", encoding="utf-8") as f:
            written_data = jdump({"database": self.__memory}).decode(
            ) if not self.__encrypted else encryption.encrypt({"database": self.__memory}, self.__pin)
            f.write(written_data)

        self.__events["after_save"]()
        gccollect()

        return True
Esempio n. 4
0
    def dump(self, location: str, encoding: str = "utf-8") -> bool:
        """Dumps all the data to a file."""

        functions.raise_error(location, "location", str)
        functions.raise_error(encoding, "encoding", str)

        self.__events["before_export"]()
        with open(location, "w+", encoding=encoding) as f:
            f.write(jdump({"database": self.__memory}).decode())

        self.__events["after_export"]()
        gccollect()

        return True
Esempio n. 5
0
        def __wrapper():
            while self.__backup:
                last_path = "./"
                for path in self.__backup_path.split("/"):
                    if not opath.exists(f"{last_path}{path}"):
                        mkdir(f"{last_path}{path}")
                    last_path += f"{path}/"

                will_encrypt = self.__encrypted and should_encrypt

                with open(
                        f"./{self.__backup_path}/backup_{datetime.now().strftime('%d-%m-%Y_%H-%M-%S')}.{'json' if not will_encrypt else 'datagoose'}",
                        "w+",
                        encoding="utf-8") as f:
                    written_data = jdump({"database": self.__memory}).decode(
                    ) if not will_encrypt else encryption.encrypt({"database": self.__memory}, self.__pin)
                    f.write(written_data)

                gccollect()
                self.__events["backup"]()
                sleep(self.__backup_time)
Esempio n. 6
0
    def __init__(self, name: str, options=None) -> None:
        if options is None:
            options = {}

        functions.raise_error(name, "name", str)
        functions.raise_error(options, "options", dict)

        self.__path = options['PATH'] if 'PATH' in options and isinstance(
            options['PATH'], str) else "datagoose_files"
        self.__autosave = options['AUTO_SAVE'] if 'AUTO_SAVE' in options and isinstance(
            options['AUTO_SAVE'], bool) else False
        self.__hashing = [
            i for i in options['HASHING'] if isinstance(
                i, str)] if 'HASHING' in options and isinstance(
            options['HASHING'], list) else []
        self.__safemode = options['SAFE_MODE'] if 'SAFE_MODE' in options and isinstance(
            options['SAFE_MODE'], bool) else True
        self.__useregex = options['USE_REGEX'] if 'USE_REGEX' in options and isinstance(
            options['USE_REGEX'], bool) else False
        self.__encrypted = options['ENCRYPTED'] if 'ENCRYPTED' in options and isinstance(
            options['ENCRYPTED'], bool) else False

        self.__name = name
        self.__location = f"./{self.__path}/{self.__name}.{'json' if not self.__encrypted else 'datagoose'}"
        self.__pin = options['PIN'] if 'PIN' in options and isinstance(
            options['PIN'], int) else 2

        self.__backup = False
        self.__backup_time = 60
        self.__backup_path = "datagoose_backups"

        self.__events = {
            "before_insert": lambda value: None,
            "should_insert": lambda value: True,
            "after_insert": lambda value: None,

            "before_update": lambda now, changes: None,
            "should_update": lambda now, changes: True,
            "after_update": lambda now, old: None,

            "before_replace": lambda now, new: None,
            "should_replace": lambda now, new: True,
            "after_replace": lambda now, old: None,

            "before_delete": lambda value: None,
            "should_delete": lambda value: True,
            "after_delete": lambda value: None,

            "before_copy": lambda value: None,
            "should_copy": lambda value: True,
            "after_copy": lambda value: None,

            "before_save": lambda: None,
            "after_save": lambda: None,

            "before_export": lambda: None,
            "after_export": lambda: None,

            "before_import": lambda: None,
            "after_import": lambda: None,

            "backup_start": lambda: None,
            "backup": lambda: None,
            "backup_finish": lambda: None,

            "before_garbage_clear": lambda: None,
            "after_garbage_clear": lambda: None
        }

        path_prefix = "./"
        for path in self.__path.split("/"):
            if not opath.exists(f"{path_prefix}{path}"):
                mkdir(f"{path_prefix}{path}")
            path_prefix += f"{path}/"

        del path_prefix

        if not opath.isfile(self.__location):
            with open(self.__location, "w+", encoding="utf-8") as f:
                written_data = jdump({"database": []}).decode(
                ) if not self.__encrypted else encryption.encrypt({"database": []}, self.__pin)
                f.write(written_data)

        with open(self.__location, "r", encoding="utf-8") as f:
            self.__memory = jload(
                f.read())["database"] if not self.__encrypted else encryption.decrypt(
                self.__pin, f.read())["database"]

        self.__time_start = datetime.now()