|
|
@@ -1,11 +1,12 @@
|
|
|
from django.conf import settings
|
|
|
+from django.contrib.auth import authenticate
|
|
|
from django.contrib.auth import get_user_model
|
|
|
from django.contrib.auth.models import Group
|
|
|
from django.contrib.contenttypes.models import ContentType
|
|
|
from drf_spectacular.utils import extend_schema_field
|
|
|
from drf_spectacular.types import OpenApiTypes
|
|
|
from rest_framework import serializers
|
|
|
-from rest_framework.exceptions import PermissionDenied
|
|
|
+from rest_framework.exceptions import AuthenticationFailed, PermissionDenied
|
|
|
|
|
|
from netbox.api.fields import ContentTypeField, IPNetworkSerializer, SerializedPKRelatedField
|
|
|
from netbox.api.serializers import ValidatedModelSerializer
|
|
|
@@ -107,9 +108,42 @@ class TokenSerializer(ValidatedModelSerializer):
|
|
|
return super().validate(data)
|
|
|
|
|
|
|
|
|
-class TokenProvisionSerializer(serializers.Serializer):
|
|
|
- username = serializers.CharField()
|
|
|
- password = serializers.CharField()
|
|
|
+class TokenProvisionSerializer(TokenSerializer):
|
|
|
+ user = NestedUserSerializer(
|
|
|
+ read_only=True
|
|
|
+ )
|
|
|
+ username = serializers.CharField(
|
|
|
+ write_only=True
|
|
|
+ )
|
|
|
+ password = serializers.CharField(
|
|
|
+ write_only=True
|
|
|
+ )
|
|
|
+ last_used = serializers.DateTimeField(
|
|
|
+ read_only=True
|
|
|
+ )
|
|
|
+ key = serializers.CharField(
|
|
|
+ read_only=True
|
|
|
+ )
|
|
|
+
|
|
|
+ class Meta:
|
|
|
+ model = Token
|
|
|
+ fields = (
|
|
|
+ 'id', 'url', 'display', 'user', 'created', 'expires', 'last_used', 'key', 'write_enabled', 'description',
|
|
|
+ 'allowed_ips', 'username', 'password',
|
|
|
+ )
|
|
|
+
|
|
|
+ def validate(self, data):
|
|
|
+ # Validate the username and password
|
|
|
+ username = data.pop('username')
|
|
|
+ password = data.pop('password')
|
|
|
+ user = authenticate(request=self.context.get('request'), username=username, password=password)
|
|
|
+ if user is None:
|
|
|
+ raise AuthenticationFailed("Invalid username/password")
|
|
|
+
|
|
|
+ # Inject the user into the validated data
|
|
|
+ data['user'] = user
|
|
|
+
|
|
|
+ return data
|
|
|
|
|
|
|
|
|
class ObjectPermissionSerializer(ValidatedModelSerializer):
|