View source
<?php
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;
}
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']) {
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);
}
}
}
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);
}
}
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;
$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;
}
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');
}
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,
)));
}