OpenDroneMap-WebODM/app/auth/backends.py

88 wiersze
2.9 KiB
Python

2023-08-21 15:43:50 +00:00
import requests
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User
from nodeodm.models import ProcessingNode
2023-09-11 15:53:10 +00:00
from webodm import settings
2023-08-21 15:43:50 +00:00
from guardian.shortcuts import assign_perm
import logging
logger = logging.getLogger('app.logger')
2023-09-08 16:28:13 +00:00
def get_user_from_external_auth_response(res):
if 'message' in res or 'error' in res:
return None
if 'user_id' in res and 'username' in res:
try:
user = User.objects.get(pk=res['user_id'])
2023-09-11 15:53:10 +00:00
except User.DoesNotExist:
user = User(pk=res['user_id'], username=res['username'])
user.save()
2023-09-08 16:28:13 +00:00
2023-09-11 15:53:10 +00:00
# Update user info
if user.username != res['username']:
user.username = res['username']
user.save()
maxQuota = -1
if 'maxQuota' in res:
maxQuota = res['maxQuota']
if 'node' in res and 'limits' in res['node'] and 'maxQuota' in res['node']['limits']:
maxQuota = res['node']['limits']['maxQuota']
2023-09-08 16:28:13 +00:00
2023-09-11 15:53:10 +00:00
# Update quotas
if user.profile.quota != maxQuota:
user.profile.quota = maxQuota
2023-09-08 16:28:13 +00:00
user.save()
# Setup/update processing node
2023-09-11 15:53:10 +00:00
if 'node' in res and 'hostname' in res['node'] and 'port' in res['node']:
2023-09-08 16:28:13 +00:00
hostname = res['node']['hostname']
port = res['node']['port']
2023-09-11 15:53:10 +00:00
token = res['node'].get('token', '')
2023-09-08 16:28:13 +00:00
2023-09-11 15:53:10 +00:00
# Only add/update if a token is provided, since we use
# tokens as unique identifiers for hostname/port updates
if token != "":
try:
node = ProcessingNode.objects.get(token=token)
if node.hostname != hostname or node.port != port:
node.hostname = hostname
node.port = port
node.save()
except ProcessingNode.DoesNotExist:
node = ProcessingNode(hostname=hostname, port=port, token=token)
2023-09-08 16:28:13 +00:00
node.save()
2023-09-11 15:53:10 +00:00
if not user.has_perm('view_processingnode', node):
assign_perm('view_processingnode', user, node)
2023-09-08 16:28:13 +00:00
return user
else:
return None
2023-08-21 15:43:50 +00:00
class ExternalBackend(ModelBackend):
def authenticate(self, request, username=None, password=None):
2023-09-11 15:53:10 +00:00
if settings.EXTERNAL_AUTH_ENDPOINT == "":
2023-08-21 15:43:50 +00:00
return None
try:
2023-09-11 15:53:10 +00:00
r = requests.post(settings.EXTERNAL_AUTH_ENDPOINT, {
2023-08-21 15:43:50 +00:00
'username': username,
'password': password
}, headers={'Accept': 'application/json'})
res = r.json()
2023-09-08 16:28:13 +00:00
return get_user_from_external_auth_response(res)
2023-08-21 15:43:50 +00:00
except:
return None
def get_user(self, user_id):
2023-09-11 15:53:10 +00:00
if settings.EXTERNAL_AUTH_ENDPOINT == "":
2023-08-21 15:43:50 +00:00
return None
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None