You are here

drd_server.admin.inc in Drupal Remote Dashboard Server 7.2

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

Provides functionality for configuring drd_server and to return blocks for the admin module.

File

drd_server.admin.inc
View source
<?php

/**
 * @file
 * Provides functionality for configuring drd_server and to return blocks for the admin module.
 */

/**
 * Settings form for the current module.
 *
 * @param array $form
 *   Form array.
 * @param array $form_state
 *   Form_state array.
 *
 * @return array
 *   Array containing the system settings form.
 */
function drd_server_settings($form, $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' => 'container',
  );
  $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['actions']['#type'] = 'actions';
  $form['actions']['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save configuration'),
  );
  $form['actions']['drd_server_debug_export'] = array(
    '#type' => 'submit',
    '#value' => t('Export Debug Log'),
  );
  return $form;
}

/**
 * Submit handler for the settings form.
 *
 * @param array $form
 *   Form definition.
 * @param array $form_state
 *   Form_state array including form values and more.
 */
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['actions']['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/config/system/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
 *   Form array.
 * @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, $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['#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['cluster_mode'] = array(
    '#type' => 'checkbox',
    '#title' => 'Operate on a cluster behind load balancer',
    '#default_value' => $keys[$ip]['cluster_mode'],
  );
  $form['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['actions']['#type'] = 'actions';
  $form['actions']['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save configuration'),
  );
  $form['actions']['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');
}

/**
 * DRD Server Admin menu to be used in admin block or navbar hook.
 *
 * @return array
 *   Array of admin items ready for list-item theming.
 */
function drd_server_admin_menu() {
  $menu = array();
  if (user_access('administer site configuration')) {
    $menu[] = array(
      'data' => l(t('Run Cron'), 'admin/reports/status/run-cron'),
      'class' => array(
        'leaf',
      ),
    );
    $menu[] = array(
      'data' => l(t('Run Update'), 'update.php'),
      'class' => array(
        'leaf',
      ),
    );
    if (module_exists('job_scheduler')) {
      $destination = drupal_get_destination();
      $menu[] = array(
        'data' => l(t('Rebuild Scheduler'), 'admin/drd_server/rebuild_scheduler', array(
          'query' => $destination,
        )),
        'class' => array(
          'leaf',
        ),
      );
    }
  }
  if (user_access('flush cache')) {
    $destination = drupal_get_destination();
    $menu[] = array(
      'data' => l(t('Flush Cache'), 'admin/drd_server/flush/cache', array(
        'query' => $destination,
      )),
      'class' => array(
        'leaf',
      ),
    );
  }
  if (user_access('translate interface')) {
    $menu[] = array(
      'data' => l(t('Update Translation'), 'admin/drd_server/update/translation'),
      'class' => array(
        'leaf',
      ),
    );
  }
  drupal_alter('drd_server_admin_block', $menu);
  return $menu;
}

/**
 * DRD Server Admin block.
 *
 * @return array
 *   Renderable array containing admin details.
 */
function drd_server_admin_block() {
  $block = array(
    'subject' => t('Extra Admin'),
    'content' => '',
  );
  $menu = drd_server_admin_menu();
  if (empty($menu)) {
    return FALSE;
  }
  $block['content'] = theme('item_list', array(
    'items' => $menu,
    'attributes' => array(
      'class' => array(
        'menu',
      ),
    ),
  ));
  return $block;
}

/**
 * Function to update translations of the current domain.
 *
 * @param boolean $redirect
 *   If TRUE, this function will perform a redirect using drupal_goto() instead of just returning after completion.
 */
function drd_server_admin_update_translation($redirect = TRUE) {
  if (module_exists('l10n_update')) {
    set_time_limit(0);
    module_load_include('admin.inc', 'l10n_update');
    if (function_exists('l10n_update_language_list')) {

      // TODO: l10n_update version has a completely changed structure which needs a rewrite.
      $steps = array(
        t('Refresh information'),
        t('Update translations'),
      );
      foreach ($steps as $step) {
        $projects = l10n_update_get_projects();
        $languages = l10n_update_language_list('name');
        if ($languages) {
          $history = l10n_update_get_history();
          $available = l10n_update_available_releases();
          $updates = l10n_update_build_updates($history, $available);
          $form_state = array(
            'values' => array(
              'op' => $step,
              'mode' => variable_get('l10n_update_import_mode', LOCALE_IMPORT_KEEP),
              // Send the empty array so that all languages get updated.
              'languages' => array(),
              'updates' => $updates,
            ),
          );
          $form = array();
          l10n_update_admin_import_form_submit($form, $form_state);
        }
      }
      $batch =& batch_get();
      if ($batch && !isset($batch['current_set'])) {

        // Set progressive to FALSE if called from xmlrpc.php.
        $batch['progressive'] = $redirect;
        $batch['form_state'] = array(
          'rebuild' => FALSE,
          'programmed' => FALSE,
        );
        batch_process();
      }
    }
  }

  // Allow other modules as well to jump in with translation update routines.
  module_invoke_all('drd_server_update_translation');
  if ($redirect) {
    drupal_goto($_SERVER['HTTP_REFERER']);
  }
}

/**
 * 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_select('watchdog', 'w')
    ->fields('w', array(
    'message',
    'variables',
    'timestamp',
  ))
    ->condition('w.type', 'DRD Server')
    ->orderBy('w.wid')
    ->execute()
    ->fetchAll();
  if (empty($entries)) {
    drupal_set_message('No debug entries available.', 'warning');
    return;
  }
  $filename = 'drd_server_debug_' . format_date(REQUEST_TIME, 'custom', 'Ymd_hi') . '.html';
  $n = 0;
  $html = '<html><body><h1>DRD Server Debug Log</h1>';
  foreach ($entries as $entry) {
    $n++;
    $html .= '<p><span>' . $entry->timestamp . '</span> ' . t($entry->message, unserialize($entry->variables)) . '</p>';
  }
  $html .= '</body></html>';
  file_put_contents(file_directory_temp() . '/' . $filename, $html);
  drupal_set_message(t('DRD Server debug exported with !n records. !link', array(
    '!n' => $n,
    '!link' => l('Download', 'system/temporary/' . $filename),
  )));
}

Functions

Namesort descending Description
drd_server_admin_block DRD Server Admin block.
drd_server_admin_menu DRD Server Admin menu to be used in admin block or navbar hook.
drd_server_admin_update_translation Function to update translations of the current domain.
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.