Make a clear distinction between v1 and v2 API endpoints.

This commit is contained in:
Antoine Nguyen
2021-02-17 08:59:43 +01:00
parent d564aae5f3
commit 68fa66b772
23 changed files with 92 additions and 49 deletions
View File
View File
+23
View File
@@ -0,0 +1,23 @@
"""Core API serializers."""
from django.utils.translation import ugettext as _
from rest_framework import serializers
class CheckTFASetupSerializer(serializers.Serializer):
"""Serializer used to finalize 2FA setup."""
pin_code = serializers.CharField()
def validate_pin_code(self, value):
device = self.context["user"].totpdevice_set.first()
if not device.verify_token(value):
raise serializers.ValidationError(_("Invalid PIN code"))
return value
def validate(self, data):
user = self.context["user"]
if user.tfa_enabled or user.staticdevice_set.exists():
raise serializers.ValidationError(_("2FA is already enabled"))
return data
+11
View File
@@ -0,0 +1,11 @@
"""Core API urls."""
from rest_framework import routers
from . import viewsets
router = routers.SimpleRouter()
router.register(r"account", viewsets.AccountViewSet, basename="account")
urlpatterns = router.urls
@@ -9,9 +9,6 @@ from rest_framework import permissions, response, viewsets
from rest_framework.decorators import action
from drf_spectacular.utils import extend_schema
from modoboa.admin import serializers as admin_serializers
from . import models
from . import serializers
@@ -23,12 +20,6 @@ class AccountViewSet(viewsets.ViewSet):
permission_classes = (permissions.IsAuthenticated, )
@action(methods=["get"], detail=False)
def me(self, request):
"""Return information about connected user."""
serializer = admin_serializers.AccountSerializer(request.user)
return response.Response(serializer.data)
@action(methods=["post"], detail=False, url_path="tfa/setup")
def tfa_setup(self, request):
"""Initiate TFA setup."""
@@ -84,14 +75,3 @@ class AccountViewSet(viewsets.ViewSet):
return response.Response({
"tokens": device.token_set.all().values_list("token", flat=True)
})
class LogViewSet(viewsets.ReadOnlyModelViewSet):
"""Log viewset."""
permission_classes = (
permissions.IsAuthenticated,
permissions.DjangoModelPermissions,
)
queryset = models.Log.objects.all()
serializer_class = serializers.LogSerializer
View File
@@ -1,4 +1,4 @@
"""Core API serializers."""
"""Core API v2 serializers."""
from django.utils import formats
from django.utils.translation import ugettext_lazy, ugettext as _
@@ -9,8 +9,8 @@ from rest_framework import serializers
from modoboa.lib import fields as lib_fields
from . import constants
from . import models
from ... import constants
from ... import models
class CoreGlobalParametersSerializer(serializers.Serializer):
@@ -140,21 +140,3 @@ class LogSerializer(serializers.ModelSerializer):
def get_date_created(self, log) -> str:
return formats.date_format(log.date_created, "SHORT_DATETIME_FORMAT")
class CheckTFASetupSerializer(serializers.Serializer):
"""Serializer used to finalize 2FA setup."""
pin_code = serializers.CharField()
def validate_pin_code(self, value):
device = self.context["user"].totpdevice_set.first()
if not device.verify_token(value):
raise serializers.ValidationError(_("Invalid PIN code"))
return value
def validate(self, data):
user = self.context["user"]
if user.tfa_enabled or user.staticdevice_set.exists():
raise serializers.ValidationError(_("2FA is already enabled"))
return data
+31
View File
@@ -0,0 +1,31 @@
"""Core API v2 viewsets."""
from rest_framework import permissions, response, viewsets
from rest_framework.decorators import action
from modoboa.admin import serializers as admin_serializers
from modoboa.core.api.v1 import viewsets as core_v1_viewsets
from ... import models
from . import serializers
class AccountViewSet(core_v1_viewsets.AccountViewSet):
"""Account viewset."""
@action(methods=["get"], detail=False)
def me(self, request):
"""Return information about connected user."""
serializer = admin_serializers.AccountSerializer(request.user)
return response.Response(serializer.data)
class LogViewSet(viewsets.ReadOnlyModelViewSet):
"""Log viewset."""
permission_classes = (
permissions.IsAuthenticated,
permissions.DjangoModelPermissions,
)
queryset = models.Log.objects.all()
serializer_class = serializers.LogSerializer
+1 -1
View File
@@ -13,7 +13,7 @@ def load_core_settings():
"""
from modoboa.parameters import tools as param_tools
from . import app_settings
from . import serializers
from .api.v2 import serializers
param_tools.registry.add(
"global", app_settings.GeneralParametersForm, ugettext_lazy("General"))
View File
View File
@@ -4,7 +4,7 @@ from rest_framework import serializers
from modoboa.admin import models as admin_models
from . import models
from ... import models
class MXRecordSerializer(serializers.ModelSerializer):
View File
@@ -5,7 +5,7 @@ from rest_framework import response, viewsets
from rest_framework.decorators import action
from . import serializers
from . import tools
from ... import tools
class ParametersViewSet(viewsets.ViewSet):
+2 -2
View File
@@ -75,8 +75,8 @@ urlpatterns += [
name='docs-index-v2'),
path('api/schema-v2/redoc/',
SpectacularRedocView.as_view(url_name='schema-v2')),
path('api/v1/', include("modoboa.urls_api", namespace="v1")),
path('api/v2/', include("modoboa.urls_api", namespace="v2")),
path('api/v1/', include("modoboa.urls_api_v1", namespace="v1")),
path('api/v2/', include("modoboa.urls_api_v2", namespace="v2")),
]
if settings.DEBUG:
+16
View File
@@ -0,0 +1,16 @@
"""External API urls."""
from django.urls import include, path
from modoboa.core.extensions import exts_pool
app_name = "api"
urlpatterns = [
path('', include("modoboa.core.api.v1.urls")),
path('', include("modoboa.admin.urls_api")),
path('', include("modoboa.limits.urls_api")),
path('', include("modoboa.relaydomains.urls_api"))
]
urlpatterns += exts_pool.get_urls(category="api")
@@ -15,12 +15,12 @@ urlpatterns = [
path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('token/refresh/', TokenRefreshView.as_view(),
name='token_refresh'),
path('', include("modoboa.core.urls_api")),
path('', include("modoboa.core.api.v2.urls")),
path('', include("modoboa.admin.urls_api")),
path('', include("modoboa.parameters.urls_api")),
path('', include("modoboa.parameters.api.v2.urls")),
path('', include("modoboa.limits.urls_api")),
path('', include("modoboa.relaydomains.urls_api")),
path('', include("modoboa.dnstools.urls_api")),
path('', include("modoboa.dnstools.api.v2.urls")),
]
urlpatterns += exts_pool.get_urls(category="api")