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,
 | 
					    LogOut,
 | 
				
			||||||
    ResetRequest,
 | 
					    ResetRequest,
 | 
				
			||||||
    UserCreateAPI,
 | 
					    UserCreateAPI,
 | 
				
			||||||
    ActivateAccount
 | 
					    ActivateAccount,
 | 
				
			||||||
 | 
					    SeedRetrieveCreate
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
urlpatterns = [
 | 
					urlpatterns = [
 | 
				
			||||||
| 
						 | 
					@ -29,5 +30,6 @@ urlpatterns = [
 | 
				
			||||||
    path('reset/<str:user>/<str:token>/', ResetRequest.as_view()),
 | 
					    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('activate/<str:user>/<str:pwd>/<str:firstname>/<str:lastname>/<str:email>/<str:token>/', ActivateAccount.as_view()),
 | 
				
			||||||
    path('reset/', ResetRequest.as_view(), name="reset"),
 | 
					    path('reset/', ResetRequest.as_view(), name="reset"),
 | 
				
			||||||
 | 
					    path('otp/', SeedRetrieveCreate.as_view(), name="seed"),
 | 
				
			||||||
    path('', Index.as_view(), name="login_index"),
 | 
					    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 .models import ResetToken
 | 
				
			||||||
from .forms import LoginForm
 | 
					from .forms import LoginForm
 | 
				
			||||||
from .ungleich_ldap import LdapManager
 | 
					from .ungleich_ldap import LdapManager
 | 
				
			||||||
 | 
					from decouple import config, Csv
 | 
				
			||||||
 | 
					from pyotp import TOTP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import logging
 | 
					import logging
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,6 +28,8 @@ from datetime import datetime
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from random import choice, randint
 | 
					from random import choice, randint
 | 
				
			||||||
import string
 | 
					import string
 | 
				
			||||||
 | 
					import requests
 | 
				
			||||||
 | 
					import json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from django.conf import settings
 | 
					from django.conf import settings
 | 
				
			||||||
from django.contrib.auth.mixins import LoginRequiredMixin
 | 
					from django.contrib.auth.mixins import LoginRequiredMixin
 | 
				
			||||||
| 
						 | 
					@ -606,3 +610,43 @@ class UserCreateAPI(APIView):
 | 
				
			||||||
        except:
 | 
					        except:
 | 
				
			||||||
            return Response('Failed to send the email', 201)
 | 
					            return Response('Failed to send the email', 201)
 | 
				
			||||||
        return Response('Email with activation link successfully sent', 200)
 | 
					        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…
	
	Add table
		Add a link
		
	
		Reference in a new issue