PageRenderTime 27ms CodeModel.GetById 39ms RepoModel.GetById 0ms app.codeStats 0ms

/admin/tool/spamcleaner/index.php

https://bitbucket.org/ngmares/moodle
PHP | 335 lines | 255 code | 62 blank | 18 comment | 46 complexity | d04e78af762a217e8723c9f965c9a1e7 MD5 | raw file
Possible License(s): LGPL-2.1, AGPL-3.0, MPL-2.0-no-copyleft-exception, GPL-3.0, Apache-2.0, BSD-3-Clause
  1. <?php
  2. /**
  3. * Spam Cleaner
  4. *
  5. * Helps an admin to clean up spam in Moodle
  6. *
  7. * @authors Dongsheng Cai, Martin Dougiamas, Amr Hourani
  8. * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
  9. */
  10. // List of known spammy keywords, please add more here
  11. /////////////////////////////////////////////////////////////////////////////////
  12. require_once('../../../config.php');
  13. require_once($CFG->libdir.'/adminlib.php');
  14. // Configuration
  15. $autokeywords = array(
  16. "<img",
  17. "fuck",
  18. "casino",
  19. "porn",
  20. "xxx",
  21. "cialis",
  22. "viagra",
  23. "poker",
  24. "warcraft"
  25. );
  26. $keyword = optional_param('keyword', '', PARAM_RAW);
  27. $autodetect = optional_param('autodetect', '', PARAM_RAW);
  28. $del = optional_param('del', '', PARAM_RAW);
  29. $delall = optional_param('delall', '', PARAM_RAW);
  30. $ignore = optional_param('ignore', '', PARAM_RAW);
  31. $reset = optional_param('reset', '', PARAM_RAW);
  32. $id = optional_param('id', '', PARAM_INT);
  33. require_login();
  34. admin_externalpage_setup('toolspamcleaner');
  35. // Delete one user
  36. if (!empty($del) && confirm_sesskey() && ($id != $USER->id)) {
  37. if (isset($SESSION->users_result[$id])) {
  38. $user = $SESSION->users_result[$id];
  39. if (delete_user($user)) {
  40. unset($SESSION->users_result[$id]);
  41. echo json_encode(true);
  42. } else {
  43. echo json_encode(false);
  44. }
  45. } else {
  46. echo json_encode(false);
  47. }
  48. exit;
  49. }
  50. // Delete lots of users
  51. if (!empty($delall) && confirm_sesskey()) {
  52. if (!empty($SESSION->users_result)) {
  53. foreach ($SESSION->users_result as $userid => $user) {
  54. if ($userid != $USER->id) {
  55. if (delete_user($user)) {
  56. unset($SESSION->users_result[$userid]);
  57. }
  58. }
  59. }
  60. }
  61. echo json_encode(true);
  62. exit;
  63. }
  64. if (!empty($ignore)) {
  65. unset($SESSION->users_result[$id]);
  66. echo json_encode(true);
  67. exit;
  68. }
  69. $PAGE->requires->js_init_call('M.tool_spamcleaner.init', array(me()), true);
  70. $strings = Array('spaminvalidresult','spamdeleteallconfirm','spamcannotdelete','spamdeleteconfirm');
  71. $PAGE->requires->strings_for_js($strings, 'tool_spamcleaner');
  72. echo $OUTPUT->header();
  73. // Print headers and things
  74. echo $OUTPUT->box(get_string('spamcleanerintro', 'tool_spamcleaner'));
  75. echo $OUTPUT->box_start(); // The forms section at the top
  76. ?>
  77. <div class="mdl-align">
  78. <form method="post" action="index.php">
  79. <div>
  80. <input type="text" name="keyword" id="keyword_el" value="<?php p($keyword) ?>" />
  81. <input type="hidden" name="sesskey" value="<?php echo sesskey();?>" />
  82. <input type="submit" value="<?php echo get_string('spamsearch', 'tool_spamcleaner')?>" />
  83. </div>
  84. </form>
  85. <p><?php echo get_string('spameg', 'tool_spamcleaner');?></p>
  86. <hr />
  87. <form method="post" action="index.php">
  88. <div>
  89. <input type="submit" name="autodetect" value="<?php echo get_string('spamauto', 'tool_spamcleaner');?>" />
  90. </div>
  91. </form>
  92. </div>
  93. <?php
  94. echo $OUTPUT->box_end();
  95. echo '<div id="result" class="mdl-align">';
  96. // Print list of resulting profiles
  97. if (!empty($keyword)) { // Use the keyword(s) supplied by the user
  98. $keywords = explode(',', $keyword);
  99. foreach ($keywords as $key => $keyword) {
  100. $keywords[$key] = trim($keyword);
  101. }
  102. search_spammers($keywords);
  103. } else if (!empty($autodetect)) { // Use the inbuilt keyword list to detect users
  104. search_spammers($autokeywords);
  105. }
  106. echo '</div>';
  107. /////////////////////////////////////////////////////////////////////////////////
  108. /// Functions
  109. function search_spammers($keywords) {
  110. global $CFG, $USER, $DB, $OUTPUT;
  111. if (!is_array($keywords)) {
  112. $keywords = array($keywords); // Make it into an array
  113. }
  114. $params = array('userid'=>$USER->id);
  115. $keywordfull = array();
  116. $i = 0;
  117. foreach ($keywords as $keyword) {
  118. $keywordfull[] = $DB->sql_like('description', ':descpat'.$i, false);
  119. $params['descpat'.$i] = "%$keyword%";
  120. $keywordfull2[] = $DB->sql_like('p.summary', ':sumpat'.$i, false);
  121. $params['sumpat'.$i] = "%$keyword%";
  122. $keywordfull3[] = $DB->sql_like('p.subject', ':subpat'.$i, false);
  123. $params['subpat'.$i] = "%$keyword%";
  124. $keywordfull4[] = $DB->sql_like('c.content', ':contpat'.$i, false);
  125. $params['contpat'.$i] = "%$keyword%";
  126. $keywordfull5[] = $DB->sql_like('m.fullmessage', ':msgpat'.$i, false);
  127. $params['msgpat'.$i] = "%$keyword%";
  128. $keywordfull6[] = $DB->sql_like('fp.message', ':forumpostpat'.$i, false);
  129. $params['forumpostpat'.$i] = "%$keyword%";
  130. $keywordfull7[] = $DB->sql_like('fp.subject', ':forumpostsubpat'.$i, false);
  131. $params['forumpostsubpat'.$i] = "%$keyword%";
  132. $i++;
  133. }
  134. $conditions = '( '.implode(' OR ', $keywordfull).' )';
  135. $conditions2 = '( '.implode(' OR ', $keywordfull2).' )';
  136. $conditions3 = '( '.implode(' OR ', $keywordfull3).' )';
  137. $conditions4 = '( '.implode(' OR ', $keywordfull4).' )';
  138. $conditions5 = '( '.implode(' OR ', $keywordfull5).' )';
  139. $conditions6 = '( '.implode(' OR ', $keywordfull6).' )';
  140. $conditions7 = '( '.implode(' OR ', $keywordfull7).' )';
  141. $sql = "SELECT * FROM {user} WHERE deleted = 0 AND id <> :userid AND $conditions"; // Exclude oneself
  142. $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 <> :userid";
  143. $sql3 = "SELECT u.*, p.subject as postsubject FROM {user} AS u, {post} AS p WHERE $conditions3 AND u.deleted = 0 AND u.id=p.userid AND u.id <> :userid";
  144. $sql4 = "SELECT u.*, c.content FROM {user} AS u, {comments} AS c WHERE $conditions4 AND u.deleted = 0 AND u.id=c.userid AND u.id <> :userid";
  145. $sql5 = "SELECT u.*, m.fullmessage FROM {user} AS u, {message} AS m WHERE $conditions5 AND u.deleted = 0 AND u.id=m.useridfrom AND u.id <> :userid";
  146. $sql6 = "SELECT u.*, fp.message FROM {user} AS u, {forum_posts} AS fp WHERE $conditions6 AND u.deleted = 0 AND u.id=fp.userid AND u.id <> :userid";
  147. $sql7 = "SELECT u.*, fp.subject FROM {user} AS u, {forum_posts} AS fp WHERE $conditions7 AND u.deleted = 0 AND u.id=fp.userid AND u.id <> :userid";
  148. $spamusers_desc = $DB->get_recordset_sql($sql, $params);
  149. $spamusers_blog = $DB->get_recordset_sql($sql2, $params);
  150. $spamusers_blogsub = $DB->get_recordset_sql($sql3, $params);
  151. $spamusers_comment = $DB->get_recordset_sql($sql4, $params);
  152. $spamusers_message = $DB->get_recordset_sql($sql5, $params);
  153. $spamusers_forumpost = $DB->get_recordset_sql($sql6, $params);
  154. $spamusers_forumpostsub = $DB->get_recordset_sql($sql7, $params);
  155. $keywordlist = implode(', ', $keywords);
  156. echo $OUTPUT->box(get_string('spamresult', 'tool_spamcleaner').s($keywordlist)).' ...';
  157. print_user_list(array($spamusers_desc,
  158. $spamusers_blog,
  159. $spamusers_blogsub,
  160. $spamusers_comment,
  161. $spamusers_message,
  162. $spamusers_forumpost,
  163. $spamusers_forumpostsub
  164. ),
  165. $keywords);
  166. }
  167. function print_user_list($users_rs, $keywords) {
  168. global $CFG, $SESSION;
  169. // reset session everytime this function is called
  170. $SESSION->users_result = array();
  171. $count = 0;
  172. foreach ($users_rs as $rs){
  173. foreach ($rs as $user) {
  174. if (!$count) {
  175. echo '<table border="1" width="100%" id="data-grid"><tr><th>&nbsp;</th><th>'.get_string('user','admin').'</th><th>'.get_string('spamdesc', 'tool_spamcleaner').'</th><th>'.get_string('spamoperation', 'tool_spamcleaner').'</th></tr>';
  176. }
  177. $count++;
  178. filter_user($user, $keywords, $count);
  179. }
  180. }
  181. if (!$count) {
  182. echo get_string('spamcannotfinduser', 'tool_spamcleaner');
  183. } else {
  184. echo '</table>';
  185. echo '<div class="mld-align">
  186. <button id="removeall_btn">'.get_string('spamdeleteall', 'tool_spamcleaner').'</button>
  187. </div>';
  188. }
  189. }
  190. function filter_user($user, $keywords, $count) {
  191. global $CFG;
  192. $image_search = false;
  193. if (in_array('<img', $keywords)) {
  194. $image_search = true;
  195. }
  196. if (isset($user->summary)) {
  197. $user->description = '<h3>'.get_string('spamfromblog', 'tool_spamcleaner').'</h3>'.$user->summary;
  198. unset($user->summary);
  199. } else if (isset($user->postsubject)) {
  200. $user->description = '<h3>'.get_string('spamfromblog', 'tool_spamcleaner').'</h3>'.$user->postsubject;
  201. unset($user->postsubject);
  202. } else if (isset($user->content)) {
  203. $user->description = '<h3>'.get_string('spamfromcomments', 'tool_spamcleaner').'</h3>'.$user->content;
  204. unset($user->content);
  205. } else if (isset($user->fullmessage)) {
  206. $user->description = '<h3>'.get_string('spamfrommessages', 'tool_spamcleaner').'</h3>'.$user->fullmessage;
  207. unset($user->fullmessage);
  208. } else if (isset($user->message)) {
  209. $user->description = '<h3>'.get_string('spamfromforumpost', 'tool_spamcleaner').'</h3>'.$user->message;
  210. unset($user->message);
  211. } else if (isset($user->subject)) {
  212. $user->description = '<h3>'.get_string('spamfromforumpost', 'tool_spamcleaner').'</h3>'.$user->subject;
  213. unset($user->subject);
  214. }
  215. if (preg_match('#<img.*src=[\"\']('.$CFG->wwwroot.')#', $user->description, $matches)
  216. && $image_search) {
  217. $result = false;
  218. foreach ($keywords as $keyword) {
  219. if (preg_match('#'.$keyword.'#', $user->description)
  220. && ($keyword != '<img')) {
  221. $result = true;
  222. }
  223. }
  224. if ($result) {
  225. echo print_user_entry($user, $keywords, $count);
  226. } else {
  227. unset($user);
  228. }
  229. } else {
  230. echo print_user_entry($user, $keywords, $count);
  231. }
  232. }
  233. function print_user_entry($user, $keywords, $count) {
  234. global $SESSION, $CFG;
  235. $smalluserobject = new stdClass(); // All we need to delete them later
  236. $smalluserobject->id = $user->id;
  237. $smalluserobject->email = $user->email;
  238. $smalluserobject->auth = $user->auth;
  239. $smalluserobject->firstname = $user->firstname;
  240. $smalluserobject->lastname = $user->lastname;
  241. $smalluserobject->username = $user->username;
  242. if (empty($SESSION->users_result[$user->id])) {
  243. $SESSION->users_result[$user->id] = $smalluserobject;
  244. $html = '<tr valign="top" id="row-'.$user->id.'" class="result-row">';
  245. $html .= '<td width="10">'.$count.'</td>';
  246. $html .= '<td width="30%" align="left"><a href="'.$CFG->wwwroot."/user/view.php?course=1&amp;id=".$user->id.'" title="'.s($user->username).'">'.fullname($user).'</a>';
  247. $html .= "<ul>";
  248. $profile_set = array('city'=>true, 'country'=>true, 'email'=>true);
  249. foreach ($profile_set as $key=>$value) {
  250. if (isset($user->$key)){
  251. $html .= '<li>'.$user->$key.'</li>';
  252. }
  253. }
  254. $html .= "</ul>";
  255. $html .= '</td>';
  256. foreach ($keywords as $keyword) {
  257. $user->description = highlight($keyword, $user->description);
  258. }
  259. if (!isset($user->descriptionformat)) {
  260. $user->descriptionformat = FORMAT_MOODLE;
  261. }
  262. $html .= '<td align="left">'.format_text($user->description, $user->descriptionformat, array('overflowdiv'=>true)).'</td>';
  263. $html .= '<td width="100px" align="center">';
  264. $html .= '<button onclick="M.tool_spamcleaner.del_user(this,'.$user->id.')">'.get_string('deleteuser', 'admin').'</button><br />';
  265. $html .= '<button onclick="M.tool_spamcleaner.ignore_user(this,'.$user->id.')">'.get_string('ignore', 'admin').'</button>';
  266. $html .= '</td>';
  267. $html .= '</tr>';
  268. return $html;
  269. } else {
  270. return null;
  271. }
  272. }
  273. echo $OUTPUT->footer();