From 0aadb4b034c502c2cb4d7231ce4753724cfd13d9 Mon Sep 17 00:00:00 2001 From: Timur Demin Date: Wed, 12 Jun 2019 21:07:45 +0500 Subject: [PATCH] Make logging better --- project_amber/errors.py | 16 +++++++++++++--- project_amber/helpers/auth.py | 10 +++++++++- project_amber/logging.py | 24 ++++++++++++++++-------- 3 files changed, 38 insertions(+), 12 deletions(-) diff --git a/project_amber/errors.py b/project_amber/errors.py index f6043f8..c5918d2 100644 --- a/project_amber/errors.py +++ b/project_amber/errors.py @@ -1,6 +1,6 @@ from http import HTTPStatus -from project_amber.logging import logError +from project_amber.logging import warn, error class HTTPError(Exception): """ @@ -14,7 +14,7 @@ def __init__(self, code: int, message: str): """ self.code = code self.message = message - logError(self.message) + warn(self.message) super(HTTPError, self).__init__() class BadRequest(HTTPError): @@ -30,8 +30,9 @@ class InternalServerError(HTTPError): Exception class for DB errors. Probably going to be left unused. """ code = HTTPStatus.INTERNAL_SERVER_ERROR + ## pylint: disable=super-init-not-called def __init__(self, message="Internal error"): - super().__init__(self.code, message) + error(message) class NotFound(HTTPError): """ @@ -56,3 +57,12 @@ class Unauthorized(HTTPError): code = HTTPStatus.UNAUTHORIZED def __init__(self, message="Unauthorized"): super().__init__(self.code, message) + +class Conflict(HTTPError): + """ + Essentially reverse for HTTP 404: HTTP 409 Conflict. To be used on "entity + already exists" situations. + """ + code = HTTPStatus.CONFLICT + def __init__(self, message="This entity already exists"): + super().__init__(self.code, message) diff --git a/project_amber/helpers/auth.py b/project_amber/helpers/auth.py index ded98eb..989e139 100644 --- a/project_amber/helpers/auth.py +++ b/project_amber/helpers/auth.py @@ -7,7 +7,9 @@ from project_amber.const import MSG_NO_TOKEN, MSG_INVALID_TOKEN, MSG_USER_NOT_FOUND from project_amber.db import db -from project_amber.errors import Unauthorized, BadRequest, NotFound, InternalServerError +from project_amber.errors import Unauthorized, BadRequest, NotFound, \ + InternalServerError, Conflict +from project_amber.logging import log from project_amber.models.auth import User, Session class LoginUser: @@ -49,9 +51,13 @@ def addUser(name: str, password: str) -> int: """ Creates a new user. Returns their ID on success. """ + # does a user with this name already exist? + if not db.session.query(User).filter_by(name=name).one_or_none() is None: + raise Conflict("The user with this name already exists") prehashed_pw = b64encode(sha256(password.encode("utf8")).digest()) hashed_pw = hashpw(prehashed_pw, gensalt()) user = User(name=name, password=hashed_pw) + log("Adding user %s..." % name) db.session.add(user) db.session.commit() return user.id @@ -63,6 +69,7 @@ def removeUser(uid: int) -> int: user = db.session.query(User).filter_by(id=uid).one_or_none() if user is None: raise NotFound(MSG_USER_NOT_FOUND) + log("Removing user %s..." % user.name) db.session.delete(user) db.session.commit() return uid @@ -87,6 +94,7 @@ def createSession(name: str, password: str) -> str: if verifyPassword(user.id, password): token = sha256(gensalt() + bytes(str(time()).encode())).hexdigest() session = Session(token=token, user=user.id, login_time=time()) + log("User %s logged in" % user.name) db.session.add(session) db.session.commit() return token diff --git a/project_amber/logging.py b/project_amber/logging.py index 6080936..d87d61c 100644 --- a/project_amber/logging.py +++ b/project_amber/logging.py @@ -2,20 +2,28 @@ from project_amber.config import config -logging.basicConfig(level=logging.INFO) -logger = logging.getLogger("sjbackend") +level = logging.INFO +if config["loglevel"] == 0: level = logging.ERROR +if config["loglevel"] == 1: level = logging.WARN + +logging.basicConfig(level=level) +logger = logging.getLogger("amber_backend") def log(message): """ Wrapper for the logger calls. Only intended to be used in DB code. + Corresponds to loglevel 2. + """ + logger.info(message) + +def warn(message): + """ + Wrapper for the logger calls. Corresponds to loglevel 1. """ - # This wrapper only logs things in case of loglevel being set to 2 - # (log requests). - if config["loglevel"] == 2: - logger.info(message) + logger.warning(message) -def logError(message): +def error(message): """ - Wrapper for the error messages. + Wrapper for the error messages. Loglevel 0. """ logger.error(message)