You are here

function spam_content_update in Spam 6

Same name and namespace in other branches
  1. 5.3 spam.module \spam_content_update()

This function is called when content on your website is updated.

Parameters

$content: An array holding the complete content.

$type: A string naming the type of content being updated.

3 calls to spam_content_update()
spam_comment in content/spam_content_comment.inc
Drupal _comment() hook.
spam_nodeapi in content/spam_content_node.inc
Drupal _nodeapi() hook.
spam_user in content/spam_content_user.inc

File

./spam.module, line 300
Spam module, v3 Copyright(c) 2006-2008 Jeremy Andrews <jeremy@tag1consulting.com>. All rights reserved.

Code

function spam_content_update($content, $type, $extra = array()) {
  if (!spam_filter_content_type($content, $type, $extra)) {
    return;
  }
  $id = spam_invoke_module($type, 'content_id', $content, $extra);
  if (spam_bypass_filters() || user_access('bypass filters')) {
    spam_log(SPAM_DEBUG, 'spam_content_update', t('bypassing filters'), $type, $id);
    return;
  }
  spam_log(SPAM_VERBOSE, 'spam_content_update', t('updating'), $type, $id);
  $error = FALSE;
  $score = 0;
  if ($id) {
    $spam = spam_content_is_spam($content, $type, $extra);
    $score = $spam['score'];
    db_query("UPDATE {spam_tracker} SET score = %d, hostname = '%s', timestamp = %d WHERE content_type = '%s' AND content_id = '%s'", $score, ip_address(), time(), $type, $id);
    $sid = db_result(db_query("SELECT sid FROM {spam_tracker} WHERE content_type = '%s' AND content_id = '%s'", $type, $id));
    if ($sid) {
      watchdog('spam', 'Updated %type with id %id in spam tracker table.', array(
        '%type' => $type,
        '%id' => $id,
      ), WATCHDOG_NOTICE);
      $extra['sid'] = $sid;
      if (!isset($extra['host'])) {

        // Content type modules can set this value, should REMOTE_ADDR not be
        // the correct IP for their content type.
        $extra['host'] = ip_address();
      }
      $fields = spam_invoke_module($type, 'filter_fields', $content, $extra);
      if (!empty($fields) && is_array($fields['main'])) {
        $filters = db_query('SELECT name, module, gain FROM {spam_filters} WHERE status = %d ORDER BY weight', SPAM_FILTER_ENABLED);
        while ($filter = db_fetch_object($filters)) {

          // Let filters act on insert action.
          spam_invoke_module($filter->module, 'update', $type, $content, $fields, $extra);
        }
      }
      else {
        watchdog('spam', 'Function spam_content_update failed, no fields are defined for %type content type.', array(
          '%type' => $type,
        ), WATCHDOG_ERROR);
        $error = -3;
      }
    }
    else {
      watchdog('spam', 'Update to %type with id %id not filtered before, inserting.', array(
        '%type' => $type,
        '%id' => $id,
      ), WATCHDOG_NOTICE);

      // It seems that the content hasn't ever been scanned before, let's try
      // inserting it.
      $error = spam_content_insert($content, $type, $extra);
    }
  }
  else {
    watchdog('spam', 'Function spam_content_update failed, unable to update %type in spam_tracker table, no id found in the content array.', array(
      '%type' => $type,
    ), WATCHDOG_ERROR);
    $error = -1;
  }

  // This content became spam during an update, mark it as such.
  if ($score >= variable_get('spam_threshold', SPAM_DEFAULT_THRESHOLD)) {
    spam_mark_as_spam($type, $id, $extra);
    $_SESSION['spam_content'] = serialize((array) $content);
    $_SESSION['spam_type'] = $type;
    if (!in_array(variable_get('spam_visitor_action', SPAM_ACTION_PREVENT), array(
      SPAM_ACTION_HOLD,
    ))) {
      _spam_update_statistics(t('prevented spam @type', array(
        '@type' => $type,
      )));
      spam_log(SPAM_DEBUG, 'spam_content_update', t('redirecting to spam/denied'), $type, $id);
      drupal_goto('spam/denied');
    }
  }
  return $error;
}