54 lines
1.8 KiB
Python
54 lines
1.8 KiB
Python
|
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
|