diff --git a/config/schema/webform_encrypt.schema.yml b/config/schema/webform_encrypt.schema.yml new file mode 100644 index 0000000..ac6a70c --- /dev/null +++ b/config/schema/webform_encrypt.schema.yml @@ -0,0 +1,20 @@ +webform.settings.third_party.webform_encrypt: + type: mapping + label: 'Webform encrypt configuration' + mapping: + element: + type: mapping + label: 'Element' + mapping: + settings: + type: sequence + label: 'Element settings' + sequence: + type: mapping + mapping: + encrypt: + type: string + label: 'Encrypt enabled' + encrypt_profile: + type: string + label: 'Encrypt profile' diff --git a/src/Element/WebformElementEncrypt.php b/src/Element/WebformElementEncrypt.php index 2ea13f7..5836511 100644 --- a/src/Element/WebformElementEncrypt.php +++ b/src/Element/WebformElementEncrypt.php @@ -38,7 +38,8 @@ class WebformElementEncrypt extends FormElement { * Processes element attributes. */ public static function processWebformElementEncrypt(&$element, FormStateInterface $form_state, &$complete_form) { - $config = \Drupal::service('config.factory')->get('webform.encrypt')->get('element.settings'); + $webform = $config = $form_state->getFormObject()->getWebform(); + $config = $webform->getThirdPartySetting('webform_encrypt', 'element')['settings']; $values = $form_state->getValues(); $field_name = $values['key']; @@ -59,7 +60,7 @@ class WebformElementEncrypt extends FormElement { '#default_value' => isset($config[$field_name]['encrypt_profile']) ? $config[$field_name]['encrypt_profile'] : NULL, '#states' => [ 'visible' => [ - [':input[name="properties[encrypt]"]' => ['checked' => TRUE]], + [':input[name="encrypt"]' => ['checked' => TRUE]], ] ] ]; @@ -79,16 +80,28 @@ class WebformElementEncrypt extends FormElement { * Validates element attributes. */ public static function validateWebformElementEncrypt(&$element, FormStateInterface $form_state, &$complete_form) { - $config = \Drupal::service('config.factory')->getEditable('webform.encrypt')->get('element.settings'); + $webform = $config = $form_state->getFormObject()->getWebform(); + $config = $webform->getThirdPartySetting('webform_encrypt', 'element'); + $values = $form_state->getValues(); $field_name = $values['key']; - $config[$field_name] = array( - 'encrypt' => $values['encrypt'], - 'encrypt_profile' => $values['encrypt_profile'], - ); + if (empty($values['encrypt'])) { + unset($config['settings'][$field_name]); + } + else { + $config['settings'][$field_name] = array( + 'encrypt' => $values['encrypt'], + 'encrypt_profile' => $values['encrypt_profile'], + ); + } - \Drupal::service('config.factory')->getEditable('webform.encrypt')->set('element.settings', $config)->save(); + if (empty($config['settings'])) { + $webform->unsetThirdPartySetting('webform_encrypt', 'element'); + } + else { + $webform->setThirdPartySetting('webform_encrypt', 'element', $config); + } } } diff --git a/src/WebformEncryptSubmissionStorage.php b/src/WebformEncryptSubmissionStorage.php index a9571f8..ced5608 100644 --- a/src/WebformEncryptSubmissionStorage.php +++ b/src/WebformEncryptSubmissionStorage.php @@ -50,8 +50,8 @@ class WebformEncryptSubmissionStorage extends WebformSubmissionStorage { * An array containing the Webform Submission decrypted data. */ protected function getDecryptedData(WebformSubmission $webform_submission, $check_permissions = TRUE) { - $config = \Drupal::service('config.factory')->get('webform.encrypt')->get('element.settings'); $webform = $webform_submission->getWebform(); + $config = $webform->getThirdPartySetting('webform_encrypt', 'element')['settings']; $elements = $webform->getElementsInitializedFlattenedAndHasValue(); $data = $webform_submission->getData(); diff --git a/tests/modules/webform_encrypt_test/config/install/webform.encrypt.yml b/tests/modules/webform_encrypt_test/config/install/webform.encrypt.yml deleted file mode 100644 index 148bf38..0000000 --- a/tests/modules/webform_encrypt_test/config/install/webform.encrypt.yml +++ /dev/null @@ -1,11 +0,0 @@ -element: - settings: - test_text_field: - encrypt: '1' - encrypt_profile: test_encryption_profile - test_text_area: - encrypt: '1' - encrypt_profile: test_encryption_profile - test_not_encrypted: - encrypt: '' - encrypt_profile: test_encryption_profile diff --git a/tests/modules/webform_encrypt_test/config/install/webform.webform.test_encryption.yml b/tests/modules/webform_encrypt_test/config/install/webform.webform.test_encryption.yml index fe69e79..7a4aedc 100644 --- a/tests/modules/webform_encrypt_test/config/install/webform.webform.test_encryption.yml +++ b/tests/modules/webform_encrypt_test/config/install/webform.webform.test_encryption.yml @@ -1,6 +1,21 @@ langcode: en status: open -dependencies: { } +dependencies: + module: + - webform_encrypt +third_party_settings: + webform_encrypt: + element: + settings: + test_text_field: + encrypt: '1' + encrypt_profile: test_encryption_profile + test_text_area: + encrypt: '1' + encrypt_profile: test_encryption_profile + test_not_encrypted: + encrypt: '1' + encrypt_profile: test_encryption_profile open: null close: null uid: 1 diff --git a/webform_encrypt.install b/webform_encrypt.install index 244ad40..21bd351 100644 --- a/webform_encrypt.install +++ b/webform_encrypt.install @@ -6,6 +6,9 @@ * module. */ +use Drupal\encrypt\Entity\EncryptionProfile; +use Drupal\webform\Entity\Webform; + /** * Implementation of hook_uninstall(). */ @@ -15,11 +18,12 @@ function webform_encrypt_uninstall() { ->fields('wsd', array()) ->execute() ->fetchAll(); - $config = \Drupal::service('config.factory')->get('webform.encrypt')->get('element.settings'); foreach ($submissions as $submission) { - if (isset($config[$submission->name]['encrypt']) && $config[$submission->name]['encrypt']) { - $encryption_profile = \Drupal\encrypt\Entity\EncryptionProfile::load($config[$submission->name]['encrypt_profile']); + $webform = Webform::load($submission->webform_id); + $config = $webform->getThirdPartySetting('webform_encrypt', 'element'); + if (!empty($config['settings'][$submission->name])) { + $encryption_profile = EncryptionProfile::load($config['settings'][$submission->name]['encrypt_profile']); $value = Drupal::service('encryption')->decrypt($submission->value, $encryption_profile); \Drupal::database()->update('webform_submission_data') ->fields(array('value' => $value)) @@ -27,6 +31,4 @@ function webform_encrypt_uninstall() { ->execute(); } } - - \Drupal::configFactory()->getEditable('webform.encrypt')->delete(); } diff --git a/webform_encrypt.module b/webform_encrypt.module index 22c6ee1..27a3eed 100644 --- a/webform_encrypt.module +++ b/webform_encrypt.module @@ -44,7 +44,7 @@ function webform_encrypt_form_webform_ui_element_form_alter(&$form, FormStateInt */ function webform_encrypt_entity_presave(EntityInterface $entity) { if ($entity instanceof WebformSubmission) { - $config = \Drupal::service('config.factory')->get('webform.encrypt')->get('element.settings'); + $config = $entity->getWebform()->getThirdPartySetting('webform_encrypt', 'element')['settings']; $data_original = $entity->getData(); $encryption = Drupal::service('encryption');