Skip to content

Commit 4343365

Browse files
Merge pull request #3820 from open-formulieren/feature/3680-remove-auth-plugin-from-cosign
Feature/3680 remove auth plugin from cosign
2 parents 5237461 + 0bda8b2 commit 4343365

File tree

19 files changed

+142
-124
lines changed

19 files changed

+142
-124
lines changed

package-lock.json

+7-7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
"dependencies": {
3030
"@fortawesome/fontawesome-free": "^6.1.1",
3131
"@open-formulieren/design-tokens": "^0.51.0",
32-
"@open-formulieren/formio-builder": "^0.14.2",
32+
"@open-formulieren/formio-builder": "^0.15.1",
3333
"@open-formulieren/leaflet-tools": "^1.0.0",
3434
"@rjsf/core": "^4.2.1",
3535
"@tinymce/tinymce-react": "^4.3.2",

src/openapi.yaml

+13
Original file line numberDiff line numberDiff line change
@@ -7061,10 +7061,16 @@ components:
70617061
hideNonApplicableSteps:
70627062
type: boolean
70637063
readOnly: true
7064+
cosignLoginOptions:
7065+
type: array
7066+
items:
7067+
$ref: '#/components/schemas/LoginOption'
7068+
readOnly: true
70647069
cosignLoginInfo:
70657070
allOf:
70667071
- $ref: '#/components/schemas/CosignLoginInfo'
70677072
readOnly: true
7073+
deprecated: true
70687074
submissionStatementsConfiguration:
70697075
type: array
70707076
items:
@@ -7102,6 +7108,7 @@ components:
71027108
nullable: true
71037109
required:
71047110
- cosignLoginInfo
7111+
- cosignLoginOptions
71057112
- hideNonApplicableSteps
71067113
- loginOptions
71077114
- loginRequired
@@ -8619,10 +8626,16 @@ components:
86198626
hideNonApplicableSteps:
86208627
type: boolean
86218628
readOnly: true
8629+
cosignLoginOptions:
8630+
type: array
8631+
items:
8632+
$ref: '#/components/schemas/LoginOption'
8633+
readOnly: true
86228634
cosignLoginInfo:
86238635
allOf:
86248636
- $ref: '#/components/schemas/CosignLoginInfo'
86258637
readOnly: true
8638+
deprecated: true
86268639
submissionStatementsConfiguration:
86278640
type: array
86288641
items:

src/openforms/authentication/api/fields.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,19 @@ class LoginOptionsReadOnlyField(serializers.ListField):
1111
there is no write-mode support because this data is not writable
1212
"""
1313

14-
def __init__(self, *args, **kwargs):
14+
def __init__(self, is_for_cosign: bool = False, *args, **kwargs) -> None:
1515
kwargs.setdefault("child", LoginOptionSerializer())
1616
kwargs["read_only"] = True
1717
kwargs["source"] = "*"
18+
19+
self.is_for_cosign = is_for_cosign
20+
1821
super().__init__(*args, **kwargs)
1922

2023
def to_internal_value(self, data):
2124
raise NotImplementedError("read only")
2225

2326
def to_representation(self, form):
2427
request = self.context["request"]
25-
temp = auth_register.get_options(request, form)
28+
temp = auth_register.get_options(request, form, self.is_for_cosign)
2629
return super().to_representation(temp)

src/openforms/authentication/api/serializers.py

+33-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
from django.utils.translation import gettext_lazy as _
22

3+
from furl import furl
34
from rest_framework import serializers
5+
from rest_framework.reverse import reverse
46

7+
from openforms.authentication.base import LoginInfo
8+
from openforms.authentication.registry import register as auth_register
59
from openforms.plugins.api.serializers import PluginBaseSerializer
610

711
from ..constants import LogoAppearance
8-
from ..utils import get_cosign_login_info
912

1013

1114
class TextChoiceSerializer(serializers.Serializer):
@@ -83,4 +86,32 @@ class LoginOptionSerializer(serializers.Serializer):
8386

8487
class CosignLoginInfoSerializer(LoginOptionSerializer):
8588
def get_attribute(self, form):
86-
return get_cosign_login_info(self.context["request"], form)
89+
if not form.cosign_component:
90+
return None
91+
92+
auth_plugin_id = form.authentication_backends[0]
93+
auth_url = reverse(
94+
"authentication:start",
95+
kwargs={
96+
"slug": form.slug,
97+
"plugin_id": auth_plugin_id,
98+
},
99+
request=self.context["request"],
100+
)
101+
next_url = reverse(
102+
"submissions:find-submission-for-cosign",
103+
kwargs={"form_slug": form.slug},
104+
request=self.context["request"],
105+
)
106+
auth_page = furl(auth_url)
107+
auth_page.args.set("next", next_url)
108+
109+
auth_plugin = auth_register[auth_plugin_id]
110+
111+
return LoginInfo(
112+
auth_plugin.identifier,
113+
auth_plugin.get_label(),
114+
url=auth_page.url,
115+
logo=auth_plugin.get_logo(self.context["request"]),
116+
is_for_gemachtigde=auth_plugin.is_for_gemachtigde,
117+
)

src/openforms/authentication/base.py

+10-2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from openforms.typing import AnyRequest
1313

1414
from .constants import AuthAttribute
15+
from .utils import get_cosign_login_url
1516

1617

1718
@dataclass()
@@ -98,11 +99,18 @@ def logout(self, request: HttpRequest):
9899
"""
99100
pass
100101

101-
def get_login_info(self, request: HttpRequest, form: Form | None) -> LoginInfo:
102+
def get_login_info(
103+
self, request: HttpRequest, form: Form | None, is_for_cosign: bool = False
104+
) -> LoginInfo:
105+
if is_for_cosign:
106+
login_url = get_cosign_login_url(request, form, self.identifier)
107+
else:
108+
login_url = self.get_start_url(request, form) if form else ""
109+
102110
info = LoginInfo(
103111
self.identifier,
104112
self.get_label(),
105-
url=self.get_start_url(request, form) if form else "",
113+
url=login_url,
106114
logo=self.get_logo(request),
107115
is_for_gemachtigde=self.is_for_gemachtigde,
108116
)

src/openforms/authentication/registry.py

+9-3
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,15 @@ class Registry(BaseRegistry["BasePlugin"]):
3131
module = "authentication"
3232

3333
def get_options(
34-
self, request: HttpRequest, form: Form | None = None
35-
) -> list[LoginInfo]:
34+
self,
35+
request: HttpRequest,
36+
form: Form | None = None,
37+
is_for_cosign: bool = False,
38+
) -> list["LoginInfo"]:
3639
options = list()
40+
if is_for_cosign and (not form or not form.cosign_component):
41+
return options
42+
3743
for plugin_id in _iter_plugin_ids(form, self):
3844
if plugin_id not in self._registry:
3945
logger.warning(
@@ -43,7 +49,7 @@ def get_options(
4349
)
4450
continue
4551
plugin = self._registry[plugin_id]
46-
info = plugin.get_login_info(request, form)
52+
info = plugin.get_login_info(request, form, is_for_cosign)
4753
options.append(info)
4854
return options
4955

src/openforms/authentication/tests/test_utils.py

+5-21
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from openforms.forms.tests.factories import FormStepFactory
77
from openforms.submissions.tests.factories import SubmissionFactory
88

9-
from ..utils import get_cosign_login_info, store_auth_details, store_registrator_details
9+
from ..utils import get_cosign_login_url, store_auth_details, store_registrator_details
1010

1111

1212
class UtilsTests(TestCase):
@@ -28,22 +28,6 @@ def test_store_registrator_details(self):
2828
{"plugin": "digid", "attribute": "WRONG", "value": "some-value"},
2929
)
3030

31-
def test_get_cosign_info_when_no_cosign_on_form(self):
32-
form_step = FormStepFactory.create(
33-
form_definition__configuration={
34-
"components": [
35-
{"key": "textField", "label": "Not cosign", "type": "textfield"}
36-
]
37-
}
38-
)
39-
40-
factory = RequestFactory()
41-
request = factory.get("/foo")
42-
43-
login_info = get_cosign_login_info(request=request, form=form_step.form)
44-
45-
self.assertIsNone(login_info)
46-
4731
def test_get_cosign_info(self):
4832
form_step = FormStepFactory.create(
4933
form__slug="form-with-cosign",
@@ -62,11 +46,11 @@ def test_get_cosign_info(self):
6246
factory = RequestFactory()
6347
request = factory.get("/foo")
6448

65-
login_info = get_cosign_login_info(request=request, form=form_step.form)
66-
67-
self.assertIsNotNone(login_info)
49+
login_url = get_cosign_login_url(
50+
request=request, form=form_step.form, plugin_id="digid"
51+
)
52+
login_url = furl(login_url)
6853

69-
login_url = furl(login_info.url)
7054
submission_find_url = furl(
7155
login_url.args["next"]
7256
) # Page where the user will look for the submission to cosign

src/openforms/authentication/utils.py

+3-17
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
from openforms.forms.models import Form
88
from openforms.submissions.models import Submission
99

10-
from .base import LoginInfo
1110
from .constants import FORM_AUTH_SESSION_KEY, AuthAttribute
1211
from .models import AuthInfo, RegistratorInfo
1312
from .registry import register as auth_register
@@ -68,15 +67,12 @@ def meets_plugin_requirements(request: Request, config: dict) -> bool:
6867
return plugin.check_requirements(request, config.get(plugin_id, {}))
6968

7069

71-
def get_cosign_login_info(request: Request, form: Form) -> LoginInfo | None:
72-
if not (co_sign_component := form.get_cosign_component()):
73-
return None
74-
70+
def get_cosign_login_url(request: Request, form: Form, plugin_id: str) -> str:
7571
auth_url = reverse(
7672
"authentication:start",
7773
kwargs={
7874
"slug": form.slug,
79-
"plugin_id": co_sign_component["authPlugin"],
75+
"plugin_id": plugin_id,
8076
},
8177
request=request,
8278
)
@@ -87,14 +83,4 @@ def get_cosign_login_info(request: Request, form: Form) -> LoginInfo | None:
8783
)
8884
auth_page = furl(auth_url)
8985
auth_page.args.set("next", next_url)
90-
91-
auth_plugin_id = co_sign_component["authPlugin"]
92-
auth_plugin = auth_register[auth_plugin_id]
93-
94-
return LoginInfo(
95-
auth_plugin.identifier,
96-
auth_plugin.get_label(),
97-
url=auth_page.url,
98-
logo=auth_plugin.get_logo(request),
99-
is_for_gemachtigde=auth_plugin.is_for_gemachtigde,
100-
)
86+
return auth_page.url

src/openforms/formio/typing/__init__.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"""
88

99
from .base import Component, OptionDict
10-
from .custom import CosignComponent, DateComponent
10+
from .custom import DateComponent
1111
from .vanilla import (
1212
Column,
1313
ColumnsComponent,
@@ -30,6 +30,5 @@
3030
"Column",
3131
"ColumnsComponent",
3232
"DatetimeComponent",
33-
"CosignComponent",
3433
"DateComponent",
3534
]

src/openforms/formio/typing/custom.py

-4
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,5 @@
22
from .dates import DatePickerConfig
33

44

5-
class CosignComponent(Component):
6-
authPlugin: str
7-
8-
95
class DateComponent(Component):
106
datePicker: DatePickerConfig | None

src/openforms/forms/api/serializers/form.py

+9-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,11 @@ def validate(self, attrs):
9696

9797

9898
@extend_schema_serializer(
99-
deprecate_fields=["registration_backend", "registration_backend_options"]
99+
deprecate_fields=[
100+
"registration_backend",
101+
"registration_backend_options",
102+
"cosign_login_info",
103+
]
100104
)
101105
class FormSerializer(PublicFieldsSerializerMixin, serializers.ModelSerializer):
102106
"""
@@ -120,6 +124,8 @@ class FormSerializer(PublicFieldsSerializerMixin, serializers.ModelSerializer):
120124
)
121125
authentication_backend_options = serializers.DictField(required=False, default=dict)
122126
login_options = LoginOptionsReadOnlyField()
127+
cosign_login_options = LoginOptionsReadOnlyField(is_for_cosign=True)
128+
# TODO: deprecated, remove in 3.0.0
123129
cosign_login_info = CosignLoginInfoSerializer(source="*", read_only=True)
124130
auto_login_authentication_backend = serializers.CharField(
125131
required=False,
@@ -262,6 +268,7 @@ class Meta:
262268
"translations",
263269
"resume_link_lifetime",
264270
"hide_non_applicable_steps",
271+
"cosign_login_options",
265272
"cosign_login_info",
266273
"submission_statements_configuration",
267274
"submission_report_download_link_title",
@@ -292,6 +299,7 @@ class Meta:
292299
"appointment_options",
293300
"resume_link_lifetime",
294301
"hide_non_applicable_steps",
302+
"cosign_login_options",
295303
"cosign_login_info",
296304
"submission_statements_configuration",
297305
"submission_report_download_link_title",

0 commit comments

Comments
 (0)