mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-17 05:41:25 +02:00
Make a clear distinction between v1 and v2 API endpoints.
This commit is contained in:
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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"))
|
||||
|
||||
@@ -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):
|
||||
@@ -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
@@ -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:
|
||||
|
||||
@@ -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")
|
||||
Reference in New Issue
Block a user