From 85fcc67e01733f822d828d9a64778ed1c6440dbb Mon Sep 17 00:00:00 2001 From: dongsheng Date: Mon, 23 Feb 2009 01:09:11 +0000 Subject: [PATCH] "REPORT,SPAMCLEANER/MDL-18223, backport spamcleaner to 1.7" --- admin/report/spamcleaner/index.php | 369 ++++++++++++++++++++++++++ admin/report/spamcleaner/settings.php | 5 + lang/en_utf8/admin.php | 3 + lang/en_utf8/report_spamcleaner.php | 17 ++ 4 files changed, 394 insertions(+) create mode 100755 admin/report/spamcleaner/index.php create mode 100644 admin/report/spamcleaner/settings.php create mode 100644 lang/en_utf8/report_spamcleaner.php diff --git a/admin/report/spamcleaner/index.php b/admin/report/spamcleaner/index.php new file mode 100755 index 00000000000..8d7c2f90e74 --- /dev/null +++ b/admin/report/spamcleaner/index.php @@ -0,0 +1,369 @@ +libdir.'/adminlib.php'); +function delete_user($user) { + $updateuser = new object(); + $updateuser->id = $user->id; + $updateuser->deleted = 1; + $updateuser->username = addslashes("$user->email.".time()); + $updateuser->email = ''; + $updateuser->idnumber = ''; + $updateuser->timemodified = time(); + if (update_record('user', $updateuser)) { + role_unassign(0, $user->id); + return true; + } else { + return false; + } +} + +$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(); +$adminroot = admin_get_root(); +admin_externalpage_setup('reportspamcleaner', $adminroot); + +// 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 1; + } else { + echo 0; + } + } else { + echo 0; + } + 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 1; + exit; +} + +if (!empty($ignore)) { + unset($SESSION->users_result[$id]); + echo 1; + exit; +} + +admin_externalpage_print_header($adminroot); + +// Print headers and things + +print_spamcleaner_javascript(); + +print_simple_box(get_string('spamcleanerintro', 'report_spamcleaner')); + +?> + +
+ +
+
+ + + +
+
+

+ +
+ +
+
+ +
+
+ + +
+ +'; + +// 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 = 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 {$CFG->prefix}user WHERE deleted = 0 AND id <> {$USER->id} AND $conditions"; // Exclude oneself + $sql2= "SELECT u.*, p.summary FROM {$CFG->prefix}user AS u, {$CFG->prefix}post AS p WHERE $conditions2 AND u.deleted = 0 AND u.id=p.userid AND u.id <> {$USER->id}"; + $spamusers_desc = get_recordset_sql($sql); + $spamusers_blog = get_recordset_sql($sql2); + + $keywordlist = implode(', ', $keywords); + print_simple_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) { + while ($user = rs_fetch_next_record($rs)) { + if (!$count) { + echo ''; + } + $count++; + filter_user($user, $keywords, $count); + } + } + + if (!$count) { + echo get_string('spamcannotfinduser', 'report_spamcleaner'); + + } else { + echo '
 '.get_string('user','admin').''.get_string('spamdesc', 'report_spamcleaner').''.get_string('spamoperation', 'report_spamcleaner').'
'; + echo '
+ +
'; + } +} +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="'.s($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 = highlight($keyword, $user->description); + } + + $html .= ''.format_text($user->description, FORMAT_MOODLE).''; + $html .= ''; + $html .= '
'; + $html .= ''; + $html .= ''; + $html .= ''; + return $html; + } else { + return null; + } + + +} + +function print_spamcleaner_javascript() { + global $CFG; + +$sesskey = sesskey(); + +?> + + + + + diff --git a/admin/report/spamcleaner/settings.php b/admin/report/spamcleaner/settings.php new file mode 100644 index 00000000000..025f91a660c --- /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/admin.php b/lang/en_utf8/admin.php index f9632e1637b..957cef85014 100644 --- a/lang/en_utf8/admin.php +++ b/lang/en_utf8/admin.php @@ -279,6 +279,7 @@ $string['htmleditor'] = 'HTML Editor'; $string['http'] = 'HTTP'; $string['httpsecurity'] = 'HTTP security'; $string['iconvrecommended'] = 'Installing the optional ICONV library is highly recommended in order to improve site performance, particularly if your site is supporting non-latin languages.'; +$string['ignore'] = 'Ignore'; $string['importlangreminder'] = 'The database migration process is commencing. You will need to log in again for the upgrade to take effect. Please install unicode language packs as soon as possible from Admin->Lang->Lang Import Utility after the database migration process is completed.'; $string['importtimezones'] = 'Update complete list of timezones'; $string['importtimezonescount'] = '$a->count entries imported from $a->source'; @@ -427,6 +428,7 @@ $string['stickyblockscourseview'] = 'Course page'; $string['stickyblocksduplicatenotice'] = 'If any block you add here is already present in a particular page, it will result in a duplicate.
Only the pinned block will be non-editable, the duplicate will still be editable.'; $string['stickyblocksmymoodle'] = 'My moodle'; $string['stickyblockspagetype'] = 'Page type to configure'; +$string['spamcleaner'] = 'Spam cleaner'; $string['systempaths'] = 'System Paths'; $string['tabselectedtofront'] = 'On tables with tabs, should the row with the currently selected tag be placed at the front'; $string['tabselectedtofronttext'] = 'Bring selected tab row to front'; @@ -463,6 +465,7 @@ $string['upgradingdata'] = 'Upgrading data'; $string['upgradinglogs'] = 'Upgrading logs'; $string['upwards'] = 'upwards'; $string['usehtmleditor'] = 'Use HTML editor'; +$string['user'] = 'User'; $string['useraccountupdated'] = 'User updated'; $string['userlist'] = 'Browse list of users'; $string['userpolicies'] = 'User policies'; 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'; +?>