diff --git a/config/schema/webform_encrypt.schema.yml b/config/schema/webform_encrypt.schema.yml new file mode 100644 index 0000000..6a83607 --- /dev/null +++ b/config/schema/webform_encrypt.schema.yml @@ -0,0 +1,16 @@ +webform.settings.third_party.webform_encrypt: + type: mapping + label: 'Webform encrypt configuration' + mapping: + element: + type: sequence + label: 'Element' + sequence: + type: mapping + mapping: + encrypt: + type: boolean + label: 'Encrypt enabled' + encrypt_profile: + type: string + label: 'Encrypt profile' diff --git a/src/Element/WebformElementEncrypt.php b/src/Element/WebformElementEncrypt.php index 2ea13f7..9717516 100644 --- a/src/Element/WebformElementEncrypt.php +++ b/src/Element/WebformElementEncrypt.php @@ -38,10 +38,10 @@ 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(); $values = $form_state->getValues(); - $field_name = $values['key']; - + $element_name = $values['key']; + $config = $webform->getThirdPartySetting('webform_encrypt', 'element'); $encryption_options = \Drupal::service('encrypt.encryption_profile.manager')->getEncryptionProfileNamesAsOptions(); if (count($encryption_options) > 0) { @@ -49,17 +49,17 @@ class WebformElementEncrypt extends FormElement { '#type' => 'checkbox', '#title' => t('Encrypt this field\'s value'), '#description' => t('Click here to edit encryption settings.', array(':link' => Url::fromRoute('entity.encryption_profile.collection')->toString())), - '#default_value' => isset($config[$field_name]['encrypt']) ? $config[$field_name]['encrypt'] : 0, + '#default_value' => isset($config[$element_name]['encrypt']) ? $config[$element_name]['encrypt'] : FALSE, ]; $element['element_encrypt']['encrypt_profile'] = [ '#type' => 'select', '#title' => t('Select Encryption Profile'), '#options' => $encryption_options, - '#default_value' => isset($config[$field_name]['encrypt_profile']) ? $config[$field_name]['encrypt_profile'] : NULL, + '#default_value' => isset($config[$element_name]['encrypt_profile']) ? $config[$element_name]['encrypt_profile'] : NULL, '#states' => [ 'visible' => [ - [':input[name="properties[encrypt]"]' => ['checked' => TRUE]], + [':input[name="encrypt"]' => ['checked' => TRUE]], ] ] ]; @@ -79,16 +79,29 @@ 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 = $form_state->getFormObject()->getWebform(); $values = $form_state->getValues(); + $element_name = $values['key']; + $config = $webform->getThirdPartySetting('webform_encrypt', 'element'); - $field_name = $values['key']; - $config[$field_name] = array( - 'encrypt' => $values['encrypt'], - 'encrypt_profile' => $values['encrypt_profile'], - ); - - \Drupal::service('config.factory')->getEditable('webform.encrypt')->set('element.settings', $config)->save(); + // To avoid generating an unnecessary dependencies on webform_encrypt: + // 1. Only set our third party settings if we are encrypting the element. + // 2. Unset our third party settings if not encrypting the element. + if (isset($values['encrypt']) && $values['encrypt'] == 1) { + $config[$element_name] = [ + 'encrypt' => $values['encrypt'], + 'encrypt_profile' => $values['encrypt_profile'], + ]; + } + else { + unset($config[$element_name]); + } + if (empty($config)) { + $webform->unsetThirdPartySetting('webform_encrypt', 'element'); + } + else { + $webform->setThirdPartySetting('webform_encrypt', 'element', $config); + } } } diff --git a/src/WebformEncryptSubmissionStorage.php b/src/WebformEncryptSubmissionStorage.php index a9571f8..543a233 100644 --- a/src/WebformEncryptSubmissionStorage.php +++ b/src/WebformEncryptSubmissionStorage.php @@ -50,7 +50,6 @@ 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(); $elements = $webform->getElementsInitializedFlattenedAndHasValue(); $data = $webform_submission->getData(); @@ -60,7 +59,7 @@ class WebformEncryptSubmissionStorage extends WebformSubmissionStorage { if (!isset($data[$element_name])) { continue; } - + $config = $webform->getThirdPartySetting('webform_encrypt', 'element'); // Skip elements that are not encrypted. if (empty($config[$element_name]['encrypt'])) { continue; 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..9bbe9e3 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,17 @@ langcode: en status: open -dependencies: { } +dependencies: + module: + - webform_encrypt +third_party_settings: + webform_encrypt: + element: + test_text_field: + encrypt: true + encrypt_profile: test_encryption_profile + test_text_area: + encrypt: true + encrypt_profile: test_encryption_profile open: null close: null uid: 1 @@ -39,12 +50,6 @@ settings: submission_label: '' submission_log: false submission_user_columns: { } - wizard_progress_bar: true - wizard_progress_pages: false - wizard_progress_percentage: false - wizard_start_label: '' - wizard_complete: true - wizard_complete_label: '' preview: 0 preview_label: '' preview_title: '' diff --git a/tests/src/Functional/WebformEncryptFunctionalTest.php b/tests/src/Functional/WebformEncryptFunctionalTest.php index 93d4863..d4c41c2 100644 --- a/tests/src/Functional/WebformEncryptFunctionalTest.php +++ b/tests/src/Functional/WebformEncryptFunctionalTest.php @@ -29,13 +29,6 @@ class WebformEncryptFunctionalTest extends BrowserTestBase { ]; /** - * Don't validate config schema https://www.drupal.org/node/2901950. - * - * @var bool - */ - protected $strictConfigSchema = FALSE; - - /** * Permissions to grant admin user. * * @var array @@ -72,7 +65,7 @@ class WebformEncryptFunctionalTest extends BrowserTestBase { $edit = [ 'key' => 'test_date', 'title' => 'Test date', - 'encrypt' => 1, + 'encrypt' => TRUE, 'encrypt_profile' => 'test_encryption_profile', ]; $this->submitForm($edit, 'Save'); diff --git a/webform_encrypt.install b/webform_encrypt.install index 244ad40..fadb088 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[$submission->name])) { + $encryption_profile = EncryptionProfile::load($config[$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,56 @@ function webform_encrypt_uninstall() { ->execute(); } } +} + +/** + * Migrate webform encrypt enabed elements to using third party settings. + */ +function webform_encrypt_update_8101() { + // Upgrade path for https://www.drupal.org/node/2921824 + + // Get a list of all encrypt enabled webform elements + $old_config = \Drupal::service('config.factory')->get('webform.encrypt')->get('element.settings'); + + if (!empty($old_config)) { + foreach ($old_config as $element_name => $config) { + if ($config['encrypt'] !== '1') { + unset($old_config[$element_name]); + } + } + } + if (!empty($old_config)) { + // Loop through all webform on the site. + $webforms = Webform::loadMultiple(); + foreach ($webforms as $webform) { + $webform_elements = $webform->getElementsDecoded(); + $webform_elements_names = array_keys($webform_elements); + $new_config = []; + foreach ($webform_elements_names as $webform_element_name) { + // If the webform is using an encrypt enabled element. + if (isset($old_config[$webform_element_name])) { + // Add the new settings to be saved. + $values = $old_config[$webform_element_name]; + $new_config[$webform_element_name] = [ + 'encrypt' => ($values['encrypt'] == '1'), + 'encrypt_profile' => $values['encrypt_profile'], + ]; + } + } + if (!empty($new_config)) { + $webform->setThirdPartySetting('webform_encrypt', 'element', $new_config); + drupal_set_message(t('Set webform_encrypt settings for %elements on the webform %webform.', array( + '%elements' => implode(', ', array_keys($new_config)), + '%webform' => $webform->get('title'), + ))); + $webform->save(); + drupal_set_message(t('Saved the webform %webform with the new webform_encrypt settings.', array('%webform' => $webform->get('title')))); + } + } + } + // Delete the old config \Drupal::configFactory()->getEditable('webform.encrypt')->delete(); + drupal_set_message('webform.encrypt configuration object deleted. If you had exported it you should remove it from your filesystem now.'); + drupal_flush_all_caches(); } diff --git a/webform_encrypt.module b/webform_encrypt.module index 22c6ee1..4234e97 100644 --- a/webform_encrypt.module +++ b/webform_encrypt.module @@ -44,20 +44,20 @@ 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'); $data_original = $entity->getData(); - $encryption = Drupal::service('encryption'); + $webform = $entity->getWebform(); - foreach ($data_original as $key => $value) { - if (empty($config[$key]['encrypt'])) { + foreach ($data_original as $element_name => $value) { + $config = $webform->getThirdPartySetting('webform_encrypt', 'element'); + if (empty($config[$element_name]['encrypt'])) { // Encryption is disabled to this field. - $data[$key] = $value; + $data[$element_name] = $value; continue; } - $encryption_profile = EncryptionProfile::load($config[$key]['encrypt_profile']); + $encryption_profile = EncryptionProfile::load($config[$element_name]['encrypt_profile']); // Checks whether is an element with multiple values. if (is_array($value)) { @@ -65,13 +65,13 @@ function webform_encrypt_entity_presave(EntityInterface $entity) { foreach ($value as $multiple_values_key => $multiple_values_value) { $multiple_values[$multiple_values_key] = $encryption->encrypt($multiple_values_value, $encryption_profile); } - $data[$key] = $multiple_values; + $data[$element_name] = $multiple_values; continue; } // Single element value. - $data[$key] = $encryption->encrypt($value, $encryption_profile); + $data[$element_name] = $encryption->encrypt($value, $encryption_profile); } $entity->setData($data);