You are here

spam.install in Spam 5

Same filename and directory in other branches
  1. 5.3 spam.install
  2. 6 spam.install

File

spam.install
View source
<?php

/**
 * Implementation of hook_install()
 */
function spam_install() {
  switch ($GLOBALS['db_type']) {
    case 'mysql':
    case 'mysqli':
      db_query("CREATE TABLE {spam_tracker} (\n        sid int(11) unsigned NOT NULL auto_increment,\n        source varchar(64) NOT NULL default '', # node, comment, trackback, etc...\n        id int(11) unsigned NOT NULL default '0',\n        probability int(2) unsigned default '0',\n        hostname varchar(128) NOT NULL default '', # source IP\n        hash char(32) NOT NULL default '',\n        timestamp int(11) unsigned default '0',\n        PRIMARY KEY sid (sid),\n        KEY id (id),\n        KEY probability (probability),\n        KEY source (source),\n        KEY hostname (hostname),\n        KEY hash (hash)\n      ) TYPE=MyISAM /*!40100 DEFAULT CHARACTER SET utf8 */;");
      db_query("CREATE TABLE {spam_tokens} (\n        tid int(10) unsigned NOT NULL auto_increment,\n        token varchar(255) NOT NULL default '',\n        spam int(10) unsigned default '0',\n        notspam int(10) unsigned default '0',\n        probability int(10) unsigned default '0',\n        last int(11) unsigned default '0',\n        PRIMARY KEY tid (tid),\n        UNIQUE KEY token (token),\n        KEY spam (spam),\n        KEY notspam (notspam),\n        KEY probability (probability),\n        KEY last (last)\n      ) TYPE=MyISAM /*!40100 DEFAULT CHARACTER SET utf8 */;");
      db_query("CREATE TABLE {spam_custom} (\n        scid int(10) unsigned NOT NULL auto_increment,\n        filter varchar(255) NOT NULL default '',\n        style int(2) unsigned default '0', # text, regex, URL\n        effect int(2) unsigned default '0',\n        action tinyint(2) unsigned default '0',\n        matches int(11) unsigned default '0',\n        last int(11) unsigned default '0',\n        PRIMARY KEY scid (scid),\n        KEY filter (filter),\n        KEY matches (matches),\n        KEY last (last)\n      ) TYPE=MyISAM /*!40100 DEFAULT CHARACTER SET utf8 */;");
      db_query("CREATE TABLE {spam_reported} (\n        rid int(11) unsigned NOT NULL auto_increment,\n        source varchar(64) NOT NULL default '', # node, comment, trackback, etc...\n        id int(11) unsigned NOT NULL default '0',\n        uid int(10) unsigned NOT NULL default '0',\n        hostname varchar(128) NOT NULL default '', # source IP\n        feedback text NULL default '',\n        timestamp int(11) unsigned default '0',\n        PRIMARY KEY rid (rid),\n        KEY source (source),\n        KEY id (id),\n        KEY uid (uid)\n      ) TYPE=MyISAM /*!40100 DEFAULT CHARACTER SET utf8 */;");
      db_query("CREATE TABLE {spam_log} (\n        sid int(11) unsigned NOT NULL auto_increment,\n        source varchar(64) NOT NULL default '', # node, comment, trackback, etc...\n        id int(11) unsigned NOT NULL default '0',\n        uid int(10) unsigned NOT NULL default '0',\n        hostname varchar(128) NOT NULL default '', # source IP\n        entry varchar(255) NOT NULL default '',\n        timestamp int(11) unsigned default '0',\n        PRIMARY KEY sid (sid),\n        KEY source (source),\n        KEY id (id),\n        KEY timestamp (timestamp)\n      ) TYPE=MyISAM /*!40100 DEFAULT CHARACTER SET utf8 */;");
      break;
      db_query("INSERT INTO {spam_custom} VALUES (1, '/(adipex|cialis|phentermine|viagra)/i', 1, 1, 2, 0, 0)");
      db_query("INSERT INTO {spam_custom} VALUES (2, '/casino games|poker online|texas hold\\''em|texas holdem/i', 1, 0, 2, 0, 0)");
      db_query("INSERT INTO {spam_custom} VALUES (3, '/(american|casino|free|grand|online|party)(|-)?(blackjack|casino|gambling|poker)/i', 1, 0, 2, 0, 0)");
      db_query("INSERT INTO {spam_custom} VALUES (4, 'diet pill', 0, 0, 2, 0, 0)");
    case 'pgsql':
      db_query("CREATE TABLE {spam_tracker} (\n        sid serial PRIMARY KEY,\n        source varchar(64) NOT NULL default '',\n        id integer NOT NULL default 0,\n        probability smallint default 0,\n        hostname varchar(128) NOT NULL default '',\n        hash char(32) NOT NULL default '',\n        timestamp integer default 0\n      );");
      db_query("CREATE INDEX {spam_tracker}_id|_key ON {spam_tracker} (id);");
      db_query("CREATE INDEX {spam_tracker}_probability_key| ON {spam_tracker} (probability);");
      db_query("CREATE INDEX {spam_tracker}_source_key| ON {spam_tracker} (source);");
      db_query("CREATE INDEX {spam_tracker}_hostname_key} ON {spam_tracker} (hostname);");
      db_query("CREATE INDEX {spam_tracker}_hash_key} ON {spam_tracker} (hash);");
      db_query("CREATE TABLE {spam_tokens} (\n        tid serial PRIMARY KEY,\n        token varchar(255) NOT NULL default '',\n        spam integer DEFAULT 0 CONSTRAINT {spam_tokens_spam_unsigned} CHECK (spam >= 0),\n        notspam integer DEFAULT 0 CONSTRAINT {spam_tokens_notspam_unsigned} CHECK (notspam >= 0),\n        probability integer DEFAULT 1 CONSTRAINT {spam_tokens_probability_positive} CHECK (probability > 0),\n        last integer DEFAULT 0\n      );");
      db_query("CREATE UNIQUE INDEX (spam_tokens_token_key) ON {spam_tokens} (token);");
      db_query("CREATE INDEX (spam_tokens_spam_key) ON {spam_tokens} (spam);");
      db_query("CREATE INDEX (spam_tokens_notspam_key) ON {spam_tokens} (notspam);");
      db_query("CREATE INDEX (spam_tokens_probability_key} ON {spam_tokens} (probability);");
      db_query("CREATE INDEX spam_tokens_last_key ON {spam_tokens} (last);");
      db_query("CREATE TABLE {spam_custom} (\n        scid serial PRIMARY KEY,\n        filter varchar(255) NOT NULL default '',\n        style smallint default 0, -- text, regex, URL\n        effect smallint default 0, \n        action smallint default 0,\n        matches integer default 0,\n        last integer default 0\n      );");
      db_query("CREATE INDEX {spam_custom_filter_key} ON {spam_custom} (filter);");
      db_query("CREATE INDEX {spam_custom_matches_key} ON {spam_custom} (matches);");
      db_query("CREATE INDEX {spam_custom_last_key} ON {spam_custom} (last);");
      db_query("INSERT INTO {spam_custom} VALUES (1, '/(adipex|cialis|phentermine|viagra)/i', 1, 1, 2, 0, 0);");
      db_query("INSERT INTO {spam_custom} VALUES (2, '/casino games|poker online|texas hold''em|texas holdem/i', 1, 0, 2, 0, 0);");
      db_query("INSERT INTO {spam_custom} VALUES (3, '/(american|casino|free|grand|online|party)( |-)?(blackjack|casino|gambling|poker)/i', 1, 0, 2, 0, 0);");
      db_query("INSERT INTO {spam_custom} VALUES (4, 'diet pill', 0, 0, 2, 0, 0);");
      db_query("CREATE TABLE {spam_reported} (\n        rid serial PRIMARY KEY,\n        source varchar(64) NOT NULL default '',\n        id integer NOT NULL default 0,\n        uid integer NOT NULL default 0,\n        hostname varchar(128) NOT NULL default '',\n        feedback text NULL default '',\n        timestamp integer default 0\n      );");
      db_query("CREATE TABLE {spam_log} (\n        sid serial PRIMARY KEY,\n        source varchar(64) NOT NULL default '',\n        id integer NOT NULL default 0,\n        uid integer NOT NULL default 0,\n        hostname varchar(128) NOT NULL default '',\n        entry varchar(255) NOT NULL default '',\n        timestamp integer default 0\n      );");
      db_query("CREATE INDEX {spam_log_source_key} ON {spam_log} (source);");
      db_query("CREATE INDEX {spam_log_id_key} ON {spam_log} (id);");
      db_query("CREATE INDEX {spam_log_timestamp_key} ON {spam_log} (timestamp);");
  }
  drupal_set_message(t('All tables required by the spam module have been created.'));
}

/**
 * Implementation of hook_uninstall.
 * This code deletes all tables and variables created by this module.
 */
function spam_uninstall() {
  db_query("DROP TABLE {spam_tracker}");
  db_query("DROP TABLE {spam_tokens}");
  db_query("DROP TABLE {spam_custom}");
  db_query("DROP TABLE {spam_reported}");
  db_query("DROP TABLE {spam_log}");

  // TODO: Build an array of all variables that need to be deleted, and
  // delete them individually.  This query could accidentally remove variables
  // unrelated to the spam module.
  // db_query("DELETE FROM {variable} WHERE name LIKE('spam_%%')");
  // Clear the menu cache to remove our stuff.
  cache_clear_all('*', 'cache_menu', TRUE);

  //drupal_set_message(t('All tables and variables required by the Spam module have been removed.'));
  drupal_set_message(t('All tables required by the Spam module have been removed.'));
}

/**
 * Updates
 */
function spam_update_1() {
  $ret = array();
  if ($GLOBALS['db_type'] == 'mysql') {
    $ret[] = update_sql("ALTER TABLE {spam_tokens} RENAME TO {spam_tokens_old}");
    $ret[] = update_sql("CREATE TABLE {spam_tokens} (\n      tid int(10) unsigned NOT NULL auto_increment,\n      token varchar(255) NOT NULL default '',\n      spam int(10) unsigned default '0',\n      notspam int(10) unsigned default '0',\n      probability int(10) unsigned default '0',\n      last int(11) unsigned default '0',\n      PRIMARY KEY tid (tid),\n      UNIQUE KEY token (token),\n      KEY spam (spam),\n      KEY notspam (notspam),\n      KEY probability (probability),\n      KEY last (last)\n    ) TYPE=MyISAM;");
  }
  else {
    $ret[] = update_sql("ALTER TABLE {spam_tokens} RENAME TO {spam_tokens_old}");
    $ret[] = update_sql("ALTER TABLE {spam_tokens_tid_seq} RENAME TO {spam_tokens_old_tid_seq}");
    $ret[] = update_sql("ALTER TABLE {spam_tokens_pkey} RENAME TO {spam_tokens_old_pkey}");
    $ret[] = update_sql("ALTER TABLE {spam_tokens_token_key} RENAME TO {spam_tokens_old_token_key}");
    $ret[] = update_sql("ALTER TABLE {spam_tokens_spam_key} RENAME TO {spam_tokens_old_spam_key}");
    $ret[] = update_sql("ALTER TABLE {spam_tokens_notspam_key} RENAME TO {spam_tokens_old_notspam_key}");
    $ret[] = update_sql("ALTER TABLE {spam_tokens_probability_key} RENAME TO {spam_tokens_old_probability_key}");
    $ret[] = update_sql("ALTER TABLE {spam_tokens_last_key} RENAME TO {spam_tokens_old_last_key}");
    $ret[] = update_sql("CREATE TABLE {spam_tokens} (\n      tid serial PRIMARY KEY,\n      token varchar(255) UNIQUE NOT NULL DEFAULT '',\n      spam integer default 0,\n      notspam integer default 0,\n      probability integer default 0,\n      last integer default 0 )");
    $ret[] = update_sql("CREATE INDEX {spam_tokens_spam_key} ON {spam_tokens} (spam)");
    $ret[] = update_sql("CREATE INDEX {spam_tokens_notspam_key} ON {spam_tokens} (notspam)");
    $ret[] = update_sql("CREATE INDEX {spam_tokens_probability_key} ON {spam_tokens} (probability)");
    $ret[] = update_sql("CREATE INDEX {spam_tokens_last_key} ON {spam_tokens} (last)");
  }
  $orig = $new = $url = 0;
  $result = db_query('SELECT * FROM {spam_tokens_old}');
  while ($old = db_fetch_object($result)) {
    $orig++;

    // test if URI, if so, just save it
    if (substr($old->token, 0, 4) == 'URL*') {
      $url++;
      $new += spam_save_token($old->token, $old);
    }
    else {
      $token = preg_replace('/^header\\*/', '', $old->token, 1);
      if ($token != $old->token) {
        $header = 'header*';
      }
      else {
        $header = '';
      }
      $tokens = array();
      $sanitized = preg_replace('(http://|https://|ftp://|mailto:)', '', $token);
      $sanitized = preg_replace("'(www\\.)|(</a>)|(href=)|(target=)|(src=)'i", '', $sanitized);
      $sanitized = preg_replace("/[()\\{\\}\\[\\]#.,]/", '', $sanitized);
      $sanitized = strtolower($sanitized);
      $delimiters = " \t\n\r-_<>'\"`/|*%^&+=~:;?";
      $tok = strtok($sanitized, $delimiters);
      while ($tok !== FALSE) {

        // if longer than 255 characters, truncate the token
        $tokens[] = htmlspecialchars(substr("{$header}{$tok}", 0, 254));
        $tok = strtok($delimiters);
      }
      foreach ($tokens as $t) {
        if ($t != '') {
          $new += spam_save_token($t, $old);
        }
      }
    }
  }
  switch ($GLOBALS['db_type']) {
    case 'mysql':
    case 'mysqli':
      $ret[] = update_sql('DROP TABLE {spam_tokens_old}');
      break;
    case 'pgsql':
      $ret[] = update_sql('DROP TABLE {spam_tokens_old}');
      break;
  }
  print "<p>" . t("Converting %original tokens into %new tokens.", array(
    '%original' => $orig,
    '%new' => $new,
  )) . "</p>";
  return $ret;
}
function spam_save_token($token, $old) {
  $existing = db_fetch_object(db_query("SELECT * from {spam_tokens} WHERE token = '%s'", $token));
  if (isset($existing->token)) {
    $total = $existing->spam + $existing->notspam + $old->spam + $old->notspam;
    $probability = ($existing->spam + $old->spam) / $total * 100;
    if ($probability > 99) {
      $probability = 99;
    }
    else {
      if ($probability < 1) {
        $probability = 1;
      }
    }
    db_query("UPDATE {spam_tokens} SET spam = %d, notspam = %d, probability = %d, last = %d WHERE token = '%s'", $existing->spam + $old->spam, $existing->notspam + $old->notspam, $probability, $existing->last >= $old->last ? $existing->last : $old->last, $existing->token);
    return 0;
  }
  else {

    // we shouldn't have to make changes here, but let's be sure things are sane    $spam = $old->spam < 1 ? 1 : $old->spam;
    $notspam = $old->notspam < 1 ? 1 : $old->notspam;
    $total = $spam + $notspam;
    $probability = $spam / $total * 100;
    if ($probability > 99) {
      $probability = 99;
    }
    else {
      if ($probability < 1) {
        $probability = 1;
      }
    }
    db_query("INSERT INTO {spam_tokens} (token, spam, notspam, probability, last) VALUES('%s', %d, %d, %d, %d)", $token, $spam, $notspam, $probability, $old->last);
    return 1;
  }
}
function spam_update_2() {
  $ret = array();
  switch ($GLOBALS['db_type']) {
    case 'mysql':
    case 'mysqli':
      $ret[] = update_sql("CREATE TABLE {spam_reported} (\n      rid int(11) unsigned NOT NULL auto_increment,\n      source varchar(64) NOT NULL default '',\n      id int(11) unsigned NOT NULL default '0',\n      uid int(10) unsigned NOT NULL default '0',\n      hostname varchar(128) NOT NULL default '',\n      feedback text NULL default '',\n      timestamp int(11) unsigned default '0',\n      PRIMARY KEY rid (rid),\n      KEY source (source),\n      KEY id (id),\n      KEY uid (uid)\n    ) TYPE=MyISAM;");
      break;
    case 'pgsql':
      $ret[] = update_sql("CREATE TABLE {spam_reported} (\n      rid serial PRIMARY KEY,\n      source varchar(64) NOT NULL default '',\n      id integer NOT NULL default 0,\n      uid integer NOT NULL default 0,\n      hostname varchar(128) NOT NULL default '',\n      feedback text NULL default '',\n      timestamp integer default 0);");
      break;
  }
  return $ret;
}
function spam_update_3() {
  return _system_update_utf8(array(
    'spam_tracker',
    'spam_tokens',
    'spam_custom',
    'spam_reported',
    'spam_log',
    'spam_tracker',
  ));
}

/** 
 * Changes to administrative menus require that the menu cache be flushed.
 * This should have been included with release 1.1.
 */
function spam_update_4() {

  // Kludge so we only execute this update once.
  static $already = FALSE;
  if ($already) {
    return;
  }
  $already = TRUE;
  $ret = array();
  $ret[] = update_sql("DELETE FROM {cache_menu}");
  return $ret;
}

/**
 * Original version of spam_update_4 resulted in an error.  _update_5 is added
 * for anyone who may have already updated to version 1.1-1.
 */
function spam_update_5() {
  $rc = spam_update_4();

  // Kludge so we only execute update once, and don't return errors either way.
  if ($rc) {
    return $rc;
  }
  return array();
}

Functions

Namesort descending Description
spam_install Implementation of hook_install()
spam_save_token
spam_uninstall Implementation of hook_uninstall. This code deletes all tables and variables created by this module.
spam_update_1 Updates
spam_update_2
spam_update_3
spam_update_4 Changes to administrative menus require that the menu cache be flushed. This should have been included with release 1.1.
spam_update_5 Original version of spam_update_4 resulted in an error. _update_5 is added for anyone who may have already updated to version 1.1-1.