uid) {
drupal_set_message(t("The Anonymous user account can't be reported for spam. If you intended to block a user account verify that the URL is /user/XXXX/spambot where XXXX is a valid UID"), 'warning');
return MENU_NOT_FOUND;
}
return drupal_get_form('spambot_user_spam_admin_form', $account);
}
/**
* Form builder for spambot_user_spam_admin_form form.
*/
function spambot_user_spam_admin_form($form, &$form_state, $account) {
$key = variable_get('spambot_sfs_api_key', FALSE);
$comments_enabled = module_exists('comment');
$node_count = db_select('node', 'n')
->fields('n', array('nid'))
->condition('uid', $account->uid)
->countQuery()
->execute()
->fetchField();
$status = t('This account has @n nodes.', array('@n' => $node_count));
if ($comments_enabled) {
$comment_count = db_select('comment', 'c')
->fields('c', array('cid'))
->condition('uid', $account->uid)
->countQuery()
->execute()
->fetchField();
$status = t('This account has @n nodes and @c comments.', array('@n' => $node_count, '@c' => $comment_count));
}
$form['check'] = array(
'#type' => 'submit',
'#value' => t('Check if this account matches a known spammer'),
);
$form['action'] = array(
'#type' => 'fieldset',
'#title' => t('Take action against this account'),
'#collapsible' => TRUE,
'#description' => $status,
);
$form['action']['unpublish_content'] = array(
'#type' => 'checkbox',
'#title' => t('Unpublish nodes and comments by this account'),
'#default_value' => TRUE,
);
$form['action']['delete_content'] = array(
'#type' => 'checkbox',
'#title' => t('Delete nodes and comments by this account'),
'#default_value' => FALSE,
);
$form['action']['report'] = array(
'#type' => 'fieldset',
'#title' => t('Report this account to www.stopforumspam.com'),
'#tree' => TRUE,
'#collapsible' => TRUE,
);
// Fetch a list of reportable nodes.
$form['action']['report']['nids'] = array();
$result = db_select('node_spambot', 'ns')
->fields('ns', array('nid', 'hostname'))
->condition('ns.uid', $account->uid)
->orderBy('ns.nid', 'DESC')
->range(0, 20)
->execute();
$nid_hostnames = array();
foreach ($result as $record) {
$nid_hostnames[$record->nid] = $record->hostname;
}
foreach ($nid_hostnames as $nid => $hostname) {
if ($node = node_load($nid)) {
$title = truncate_utf8(check_plain($node->title), 128, TRUE, TRUE);
$form['action']['report']['nids'][$nid] = array(
'#type' => 'checkbox',
'#title' => l(
$title,
"node/$nid",
array(
'attributes' => array(
'title' => $title,
),
)
) . ' ' . t('(node, ip=@ip)', array('@ip' => $hostname)),
'#disabled' => !$key,
);
}
}
// Fetch a list of reportable comments.
if ($comments_enabled) {
$form['action']['report']['cids'] = array();
$result = db_select('comment')
->fields('comment', array('cid'))
->condition('uid', $account->uid)
->orderBy('cid', 'DESC')
->range(0, 20)
->execute();
$cids = array();
foreach ($result as $record) {
$cids[$record->cid] = $record->cid;
}
foreach ($cids as $cid) {
if ($comment = comment_load($cid)) {
$subject = truncate_utf8(check_plain($comment->subject), 128, TRUE, TRUE);
$form['action']['report']['cids'][$cid] = array(
'#type' => 'checkbox',
'#title' => l(
$subject,
"node/$comment->nid",
array(
'fragment' => "comment-$comment->cid",
'attributes' => array(
'title' => $subject,
),
)
) . ' ' . t('(comment, ip=@ip)', array('@ip' => $comment->hostname)),
'#disabled' => !$key,
);
}
}
}
if ($key) {
$comment_cids = $comments_enabled ? count($form['action']['report']['cids']) : 0;
$evidence_count = count($form['action']['report']['nids']) + $comment_cids;
$form['action']['report']['#description'] = $evidence_count ? t('Select one or more posts below to report them to www.stopforumspam.com.') : t('This account cannot be reported because no evidence or IP address is available.');
}
else {
$form['action']['report']['#description'] = t('An API key from www.stopforumspam.com must be configured to report spammers.', array('!admin-url' => url('admin/config/system/spambot')));
}
$form['action']['block_user'] = array(
'#type' => 'checkbox',
'#title' => t('Block this account'),
'#default_value' => TRUE,
);
$form['action']['delete_user'] = array(
'#type' => 'checkbox',
'#title' => t('Delete this account'),
'#default_value' => FALSE,
);
$form['action']['action'] = array(
'#type' => 'submit',
'#value' => t('Take action'),
);
$form['uid'] = array(
'#type' => 'value',
'#value' => $account->uid,
);
$form['#validate'][] = 'spambot_user_spam_admin_form_validate';
$form['#submit'][] = 'spambot_user_spam_admin_form_submit';
return $form;
}
/**
* Validate handler for spambot_user_spam_admin_form() form.
*/
function spambot_user_spam_admin_form_validate(&$form, &$form_state) {
$key_required = (!empty($form_state['values']['report']['nids']) && count(array_filter($form_state['values']['report']['nids']))) ? TRUE : FALSE;
if (module_exists('comment')) {
$key_required = (!empty($form_state['values']['report']['cids']) && count(array_filter($form_state['values']['report']['cids']))) || $key_required;
}
if ($key_required && !variable_get('spambot_sfs_api_key', FALSE)) {
form_set_error('', t('To report spammers to www.stopforumspam.com, you need to register for an API key at www.stopforumspam.com and enter it into the !page.', array(
'!page' => l(t('spambot settings'), 'admin/config/system/spambot'),
)));
}
}
/**
* Submit handler for spambot_user_spam_admin_form() form.
*/
function spambot_user_spam_admin_form_submit(&$form, &$form_state) {
$account = user_load($form_state['values']['uid']);
if ($form_state['values']['op'] == $form_state['values']['check']) {
_spambot_user_spam_admin_form_submit_check($form, $form_state, $account);
}
elseif ($form_state['values']['op'] == $form_state['values']['action']) {
_spambot_user_spam_admin_form_submit_action($form, $form_state, $account);
}
}
/**
* Do complex checking at this user account.
*/
function _spambot_user_spam_admin_form_submit_check(&$form, &$form_state, $account) {
$messages = array();
$service_down = FALSE;
// Check email and username.
$data = array();
$request = array(
'email' => $account->mail,
'username' => $account->name,
);
if (spambot_sfs_request($request, $data)) {
if (!empty($data['email']['appears'])) {
$messages[] = array(
'text' => t("This account's email address matches %num times: !link", array(
'!link' => l($request['email'], 'http://www.stopforumspam.com/search?q=' . $request['email']),
'%num' => $data['email']['frequency'],
)),
'type' => 'warning',
);
}
if (!empty($data['username']['appears'])) {
$messages[] = array(
'text' => t("This account's username matches %num times: !link", array(
'!link' => l($request['username'], 'http://www.stopforumspam.com/search?q=' . $request['username']),
'%num' => $data['username']['frequency'],
)),
'type' => 'warning',
);
}
// Check data at whitelist.
if (spambot_check_whitelist('email', $account->mail)) {
$messages[] = array(
'text' => t("This account's email address placed at your whitelist."),
'type' => 'status',
);
}
if (spambot_check_whitelist('username', $account->name)) {
$messages[] = array(
'text' => t("This account's username placed at your whitelist."),
'type' => 'status',
);
}
}
else {
drupal_set_message(t('Error contacting service.'), 'warning');
$service_down = TRUE;
}
// Check IP addresses.
if (!$service_down) {
$ips = spambot_account_ip_addresses($account);
foreach ($ips as $ip) {
// Skip the loopback interface.
if ($ip == '127.0.0.1') {
continue;
}
elseif (spambot_check_whitelist('ip', $ip)) {
$whitelist_ips[] = $ip;
continue;
}
// Make sure we have a valid IPv4 address
// (the API doesn't support IPv6 yet).
elseif (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) === FALSE) {
$messages[] = array(
'text' => t('Invalid IP address: @ip. Spambot will not rely on it.', array('@ip' => $ip)),
'type' => 'warning',
);
continue;
}
$request = array('ip' => $ip);
$data = array();
if (spambot_sfs_request($request, $data)) {
if (!empty($data['ip']['appears'])) {
$messages[] = array(
'text' => t('An IP address !ip used by this account matches %num times.', array(
'!ip' => l($ip, 'http://www.stopforumspam.com/search?q=' . $ip),
'%num' => $data['ip']['frequency'],
)),
'type' => 'warning',
);
}
}
else {
drupal_set_message(t('Error contacting service.'), 'warning');
break;
}
}
if (!empty($whitelist_ips)) {
$messages[] = array(
'text' => t('These IP addresses placed at your whitelist: %ips', array('%ips' => implode(', ', $whitelist_ips))),
'type' => 'status',
);
}
}
if ($messages) {
foreach ($messages as $message) {
drupal_set_message($message['text'], $message['type']);
}
}
else {
drupal_set_message(t('No matches against known spammers found.'));
}
}
/**
* Take action under this user account.
*/
function _spambot_user_spam_admin_form_submit_action(&$form, &$form_state, $account) {
$comments_enabled = module_exists('comment');
if ($account->uid == 1) {
drupal_set_message(t('Sorry, taking action against uid 1 is not allowed.'), 'warning');
return;
}
// Block account.
if (!empty($form_state['values']['block_user'])) {
if ($account->status) {
user_save($account, array('status' => 0));
drupal_set_message(t('Account blocked.'));
}
else {
drupal_set_message(t('This account is already blocked.'));
}
}
// Prepare some data.
$nodes = db_select('node')
->fields('node', array('nid'))
->condition('uid', $account->uid, '=')
->orderBy('nid')
->execute()
->fetchCol();
$node_hostnames = array();
$result = db_select('node_spambot')
->fields('node_spambot', array('nid', 'hostname'))
->condition('uid', $account->uid)
->orderBy('nid', 'DESC')
->execute();
foreach ($result as $record) {
$node_hostnames[$record->nid] = $record->hostname;
}
$comments = array();
if ($comments_enabled) {
$comments = db_select('comment')
->fields('comment', array('cid'))
->condition('uid', $account->uid, '=')
->orderBy('cid')
->execute()
->fetchCol();
}
// Report posts to www.stopforumspam.com.
if (!empty($form_state['values']['report']['nids'])) {
foreach (array_filter($form_state['values']['report']['nids']) as $nid => $unused) {
$node = node_load($nid);
if (!empty($node->nid)) {
if (spambot_report_account($account, $node_hostnames[$nid], $node->title . "\n\n" . $node->body[LANGUAGE_NONE][0]['summary'] . "\n\n" . $node->body[LANGUAGE_NONE][0]['value'])) {
drupal_set_message(t('Node %title has been reported.', array('%title' => $node->title)));
}
else {
drupal_set_message(t('There was a problem reporting node %title.', array('%title' => $node->title)));
}
}
}
}
if ($comments_enabled && !empty($form_state['values']['report']['cids'])) {
foreach (array_filter($form_state['values']['report']['cids']) as $cid => $unused) {
$comment = comment_load($cid);
if (!empty($comment->cid)) {
if (spambot_report_account($account, $comment->hostname, $comment->subject . "\n\n" . $comment->comment_body[LANGUAGE_NONE][0]['value'])) {
drupal_set_message(t('Comment %title has been reported.', array('%title' => $comment->subject)));
}
else {
drupal_set_message(t('There was a problem reporting comment %title.', array('%title' => $comment->subject)));
}
}
}
}
// Delete nodes and content.
if (!empty($form_state['values']['delete_content'])) {
node_delete_multiple($nodes);
if ($comments) {
comment_delete_multiple($comments);
}
drupal_set_message(t('Nodes and comments have been deleted.'));
}
elseif (!empty($form_state['values']['unpublish_content'])) {
// Unpublish nodes and content.
if ($nodes) {
module_load_include('inc', 'node', 'node.admin');
node_mass_update($nodes, array('status' => 0));
}
if ($comments) {
db_update('comment')
->fields(array('status' => COMMENT_NOT_PUBLISHED))
->condition('uid', $account->uid)
->execute();
}
drupal_set_message(t('Nodes and comments have been unpublished.'));
}
// Delete user.
if (!empty($form_state['values']['delete_user'])) {
// Redirect to user delete form.
$form_state['redirect'] = "user/$account->uid/cancel";
}
}