From 77a31a44d1a24857a6718ad4cc9b2481ff19f102 Mon Sep 17 00:00:00 2001 From: Darksider3 Date: Thu, 17 Oct 2019 14:42:13 +0200 Subject: [PATCH] Abort on errors in import file before even trying to activate Moves every check regarding the imported file outside of import.py into the validator. Also removes every follow-up checks regarding it out of import.py. Looks a whole lot cleaner now! --- private/Import.py | 31 +++++-------------------------- private/lib/validator.py | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 26 deletions(-) diff --git a/private/Import.py b/private/Import.py index dcf6390..c44a31a 100644 --- a/private/Import.py +++ b/private/Import.py @@ -2,7 +2,6 @@ import lib.CFG as CFG import csv import os import lib.UserExceptions -import lib.validator def ImportFromFile(fname: str = CFG.args.file, db: str = CFG.REG_FILE, userids: tuple = tuple([])): @@ -17,33 +16,17 @@ def ImportFromFile(fname: str = CFG.args.file, db: str = CFG.REG_FILE, userids: # noinspection PyBroadException try: with open(fname, 'r', newline='') as f: + import lib.validator + err = lib.validator.checkImportFile(f) + if err is not True: + print(err) + exit(0) import lib.sqlitedb import lib.System sysctl = lib.System.System() sql = lib.sqlitedb.SQLitedb(CFG.REG_FILE) reader = csv.DictReader(f) # @TODO csv.Sniffer to compare? When yes, give force-accept option for row in reader: - db_insert = False - # if any of this fails move on to the next user, just print a relatively helpful message lel - if not lib.validator.checkUsernameCharacters(row["username"]): - print(f"The username contains unsupported characters or starts with a number: " - f"{row['username']}. Skipping.") - continue - if not lib.validator.checkUsernameLength(row["username"]): - print(f"The username {row['username']} is either too long(>16) or short(<3). Skipping.") - continue - if not lib.validator.checkSSHKey(row["pubkey"]): - print(f"Following SSH-Key isn't valid: {row['pubkey']}. Skipping.") - continue - if not lib.validator.checkEmail(row["email"]): - print(f"The E-Mail address {row['email']} is not valid. Skipping") - continue - if not lib.validator.checkUserExists(row["username"]): - print(f"The user '{row['username']}' already exists. Skipping.") - continue - if not lib.validator.checkDatetimeFormat(row["timestamp"]): - print(f"The timestamp '{row['timestamp']}' from user '{row['username']}' is invalid. Skipping.") - continue if row["status"] == "1": try: sysctl.register(row["username"]) @@ -63,13 +46,9 @@ def ImportFromFile(fname: str = CFG.args.file, db: str = CFG.REG_FILE, userids: except Exception as E: # @TODO well less broad is hard to achieve Kappa print(E) continue - db_insert = True elif row["status"] == "0": print(row['username'] + " not approved, therefore not registered.") - db_insert = True try: - if not db_insert: - continue sql.safequery( "INSERT INTO `applications` (username, name, timestamp, email, pubkey, status) " "VALUES (?,?,?,?,?,?)", tuple([row["username"], row["name"], row["timestamp"], diff --git a/private/lib/validator.py b/private/lib/validator.py index 92492c4..e476bbb 100644 --- a/private/lib/validator.py +++ b/private/lib/validator.py @@ -76,3 +76,39 @@ def checkDatetimeFormat(form: str): except ValueError: return False return True + + +def checkImportFile(f): + import csv + reador = csv.DictReader(f) + error_list = str() + valid = True + ln = 1 # line number + + for row in reador: + # if any of this fails move on to the next user, just print a relatively helpful message lel + if not lib.validator.checkUsernameCharacters(row["username"]): + error_list += (f"Line {ln}: The username contains unsupported characters or starts with a number: '" + f"{row['username']}'.\n") + valid = False + if not lib.validator.checkUsernameLength(row["username"]): + error_list += f"Line {ln}: The username '{row['username']}' is either too long(>16) or short(<3)\n" + valid = False + if not lib.validator.checkSSHKey(row["pubkey"]): + error_list += f"Line {ln}: Following SSH-Key from user '{row['username']}' isn't valid: '{row['pubkey']}'."\ + f"\n" + valid = False + if not lib.validator.checkEmail(row["email"]): + error_list += f"Line {ln}: The E-Mail address of user '{row['username']}' '{row['email']}' is not valid.\n" + valid = False + if not lib.validator.checkUserExists(row["username"]): + error_list += f"Line {ln}: The user '{row['username']}' already exists.\n" + valid = False + if not lib.validator.checkDatetimeFormat(row["timestamp"]): + error_list += f"Line {ln}: The timestamp '{row['timestamp']}' from user '{row['username']}' is invalid.\n" + valid = False + ln += 1 + if valid: + return True + else: + return error_list