auth.py: Make usage of exceptions instead of if-else-blocks #5

Closed
frlan wants to merge 1 commits from auth-with-exceptions into main

View File

@ -5,28 +5,41 @@ from app import app, db
from ki.models import User, Token
class UserWrongCredentialsException(Exception):
pass
class UserAllreadyLoggedInException(Exception):
pass
def auth(username, password):
auth_file_path = app.config["KI_DATA_DIR"] + "/auth.yml"
with open(auth_file_path, "r") as auth_file_stream:
users = yaml.safe_load(auth_file_stream)
if username not in users:
try:
users = yaml.safe_load(auth_file_stream)
except yaml.YAMLError:
print('Could not parse auth.yml.')
weeman marked this conversation as resolved
Review

Hier würde ich dann eine 500er Antwort zurückgeben.

Hier würde ich dann eine 500er Antwort zurückgeben.
Review

Ich habe das jetzt mal versucht -- aber das ist nicht so richtig schön zu machen, wenn man nicht den kompletten Code in die routes.py verlegen will oder Datenstrutkturen von links nach rechts kopieren mag. Ich würde das mal rauslassen bis LDAP eingebaut wird. Für dev sollte das vollkommen ok sein.

Ich habe das jetzt mal versucht -- aber das ist nicht so richtig schön zu machen, wenn man nicht den kompletten Code in die routes.py verlegen will oder Datenstrutkturen von links nach rechts kopieren mag. Ich würde das mal rauslassen bis LDAP eingebaut wird. Für dev sollte das vollkommen ok sein.
Review

Ich hab da ne Idee. Mach ich später

Ich hab da ne Idee. Mach ich später
try:
auth_user = users[username]
weeman marked this conversation as resolved
Review

Die Prüfung, ob der Benutzer existiert ist verschwunden oder übersehe ich was?

Die Prüfung, ob der Benutzer existiert ist verschwunden oder übersehe ich was?
Review

Ja, das ist richtig. Das wirft einen KeyError.

Ja, das ist richtig. Das wirft einen KeyError.
if auth_user["password"] != password:
raise UserWrongCredentialsException
except (UserWrongCredentialsException, KeyError):
print('Wrong username/password combination')
Review

Ich bau die Tage mal logging ein.

Was passiert bei der API mit print? Sehe ich das dann in der Antwort? Weil es sollte irgend ein geregeltes JSON zurückkommen.

Ich bau die Tage mal `logging` ein. Was passiert bei der API mit `print`? Sehe ich das dann in der Antwort? Weil es sollte irgend ein geregeltes JSON zurückkommen.
Review

Siehe #7 für Ausgaben.

Siehe #7 für Ausgaben.
return None
auth_user = users[username]
else:
user = User.query.filter(User.auth_id.__eq__(username)).first()
if auth_user["password"] != password:
return None
token = Token(token=str(uuid.uuid4()), user=user)
user = User.query.filter(User.auth_id.__eq__(username)).first()
db.session.add(token)
db.session.commit()
if user is None:
user = User(auth_id=username)
db.session.add(user)
token = Token(token=str(uuid.uuid4()), user=user)
db.session.add(token)
db.session.commit()
return token
return token