You are here

drd_server.admin.inc in Drupal Remote Dashboard Server 6.2

Same filename and directory in other branches
  1. 7.2 drd_server.admin.inc
  2. 7 drd_server.admin.inc

File

drd_server.admin.inc
View source
<?php

/**
 * Settings form for the current module.
 *
 * @param array $form_state
 * @return array
 */
function drd_server_settings(&$form_state) {
  $form = array();
  $form['drd_allowed_referer'] = array(
    '#type' => 'textfield',
    '#title' => t('Allowed referer IP addresses'),
    '#default_value' => variable_get('drd_allowed_referer', ''),
    '#description' => t('Separate multiple values with spaces, commas or semicolons.'),
  );
  $form['drd_aes_keys'] = array(
    '#type' => 'fieldset',
  );
  $keys = variable_get('drd_aes_keys', array());
  foreach (drd_get_allowed_referers() as $ip) {
    $ip = trim($ip);
    if (empty($ip)) {
      continue;
    }
    if (!isset($keys[$ip])) {
      $keys[$ip] = array();
    }
    $keys[$ip] += array(
      'key' => '',
      'cipher' => '',
      'iv' => '',
      'impl' => '',
      'cluster_mode' => FALSE,
      'cluster_ips' => '',
    );
    $form['drd_aes_keys'][$ip] = array(
      '#type' => 'fieldset',
      '#title' => $ip,
    );
    $form['drd_aes_keys'][$ip]['impl'] = array(
      '#type' => 'textfield',
      '#title' => 'Implementation',
      '#default_value' => $keys[$ip]['impl'],
      '#disabled' => TRUE,
    );
    $form['drd_aes_keys'][$ip]['cipher'] = array(
      '#type' => 'textfield',
      '#title' => 'Cipher',
      '#default_value' => $keys[$ip]['cipher'],
      '#disabled' => TRUE,
    );
    $form['drd_aes_keys'][$ip]['key'] = array(
      '#type' => 'textfield',
      '#title' => 'Key',
      '#default_value' => $keys[$ip]['key'],
      '#disabled' => TRUE,
    );
    $form['drd_aes_keys'][$ip]['iv'] = array(
      '#type' => 'textfield',
      '#title' => 'IV',
      '#default_value' => $keys[$ip]['iv'],
      '#disabled' => TRUE,
    );
    $form['drd_aes_keys'][$ip]['cluster_ips'] = array(
      '#type' => 'textarea',
      '#title' => 'IP addresses in cluster mode',
      '#default_value' => $keys[$ip]['cluster_ips'],
      '#disabled' => TRUE,
      '#access' => $keys[$ip]['cluster_mode'],
    );
    $form['drd_aes_keys'][$ip]['edit'] = array(
      '#type' => 'submit',
      '#value' => 'Edit ' . $ip,
    );
  }
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save configuration'),
  );
  $form['drd_server_debug_export'] = array(
    '#type' => 'submit',
    '#value' => t('Export Debug Log'),
  );
  return $form;
}

/**
 * Submit handler for the settings form.
 *
 * @param array $form
 * @param array $form_state
 */
function drd_server_settings_submit($form, $form_state) {
  if ($form_state['values']['op'] == $form_state['values']['drd_server_debug_export']) {
    _drd_server_export_debug_log();
    drupal_goto('admin/config/system/drd_settings');
  }
  if ($form_state['values']['op'] != $form['submit']['#value']) {

    // An edit button was clicked.
    foreach ($form['drd_aes_keys'] as $ip => $key_form) {
      if (is_array($key_form)) {
        if ($key_form['edit']['#value'] == $form_state['values']['op']) {
          drupal_goto('admin/settings/drd_settings/' . $ip);
        }
      }
    }

    // No valid button was found
    drupal_goto('admin/config/system/drd_settings');
  }
  variable_set('drd_allowed_referer', $form_state['values']['drd_allowed_referer']);
  $ips = drd_get_allowed_referers($form_state['values']['drd_allowed_referer']);
  $aes_keys = variable_get('drd_aes_keys', array());
  foreach ($aes_keys as $key => $def) {
    $aes_keys[$key]['keep'] = FALSE;
  }
  $changed = FALSE;
  if (!empty($aes_keys)) {
    $keys = array_keys($aes_keys);
    $master = $aes_keys[$keys[0]];
    foreach ($ips as $ip) {
      if (!array_key_exists($ip, $aes_keys)) {
        $aes_keys[$ip] = $master;
        $aes_keys[$ip]['keep'] = TRUE;
        $changed = TRUE;
      }
      else {
        $aes_keys[$ip]['keep'] = TRUE;
      }
    }
  }
  foreach ($aes_keys as $key => $def) {
    if (!$aes_keys[$key]['keep']) {
      unset($aes_keys[$key]);
      $changed = TRUE;
    }
  }
  if ($changed) {
    variable_set('drd_aes_keys', $aes_keys);
    $sites = drd_server_read_sites();
    drd_server_key_remote($sites, $aes_keys);
  }
}

/**
 * AES key settings form for an IP of an accepted DRD instance.
 *
 * @param array $form_state
 *   Form_state array.
 * @param string $ip
 *   The IP address for which the settings should be edited
 *
 * @return array
 *   Array containing the form.
 */
function drd_server_settings_keys($form_state, $ip) {
  $allowed = drd_get_allowed_referers();
  if (!in_array($ip, $allowed)) {
    drupal_not_found();
    exit;
  }
  drupal_set_title(t('Set AES keys for !ip', array(
    '!ip' => $ip,
  )));
  $keys = variable_get('drd_aes_keys', array());
  if (!isset($keys[$ip])) {
    $keys[$ip] = array();
  }
  $keys[$ip] += array(
    'key' => '',
    'cipher' => '',
    'iv' => '',
    'impl' => '',
    'cluster_mode' => FALSE,
    'cluster_ips' => '',
  );
  $form = array();
  $form['#ip'] = $ip;

  // AES settings
  $phpsec_load_result = _drd_server_aes_load_phpsec();
  $phpsec_loaded = $phpsec_load_result > 0;
  $encryption_implementations = array();
  if ($phpsec_loaded) {
    $encryption_implementations['phpseclib'] = t('PHP Secure Communications Library (phpseclib)');
  }
  if (extension_loaded('mcrypt')) {
    $encryption_implementations['mcrypt'] = t('Mcrypt extension');
  }
  if (empty($encryption_implementations)) {
    $encryption_implementations = array(
      t('None!'),
    );
  }
  $form['aes_implementation'] = array(
    '#type' => 'select',
    '#title' => t('AES implementation'),
    '#options' => $encryption_implementations,
    '#default_value' => $keys[$ip]['impl'],
  );
  $form['aes_cipher'] = array(
    '#type' => 'select',
    '#title' => t('Cipher'),
    '#options' => array(
      'rijndael-128' => 'Rijndael 128',
      'rijndael-192' => 'Rijndael 192',
      'rijndael-256' => 'Rijndael 256',
    ),
    '#default_value' => $keys[$ip]['cipher'],
    '#states' => array(
      'invisible' => array(
        ':input[name="aes_implementation"]' => array(
          'value' => 'phpseclib',
        ),
      ),
    ),
  );
  $form['aes_iv'] = array(
    '#type' => 'textfield',
    '#title' => 'IV',
    '#default_value' => $keys[$ip]['iv'],
  );
  $form['aes_key'] = array(
    '#type' => 'textfield',
    '#title' => 'Key',
    '#default_value' => $keys[$ip]['key'],
  );
  $form['aes']['cluster_mode'] = array(
    '#type' => 'checkbox',
    '#title' => 'Operate on a cluster behind load balancer',
    '#default_value' => $keys[$ip]['cluster_mode'],
  );
  $form['aes']['cluster_ips'] = array(
    '#type' => 'textarea',
    '#title' => 'IP addresses in cluster mode',
    '#default_value' => $keys[$ip]['cluster_ips'],
    '#description' => t('One IP address per line'),
  );
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save configuration'),
  );
  $form['cancel'] = array(
    '#type' => 'submit',
    '#value' => t('Cancel'),
  );
  return $form;
}

/**
 * Submit handler for the AES key settings form.
 *
 * @param array $form
 *   Form definition.
 * @param array $form_state
 *   Form_state array including form values and more.
 */
function drd_server_settings_keys_submit($form, $form_state) {
  if ($form_state['values']['op'] == $form_state['values']['submit']) {
    $ip = $form['#ip'];
    $keys = variable_get('drd_aes_keys', array());
    $old_key = isset($keys[$ip]) ? serialize($keys[$ip]) : '';
    $keys[$ip] = array(
      'key' => $form_state['values']['aes_key'],
      'cipher' => $form_state['values']['aes_cipher'],
      'iv' => $form_state['values']['aes_iv'],
      'impl' => $form_state['values']['aes_implementation'],
      'cluster_mode' => $form_state['values']['cluster_mode'],
      'cluster_ips' => $form_state['values']['cluster_ips'],
    );
    $new_key = serialize($keys[$ip]);
    if ($old_key != $new_key) {
      variable_set('drd_aes_keys', $keys);
      $sites = drd_server_read_sites();
      drd_server_key_remote($sites, $keys);
    }
  }
  drupal_goto('admin/config/system/drd_settings');
}

/**
 * Exports all current debug log entries from watchdog to an HTML file.
 */
function _drd_server_export_debug_log() {
  if (!module_exists('dblog')) {
    drupal_set_message('Module dblog not enabled, nothing to export.', 'error');
    return;
  }
  $entries = db_query("SELECT message, variables, timestamp FROM {watchdog} WHERE type='DRD Server' ORDER BY wid");
  $filename = 'drd_server_debug_' . format_date(REQUEST_TIME, 'custom', 'Ymd_hi') . '.html';
  $n = 0;
  $html = '<html><body><h1>DRD Server Debug Log</h1>';
  while ($entry = db_fetch_object($entries)) {
    $n++;
    $html .= '<p><span>' . $entry->timestamp . '</span> ' . t($entry->message, unserialize($entry->variables)) . '</p>';
  }
  $html .= '</body></html>';
  $fullname = file_directory_temp() . '/' . $filename;
  file_put_contents($fullname, $html);
  drupal_set_message(t('DRD Server debug exported with !n records. Get the file !filename from your server.', array(
    '!n' => $n,
    '!filename' => $fullname,
  )));
}

Functions

Namesort descending Description
drd_server_settings Settings form for the current module.
drd_server_settings_keys AES key settings form for an IP of an accepted DRD instance.
drd_server_settings_keys_submit Submit handler for the AES key settings form.
drd_server_settings_submit Submit handler for the settings form.
_drd_server_export_debug_log Exports all current debug log entries from watchdog to an HTML file.