*: replace shortcuts.reverse with urls.reverse

This commit is contained in:
Jens Langhammer 2021-02-20 18:58:50 +01:00
parent a1a3d316e3
commit bdb86d7119
58 changed files with 114 additions and 96 deletions

View file

@ -1,8 +1,8 @@
"""test admin api""" """test admin api"""
from json import loads from json import loads
from django.shortcuts import reverse
from django.test import TestCase from django.test import TestCase
from django.urls import reverse
from authentik import __version__ from authentik import __version__
from authentik.core.models import Group, User from authentik.core.models import Group, User

View file

@ -3,8 +3,8 @@ from importlib import import_module
from typing import Callable from typing import Callable
from django.forms import ModelForm from django.forms import ModelForm
from django.shortcuts import reverse
from django.test import Client, TestCase from django.test import Client, TestCase
from django.urls import reverse
from django.urls.exceptions import NoReverseMatch from django.urls.exceptions import NoReverseMatch
from authentik.admin.urls import urlpatterns from authentik.admin.urls import urlpatterns

View file

@ -5,6 +5,7 @@ from django.contrib.auth.mixins import (
) )
from django.contrib.messages.views import SuccessMessageMixin from django.contrib.messages.views import SuccessMessageMixin
from django.http.response import HttpResponse from django.http.response import HttpResponse
from django.urls import reverse_lazy
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from django.views.generic import UpdateView from django.views.generic import UpdateView
from django.views.generic.edit import FormView from django.views.generic.edit import FormView
@ -33,7 +34,7 @@ class CertificateKeyPairCreateView(
permission_required = "authentik_crypto.add_certificatekeypair" permission_required = "authentik_crypto.add_certificatekeypair"
template_name = "generic/create.html" template_name = "generic/create.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully created Certificate-Key Pair") success_message = _("Successfully created Certificate-Key Pair")
@ -50,7 +51,7 @@ class CertificateKeyPairGenerateView(
permission_required = "authentik_crypto.add_certificatekeypair" permission_required = "authentik_crypto.add_certificatekeypair"
template_name = "administration/certificatekeypair/generate.html" template_name = "administration/certificatekeypair/generate.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully generated Certificate-Key Pair") success_message = _("Successfully generated Certificate-Key Pair")
def form_valid(self, form: CertificateKeyPairGenerateForm) -> HttpResponse: def form_valid(self, form: CertificateKeyPairGenerateForm) -> HttpResponse:
@ -77,7 +78,7 @@ class CertificateKeyPairUpdateView(
permission_required = "authentik_crypto.change_certificatekeypair" permission_required = "authentik_crypto.change_certificatekeypair"
template_name = "generic/update.html" template_name = "generic/update.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully updated Certificate-Key Pair") success_message = _("Successfully updated Certificate-Key Pair")
@ -90,5 +91,5 @@ class CertificateKeyPairDeleteView(
permission_required = "authentik_crypto.delete_certificatekeypair" permission_required = "authentik_crypto.delete_certificatekeypair"
template_name = "generic/delete.html" template_name = "generic/delete.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully deleted Certificate-Key Pair") success_message = _("Successfully deleted Certificate-Key Pair")

View file

@ -6,6 +6,7 @@ from django.contrib.auth.mixins import (
) )
from django.contrib.messages.views import SuccessMessageMixin from django.contrib.messages.views import SuccessMessageMixin
from django.http import HttpRequest, HttpResponse, JsonResponse from django.http import HttpRequest, HttpResponse, JsonResponse
from django.urls import reverse_lazy
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from django.views.generic import DetailView, FormView, UpdateView from django.views.generic import DetailView, FormView, UpdateView
from guardian.mixins import PermissionRequiredMixin from guardian.mixins import PermissionRequiredMixin
@ -36,7 +37,7 @@ class FlowCreateView(
permission_required = "authentik_flows.add_flow" permission_required = "authentik_flows.add_flow"
template_name = "generic/create.html" template_name = "generic/create.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully created Flow") success_message = _("Successfully created Flow")
@ -53,7 +54,7 @@ class FlowUpdateView(
permission_required = "authentik_flows.change_flow" permission_required = "authentik_flows.change_flow"
template_name = "generic/update.html" template_name = "generic/update.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully updated Flow") success_message = _("Successfully updated Flow")
@ -64,7 +65,7 @@ class FlowDeleteView(LoginRequiredMixin, PermissionRequiredMixin, DeleteMessageV
permission_required = "authentik_flows.delete_flow" permission_required = "authentik_flows.delete_flow"
template_name = "generic/delete.html" template_name = "generic/delete.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully deleted Flow") success_message = _("Successfully deleted Flow")
@ -104,7 +105,7 @@ class FlowImportView(LoginRequiredMixin, FormView):
form_class = FlowImportForm form_class = FlowImportForm
template_name = "administration/flow/import.html" template_name = "administration/flow/import.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
if not request.user.is_superuser: if not request.user.is_superuser:

View file

@ -4,6 +4,7 @@ from django.contrib.auth.mixins import (
PermissionRequiredMixin as DjangoPermissionRequiredMixin, PermissionRequiredMixin as DjangoPermissionRequiredMixin,
) )
from django.contrib.messages.views import SuccessMessageMixin from django.contrib.messages.views import SuccessMessageMixin
from django.urls import reverse_lazy
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from django.views.generic import UpdateView from django.views.generic import UpdateView
from guardian.mixins import PermissionRequiredMixin from guardian.mixins import PermissionRequiredMixin
@ -27,7 +28,7 @@ class GroupCreateView(
permission_required = "authentik_core.add_group" permission_required = "authentik_core.add_group"
template_name = "generic/create.html" template_name = "generic/create.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully created Group") success_message = _("Successfully created Group")
@ -44,7 +45,7 @@ class GroupUpdateView(
permission_required = "authentik_core.change_group" permission_required = "authentik_core.change_group"
template_name = "generic/update.html" template_name = "generic/update.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully updated Group") success_message = _("Successfully updated Group")
@ -55,5 +56,5 @@ class GroupDeleteView(LoginRequiredMixin, PermissionRequiredMixin, DeleteMessage
permission_required = "authentik_flows.delete_group" permission_required = "authentik_flows.delete_group"
template_name = "generic/delete.html" template_name = "generic/delete.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully deleted Group") success_message = _("Successfully deleted Group")

View file

@ -4,6 +4,7 @@ from django.contrib.auth.mixins import (
PermissionRequiredMixin as DjangoPermissionRequiredMixin, PermissionRequiredMixin as DjangoPermissionRequiredMixin,
) )
from django.contrib.messages.views import SuccessMessageMixin from django.contrib.messages.views import SuccessMessageMixin
from django.urls import reverse_lazy
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from guardian.mixins import PermissionRequiredMixin from guardian.mixins import PermissionRequiredMixin
@ -27,7 +28,7 @@ class OutpostServiceConnectionCreateView(
permission_required = "authentik_outposts.add_outpostserviceconnection" permission_required = "authentik_outposts.add_outpostserviceconnection"
template_name = "generic/create.html" template_name = "generic/create.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully created Outpost Service Connection") success_message = _("Successfully created Outpost Service Connection")
@ -43,7 +44,7 @@ class OutpostServiceConnectionUpdateView(
permission_required = "authentik_outposts.change_outpostserviceconnection" permission_required = "authentik_outposts.change_outpostserviceconnection"
template_name = "generic/update.html" template_name = "generic/update.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully updated Outpost Service Connection") success_message = _("Successfully updated Outpost Service Connection")
@ -56,5 +57,5 @@ class OutpostServiceConnectionDeleteView(
permission_required = "authentik_outposts.delete_outpostserviceconnection" permission_required = "authentik_outposts.delete_outpostserviceconnection"
template_name = "generic/delete.html" template_name = "generic/delete.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully deleted Outpost Service Connection") success_message = _("Successfully deleted Outpost Service Connection")

View file

@ -7,6 +7,7 @@ from django.contrib.auth.mixins import (
) )
from django.contrib.messages.views import SuccessMessageMixin from django.contrib.messages.views import SuccessMessageMixin
from django.http import HttpResponse from django.http import HttpResponse
from django.urls import reverse_lazy
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from django.views.generic import FormView from django.views.generic import FormView
from django.views.generic.detail import DetailView from django.views.generic.detail import DetailView
@ -34,7 +35,7 @@ class PolicyCreateView(
permission_required = "authentik_policies.add_policy" permission_required = "authentik_policies.add_policy"
template_name = "generic/create.html" template_name = "generic/create.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully created Policy") success_message = _("Successfully created Policy")
@ -50,7 +51,7 @@ class PolicyUpdateView(
permission_required = "authentik_policies.change_policy" permission_required = "authentik_policies.change_policy"
template_name = "generic/update.html" template_name = "generic/update.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully updated Policy") success_message = _("Successfully updated Policy")
@ -61,7 +62,7 @@ class PolicyDeleteView(LoginRequiredMixin, PermissionRequiredMixin, DeleteMessag
permission_required = "authentik_policies.delete_policy" permission_required = "authentik_policies.delete_policy"
template_name = "generic/delete.html" template_name = "generic/delete.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully deleted Policy") success_message = _("Successfully deleted Policy")

View file

@ -7,6 +7,7 @@ from django.contrib.auth.mixins import (
) )
from django.contrib.messages.views import SuccessMessageMixin from django.contrib.messages.views import SuccessMessageMixin
from django.db.models import Max from django.db.models import Max
from django.urls import reverse_lazy
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from django.views.generic import UpdateView from django.views.generic import UpdateView
from guardian.mixins import PermissionRequiredMixin from guardian.mixins import PermissionRequiredMixin
@ -30,7 +31,7 @@ class PolicyBindingCreateView(
form_class = PolicyBindingForm form_class = PolicyBindingForm
template_name = "generic/create.html" template_name = "generic/create.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully created PolicyBinding") success_message = _("Successfully created PolicyBinding")
def get_initial(self) -> dict[str, Any]: def get_initial(self) -> dict[str, Any]:
@ -63,7 +64,7 @@ class PolicyBindingUpdateView(
form_class = PolicyBindingForm form_class = PolicyBindingForm
template_name = "generic/update.html" template_name = "generic/update.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully updated PolicyBinding") success_message = _("Successfully updated PolicyBinding")
@ -76,5 +77,5 @@ class PolicyBindingDeleteView(
permission_required = "authentik_policies.delete_policybinding" permission_required = "authentik_policies.delete_policybinding"
template_name = "generic/delete.html" template_name = "generic/delete.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully deleted PolicyBinding") success_message = _("Successfully deleted PolicyBinding")

View file

@ -4,6 +4,7 @@ from django.contrib.auth.mixins import (
PermissionRequiredMixin as DjangoPermissionRequiredMixin, PermissionRequiredMixin as DjangoPermissionRequiredMixin,
) )
from django.contrib.messages.views import SuccessMessageMixin from django.contrib.messages.views import SuccessMessageMixin
from django.urls import reverse_lazy
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from guardian.mixins import PermissionRequiredMixin from guardian.mixins import PermissionRequiredMixin
@ -27,7 +28,7 @@ class StageCreateView(
template_name = "generic/create.html" template_name = "generic/create.html"
permission_required = "authentik_flows.add_stage" permission_required = "authentik_flows.add_stage"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully created Stage") success_message = _("Successfully created Stage")
@ -42,7 +43,7 @@ class StageUpdateView(
model = Stage model = Stage
permission_required = "authentik_flows.update_application" permission_required = "authentik_flows.update_application"
template_name = "generic/update.html" template_name = "generic/update.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully updated Stage") success_message = _("Successfully updated Stage")
@ -52,5 +53,5 @@ class StageDeleteView(LoginRequiredMixin, PermissionRequiredMixin, DeleteMessage
model = Stage model = Stage
template_name = "generic/delete.html" template_name = "generic/delete.html"
permission_required = "authentik_flows.delete_stage" permission_required = "authentik_flows.delete_stage"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully deleted Stage") success_message = _("Successfully deleted Stage")

View file

@ -7,6 +7,7 @@ from django.contrib.auth.mixins import (
) )
from django.contrib.messages.views import SuccessMessageMixin from django.contrib.messages.views import SuccessMessageMixin
from django.db.models import Max from django.db.models import Max
from django.urls import reverse_lazy
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from django.views.generic import UpdateView from django.views.generic import UpdateView
from guardian.mixins import PermissionRequiredMixin from guardian.mixins import PermissionRequiredMixin
@ -30,7 +31,7 @@ class StageBindingCreateView(
form_class = FlowStageBindingForm form_class = FlowStageBindingForm
template_name = "generic/create.html" template_name = "generic/create.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully created StageBinding") success_message = _("Successfully created StageBinding")
def get_initial(self) -> dict[str, Any]: def get_initial(self) -> dict[str, Any]:
@ -61,7 +62,7 @@ class StageBindingUpdateView(
form_class = FlowStageBindingForm form_class = FlowStageBindingForm
template_name = "generic/update.html" template_name = "generic/update.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully updated StageBinding") success_message = _("Successfully updated StageBinding")
@ -74,5 +75,5 @@ class StageBindingDeleteView(
permission_required = "authentik_flows.delete_flowstagebinding" permission_required = "authentik_flows.delete_flowstagebinding"
template_name = "generic/delete.html" template_name = "generic/delete.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully deleted FlowStageBinding") success_message = _("Successfully deleted FlowStageBinding")

View file

@ -5,6 +5,7 @@ from django.contrib.auth.mixins import (
) )
from django.contrib.messages.views import SuccessMessageMixin from django.contrib.messages.views import SuccessMessageMixin
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from django.urls import reverse_lazy
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from guardian.mixins import PermissionRequiredMixin from guardian.mixins import PermissionRequiredMixin
@ -27,7 +28,7 @@ class InvitationCreateView(
permission_required = "authentik_stages_invitation.add_invitation" permission_required = "authentik_stages_invitation.add_invitation"
template_name = "generic/create.html" template_name = "generic/create.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully created Invitation") success_message = _("Successfully created Invitation")
def form_valid(self, form): def form_valid(self, form):
@ -46,5 +47,5 @@ class InvitationDeleteView(
permission_required = "authentik_stages_invitation.delete_invitation" permission_required = "authentik_stages_invitation.delete_invitation"
template_name = "generic/delete.html" template_name = "generic/delete.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully deleted Invitation") success_message = _("Successfully deleted Invitation")

View file

@ -4,6 +4,7 @@ from django.contrib.auth.mixins import (
PermissionRequiredMixin as DjangoPermissionRequiredMixin, PermissionRequiredMixin as DjangoPermissionRequiredMixin,
) )
from django.contrib.messages.views import SuccessMessageMixin from django.contrib.messages.views import SuccessMessageMixin
from django.urls import reverse_lazy
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from django.views.generic import UpdateView from django.views.generic import UpdateView
from guardian.mixins import PermissionRequiredMixin from guardian.mixins import PermissionRequiredMixin
@ -27,7 +28,7 @@ class PromptCreateView(
permission_required = "authentik_stages_prompt.add_prompt" permission_required = "authentik_stages_prompt.add_prompt"
template_name = "generic/create.html" template_name = "generic/create.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully created Prompt") success_message = _("Successfully created Prompt")
@ -44,7 +45,7 @@ class PromptUpdateView(
permission_required = "authentik_stages_prompt.change_prompt" permission_required = "authentik_stages_prompt.change_prompt"
template_name = "generic/update.html" template_name = "generic/update.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully updated Prompt") success_message = _("Successfully updated Prompt")
@ -55,5 +56,5 @@ class PromptDeleteView(LoginRequiredMixin, PermissionRequiredMixin, DeleteMessag
permission_required = "authentik_stages_prompt.delete_prompt" permission_required = "authentik_stages_prompt.delete_prompt"
template_name = "generic/delete.html" template_name = "generic/delete.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully deleted Prompt") success_message = _("Successfully deleted Prompt")

View file

@ -1,5 +1,6 @@
"""authentik Token administration""" """authentik Token administration"""
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.mixins import LoginRequiredMixin
from django.urls import reverse_lazy
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from guardian.mixins import PermissionRequiredMixin from guardian.mixins import PermissionRequiredMixin
@ -14,5 +15,5 @@ class TokenDeleteView(LoginRequiredMixin, PermissionRequiredMixin, DeleteMessage
permission_required = "authentik_core.delete_token" permission_required = "authentik_core.delete_token"
template_name = "generic/delete.html" template_name = "generic/delete.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully deleted Token") success_message = _("Successfully deleted Token")

View file

@ -7,7 +7,8 @@ from django.contrib.auth.mixins import (
from django.contrib.messages.views import SuccessMessageMixin from django.contrib.messages.views import SuccessMessageMixin
from django.http import HttpRequest, HttpResponse from django.http import HttpRequest, HttpResponse
from django.http.response import HttpResponseRedirect from django.http.response import HttpResponseRedirect
from django.shortcuts import redirect, reverse from django.shortcuts import redirect
from django.urls import reverse_lazy
from django.utils.http import urlencode from django.utils.http import urlencode
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from django.views.generic import DetailView, UpdateView from django.views.generic import DetailView, UpdateView
@ -32,7 +33,7 @@ class UserCreateView(
permission_required = "authentik_core.add_user" permission_required = "authentik_core.add_user"
template_name = "generic/create.html" template_name = "generic/create.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully created User") success_message = _("Successfully created User")
@ -51,7 +52,7 @@ class UserUpdateView(
# By default the object's name is user which is used by other checks # By default the object's name is user which is used by other checks
context_object_name = "object" context_object_name = "object"
template_name = "generic/update.html" template_name = "generic/update.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully updated User") success_message = _("Successfully updated User")
@ -64,7 +65,7 @@ class UserDeleteView(LoginRequiredMixin, PermissionRequiredMixin, DeleteMessageV
# By default the object's name is user which is used by other checks # By default the object's name is user which is used by other checks
context_object_name = "object" context_object_name = "object"
template_name = "generic/delete.html" template_name = "generic/delete.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully deleted User") success_message = _("Successfully deleted User")
@ -79,7 +80,7 @@ class UserDisableView(LoginRequiredMixin, PermissionRequiredMixin, DeleteMessage
# By default the object's name is user which is used by other checks # By default the object's name is user which is used by other checks
context_object_name = "object" context_object_name = "object"
template_name = "administration/user/disable.html" template_name = "administration/user/disable.html"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully disabled User") success_message = _("Successfully disabled User")
def delete(self, request: HttpRequest, *args, **kwargs) -> HttpResponse: def delete(self, request: HttpRequest, *args, **kwargs) -> HttpResponse:
@ -100,7 +101,7 @@ class UserEnableView(LoginRequiredMixin, PermissionRequiredMixin, DetailView):
# By default the object's name is user which is used by other checks # By default the object's name is user which is used by other checks
context_object_name = "object" context_object_name = "object"
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
success_message = _("Successfully enabled User") success_message = _("Successfully enabled User")
def get(self, request: HttpRequest, *args, **kwargs): def get(self, request: HttpRequest, *args, **kwargs):
@ -124,7 +125,7 @@ class UserPasswordResetView(LoginRequiredMixin, PermissionRequiredMixin, DetailV
) )
querystring = urlencode({"token": token.key}) querystring = urlencode({"token": token.key})
link = request.build_absolute_uri( link = request.build_absolute_uri(
reverse("authentik_flows:default-recovery") + f"?{querystring}" reverse_lazy("authentik_flows:default-recovery") + f"?{querystring}"
) )
messages.success( messages.success(
request, _("Password reset link: <pre>%(link)s</pre>" % {"link": link}) request, _("Password reset link: <pre>%(link)s</pre>" % {"link": link})

View file

@ -4,6 +4,7 @@ from typing import Any
from django.contrib import messages from django.contrib import messages
from django.contrib.messages.views import SuccessMessageMixin from django.contrib.messages.views import SuccessMessageMixin
from django.http import Http404 from django.http import Http404
from django.urls import reverse_lazy
from django.views.generic import DeleteView, UpdateView from django.views.generic import DeleteView, UpdateView
from authentik.lib.utils.reflection import all_subclasses from authentik.lib.utils.reflection import all_subclasses
@ -13,7 +14,7 @@ from authentik.lib.views import CreateAssignPermView
class DeleteMessageView(SuccessMessageMixin, DeleteView): class DeleteMessageView(SuccessMessageMixin, DeleteView):
"""DeleteView which shows `self.success_message` on successful deletion""" """DeleteView which shows `self.success_message` on successful deletion"""
success_url = "/" success_url = reverse_lazy("authentik_core:shell")
def delete(self, request, *args, **kwargs): def delete(self, request, *args, **kwargs):
messages.success(self.request, self.success_message) messages.success(self.request, self.success_message)

View file

@ -1,5 +1,5 @@
"""PropertyMapping API Views""" """PropertyMapping API Views"""
from django.shortcuts import reverse from django.urls import reverse
from drf_yasg2.utils import swagger_auto_schema from drf_yasg2.utils import swagger_auto_schema
from rest_framework.decorators import action from rest_framework.decorators import action
from rest_framework.request import Request from rest_framework.request import Request

View file

@ -1,5 +1,5 @@
"""Provider API Views""" """Provider API Views"""
from django.shortcuts import reverse from django.urls import reverse
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from drf_yasg2.utils import swagger_auto_schema from drf_yasg2.utils import swagger_auto_schema
from rest_framework.decorators import action from rest_framework.decorators import action

View file

@ -1,5 +1,5 @@
"""Source API Views""" """Source API Views"""
from django.shortcuts import reverse from django.urls import reverse
from drf_yasg2.utils import swagger_auto_schema from drf_yasg2.utils import swagger_auto_schema
from rest_framework.decorators import action from rest_framework.decorators import action
from rest_framework.request import Request from rest_framework.request import Request

View file

@ -1,6 +1,6 @@
"""impersonation tests""" """impersonation tests"""
from django.shortcuts import reverse
from django.test.testcases import TestCase from django.test.testcases import TestCase
from django.urls import reverse
from authentik.core.models import User from authentik.core.models import User

View file

@ -2,8 +2,8 @@
import string import string
from random import SystemRandom from random import SystemRandom
from django.shortcuts import reverse
from django.test import TestCase from django.test import TestCase
from django.urls import reverse
from authentik.core.models import User from authentik.core.models import User

View file

@ -2,8 +2,8 @@
import string import string
from random import SystemRandom from random import SystemRandom
from django.shortcuts import reverse
from django.test import TestCase from django.test import TestCase
from django.urls import reverse
from authentik.core.models import User from authentik.core.models import User

View file

@ -1,6 +1,6 @@
"""Event API tests""" """Event API tests"""
from django.shortcuts import reverse from django.urls import reverse
from rest_framework.test import APITestCase from rest_framework.test import APITestCase
from authentik.core.models import User from authentik.core.models import User

View file

@ -1,6 +1,6 @@
"""Event Middleware tests""" """Event Middleware tests"""
from django.shortcuts import reverse from django.urls import reverse
from rest_framework.test import APITestCase from rest_framework.test import APITestCase
from authentik.core.models import Application, User from authentik.core.models import Application, User

View file

@ -1,5 +1,5 @@
"""Flow Stage API Views""" """Flow Stage API Views"""
from django.shortcuts import reverse from django.urls import reverse
from drf_yasg2.utils import swagger_auto_schema from drf_yasg2.utils import swagger_auto_schema
from rest_framework.decorators import action from rest_framework.decorators import action
from rest_framework.request import Request from rest_framework.request import Request

View file

@ -1,14 +1,15 @@
from authentik.flows.transfer.common import DataclassEncoder """Challenge helpers"""
from dataclasses import asdict, is_dataclass
from enum import Enum from enum import Enum
from json.encoder import JSONEncoder
from django.http import JsonResponse from django.http import JsonResponse
from rest_framework.fields import ChoiceField, DictField, JSONField from rest_framework.fields import ChoiceField, JSONField
from rest_framework.serializers import CharField, Serializer from rest_framework.serializers import CharField, Serializer
from authentik.flows.transfer.common import DataclassEncoder
class ChallengeTypes(Enum): class ChallengeTypes(Enum):
"""Currently defined challenge types"""
native = "native" native = "native"
shell = "shell" shell = "shell"
@ -16,6 +17,8 @@ class ChallengeTypes(Enum):
class Challenge(Serializer): class Challenge(Serializer):
"""Challenge that gets sent to the client based on which stage
is currently active"""
type = ChoiceField(choices=list(ChallengeTypes)) type = ChoiceField(choices=list(ChallengeTypes))
component = CharField(required=False) component = CharField(required=False)
@ -23,10 +26,12 @@ class Challenge(Serializer):
class ChallengeResponse(Serializer): class ChallengeResponse(Serializer):
"""Base class for all challenge responses"""
pass
class HttpChallengeResponse(JsonResponse): class HttpChallengeResponse(JsonResponse):
"""Subclass of JsonResponse that uses the `DataclassEncoder`"""
def __init__(self, challenge: Challenge, **kwargs) -> None: def __init__(self, challenge: Challenge, **kwargs) -> None:
# pyright: reportGeneralTypeIssues=false
super().__init__(challenge.data, encoder=DataclassEncoder, **kwargs) super().__init__(challenge.data, encoder=DataclassEncoder, **kwargs)

View file

@ -1,5 +1,5 @@
"""API flow tests""" """API flow tests"""
from django.shortcuts import reverse from django.urls import reverse
from rest_framework.test import APITestCase from rest_framework.test import APITestCase
from authentik.core.models import User from authentik.core.models import User

View file

@ -4,8 +4,8 @@ from unittest.mock import MagicMock, Mock, PropertyMock, patch
from django.contrib.sessions.middleware import SessionMiddleware from django.contrib.sessions.middleware import SessionMiddleware
from django.core.cache import cache from django.core.cache import cache
from django.http import HttpRequest from django.http import HttpRequest
from django.shortcuts import reverse
from django.test import RequestFactory, TestCase from django.test import RequestFactory, TestCase
from django.urls import reverse
from guardian.shortcuts import get_anonymous_user from guardian.shortcuts import get_anonymous_user
from authentik.core.models import User from authentik.core.models import User

View file

@ -2,9 +2,9 @@
from unittest.mock import MagicMock, PropertyMock, patch from unittest.mock import MagicMock, PropertyMock, patch
from django.http import HttpRequest, HttpResponse from django.http import HttpRequest, HttpResponse
from django.shortcuts import reverse
from django.test import TestCase from django.test import TestCase
from django.test.client import RequestFactory from django.test.client import RequestFactory
from django.urls import reverse
from django.utils.encoding import force_str from django.utils.encoding import force_str
from authentik.core.models import User from authentik.core.models import User
@ -359,7 +359,7 @@ class TestFlowExecutor(TestCase):
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertJSONEqual( self.assertJSONEqual(
force_str(response.content), force_str(response.content),
{"type": "redirect", "to": reverse("authentik_core:shell")}, {"args": {"to": reverse("authentik_core:shell")}, "type": "redirect"},
) )
def test_reevaluate_remove_consecutive(self): def test_reevaluate_remove_consecutive(self):

View file

@ -1,6 +1,6 @@
"""flow views tests""" """flow views tests"""
from django.shortcuts import reverse
from django.test import Client, TestCase from django.test import Client, TestCase
from django.urls import reverse
from authentik.flows.models import Flow, FlowDesignation from authentik.flows.models import Flow, FlowDesignation
from authentik.flows.planner import FlowPlan from authentik.flows.planner import FlowPlan

View file

@ -2,7 +2,7 @@
from dataclasses import asdict from dataclasses import asdict
from django.db.models.base import Model from django.db.models.base import Model
from django.shortcuts import reverse from django.urls import reverse
from drf_yasg2.utils import swagger_auto_schema from drf_yasg2.utils import swagger_auto_schema
from rest_framework.decorators import action from rest_framework.decorators import action
from rest_framework.fields import BooleanField, CharField, SerializerMethodField from rest_framework.fields import BooleanField, CharField, SerializerMethodField

View file

@ -1,7 +1,7 @@
"""policy API Views""" """policy API Views"""
from django.core.cache import cache from django.core.cache import cache
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from django.shortcuts import reverse from django.urls import reverse
from drf_yasg2.utils import swagger_auto_schema from drf_yasg2.utils import swagger_auto_schema
from rest_framework.decorators import action from rest_framework.decorators import action
from rest_framework.request import Request from rest_framework.request import Request

View file

@ -1,5 +1,5 @@
"""OAuth2Provider API Views""" """OAuth2Provider API Views"""
from django.shortcuts import reverse from django.urls import reverse
from drf_yasg2.utils import swagger_auto_schema from drf_yasg2.utils import swagger_auto_schema
from rest_framework.decorators import action from rest_framework.decorators import action
from rest_framework.fields import ReadOnlyField from rest_framework.fields import ReadOnlyField

View file

@ -3,7 +3,7 @@ from typing import Iterator, Optional
import xmlsec # nosec import xmlsec # nosec
from django.http import HttpRequest from django.http import HttpRequest
from django.shortcuts import reverse from django.urls import reverse
from lxml.etree import Element, SubElement, tostring # nosec from lxml.etree import Element, SubElement, tostring # nosec
from authentik.providers.saml.models import SAMLProvider from authentik.providers.saml.models import SAMLProvider

View file

@ -2,8 +2,8 @@
from io import StringIO from io import StringIO
from django.core.management import call_command from django.core.management import call_command
from django.shortcuts import reverse
from django.test import TestCase from django.test import TestCase
from django.urls import reverse
from authentik.core.models import Token, TokenIntents, User from authentik.core.models import Token, TokenIntents, User

View file

@ -2,8 +2,8 @@
from base64 import b64encode from base64 import b64encode
from django.conf import settings from django.conf import settings
from django.shortcuts import reverse
from django.test import Client, TestCase from django.test import Client, TestCase
from django.urls import reverse
class TestRoot(TestCase): class TestRoot(TestCase):

View file

@ -3,10 +3,10 @@ from typing import Optional, Type
from django.db import models from django.db import models
from django.forms import ModelForm from django.forms import ModelForm
from django.templatetags.static import static
from django.urls import reverse, reverse_lazy from django.urls import reverse, reverse_lazy
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from rest_framework.serializers import Serializer from rest_framework.serializers import Serializer
from django.templatetags.static import static
from authentik.core.models import Source, UserSourceConnection from authentik.core.models import Source, UserSourceConnection
from authentik.core.types import UILoginButton from authentik.core.types import UILoginButton

View file

@ -1,6 +1,6 @@
"""OAuth Source tests""" """OAuth Source tests"""
from django.shortcuts import reverse
from django.test import TestCase from django.test import TestCase
from django.urls import reverse
from authentik.sources.oauth.models import OAuthSource from authentik.sources.oauth.models import OAuthSource

View file

@ -4,8 +4,7 @@ from typing import Type
from django.db import models from django.db import models
from django.forms import ModelForm from django.forms import ModelForm
from django.http import HttpRequest from django.http import HttpRequest
from django.shortcuts import reverse from django.urls import reverse, reverse_lazy
from django.urls import reverse_lazy
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from rest_framework.serializers import Serializer from rest_framework.serializers import Serializer

View file

@ -3,7 +3,7 @@ from typing import Optional, Type
from django.db import models from django.db import models
from django.forms import ModelForm from django.forms import ModelForm
from django.shortcuts import reverse from django.urls import reverse
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.views import View from django.views import View
from rest_framework.serializers import BaseSerializer from rest_framework.serializers import BaseSerializer

View file

@ -3,7 +3,7 @@ from typing import Optional, Type
from django.db import models from django.db import models
from django.forms import ModelForm from django.forms import ModelForm
from django.shortcuts import reverse from django.urls import reverse
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.views import View from django.views import View
from rest_framework.serializers import BaseSerializer from rest_framework.serializers import BaseSerializer

View file

@ -4,7 +4,7 @@ from typing import Optional, Type
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.db import models from django.db import models
from django.forms import ModelForm from django.forms import ModelForm
from django.shortcuts import reverse from django.urls import reverse
from django.utils.timezone import now from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.views import View from django.views import View

View file

@ -1,7 +1,7 @@
"""captcha tests""" """captcha tests"""
from django.conf import settings from django.conf import settings
from django.shortcuts import reverse
from django.test import Client, TestCase from django.test import Client, TestCase
from django.urls import reverse
from django.utils.encoding import force_str from django.utils.encoding import force_str
from authentik.core.models import User from authentik.core.models import User

View file

@ -1,8 +1,8 @@
"""consent tests""" """consent tests"""
from time import sleep from time import sleep
from django.shortcuts import reverse
from django.test import Client, TestCase from django.test import Client, TestCase
from django.urls import reverse
from django.utils.encoding import force_str from django.utils.encoding import force_str
from authentik.core.models import Application, User from authentik.core.models import Application, User

View file

@ -1,6 +1,6 @@
"""dummy tests""" """dummy tests"""
from django.shortcuts import reverse
from django.test import Client, TestCase from django.test import Client, TestCase
from django.urls import reverse
from django.utils.encoding import force_str from django.utils.encoding import force_str
from authentik.core.models import User from authentik.core.models import User

View file

@ -4,8 +4,8 @@ from unittest.mock import MagicMock, patch
from django.core import mail from django.core import mail
from django.core.mail.backends.locmem import EmailBackend from django.core.mail.backends.locmem import EmailBackend
from django.shortcuts import reverse
from django.test import Client, TestCase from django.test import Client, TestCase
from django.urls import reverse
from authentik.core.models import User from authentik.core.models import User
from authentik.flows.markers import StageMarker from authentik.flows.markers import StageMarker

View file

@ -2,8 +2,8 @@
from unittest.mock import MagicMock, patch from unittest.mock import MagicMock, patch
from django.core import mail from django.core import mail
from django.shortcuts import reverse
from django.test import Client, TestCase from django.test import Client, TestCase
from django.urls import reverse
from django.utils.encoding import force_str from django.utils.encoding import force_str
from authentik.core.models import Token, User from authentik.core.models import Token, User

View file

@ -1,10 +1,10 @@
"""Identification stage logic""" """Identification stage logic"""
from typing import Optional from typing import Optional, Union
from django.contrib import messages from django.contrib import messages
from django.db.models import Q from django.db.models import Q
from django.http import HttpResponse from django.http import HttpResponse
from django.shortcuts import reverse from django.urls import reverse
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from django.views.generic import FormView from django.views.generic import FormView
from rest_framework.fields import CharField from rest_framework.fields import CharField
@ -55,7 +55,7 @@ class IdentificationStageView(ChallengeStageView):
def get_challenge(self) -> Challenge: def get_challenge(self) -> Challenge:
current_stage: IdentificationStage = self.executor.current_stage current_stage: IdentificationStage = self.executor.current_stage
args = {"input_type": "text"} args: dict[str, Union[str, list[UILoginButton]]] = {"input_type": "text"}
if current_stage.user_fields == [UserFields.E_MAIL]: if current_stage.user_fields == [UserFields.E_MAIL]:
args["input_type"] = "email" args["input_type"] = "email"
# If the user has been redirected to us whilst trying to access an # If the user has been redirected to us whilst trying to access an
@ -76,14 +76,15 @@ class IdentificationStageView(ChallengeStageView):
args["primary_action"] = _("Log in") args["primary_action"] = _("Log in")
# Check all enabled source, add them if they have a UI Login button. # Check all enabled source, add them if they have a UI Login button.
args["sources"] = [] ui_sources = []
sources: list[Source] = ( sources: list[Source] = (
Source.objects.filter(enabled=True).order_by("name").select_subclasses() Source.objects.filter(enabled=True).order_by("name").select_subclasses()
) )
for source in sources: for source in sources:
ui_login_button = source.ui_login_button ui_login_button = source.ui_login_button
if ui_login_button: if ui_login_button:
args["sources"].append(ui_login_button) ui_sources.append(ui_login_button)
args["sources"] = ui_sources
return Challenge( return Challenge(
data={ data={
"type": ChallengeTypes.native, "type": ChallengeTypes.native,

View file

@ -1,6 +1,6 @@
"""identification tests""" """identification tests"""
from django.shortcuts import reverse
from django.test import Client, TestCase from django.test import Client, TestCase
from django.urls import reverse
from django.utils.encoding import force_str from django.utils.encoding import force_str
from authentik.core.models import User from authentik.core.models import User

View file

@ -1,8 +1,8 @@
"""invitation tests""" """invitation tests"""
from unittest.mock import MagicMock, patch from unittest.mock import MagicMock, patch
from django.shortcuts import reverse
from django.test import Client, TestCase from django.test import Client, TestCase
from django.urls import reverse
from django.utils.encoding import force_str from django.utils.encoding import force_str
from guardian.shortcuts import get_anonymous_user from guardian.shortcuts import get_anonymous_user

View file

@ -4,7 +4,7 @@ from typing import Optional, Type
from django.contrib.postgres.fields import ArrayField from django.contrib.postgres.fields import ArrayField
from django.db import models from django.db import models
from django.forms import ModelForm from django.forms import ModelForm
from django.shortcuts import reverse from django.urls import reverse
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.views import View from django.views import View
from rest_framework.serializers import BaseSerializer from rest_framework.serializers import BaseSerializer

View file

@ -4,8 +4,8 @@ from random import SystemRandom
from unittest.mock import MagicMock, patch from unittest.mock import MagicMock, patch
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.shortcuts import reverse
from django.test import Client, TestCase from django.test import Client, TestCase
from django.urls import reverse
from django.utils.encoding import force_str from django.utils.encoding import force_str
from authentik.core.models import User from authentik.core.models import User

View file

@ -2,7 +2,7 @@
from typing import Any from typing import Any
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.mixins import LoginRequiredMixin
from django.shortcuts import reverse from django.urls import reverse
from django.utils.http import urlencode from django.utils.http import urlencode
from django.views.generic import TemplateView from django.views.generic import TemplateView

View file

@ -1,8 +1,8 @@
"""Prompt tests""" """Prompt tests"""
from unittest.mock import MagicMock, patch from unittest.mock import MagicMock, patch
from django.shortcuts import reverse
from django.test import Client, TestCase from django.test import Client, TestCase
from django.urls import reverse
from django.utils.encoding import force_str from django.utils.encoding import force_str
from authentik.core.models import User from authentik.core.models import User

View file

@ -1,8 +1,8 @@
"""delete tests""" """delete tests"""
from unittest.mock import patch from unittest.mock import patch
from django.shortcuts import reverse
from django.test import Client, TestCase from django.test import Client, TestCase
from django.urls import reverse
from django.utils.encoding import force_str from django.utils.encoding import force_str
from authentik.core.models import User from authentik.core.models import User

View file

@ -1,8 +1,8 @@
"""login tests""" """login tests"""
from unittest.mock import patch from unittest.mock import patch
from django.shortcuts import reverse
from django.test import Client, TestCase from django.test import Client, TestCase
from django.urls import reverse
from django.utils.encoding import force_str from django.utils.encoding import force_str
from authentik.core.models import User from authentik.core.models import User

View file

@ -1,6 +1,6 @@
"""logout tests""" """logout tests"""
from django.shortcuts import reverse
from django.test import Client, TestCase from django.test import Client, TestCase
from django.urls import reverse
from django.utils.encoding import force_str from django.utils.encoding import force_str
from authentik.core.models import User from authentik.core.models import User

View file

@ -3,8 +3,8 @@ import string
from random import SystemRandom from random import SystemRandom
from unittest.mock import patch from unittest.mock import patch
from django.shortcuts import reverse
from django.test import Client, TestCase from django.test import Client, TestCase
from django.urls import reverse
from django.utils.encoding import force_str from django.utils.encoding import force_str
from authentik.core.models import User from authentik.core.models import User

View file

@ -12,8 +12,8 @@ from django.apps import apps
from django.contrib.staticfiles.testing import StaticLiveServerTestCase from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from django.db import connection, transaction from django.db import connection, transaction
from django.db.utils import IntegrityError from django.db.utils import IntegrityError
from django.shortcuts import reverse
from django.test.testcases import TransactionTestCase from django.test.testcases import TransactionTestCase
from django.urls import reverse
from docker import DockerClient, from_env from docker import DockerClient, from_env
from docker.models.containers import Container from docker.models.containers import Container
from selenium import webdriver from selenium import webdriver