Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create a user dashboard #49

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
135 changes: 135 additions & 0 deletions project/apps/identity_provider/utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
from datetime import datetime
from django.utils import timezone
from apps.identity_provider.settings import SHORT_APIKEY_EXPIRE
from apps.identity_provider.models import ApiKey, default_expiration_date
from apps.user_management.models import User

# Helper function for selecting a simple user
def select_user(request, user):
other_user = request.data.get("account_id", None)
if other_user:
founded_user = User.objects.filter(id=other_user)
if founded_user.exists():
user = founded_user.get()
return user

# Endpoints functionality
def apikey_list(user):
# A user cannot create a management key

# Find keys of a user with the scope resource
user_tokens = ApiKey.objects.filter(user=user).filter(scope='resource')

# Create a list with the resource keys of this user
token_list = [i.key for i in user_tokens]

data = token_list
return(data)

def create_apikey(request, user):
# A user cannot create a management key
scope = 'resource'
revoked = request.data.get('revoked', False)
expiry = request.data.get('expiry', default_expiration_date())

record = ApiKey.objects.create(user=user, scope=scope, revoked=revoked, expiry=expiry)

data = {
"username": str(user),
"token": record.key,
"id": record.id,
"created": "success",
}
return(data)

def key_status(resource_key, user):

resource_key_obj = ApiKey.objects.filter(user=user).filter(scope='resource').get(key=resource_key)

data = {
"username" : str(user),
"key": resource_key_obj.key,
"id": resource_key_obj.id,
"revoked": resource_key_obj.revoked,
"expiration date": resource_key_obj.expiry
}
return(data)

def key_revoke(resource_key, revoked, user):

resource_key_obj = ApiKey.objects.filter(user=user).filter(scope='resource').get(key=resource_key)

if revoked is None:
data = {
"message": "Please set a revoked value"}
return(data)
else:
# Set and save a new revoked value
resource_key_obj.revoked = revoked
resource_key_obj.save()

data = {
"username" : str(user),
"key": resource_key_obj.key,
"id": resource_key_obj.id,
"new revoked value": resource_key_obj.revoked,
}
return(data)

def key_renew(resource_key, expiry, user):

resource_key_obj = ApiKey.objects.filter(user=user).filter(scope='resource').get(key=resource_key)

if expiry is None:
# set the default expiration date and save it to the database
resource_key_obj.expiry = default_expiration_date()
resource_key_obj.save()

data = {
"username" : str(user),
"key": resource_key_obj.key,
"id": resource_key_obj.id,
"New expiration date": resource_key_obj.expiry,
}
return(data)
else:
# Convert date to datetime object with timezone
expiry_obj = datetime.strptime(expiry, "%Y-%m-%dT%H:%M:%S.%fZ").replace(tzinfo=timezone.utc)
# Set and save a new revoked value
resource_key_obj.expiry = expiry_obj
resource_key_obj.save()

data = {
"username" : str(user),
"key": resource_key_obj.key,
"id": resource_key_obj.id,
"New expiration date": resource_key_obj.expiry,
}
return(data)

def key_rotate(resource_key, short_expiry, user):

resource_key_obj = ApiKey.objects.filter(user=user).filter(scope='resource').get(key=resource_key)
extension = 0

# Set the revoked value of this key to True
resource_key_obj.revoked = True

if short_expiry=="True":
extension = 3
resource_key_obj.expiry = timezone.now() + SHORT_APIKEY_EXPIRE
resource_key_obj.save()
else:
resource_key_obj.save()

# Create a new resource key

record = ApiKey.objects.create(user=user, scope="resource", revoked=False)

data = {
"message": "The old key: {} with id: {} is revoked and extended for {} days".format(resource_key_obj.key, resource_key_obj.id, extension),
"username": str(user),
"new_key": record.key,
"id": record.id,
}
return(data)
181 changes: 25 additions & 156 deletions project/apps/identity_provider/views/token_management.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
from django.http.response import JsonResponse
from apps.identity_provider.models import ApiKey, default_expiration_date
from apps.user_management.models import User
from rest_framework.permissions import IsAuthenticated
from apps.identity_provider.authentication import DjamTokenAuthentication
from apps.identity_provider.permissions import APIKeyManagementResourceKeyVerification, ExpirationDateValidation
from rest_framework.viewsets import ViewSet
from rest_framework.decorators import action
from datetime import datetime
from django.utils import timezone
from apps.identity_provider.settings import SHORT_APIKEY_EXPIRE
from apps.identity_provider.utils import select_user, apikey_list, create_apikey, key_status, key_revoke, key_renew, key_rotate

from rest_framework import serializers
from drf_spectacular.utils import extend_schema, inline_serializer

Expand Down Expand Up @@ -45,12 +43,16 @@ def key_list(self, request):

user = request.user
if user.is_superuser:
user = self._select_user(request, user)
data = self._key_list(user)
user = select_user(request, user)
data = {
"tokens of {}".format(user): apikey_list(user),
}
status=200
return JsonResponse(data, status=status)
elif request.user.is_superuser == False:
data = self._key_list(user)
data = {
"tokens of {}".format(user): apikey_list(user),
}
status=200
return JsonResponse(data, status=status)
else:
Expand Down Expand Up @@ -81,12 +83,12 @@ def create_key(self, request):

user = request.user
if user.is_superuser:
user = self._select_user(request, user)
data = self._create_key(request, user)
user = select_user(request, user)
data = create_apikey(request, user)
status=200
return JsonResponse(data, status=status)
elif user.is_superuser == False:
data = self._create_key(request, user)
data = create_apikey(request, user)
status=200
return JsonResponse(data, status=status)
else:
Expand Down Expand Up @@ -118,12 +120,12 @@ def status(self, request):
resource_key = request.data.get('resource_key', None)

if user.is_superuser:
user = self._select_user(request, user)
data = self._key_status(resource_key, user)
user = select_user(request, user)
data = key_status(resource_key, user)
status=200
return JsonResponse(data, status=status)
elif user.is_superuser == False:
data = self._key_status(resource_key, user)
data = key_status(resource_key, user)
status=200
return JsonResponse(data, status=status)
else:
Expand Down Expand Up @@ -156,12 +158,12 @@ def revoke(self, request):
revoked = request.data.get('revoked', None)

if user.is_superuser:
user = self._select_user(request, user)
data = self._key_revoke(resource_key, revoked, user)
user = select_user(request, user)
data = key_revoke(resource_key, revoked, user)
status=200
return JsonResponse(data, status=status)
elif user.is_superuser == False:
data = self._key_revoke(resource_key, revoked, user)
data = key_revoke(resource_key, revoked, user)
status=200
return JsonResponse(data, status=status)
else:
Expand Down Expand Up @@ -196,12 +198,12 @@ def renew(self, request):
expiry = request.data.get('expiry', None)

if user.is_superuser:
user = self._select_user(request, user)
data = self._key_renew(resource_key, expiry, user)
user = select_user(request, user)
data = key_renew(resource_key, expiry, user)
status=200
return JsonResponse(data, status=status)
elif user.is_superuser == False:
data = self._key_renew(resource_key, expiry, user)
data = key_renew(resource_key, expiry, user)
status=200
return JsonResponse(data, status=status)
else:
Expand Down Expand Up @@ -238,148 +240,15 @@ def rotate(self, request):
short_expiry = request.data.get('short_expiry', None)

if user.is_superuser:
user = self._select_user(request, user)
data = self._key_rotate(resource_key, short_expiry, user)
user = select_user(request, user)
data = key_rotate(resource_key, short_expiry, user)
status=200
return JsonResponse(data, status=status)
elif user.is_superuser == False:
data = self._key_rotate(resource_key, short_expiry, user)
data = key_rotate(resource_key, short_expiry, user)
status=200
return JsonResponse(data, status=status)
else:
data = {}
status=403
return JsonResponse(data, status=status)


# Helper function for selecting a simple user
def _select_user(self, request, user):
other_user = request.data.get("account_id", None)
if other_user:
founded_user = User.objects.filter(id=other_user)
if founded_user.exists():
user = founded_user.get()
return user

# Endpoints functionality
def _key_list(self, user):
# A user cannot create a management key

# Find keys of a user with the scope resource
user_tokens = ApiKey.objects.filter(user=user).filter(scope='resource')

# Create a list with the resource keys of this user
token_list = [i.key for i in user_tokens]

data = {
"tokens of {}".format(user): token_list,
}
return(data)

def _create_key(self, request, user):
# A user cannot create a management key
scope = 'resource'
revoked = request.data.get('revoked', False)
expiry = request.data.get('expiry', default_expiration_date())

record = ApiKey.objects.create(user=user, scope=scope, revoked=revoked, expiry=expiry)

data = {
"username": str(user),
"token": record.key,
"id": record.id,
"created": "success",
}
return(data)

def _key_status(self, resource_key, user):

resource_key_obj = ApiKey.objects.filter(user=user).filter(scope='resource').get(key=resource_key)

data = {
"username" : str(user),
"key": resource_key_obj.key,
"id": resource_key_obj.id,
"revoked": resource_key_obj.revoked,
"expiration date": resource_key_obj.expiry
}
return(data)

def _key_revoke(self, resource_key, revoked, user):

resource_key_obj = ApiKey.objects.filter(user=user).filter(scope='resource').get(key=resource_key)

if revoked is None:
data = {
"message": "Please set a revoked value"}
return(data)
else:
# Set and save a new revoked value
resource_key_obj.revoked = revoked
resource_key_obj.save()

data = {
"username" : str(user),
"key": resource_key_obj.key,
"id": resource_key_obj.id,
"new revoked value": resource_key_obj.revoked,
}
return(data)

def _key_renew(self, resource_key, expiry, user):

resource_key_obj = ApiKey.objects.filter(user=user).filter(scope='resource').get(key=resource_key)

if expiry is None:
# set the default expiration date and save it to the database
resource_key_obj.expiry = default_expiration_date()
resource_key_obj.save()

data = {
"username" : str(user),
"key": resource_key_obj.key,
"id": resource_key_obj.id,
"New expiration date": resource_key_obj.expiry,
}
return(data)
else:
# Convert date to datetime object with timezone
expiry_obj = datetime.strptime(expiry, "%Y-%m-%dT%H:%M:%S.%fZ").replace(tzinfo=timezone.utc)
# Set and save a new revoked value
resource_key_obj.expiry = expiry_obj
resource_key_obj.save()

data = {
"username" : str(user),
"key": resource_key_obj.key,
"id": resource_key_obj.id,
"New expiration date": resource_key_obj.expiry,
}
return(data)

def _key_rotate(self, resource_key, short_expiry, user):

resource_key_obj = ApiKey.objects.filter(user=user).filter(scope='resource').get(key=resource_key)
extension = 0

# Set the revoked value of this key to True
resource_key_obj.revoked = True

if short_expiry=="True":
extension = 3
resource_key_obj.expiry = timezone.now() + SHORT_APIKEY_EXPIRE
resource_key_obj.save()
else:
resource_key_obj.save()

# Create a new resource key

record = ApiKey.objects.create(user=user, scope="resource", revoked=False)

data = {
"message": "The old key: {} with id: {} is revoked and extended for {} days".format(resource_key_obj.key, resource_key_obj.id, extension),
"username": str(user),
"new_key": record.key,
"id": record.id,
}
return(data)
return JsonResponse(data, status=status)
Loading