You are here

webform_encrypt.module in Webform Encrypt 6

Same filename and directory in other branches
  1. 8 webform_encrypt.module
  2. 7 webform_encrypt.module

Main module file for the Webform Encrypt module.

File

webform_encrypt.module
View source
<?php

/**
 * @file
 * Main module file for the Webform Encrypt module.
 */

/**
 * Implementation of hook_perm().
 */
function webform_encrypt_perm() {
  return array(
    'view encrypted values',
  );
}

/**
 * Implementation of hook_form_FORM_ID_alter()
 */
function webform_encrypt_form_webform_admin_settings_alter(&$form, $form_state) {

  // Add our config options to the webform settings page.
  $form['encrypt'] = array(
    '#type' => 'fieldset',
    '#title' => t('Webform Encrypt'),
    '#collapsible' => TRUE,
    '#collapsed' => FALSE,
  );
  $form['encrypt']['webform_encrypt_match_user'] = array(
    '#type' => 'checkbox',
    '#title' => t('Enable email to user matching'),
    '#description' => t('If enabled, every time webform sends an email, it will attempt to find a user that matches the email address the mail will be sent to in order to correctly determine permissions.'),
    '#default_value' => variable_get('webform_encrypt_match_user', 0),
  );
}

/**
 * Implementation of hook_form_FORM_ID_alter()
 */
function webform_encrypt_form_webform_component_edit_form_alter(&$form, $form_state) {

  // Add our fields to the component add/edit form.
  $component = $form['#parameters'][3];

  // Exclude webform component types that don't make sense to encrypt.
  $excluded_types = array(
    'fieldset',
    'file',
    'markup',
    'pagebreak',
  );
  if (!in_array($form['type']['#value'], $excluded_types)) {

    // Add settings for encryption.
    $form['encryption'] = array(
      '#type' => 'fieldset',
      '#title' => t('Encryption'),
      '#tree' => TRUE,
    );
    $form['encryption']['encrypt'] = array(
      '#type' => 'checkbox',
      '#title' => t('Encrypt this field\'s value'),
      '#description' => t('!link to edit encryption settings.', array(
        '!link' => l('Click here', 'admin/settings/encrypt'),
      )),
      '#default_value' => isset($component['extra']['encrypt']) ? $component['extra']['encrypt'] : 0,
    );
  }
}

/**
 * Implementation of hook_form_alter().
 */
function webform_encrypt_form_alter(&$form, &$form_state, $form_id) {

  // When we are editing a webform submission,
  if (strpos($form_id, 'webform_client_form_') === 0 && $form['details']['sid']['#value']) {
    _webform_encrypt_decrypt_nested_values($form['submitted']);
  }
}

/**
 * Implementation of hook_webform_component_presave().
 * Save encryption settings for a component.
 */
function webform_encrypt_webform_component_presave(&$component) {
  if (!empty($component['encryption'])) {
    $component['extra'] = array_merge($component['extra'], $component['encryption']);
    unset($component['encryption']);
  }
}

/**
 * Implementation of hook_webform_submission_presave().
 * Encrypt the value if the component has been marked as such.
 */
function webform_encrypt_webform_submission_presave($node, &$submission) {
  foreach ($submission->data as $cid => $entry) {
    if (!empty($node->webform['components'][$cid]['extra']['encrypt'])) {
      $submission->data[$cid]['value'][0] = encrypt($entry['value'][0], array(
        'base64' => TRUE,
      ));
    }
  }
}

/**
 * Implementation of hook_webform_submission_render_alter().
 * Decrypt values when displaying webform submissions.
 */
function webform_encrypt_webform_submission_render_alter(&$renderable) {

  // First, determine if 1) if we are dealing with an email or a page view, and 2) if user matching
  // is enabled.
  if (variable_get('webform_encrypt_match_user', 0) && !empty($renderable['#email'])) {

    // If we are, then try to match a user to the email address we are sending to.
    $uid = db_result(db_query('SELECT uid FROM {users} WHERE mail = "%s"', array(
      $renderable['#email']['email'],
    )));
    $account = $uid ? user_load($uid) : NULL;
  }
  else {
    $account = NULL;
  }

  // Next, we loop through components and decrypt as necessary.
  foreach ($renderable['#submission']->data as $cid => $entry) {
    if (!empty($renderable['#node']->webform['components'][$cid]['extra']['encrypt'])) {
      $form_key = $renderable['#node']->webform['components'][$cid]['form_key'];
      if (user_access('view encrypted values')) {
        $renderable[$form_key]['#value'] = decrypt($entry['value'][0], array(
          'base64' => TRUE,
        ));
      }
      else {
        $renderable[$form_key]['#value'] = t('[Value Encrypted]');
      }
    }
  }
}

/**
 * Helper function to recursively decrypt values in a webform structure.
 */
function _webform_encrypt_decrypt_nested_values(&$element) {
  foreach (element_children($element) as $name) {
    $component =& $element[$name];
    if (!empty($component['#webform_component']['extra']['encrypt'])) {
      $component['#default_value'] = decrypt($component['#default_value'], array(
        'base64' => TRUE,
      ));
    }
    _webform_encrypt_decrypt_nested_values($component);
  }
}

Functions

Namesort descending Description
webform_encrypt_form_alter Implementation of hook_form_alter().
webform_encrypt_form_webform_admin_settings_alter Implementation of hook_form_FORM_ID_alter()
webform_encrypt_form_webform_component_edit_form_alter Implementation of hook_form_FORM_ID_alter()
webform_encrypt_perm Implementation of hook_perm().
webform_encrypt_webform_component_presave Implementation of hook_webform_component_presave(). Save encryption settings for a component.
webform_encrypt_webform_submission_presave Implementation of hook_webform_submission_presave(). Encrypt the value if the component has been marked as such.
webform_encrypt_webform_submission_render_alter Implementation of hook_webform_submission_render_alter(). Decrypt values when displaying webform submissions.
_webform_encrypt_decrypt_nested_values Helper function to recursively decrypt values in a webform structure.