[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/admin/tool/spamcleaner/ -> index.php (source)

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


Generated: Thu Aug 11 10:00:09 2016 Cross-referenced by PHPXref 0.7.1