diff --git a/admin/report/spamcleaner/index.php b/admin/report/spamcleaner/index.php
new file mode 100755
index 00000000000..d98e44a2e18
--- /dev/null
+++ b/admin/report/spamcleaner/index.php
@@ -0,0 +1,367 @@
+libdir.'/adminlib.php');
+
+require_js(array('yui_dom-event', 'yui_connection', 'yui_json'));
+
+$keyword = optional_param('keyword', '', PARAM_RAW);
+$autodetect = optional_param('autodetect', '', PARAM_RAW);
+$del = optional_param('del', '', PARAM_RAW);
+$delall = optional_param('delall', '', PARAM_RAW);
+$ignore = optional_param('ignore', '', PARAM_RAW);
+$reset = optional_param('reset', '', PARAM_RAW);
+$id = optional_param('id', '', PARAM_INT);
+
+require_login();
+admin_externalpage_setup('reportspamcleaner');
+
+// Implement some AJAX calls
+
+// Delete one user
+if (!empty($del) && confirm_sesskey() && ($id != $USER->id)) {
+ if (isset($SESSION->users_result[$id])) {
+ $user = $SESSION->users_result[$id];
+ if (delete_user($user)) {
+ unset($SESSION->users_result[$id]);
+ echo json_encode(true);
+ } else {
+ echo json_encode(false);
+ }
+ } else {
+ echo json_encode(false);
+ }
+ exit;
+}
+
+// Delete lots of users
+if (!empty($delall) && confirm_sesskey()) {
+ if (!empty($SESSION->users_result)) {
+ foreach ($SESSION->users_result as $userid => $user) {
+ if ($userid != $USER->id) {
+ if (delete_user($user)) {
+ unset($SESSION->users_result[$userid]);
+ }
+ }
+ }
+ }
+ echo json_encode(true);
+ exit;
+}
+
+if (!empty($ignore)) {
+ unset($SESSION->users_result[$id]);
+ echo json_encode(true);
+ exit;
+}
+
+
+admin_externalpage_print_header();
+
+// Print headers and things
+
+print_spamcleaner_javascript();
+
+print_box(get_string('spamcleanerintro', 'report_spamcleaner'));
+
+print_box_start(); // The forms section at the top
+
+?>
+
+
+
+';
+
+// Print list of resulting profiles
+
+if (!empty($keyword)) { // Use the keyword(s) supplied by the user
+ $keywords = explode(',', $keyword);
+ foreach ($keywords as $key => $keyword) {
+ $keywords[$key] = trim($keyword);
+ }
+ search_spammers($keywords);
+
+} else if (!empty($autodetect)) { // Use the inbuilt keyword list to detect users
+ search_spammers($autokeywords);
+}
+
+echo '';
+
+/////////////////////////////////////////////////////////////////////////////////
+
+
+/// Functions
+
+
+function search_spammers($keywords) {
+
+ global $CFG, $USER, $DB;
+
+ if (!is_array($keywords)) {
+ $keywords = array($keywords); // Make it into an array
+ }
+
+ $like = $DB->sql_ilike();
+
+ $keywordfull = array();
+ foreach ($keywords as $keyword) {
+ $keyword = addslashes($keyword); // Just to be safe
+ $keywordfull[] = " description $like '%$keyword%' ";
+ $keywordfull2[] = " p.summary $like '%$keyword%' ";
+ }
+ $conditions = '( '.implode(' OR ', $keywordfull).' )';
+ $conditions2 = '( '.implode(' OR ', $keywordfull2).' )';
+
+ $sql = "SELECT * FROM {user} WHERE deleted = 0 AND id <> {$USER->id} AND $conditions"; // Exclude oneself
+ $sql2= "SELECT u.*, p.summary FROM {user} AS u, {post} AS p WHERE $conditions2 AND u.deleted = 0 AND u.id=p.userid AND u.id <> {$USER->id}";
+ $spamusers_desc = $DB->get_recordset_sql($sql);
+ $spamusers_blog = $DB->get_recordset_sql($sql2);
+
+ $keywordlist = implode(', ', $keywords);
+ print_box(get_string('spamresult', 'report_spamcleaner').s($keywordlist)).' ...';
+
+ print_user_list(array($spamusers_desc, $spamusers_blog), $keywords);
+
+}
+
+
+
+function print_user_list($users_rs, $keywords) {
+ global $CFG, $SESSION;
+
+ // reset session everytime this function is called
+ $SESSION->users_result = array();
+ $count = 0;
+
+ foreach ($users_rs as $rs){
+ foreach ($rs as $user) {
+ if (!$count) {
+ echo ' '.get_string('user','admin').' '.get_string('spamdesc', 'report_spamcleaner').' '.get_string('spamoperation', 'report_spamcleaner').' ';
+ }
+ $count++;
+ filter_user($user, $keywords, $count);
+ }
+ }
+
+ if (!$count) {
+ echo get_string('spamcannotfinduser', 'report_spamcleaner');
+
+ } else {
+ echo '
';
+ echo '
+ '.get_string('spamdeleteall', 'report_spamcleaner').'
+
';
+ }
+}
+function filter_user($user, $keywords, $count) {
+ global $CFG;
+ $image_search = false;
+ if (in_array(' summary)) {
+ $user->description = ''.get_string('spamfromblog', 'report_spamcleaner').' '.$user->summary;
+ unset($user->summary);
+ }
+ if (preg_match('#pixpath.')#', $user->description, $matches)
+ && $image_search) {
+ $result = false;
+ foreach ($keywords as $keyword) {
+ if (preg_match('#'.$keyword.'#', $user->description)
+ && ($keyword != ' id = $user->id;
+ $smalluserobject->email = $user->email;
+ $smalluserobject->auth = $user->auth;
+ $smalluserobject->firstname = $user->firstname;
+ $smalluserobject->lastname = $user->lastname;
+
+ if (empty($SESSION->users_result[$user->id])) {
+ $SESSION->users_result[$user->id] = $smalluserobject;
+ $html = '';
+ $html .= ''.$count.' ';
+ $html .= 'id.'" title="'.$user->username.'">'.fullname($user).' ';
+
+ $html .= "";
+ $profile_set = array('city'=>true, 'country'=>true, 'email'=>true);
+ foreach ($profile_set as $key=>$value) {
+ if (isset($user->$key)){
+ $html .= ''.$user->$key.' ';
+ }
+ }
+ $html .= " ";
+ $html .= ' ';
+
+ foreach ($keywords as $keyword) {
+ $user->description = format_text(highlight($keyword, $user->description), FORMAT_MOODLE);
+ }
+
+ $html .= ''.$user->description.' ';
+ $html .= '';
+ $html .= ''.get_string('deleteuser', 'admin').' ';
+ $html .= ''.get_string('ignore', 'admin').' ';
+ $html .= ' ';
+ $html .= ' ';
+ return $html;
+ } else {
+ return null;
+ }
+
+
+}
+
+function print_spamcleaner_javascript() {
+
+$sesskey = sesskey();
+
+?>
+
+
+
+
diff --git a/admin/report/spamcleaner/settings.php b/admin/report/spamcleaner/settings.php
new file mode 100644
index 00000000000..938f0158da9
--- /dev/null
+++ b/admin/report/spamcleaner/settings.php
@@ -0,0 +1,5 @@
+add('reports', new admin_externalpage('reportspamcleaner', get_string('spamcleaner', 'report_spamcleaner'), "$CFG->wwwroot/$CFG->admin/report/spamcleaner/index.php", 'moodle/site:config'));
+
diff --git a/lang/en_utf8/report_spamcleaner.php b/lang/en_utf8/report_spamcleaner.php
new file mode 100644
index 00000000000..319eca9d599
--- /dev/null
+++ b/lang/en_utf8/report_spamcleaner.php
@@ -0,0 +1,17 @@
+ Moodle docs has more information about Reducing spam in Moodle .';
+$string['spamdesc'] = 'Description';
+$string['spamdeleteall'] = 'Delete all these user accounts';
+$string['spamdeleteconfirm'] = 'Are you sure you want to delete this entry? You can not undo this.';
+$string['spamdeleteallconfirm'] = 'Are you sure you want to delete all these user accounts? You can not undo this.';
+$string['spameg'] = 'eg: casino, porn, xxx ';
+$string['spamfromblog'] = 'From blog post:';
+$string['spaminvalidresult'] = 'Unknown but invalid result';
+$string['spamoperation'] = 'Operation';
+$string['spamresult'] = 'Results of searching user profiles containing: ';
+$string['spamsearch'] = 'Search for these keywords';
+?>