@Pythonboy: `pathlib` und `json` werden importiert, aber nirgends verwendet.
Man könnte verhindern das `main()` aufgerufen wird wenn man das als Modul importiert.
Die Benutzereingaben sollte man gegen Fehleingaben absichern.
Das Programm kommt auch nicht damit klar wenn der Benutzer zuerst 2 auswählt. Das darf er sinnvollerweise erst dann machen wenn mindestens einmal der erste Punkt gewählt wurde. Da es nur zwei Punkte gibt, braucht man dem Benutzer am Anfang gar keine Auswahl anbieten, sondern kann gleich die Einstellungen abfragen. Am besten steckt man die beiden Aktionen sowieso in eigene Funktionen, dann ist das auch kein Problem vor der Schleife einmal bedingungslos die Funktion für die Einstellungen aufzurufen.
Beim Überprüfen gibt es eine Schleife über `items()` aber `value` aus dieser Schleife wird dann gar nicht verwendet.
Man sollte nicht `key` und `value` als Namen verwenden, wenn man dafür einen passenderen hat, wie `letter` und `serial` beispielsweise.
`difference` und `difference2` sind auch keine guten Namen.
Zwischenstand (ungetestet):
Code: Alles auswählen
#!/usr/bin/env python3
import argon2
import wmi
def get_property(volume, name):
return volume.wmi_property(name).value
def get_volume_serial_numbers():
return dict(
(
get_property(volume, "Name"),
get_property(volume, "VolumeSerialNumber"),
)
for volume in wmi.WMI().Win32_LogicalDisk()
)
def subtract_mappings(mapping_a, mapping_b):
return {key: mapping_a[key] for key in mapping_a.keys() - mapping_b.keys()}
def configure():
input(
"Entferne alle USB-Sticks aus dem USB-Hub. Drücke [Enter], sobald"
" alle USB-Sticks entfernt sind\n"
)
volume_letters_and_serial_without_usb_sticks = get_volume_serial_numbers()
input(
"Stecke nun die USB-Sticks in der gewünschten Reihenfolge in den"
" USB-Hub und drücke anschließend [Enter]\n"
)
volume_letters_and_serial_with_usb_sticks = get_volume_serial_numbers()
difference = {
letter: argon2.PasswordHasher().hash(serial)
for letter, serial in subtract_mappings(
volume_letters_and_serial_with_usb_sticks,
volume_letters_and_serial_without_usb_sticks,
).items()
}
print(difference)
return volume_letters_and_serial_without_usb_sticks, difference
def verify(volume_letters_and_serial_without_usb_sticks, difference):
volume_letters_and_serial_with_usb_sticks = get_volume_serial_numbers()
difference2 = subtract_mappings(
volume_letters_and_serial_with_usb_sticks,
volume_letters_and_serial_without_usb_sticks,
)
if difference2:
for letter, serial in difference2.items():
if letter in difference:
if argon2.PasswordHasher().verify(difference[letter], serial):
print("YES")
else:
print("NO")
else:
print("NO")
else:
print("NO")
def main():
volume_letters_and_serial_without_usb_sticks, difference = configure()
while True:
print("Was möchtest du tun?")
while True:
try:
choice = int(
input(
"1 - Einstellungen setzen\n"
"2 - Einstellungen prüfen\n\n> "
)
)
break
except ValueError:
print("Fehler: Bitte eine ganze Zahl eingeben!")
if choice == 1:
(
volume_letters_and_serial_without_usb_sticks,
difference,
) = configure()
elif choice == 2:
verify(volume_letters_and_serial_without_usb_sticks, difference)
else:
print("Fehler: Ungültige Auswahl!")
if __name__ == "__main__":
main()