Skip to content

Commit 4999654

Browse files
authored
Merge pull request #92 from itk-dev/feature/nemid-address-protection-deny-user
#867: Allow denying address protected citizen from webform
2 parents acd6d62 + 614ca16 commit 4999654

File tree

5 files changed

+169
-2
lines changed

5 files changed

+169
-2
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ before starting to add changes. Use example [placed in the end of the page](#exa
1414
- Adding Lat and Long fetching to DataAddress
1515
- [#84](https://github.com/OS2Forms/os2forms/pull/84)
1616
Added digital post test command.
17+
- [#92](https://github.com/OS2Forms/os2forms/pull/92)
18+
Allow denying address protected citizen from webform.
1719
- [#96](https://github.com/OS2Forms/os2forms/pull/96)
1820
NemLogin autologout pop-up styling.
1921
- [#99](https://github.com/OS2Forms/os2forms/pull/99)

modules/os2forms_nemid/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ Besides this module adds a special settings to the Third Party Webform settings:
1414

1515
- Webform type
1616
- Redirect to nemlogin automatically
17+
- Hide form if under address protection
1718

1819
Settings: admin/structure/webform/manage/[webform]/settings
1920

modules/os2forms_nemid/os2forms_nemid.module

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ use Drupal\migrate\Plugin\MigrateSourceInterface;
1111
use Drupal\migrate\Plugin\MigrationInterface;
1212
use Drupal\migrate\Row;
1313
use Drupal\os2forms_nemid\Plugin\WebformElement\NemidElementBase;
14+
use Drupal\os2forms_nemid\Service\FormsHelper;
15+
use Drupal\webform\Utility\WebformFormHelper;
16+
use Drupal\webform\WebformSubmissionInterface;
1417

1518
/**
1619
* Implements hook_form_FORM_ID_alter().
@@ -21,6 +24,15 @@ function os2forms_nemid_form_webform_os2forms_settings_form_alter(&$form, FormSt
2124
os2forms_nemid_webform_third_party_settings_form_alter($form, $form_state);
2225
}
2326

27+
/**
28+
* Implements hook_ENTITY_TYPE_prepare_form().
29+
*
30+
* Prepare webform.
31+
*/
32+
function os2forms_nemid_webform_submission_prepare_form(WebformSubmissionInterface $webform_submission, string $operation, FormStateInterface $form_state): void {
33+
Drupal::service('os2forms_nemid.forms_helper')->webformSubmissionPrepareForm($webform_submission, $operation, $form_state);
34+
}
35+
2436
/**
2537
* Implements hook_webform_third_party_settings_form_alter().
2638
*/
@@ -71,12 +83,76 @@ function os2forms_nemid_webform_third_party_settings_form_alter(&$form, FormStat
7183
'#default_value' => !(empty($settings)) ? $settings['nemlogin_auto_redirect'] : FALSE,
7284
'#description' => t('Redirection will happen right after user has is accessing the form, if user is already authenticated via NemID, redirection will not happen.'),
7385
];
86+
87+
$nemloginProtectionSettings = $webform->getThirdPartySetting('os2forms', 'os2forms_nemid_address_protection');
88+
89+
// OS2Forms NemID.
90+
$form['third_party_settings']['os2forms']['os2forms_nemid_address_protection'] = [
91+
'#type' => 'details',
92+
'#title' => t('OS2Forms address protection settings'),
93+
'#open' => TRUE,
94+
];
95+
96+
// Nemlogin auto redirect.
97+
$form['third_party_settings']['os2forms']['os2forms_nemid_address_protection']['nemlogin_hide_form'] = [
98+
'#type' => 'select',
99+
'#options' => [
100+
FormsHelper::WEBFORM_NEM_LOGIN_ADDRESS_PROTECTION_DEFAULT_BEHAVIOUR => t('No'),
101+
FormsHelper::WEBFORM_NEM_LOGIN_ADDRESS_PROTECTION_DISPLAY_ERROR => t('Yes'),
102+
],
103+
'#title' => t('Hide form if user is under address protection'),
104+
'#default_value' => !(empty($nemloginProtectionSettings)) ? $nemloginProtectionSettings['nemlogin_hide_form'] : FormsHelper::WEBFORM_NEM_LOGIN_ADDRESS_PROTECTION_DEFAULT_BEHAVIOUR,
105+
'#description' => t('Hides elements and displays error if nemlogin reveals that citizen is under address protection and an address element is found on the webform'),
106+
];
107+
108+
// Nemlogin address protection.
109+
$form['third_party_settings']['os2forms']['os2forms_nemid_address_protection']['nemlogin_hide_message'] = [
110+
'#title' => t('Access denied message'),
111+
'#type' => 'textarea',
112+
'#default_value' => !(empty($nemloginProtectionSettings)) ? $nemloginProtectionSettings['nemlogin_hide_message'] : '',
113+
'#description' => t('Message shown to user when visiting form'),
114+
'#states' => [
115+
'visible' => [
116+
[':input[name="third_party_settings[os2forms][os2forms_nemid_address_protection][nemlogin_hide_form]"]' => ['value' => FormsHelper::WEBFORM_NEM_LOGIN_ADDRESS_PROTECTION_DISPLAY_ERROR]],
117+
],
118+
'required' => [
119+
[':input[name="third_party_settings[os2forms][os2forms_nemid_address_protection][nemlogin_hide_form]"]' => ['value' => FormsHelper::WEBFORM_NEM_LOGIN_ADDRESS_PROTECTION_DISPLAY_ERROR]],
120+
],
121+
],
122+
];
74123
}
75124

76125
/**
77126
* Implements hook_webform_submission_form_alter().
78127
*/
79128
function os2forms_nemid_webform_submission_form_alter(array &$form, FormStateInterface $form_state, $form_id) {
129+
130+
// Handle address protection.
131+
if ($tempValue = $form_state->getTemporaryValue(FormsHelper::ADDRESS_PROTECTION_STATE)) {
132+
if (FALSE === ($tempValue['access'] ?? TRUE)) {
133+
// Flattening the elements makes it much easier to access nested elements.
134+
$elements = &WebformFormHelper::flattenElements($form['elements']);
135+
136+
$message = $tempValue['message'] ?? t('This form cannot be shown because you have address protection');
137+
138+
$form['os2forms_nemlogin_message'] = [
139+
'#theme' => 'status_messages',
140+
'#message_list' => [
141+
'error' => [$message],
142+
],
143+
];
144+
145+
// Hide all actions ….
146+
$form['actions']['#access'] = FALSE;
147+
// … and elements.
148+
foreach ($elements as &$element) {
149+
$element['#access'] = FALSE;
150+
}
151+
}
152+
153+
return;
154+
}
155+
80156
// Getting webform Nemid settings.
81157
/** @var \Drupal\webform\WebformSubmissionInterface Interface $webformSubmission */
82158
$webformSubmission = $form_state->getFormObject()->getEntity();

modules/os2forms_nemid/os2forms_nemid.services.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ services:
66
- {name: event_subscriber}
77
os2forms_nemid.forms_helper:
88
class: Drupal\os2forms_nemid\Service\FormsHelper
9-
arguments: ['@os2web_nemlogin.auth_provider', '@plugin.manager.os2web_datalookup']
9+
arguments: ['@os2web_nemlogin.auth_provider', '@plugin.manager.os2web_datalookup', '@current_route_match']

modules/os2forms_nemid/src/Service/FormsHelper.php

Lines changed: 89 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44

55
use Drupal\Component\Utility\NestedArray;
66
use Drupal\Core\Form\FormStateInterface;
7+
use Drupal\Core\Routing\RouteMatchInterface;
78
use Drupal\os2forms_nemid\Element\NemidCompanyCvrFetchData;
89
use Drupal\os2forms_nemid\Element\NemidCompanyPNumber;
910
use Drupal\os2forms_nemid\Element\NemidCprFetchData;
1011
use Drupal\os2web_datalookup\LookupResult\CompanyLookupResult;
1112
use Drupal\os2web_datalookup\LookupResult\CprLookupResult;
1213
use Drupal\os2web_datalookup\Plugin\DataLookupManager;
1314
use Drupal\os2web_nemlogin\Service\AuthProviderService;
15+
use Drupal\webform\WebformSubmissionInterface;
1416

1517
/**
1618
* FormsHelper.
@@ -20,6 +22,32 @@
2022
* @package Drupal\os2forms_nemid\Service
2123
*/
2224
class FormsHelper {
25+
const ADDRESS_PROTECTION_STATE = 'os2forms_nemlogin_address_protection';
26+
27+
/**
28+
* Defines NemID login address protection display error option.
29+
*/
30+
const WEBFORM_NEM_LOGIN_ADDRESS_PROTECTION_DISPLAY_ERROR = 'os2forms_nemlogin_address_protection_display_error';
31+
32+
/**
33+
* Defines NemID login address protection display default behaviour.
34+
*/
35+
const WEBFORM_NEM_LOGIN_ADDRESS_PROTECTION_DEFAULT_BEHAVIOUR = 'os2forms_nemlogin_address_protection_default_behaviour';
36+
37+
/**
38+
* Defines NemID login address related elements.
39+
*/
40+
private const WEBFORM_NEM_LOGIN_ADDRESS_PROTECTION_ELEMENT_TYPES = [
41+
'os2forms_nemid_address',
42+
'os2forms_nemid_street',
43+
'os2forms_nemid_house_nr',
44+
'os2forms_nemid_floor',
45+
'os2forms_nemid_apartment_nr',
46+
'os2forms_nemid_postal_code',
47+
'os2forms_nemid_city',
48+
'os2forms_nemid_kommunekode',
49+
'os2forms_nemid_coaddress',
50+
];
2351

2452
/**
2553
* Auth provider service.
@@ -35,17 +63,27 @@ class FormsHelper {
3563
*/
3664
private $dataLookManager;
3765

66+
/**
67+
* The route match.
68+
*
69+
* @var \Drupal\Core\Routing\RouteMatchInterface
70+
*/
71+
private RouteMatchInterface $routeMatch;
72+
3873
/**
3974
* Constructor.
4075
*
4176
* @param \Drupal\os2web_nemlogin\Service\AuthProviderService $authProviderService
4277
* Auth provider service.
4378
* @param \Drupal\os2web_datalookup\Plugin\DataLookupManager $dataLookPluginManager
4479
* Datalookup plugin manager.
80+
* @param \Drupal\Core\Routing\RouteMatchInterface $routeMatch
81+
* Route match service.
4582
*/
46-
public function __construct(AuthProviderService $authProviderService, DataLookupManager $dataLookPluginManager) {
83+
public function __construct(AuthProviderService $authProviderService, DataLookupManager $dataLookPluginManager, RouteMatchInterface $routeMatch) {
4784
$this->authProviderService = $authProviderService;
4885
$this->dataLookManager = $dataLookPluginManager;
86+
$this->routeMatch = $routeMatch;
4987
}
5088

5189
/**
@@ -307,4 +345,54 @@ protected function getDataFetchTriggerValue($dataFetchValueFieldName, FormStateI
307345
return $value;
308346
}
309347

348+
/**
349+
* Implements hook_ENTITY_TYPE_prepare_form().
350+
*/
351+
public function webformSubmissionPrepareForm(WebformSubmissionInterface $webformSubmission, string $operation, FormStateInterface $formState): void {
352+
// Only perform address protection check when displaying submission form.
353+
$accessCheckRouteNames = [
354+
// Webform attached to a node.
355+
'entity.node.canonical',
356+
// Creating a new submission.
357+
'entity.webform.canonical',
358+
// Editing a submission.
359+
'entity.webform_submission.edit_form',
360+
];
361+
362+
if (!in_array($this->routeMatch->getRouteName(), $accessCheckRouteNames, TRUE)) {
363+
return;
364+
}
365+
366+
// Check if hide address protection is selected.
367+
$hideForm = $webformSubmission->getWebform()->getThirdPartySettings('os2forms')['os2forms_nemid_address_protection']['nemlogin_hide_form'] ?? NULL;
368+
369+
if ($hideForm === self::WEBFORM_NEM_LOGIN_ADDRESS_PROTECTION_DISPLAY_ERROR) {
370+
$cprResult = $this->retrieveCprLookupResult($formState);
371+
372+
if ($cprResult && $cprResult->isNameAddressProtected()) {
373+
374+
// Check if any element violating address
375+
// protection is present in webform.
376+
$elements = $webformSubmission->getWebform()->getElementsDecodedAndFlattened();
377+
378+
foreach ($elements as $element) {
379+
380+
if (in_array($element['#type'], self::WEBFORM_NEM_LOGIN_ADDRESS_PROTECTION_ELEMENT_TYPES)) {
381+
382+
// Violation detected,
383+
// mark form state with temporary key and return.
384+
$message = $webformSubmission->getWebform()->getThirdPartySettings('os2forms')['os2forms_nemid_address_protection']['nemlogin_hide_message'];
385+
386+
$formState->setTemporaryValue(self::ADDRESS_PROTECTION_STATE, [
387+
'access' => FALSE,
388+
'message' => $message,
389+
]);
390+
391+
return;
392+
}
393+
}
394+
}
395+
}
396+
}
397+
310398
}

0 commit comments

Comments
 (0)