44
55use Drupal \Component \Utility \NestedArray ;
66use Drupal \Core \Form \FormStateInterface ;
7+ use Drupal \Core \Routing \RouteMatchInterface ;
78use Drupal \os2forms_nemid \Element \NemidCompanyCvrFetchData ;
89use Drupal \os2forms_nemid \Element \NemidCompanyPNumber ;
910use Drupal \os2forms_nemid \Element \NemidCprFetchData ;
1011use Drupal \os2web_datalookup \LookupResult \CompanyLookupResult ;
1112use Drupal \os2web_datalookup \LookupResult \CprLookupResult ;
1213use Drupal \os2web_datalookup \Plugin \DataLookupManager ;
1314use Drupal \os2web_nemlogin \Service \AuthProviderService ;
15+ use Drupal \webform \WebformSubmissionInterface ;
1416
1517/**
1618 * FormsHelper.
2022 * @package Drupal\os2forms_nemid\Service
2123 */
2224class 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