academon/core/backends/reportmonster.py

54 lines
1.8 KiB
Python
Raw Normal View History

2022-08-08 09:43:31 +00:00
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth import get_user_model
from django.contrib import messages
from django.conf import settings
from bcrypt import checkpw
import asyncio
from reportmonster_client import ReportMonsterClient
class ReportMonsterBackend(ModelBackend):
async def _fetch_data(self, username: str):
try:
client = ReportMonsterClient(
settings.REPORTMONSTER["Username"],
settings.REPORTMONSTER["Password"],
settings.REPORTMONSTER.get("Host", fallback="127.0.0.1"),
settings.REPORTMONSTER.getint("Port", fallback=6789))
try:
await client.connect()
except Exception as e:
raise Exception("Something went wrong connecting to ReportMonster: " + repr(e))
authresult = await client.auth()
if authresult.error:
raise Exception("Something went wrong authenticating with ReportMonster: " + response._raw)
response = await client.write(f"user {settings.REPORTMONSTER['Vessel']} {username}")
if response.error:
raise Exception("Something went wrong fetching user details: " + response._raw)
return response
except Exception as e:
messages.error(self.request, "Could not login. " + repr(e))
def authenticate(self, request, username: str = None, password:str = None):
self.request = request
userdata = asyncio.run(asyncio.wait_for(self._fetch_data(username), 10))
if not userdata or not userdata.content:
return
if checkpw(password.encode(), userdata.content["password"].encode()):
user, _ = get_user_model().objects.get_or_create(email=username)
user.save()
return user