def change_user(user: UserAuthenticationObject, username: str = None, first_name: str = None, last_name: str = None, password: str = None, email: str = None): userobj = get_user(user) utils.check_user_parameters( username, first_name, last_name, password, email) id = str(userobj.get("id")) if len(exec_sql(f"SELECT * FROM users WHERE id={id}")) != 1: raise UserDoesNotExist(f"User with id {id} not found") if username != None: try: exec_sql( f"UPDATE users SET username='******' WHERE id={id};") # transferring tasks mapped to old username to new one tasks = get_all_tasks(user) for task in tasks: change_task(user, task.get("id"), new_user=username) except IntegrityError: raise UserAlreadyExists(f"'{username}' already exists") if first_name != None: exec_sql( f"UPDATE users SET firstName='{first_name}' WHERE id={id};") if last_name != None: exec_sql(f"UPDATE users SET lastName='{last_name}' WHERE id={id};") if password != None: new_hash = sha3_512( bytes(password + utils.get_salt(), "utf-8")).hexdigest() exec_sql( f"UPDATE users SET hash='{new_hash}' WHERE id={id};") if email != None: exec_sql(f"UPDATE users SET email='{email}' WHERE id={id};") mailservice.register(username if username != None else userobj.get("username"), email, first_name if first_name != None else userobj.get("firstName"), last_name if last_name != None else userobj.get("lastName"), userobj.get("djoined"), verification=True) exec_sql(f"UPDATE users SET verified=0 WHERE email='{email}';") logger.debug(f"changed user with (previous) username {user.username}")
def create_user(username: str, first_name: str, last_name: str, password: str, email: str, verbose=False): """Create user in database Note: This handles hashing the password """ try: utils.check_user_parameters( username, first_name, last_name, password, email) salt = utils.get_salt() hash = sha3_512(bytes(password + salt, "utf-8")).hexdigest() dn = datetime.datetime.now().isoformat(timespec='seconds') uao = None if verbose: logger.debug("\nCreating user:"******"username": username, "first name": first_name, "last name": last_name, "email": email, "joined": dn, "verified": False}, logger=logger) else: logger.debug(f"Creating user: {username}") try: result = exec_sql( f"INSERT INTO users (username, firstName, lastName, hash, salt, email, joined, verified) VALUES ('{username}', '{first_name}', '{last_name}', '{hash}', '{salt}', '{email}', '{dn}', '0')", verbose=True) not_verify = mailservice.register(username, email, first_name, last_name, dn, logger) # Registration skipped (config.json: skip-email-verification) if not not_verify: exec_sql( f"UPDATE users SET verified=1 WHERE username='******'", True) except IntegrityError as e: print(e) s = str(e) if "username" in s: raise UserAlreadyExists(f"{username} already exists") elif "email" in s: raise EmailAlreadyLinked( f"Email '{email}' is already linked to another account") except Exception as e: logger.handle_exception(e) raise e
def test_check_user_parameters_invalid_email_2(): with pytest.raises(InvalidParameterError): check_user_parameters(email="@gmail.com")
def test_check_user_parameters_invalid_email_3(): with pytest.raises(InvalidParameterError): check_user_parameters(email="notmymail.tech")
def test_check_user_parameters_password_too_short(): with pytest.raises(InvalidParameterError): check_user_parameters(password="******")
def test_check_user_parameters_invalid_email(): with pytest.raises(InvalidParameterError): check_user_parameters(email="[email protected]")
def test_check_user_parameters_invalid_last_name(): with pytest.raises(InvalidParameterError): check_user_parameters(last_name="Interstell*r")
def test_check_user_parameters_invalid_password(): with pytest.raises(InvalidParameterError): check_user_parameters(password="******")
def test_check_user_parameters_invalid_first_name(): with pytest.raises(InvalidParameterError): check_user_parameters(first_name="Wolfr'ms")
def test_check_user_parameters_username_too_short(): with pytest.raises(InvalidParameterError): check_user_parameters(username="******")
def test_check_user_parameters_invalid_username(): with pytest.raises(InvalidParameterError): check_user_parameters(username="******")
def test_check_user_parameters_2(): assert check_user_parameters(password="******"§$%&/(){}=?ß´`°^\\\/")
def test_check_user_parameters(): assert check_user_parameters("mithem", "Wolfram", "Einstein", "Hello123", "*****@*****.**")