"Datensave" mit pyAesCrypt

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Hallo zusammen,

ich habe eine Art "Datensave" mit Python gemacht, ich wollte allgemein mal eure Rückmeldungen dazu hören bzw. Verbesserungsvorschläge. Speziell beim Exceptionhandling bin ich mir fast sicher dass ich da einiges nicht beachtet habe.

Code: Alles auswählen

import pyAesCrypt
import pathlib
import getpass
import shutil

BUFFER_SIZE = 64 * 1024
FOLDER_PATH = pathlib.Path(r"C:\Users\xxx\Desktop\TEST")
ZIP_EXTENSION = '.zip'
AES_EXTENSION = '.aes'

def remove_directory(path):
    for child in path.iterdir():
        if child.is_file():
            child.unlink()
        else:
            remove_directory(child)
    path.rmdir()

def is_encrypted(path):
    if path.with_suffix(AES_EXTENSION).is_file():
        return True
    elif path.is_dir():
        return False

def encrypt_file(path, password):
    shutil.make_archive(path, 'zip', path)
    pyAesCrypt.encryptFile(path.with_suffix(ZIP_EXTENSION), path.with_suffix(AES_EXTENSION), password, BUFFER_SIZE)
    path.with_suffix(ZIP_EXTENSION).unlink()
    remove_directory(path)

def decypt_file(path, password):
    pyAesCrypt.decryptFile(path.with_suffix(AES_EXTENSION), path.with_suffix(ZIP_EXTENSION), password, BUFFER_SIZE)
    shutil.unpack_archive(path.with_suffix(ZIP_EXTENSION), path)
    path.with_suffix(ZIP_EXTENSION).unlink()
    path.with_suffix(AES_EXTENSION).unlink()

def main():
    while True:
        if FOLDER_PATH.exists():
            if is_encrypted(FOLDER_PATH):
                password = getpass.getpass("Dateien sind verschlüsselt, bitte das Passwort zum entschlüsseln eingeben: ")
                try:
                    decypt_file(FOLDER_PATH, password)
                except ValueError:
                    print("Falsches Passwort!")
            else:
                password = getpass.getpass("Dateien sind entschlüsselt, bitte das Passwort zum verschlüsseln eingeben: ")
                try:
                    encrypt_file(FOLDER_PATH, password)
                except FileNotFoundError:
                    print("Datei wurde nicht gefunden!")
        else:
            print("Der Pfad existiert nicht!")
            break


if __name__ == "__main__":
    main()
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

In is_encrypted hast Du einen Pfad der True liefert einen der False liefert und einen der None liefert (bei None weiß der Leser nicht, ob das Absicht ist, oder ein Programmierfehler): die Funktion sollte immer True oder False liefern.

Ich finde das ja sehr suspekt, wenn ein Programm ungefragt irgendwelche Inputdateien löscht.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Du meinst den Fall, dass es weder ein Ordner noch eine .aes Datei ist? Dann würde ich wohl besser einfach nur prüfen ob es eine .aes Datei ist und dann das Ergebnis zurückgeben, oder? Oder wenn es nichts davon ist eine Exception werfen?

Ich wollte halt irgendwie versuchen das ganze mit so wenig Userinputs wie möglich zu machen, also Kennwort eingeben -> Verschlüsseln oder Kennwort eingeben -> entschlüsseln. Ich werde aber noch eine zweite Version mit einer Abfrage machen, ob die Quelldateien gelöscht werden sollen und bei der jetzigen Version einfach eine Ausgabe machen, dass die Quelldateien dabei gelöscht werden, dann ist es zwar immernoch ungefragt, aber nicht unbekannt. Danke :)
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Habe die Main noch überarbeitet, da hatte ich noch einen kleinen Fehler drin mit dem path.exists().


Code: Alles auswählen

def main():
    print(f"DataSave für {FOLDER_PATH} - 'q' zum beenden eingeben!")
    if FOLDER_PATH.exists() or FOLDER_PATH.with_suffix(AES_EXTENSION).exists():
        while True:
            if is_encrypted(FOLDER_PATH):
                password = getpass.getpass("Dateien sind verschlüsselt, bitte das Passwort zum entschlüsseln eingeben: ")
                if password == 'q':
                    break
                try:
                    decypt_file(FOLDER_PATH, password)
                    print("Datei erfolgreich entschlüsselt und verschlüsselte Quelldatei gelöscht.")
                except ValueError:
                    print("Falsches Passwort!")
            else:
                password = getpass.getpass("Dateien sind unverschlüsselt, bitte das Passwort zum verschlüsseln eingeben: ")
                if password == 'q':
                    break
                try:
                    encrypt_file(FOLDER_PATH, password)
                    print("Datei erfolgreich verschlüsselt und unverschlüsselte Quelldatei gelöscht.")
                except FileNotFoundError:
                    print("Datei wurde nicht gefunden!")
    else:
        print("Der Pfad existiert nicht!")
Antworten