rest interface for retrieve-create users seed
This commit is contained in:
parent
503e31cc69
commit
200699486a
2 changed files with 47 additions and 1 deletions
|
@ -14,7 +14,8 @@ from .views import (
|
|||
LogOut,
|
||||
ResetRequest,
|
||||
UserCreateAPI,
|
||||
ActivateAccount
|
||||
ActivateAccount,
|
||||
SeedRetrieveCreate
|
||||
)
|
||||
|
||||
urlpatterns = [
|
||||
|
@ -29,5 +30,6 @@ urlpatterns = [
|
|||
path('reset/<str:user>/<str:token>/', ResetRequest.as_view()),
|
||||
path('activate/<str:user>/<str:pwd>/<str:firstname>/<str:lastname>/<str:email>/<str:token>/', ActivateAccount.as_view()),
|
||||
path('reset/', ResetRequest.as_view(), name="reset"),
|
||||
path('otp/', SeedRetrieveCreate.as_view(), name="seed"),
|
||||
path('', Index.as_view(), name="login_index"),
|
||||
]
|
44
dal/views.py
44
dal/views.py
|
@ -14,6 +14,8 @@ from rest_framework.response import Response
|
|||
from .models import ResetToken
|
||||
from .forms import LoginForm
|
||||
from .ungleich_ldap import LdapManager
|
||||
from decouple import config, Csv
|
||||
from pyotp import TOTP
|
||||
|
||||
import logging
|
||||
|
||||
|
@ -26,6 +28,8 @@ from datetime import datetime
|
|||
|
||||
from random import choice, randint
|
||||
import string
|
||||
import requests
|
||||
import json
|
||||
|
||||
from django.conf import settings
|
||||
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||
|
@ -606,3 +610,43 @@ class UserCreateAPI(APIView):
|
|||
except:
|
||||
return Response('Failed to send the email', 201)
|
||||
return Response('Email with activation link successfully sent', 200)
|
||||
|
||||
|
||||
class SeedRetrieveCreate(APIView):
|
||||
def post(self, request):
|
||||
try:
|
||||
username = request.data['username']
|
||||
password = request.data['password']
|
||||
realm = request.data['realm']
|
||||
except KeyError:
|
||||
return Response('You need to specify username, password, and realm values', 400)
|
||||
# authenticate the user against ldap
|
||||
user = authenticate(username=username, password=password)
|
||||
if user is not None:
|
||||
req = requests.get(config('OTPSERVER'), data=json.dumps(
|
||||
{
|
||||
'auth_token': TOTP(config('ADMIN_SEED')).now,
|
||||
'auth_name': config('ADMIN_NAME'),
|
||||
'auth_realm': 'ungleich-admin'}), headers={'Content-Type': 'application/json'})
|
||||
response_data = json.loads(req)
|
||||
for elem in response_data:
|
||||
if elem['name'] == username and elem['realm'] == realm:
|
||||
return Response('Your {} seed is {}'.format(realm, elem['seed']), 200)
|
||||
# If doesn't find a match then check if the realm is allowed and create the user
|
||||
allowed_realms = config('ALLOWED_REALMS', cast=Csv())
|
||||
if realm not in allowed_realms:
|
||||
return Response('Not allowed to perform this action.', 403)
|
||||
else:
|
||||
req = requests.post(config('OTPSERVER'), data=json.dumps(
|
||||
{
|
||||
'auth_token': TOTP(config('ADMIN_SEED')).now,
|
||||
'auth_name': config('ADMIN_NAME'),
|
||||
'auth_realm': 'ungleich-admin',
|
||||
'name': username,
|
||||
'realm': realm
|
||||
}), headers={'Content-Type': 'application/json'})
|
||||
if req.status_code == 201:
|
||||
msg = json.loads(req.text)
|
||||
return Response(msg, 201)
|
||||
else:
|
||||
return Response(json.loads(req.text))
|
||||
|
|
Loading…
Reference in a new issue