'mollom_test_get_server_list', 'mollom.verifyKey' => 'mollom_test_verify_key', 'mollom.checkContent' => 'mollom_test_check_content', 'mollom.getImageCaptcha' => 'mollom_test_get_captcha', 'mollom.checkCaptcha' => 'mollom_test_check_captcha', ); } /** * XML-RPC callback for mollom.getServerList to retrieve new server list. */ function mollom_test_get_server_list($data) { $storage = variable_get(__FUNCTION__, array()); $storage[] = $data; variable_set(__FUNCTION__, $storage); return array($GLOBALS['base_url'] . '/xmlrpc.php?version='); } /** * XML-RPC callback for mollom.verifyKey to validate API keys. */ function mollom_test_verify_key($data) { $storage = variable_get(__FUNCTION__, array()); $storage[] = $data; variable_set(__FUNCTION__, $storage); module_load_include('inc', 'mollom'); module_load_include('php', 'simpletest', 'drupal_web_test_case'); module_load_include('test', 'mollom', 'tests/mollom'); if ($data['public_key'] === MOLLOM_TEST_PUBLIC_KEY) { return TRUE; } xmlrpc_error(MOLLOM_ERROR); } /** * XML-RPC callback for mollom.checkContent to perform textual analysis. * * @todo Add support for 'redirect' and 'refresh' values. */ function mollom_test_check_content($data) { $storage = variable_get(__FUNCTION__, array()); $storage[] = $data; variable_set(__FUNCTION__, $storage); $response = array(); // Spam filter: Check post_title and post_body for ham, spam, or unsure. if (!isset($data['checks']) || strpos($data['checks'], 'spam') !== FALSE) { $spam = FALSE; $ham = FALSE; foreach (array('post_title', 'post_body') as $key) { if (!isset($data[$key])) { continue; } // 'spam' always has precedence. if (strpos($data[$key], 'spam') !== FALSE) { $spam = TRUE; } // Otherwise, check for 'ham'. elseif (strpos($data[$key], 'ham') !== FALSE) { $ham = TRUE; } // Lastly, take a forced 'unsure' into account. elseif (strpos($data[$key], 'unsure') !== FALSE) { $spam = TRUE; $ham = TRUE; } } if ($spam && $ham) { $response['spam'] = MOLLOM_ANALYSIS_UNSURE; $quality = 0.5; } elseif ($spam) { $response['spam'] = MOLLOM_ANALYSIS_SPAM; $quality = 0; } elseif ($ham) { $response['spam'] = MOLLOM_ANALYSIS_HAM; $quality = 1; } else { $response['spam'] = MOLLOM_ANALYSIS_UNKNOWN; $quality = NULL; } } // Quality filter. if (!isset($data['checks']) || strpos($data['checks'], 'quality') !== FALSE) { if (isset($quality)) { $response['quality'] = $quality; } // @todo No idea how quality is calculated during testing without spam // results above. else { $response['quality'] = 0; } } // Profanity filter. if (isset($data['checks']) && strpos($data['checks'], 'profanity') !== FALSE) { $profanity = 0.0; foreach (array('post_title', 'post_body') as $key) { if (isset($data[$key]) && strpos($data[$key], 'profanity') !== FALSE) { $profanity = 1.0; } } $response['profanity'] = $profanity; } if (!empty($data['session_id'])) { $response['session_id'] = $data['session_id']; } else { // Drupal 6 Pressflow support. if (function_exists('drupal_session_start')) { drupal_session_start(); } $response['session_id'] = session_id(); } return $response; } /** * XML-RPC callback for mollom.getImageCaptcha to fetch a CATPCHA image. */ function mollom_test_get_captcha($data) { $storage = variable_get(__FUNCTION__, array()); $storage[] = $data; variable_set(__FUNCTION__, $storage); // Drupal 6 Pressflow support. if (function_exists('drupal_session_start')) { drupal_session_start(); } return array( 'session_id' => !empty($data['session_id']) ? $data['session_id'] : session_id(), 'url' => $GLOBALS['base_url'] . '/' . drupal_get_path('module', 'mollom') . '/images/powered-by-mollom-2.gif', ); } /** * XML-RPC callback for mollom.checkCaptcha to validate a CAPTCHA response. * * @todo Add support for 'redirect' and 'refresh' values. */ function mollom_test_check_captcha($data) { $storage = variable_get(__FUNCTION__, array()); $storage[] = $data; variable_set(__FUNCTION__, $storage); if ($data['captcha_result'] == 'correct') { return TRUE; } if ($data['captcha_result'] == 'incorrect') { return FALSE; } } /** * Implements hook_menu(). */ function mollom_test_menu() { $items['mollom-test/form'] = array( 'title' => 'Mollom test form', 'page callback' => 'drupal_get_form', 'page arguments' => array('mollom_test_form'), 'access callback' => TRUE, ); return $items; } /** * Implements hook_mollom_form_list(). */ function mollom_test_mollom_form_list() { $forms['mollom_test_form'] = array( 'title' => 'Mollom test form', 'entity' => 'mollom_test', ); return $forms; } /** * Implements hook_mollom_form_info(). */ function mollom_test_mollom_form_info($form_id) { $form_info = array( 'title' => 'Mollom test form', 'bypass access' => array('administer mollom'), 'entity' => 'mollom_test', 'elements' => array( 'title' => 'Title', 'body' => 'Body', 'exclude' => 'Some other field', 'parent][child' => 'Nested element', 'field' => 'Multiple value field', ), 'mapping' => array( 'post_id' => 'mid', 'post_title' => 'title', 'author_name' => 'name', ), ); return $form_info; } /** * Form builder for Mollom test form. */ function mollom_test_form(&$form_state, $mid = NULL) { if (empty($form_state['storage'])) { $body = ''; if (isset($mid)) { $body = db_result(db_query("SELECT body FROM {mollom_test} WHERE mid = %d", $mid)); } $form_state['storage'] = array( 'mid' => $mid, 'title' => '', 'body' => $body, 'exclude' => '', 'parent' => array('child' => ''), 'field' => array(), ); } // Always add an empty field the user can submit. $form_state['storage']['field']['new'] = ''; $form['#tree'] = TRUE; $form['mid'] = array( '#type' => 'hidden', '#value' => $form_state['storage']['mid'], ); $form['title'] = array( '#type' => 'textfield', '#title' => 'Title', '#default_value' => $form_state['storage']['title'], '#required' => TRUE, ); $form['body'] = array( '#type' => 'textfield', '#title' => 'Body', '#default_value' => $form_state['storage']['body'], ); $form['exclude'] = array( '#type' => 'textfield', '#title' => 'Some other field', '#default_value' => $form_state['storage']['exclude'], ); $form['parent']['child'] = array( '#type' => 'textfield', '#title' => 'Nested element', '#default_value' => $form_state['storage']['parent']['child'], ); $form['field'] = array( '#type' => 'fieldset', '#title' => 'Field', ); $weight = 0; foreach ($form_state['storage']['field'] as $delta => $value) { $form['field'][$delta] = array( '#type' => 'textfield', '#title' => 'Field ' . $delta, '#default_value' => $value, '#weight' => $weight++, ); } $form['field']['new']['#weight'] = 999; $form['field']['submit'] = array( '#type' => 'submit', '#value' => 'Add', '#validate_parents' => array('field'), '#submit' => array('mollom_test_form_field_submit'), '#weight' => 1000, ); $form['submit'] = array('#type' => 'submit', '#value' => 'Submit'); return $form; } /** * Form element submit handler for mollom_test_form(). */ function mollom_test_form_field_submit($form, &$form_state) { // Store the new value and clear out the 'new' field. $form_state['storage'] = $form_state['values']; $form_state['storage']['field'][] = $form_state['values']['field']['new']; unset($form_state['input']['field']['new']); $form_state['rebuild'] = TRUE; } /** * Form submit handler for mollom_test_form(). */ function mollom_test_form_submit($form, &$form_state) { $form_state['rebuild'] = FALSE; unset($form_state['storage']); $form_state['values']['field'][] = $form_state['values']['field']['new']; unset($form_state['values']['field']['new']); // Store submission. $update = !empty($form_state['values']['mid']) ? 'mid' : array(); drupal_write_record('mollom_test', $form_state['values'], $update); // Redirect to stored entry. $form_state['redirect'] = 'mollom-test/form/' . $form_state['values']['mid']; drupal_set_message('Successful form submission.'); drupal_set_message('
' . var_export($form_state['values'], TRUE) . '
'); } /** * Implements hook_form_alter(). */ function mollom_test_form_alter(&$form, &$form_state, $form_id) { if (variable_get('mollom_test_disable_mollom', FALSE)) { $form_state['mollom']['require_analysis'] = FALSE; $form_state['mollom']['require_captcha'] = FALSE; } }