Verzeichnisstruktur phpBB-3.1.0


Veröffentlicht
27.10.2014

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

acp_prune.php

Zuletzt modifiziert: 09.10.2024, 12:52 - Dateigröße: 16.70 KiB


001  <?php
002  /**
003  *
004  * This file is part of the phpBB Forum Software package.
005  *
006  * @copyright (c) phpBB Limited <https://www.phpbb.com>
007  * @license GNU General Public License, version 2 (GPL-2.0)
008  *
009  * For full copyright and license information, please see
010  * the docs/CREDITS.txt file.
011  *
012  */
013   
014  /**
015  * @ignore
016  */
017  if (!defined('IN_PHPBB'))
018  {
019      exit;
020  }
021   
022  class acp_prune
023  {
024      var $u_action;
025   
026      function main($id, $mode)
027      {
028          global $user, $phpEx, $phpbb_admin_path, $phpbb_root_path;
029   
030          $user->add_lang('acp/prune');
031          include_once($phpbb_root_path . 'includes/functions_user.' . $phpEx);
032   
033          switch ($mode)
034          {
035              case 'forums':
036                  $this->tpl_name = 'acp_prune_forums';
037                  $this->page_title = 'ACP_PRUNE_FORUMS';
038                  $this->prune_forums($id, $mode);
039              break;
040   
041              case 'users':
042                  $this->tpl_name = 'acp_prune_users';
043                  $this->page_title = 'ACP_PRUNE_USERS';
044                  $this->prune_users($id, $mode);
045              break;
046          }
047      }
048   
049      /**
050      * Prune forums
051      */
052      function prune_forums($id, $mode)
053      {
054          global $db, $user, $auth, $template, $cache;
055          global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
056   
057          $all_forums = request_var('all_forums', 0);
058          $forum_id = request_var('f', array(0));
059          $submit = (isset($_POST['submit'])) ? true : false;
060   
061          if ($all_forums)
062          {
063              $sql = 'SELECT forum_id
064                  FROM ' . FORUMS_TABLE . '
065                  ORDER BY left_id';
066              $result = $db->sql_query($sql);
067   
068              $forum_id = array();
069              while ($row = $db->sql_fetchrow($result))
070              {
071                  $forum_id[] = $row['forum_id'];
072              }
073              $db->sql_freeresult($result);
074          }
075   
076          if ($submit)
077          {
078              if (confirm_box(true))
079              {
080                  $prune_posted = request_var('prune_days', 0);
081                  $prune_viewed = request_var('prune_vieweddays', 0);
082                  $prune_all = (!$prune_posted && !$prune_viewed) ? true : false;
083   
084                  $prune_flags = 0;
085                  $prune_flags += (request_var('prune_old_polls', 0)) ? 2 : 0;
086                  $prune_flags += (request_var('prune_announce', 0)) ? 4 : 0;
087                  $prune_flags += (request_var('prune_sticky', 0)) ? 8 : 0;
088   
089                  // Convert days to seconds for timestamp functions...
090                  $prunedate_posted = time() - ($prune_posted * 86400);
091                  $prunedate_viewed = time() - ($prune_viewed * 86400);
092   
093                  $template->assign_vars(array(
094                      'S_PRUNED'        => true)
095                  );
096   
097                  $sql_forum = (sizeof($forum_id)) ? ' AND ' . $db->sql_in_set('forum_id', $forum_id) : '';
098   
099                  // Get a list of forum's or the data for the forum that we are pruning.
100                  $sql = 'SELECT forum_id, forum_name
101                      FROM ' . FORUMS_TABLE . '
102                      WHERE forum_type = ' . FORUM_POST . "
103                          $sql_forum
104                      ORDER BY left_id ASC";
105                  $result = $db->sql_query($sql);
106   
107                  if ($row = $db->sql_fetchrow($result))
108                  {
109                      $prune_ids = array();
110                      $p_result['topics'] = 0;
111                      $p_result['posts'] = 0;
112                      $log_data = '';
113   
114                      do
115                      {
116                          if (!$auth->acl_get('f_list', $row['forum_id']))
117                          {
118                              continue;
119                          }
120   
121                          if ($prune_all)
122                          {
123                              $p_result = prune($row['forum_id'], 'posted', time(), $prune_flags, false);
124                          }
125                          else
126                          {
127                              if ($prune_posted)
128                              {
129                                  $return = prune($row['forum_id'], 'posted', $prunedate_posted, $prune_flags, false);
130                                  $p_result['topics'] += $return['topics'];
131                                  $p_result['posts'] += $return['posts'];
132                              }
133   
134                              if ($prune_viewed)
135                              {
136                                  $return = prune($row['forum_id'], 'viewed', $prunedate_viewed, $prune_flags, false);
137                                  $p_result['topics'] += $return['topics'];
138                                  $p_result['posts'] += $return['posts'];
139                              }
140                          }
141   
142                          $prune_ids[] = $row['forum_id'];
143   
144                          $template->assign_block_vars('pruned', array(
145                              'FORUM_NAME'    => $row['forum_name'],
146                              'NUM_TOPICS'    => $p_result['topics'],
147                              'NUM_POSTS'        => $p_result['posts'])
148                          );
149   
150                          $log_data .= (($log_data != '') ? ', ' : '') . $row['forum_name'];
151                      }
152                      while ($row = $db->sql_fetchrow($result));
153   
154                      // Sync all pruned forums at once
155                      sync('forum', 'forum_id', $prune_ids, true, true);
156                      add_log('admin', 'LOG_PRUNE', $log_data);
157                  }
158                  $db->sql_freeresult($result);
159   
160                  return;
161              }
162              else
163              {
164                  confirm_box(false, $user->lang['PRUNE_FORUM_CONFIRM'], build_hidden_fields(array(
165                      'i'                => $id,
166                      'mode'            => $mode,
167                      'submit'        => 1,
168                      'all_forums'    => $all_forums,
169                      'f'                => $forum_id,
170   
171                      'prune_days'        => request_var('prune_days', 0),
172                      'prune_vieweddays'    => request_var('prune_vieweddays', 0),
173                      'prune_old_polls'    => request_var('prune_old_polls', 0),
174                      'prune_announce'    => request_var('prune_announce', 0),
175                      'prune_sticky'        => request_var('prune_sticky', 0),
176                  )));
177              }
178          }
179   
180          // If they haven't selected a forum for pruning yet then
181          // display a select box to use for pruning.
182          if (!sizeof($forum_id))
183          {
184              $template->assign_vars(array(
185                  'U_ACTION'            => $this->u_action,
186                  'S_SELECT_FORUM'    => true,
187                  'S_FORUM_OPTIONS'    => make_forum_select(false, false, false))
188              );
189          }
190          else
191          {
192              $sql = 'SELECT forum_id, forum_name
193                  FROM ' . FORUMS_TABLE . '
194                  WHERE ' . $db->sql_in_set('forum_id', $forum_id);
195              $result = $db->sql_query($sql);
196              $row = $db->sql_fetchrow($result);
197   
198              if (!$row)
199              {
200                  $db->sql_freeresult($result);
201                  trigger_error($user->lang['NO_FORUM'] . adm_back_link($this->u_action), E_USER_WARNING);
202              }
203   
204              $forum_list = $s_hidden_fields = '';
205              do
206              {
207                  $forum_list .= (($forum_list != '') ? ', ' : '') . '<b>' . $row['forum_name'] . '</b>';
208                  $s_hidden_fields .= '<input type="hidden" name="f[]" value="' . $row['forum_id'] . '" />';
209              }
210              while ($row = $db->sql_fetchrow($result));
211   
212              $db->sql_freeresult($result);
213   
214              $l_selected_forums = (sizeof($forum_id) == 1) ? 'SELECTED_FORUM' : 'SELECTED_FORUMS';
215   
216              $template->assign_vars(array(
217                  'L_SELECTED_FORUMS'        => $user->lang[$l_selected_forums],
218                  'U_ACTION'                => $this->u_action,
219                  'U_BACK'                => $this->u_action,
220                  'FORUM_LIST'            => $forum_list,
221                  'S_HIDDEN_FIELDS'        => $s_hidden_fields)
222              );
223          }
224      }
225   
226      /**
227      * Prune users
228      */
229      function prune_users($id, $mode)
230      {
231          global $db, $user, $auth, $template, $cache;
232          global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
233   
234          $user->add_lang('memberlist');
235   
236          $prune = (isset($_POST['prune'])) ? true : false;
237   
238          if ($prune)
239          {
240              $action = request_var('action', 'deactivate');
241              $deleteposts = request_var('deleteposts', 0);
242   
243              if (confirm_box(true))
244              {
245                  $user_ids = $usernames = array();
246   
247                  $this->get_prune_users($user_ids, $usernames);
248                  if (sizeof($user_ids))
249                  {
250                      if ($action == 'deactivate')
251                      {
252                          user_active_flip('deactivate', $user_ids);
253                          $l_log = 'LOG_PRUNE_USER_DEAC';
254                      }
255                      else if ($action == 'delete')
256                      {
257                          if ($deleteposts)
258                          {
259                              user_delete('remove', $user_ids);
260   
261                              $l_log = 'LOG_PRUNE_USER_DEL_DEL';
262                          }
263                          else
264                          {
265                              user_delete('retain', $user_ids, true);
266   
267                              $l_log = 'LOG_PRUNE_USER_DEL_ANON';
268                          }
269                      }
270   
271                      add_log('admin', $l_log, implode(', ', $usernames));
272                      $msg = $user->lang['USER_' . strtoupper($action) . '_SUCCESS'];
273                  }
274                  else
275                  {
276                      $msg = $user->lang['USER_PRUNE_FAILURE'];
277                  }
278   
279                  trigger_error($msg . adm_back_link($this->u_action));
280              }
281              else
282              {
283                  // We list the users which will be pruned...
284                  $user_ids = $usernames = array();
285                  $this->get_prune_users($user_ids, $usernames);
286   
287                  if (!sizeof($user_ids))
288                  {
289                      trigger_error($user->lang['USER_PRUNE_FAILURE'] . adm_back_link($this->u_action), E_USER_WARNING);
290                  }
291   
292                  // Assign to template
293                  foreach ($user_ids as $user_id)
294                  {
295                      $template->assign_block_vars('users', array(
296                          'USERNAME'            => $usernames[$user_id],
297                          'USER_ID'           => $user_id,
298                          'U_PROFILE'            => get_username_string('profile', $user_id, $usernames[$user_id]),
299                          'U_USER_ADMIN'        => ($auth->acl_get('a_user')) ? append_sid("{$phpbb_admin_path}index.$phpEx", 'i=users&amp;mode=overview&amp;u=' . $user_id, true, $user->session_id) : '',
300                      ));
301                  }
302   
303                  $template->assign_vars(array(
304                      'S_DEACTIVATE'        => ($action == 'deactivate') ? true : false,
305                      'S_DELETE'            => ($action == 'delete') ? true : false,
306                  ));
307   
308                  confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array(
309                      'i'                => $id,
310                      'mode'            => $mode,
311                      'prune'            => 1,
312   
313                      'deleteposts'    => request_var('deleteposts', 0),
314                      'action'        => request_var('action', ''),
315                  )), 'confirm_body_prune.html');
316              }
317          }
318   
319          $find_count = array('lt' => $user->lang['LESS_THAN'], 'eq' => $user->lang['EQUAL_TO'], 'gt' => $user->lang['MORE_THAN']);
320          $s_find_count = '';
321   
322          foreach ($find_count as $key => $value)
323          {
324              $selected = ($key == 'eq') ? ' selected="selected"' : '';
325              $s_find_count .= '<option value="' . $key . '"' . $selected . '>' . $value . '</option>';
326          }
327   
328          $find_time = array('lt' => $user->lang['BEFORE'], 'gt' => $user->lang['AFTER']);
329          $s_find_active_time = '';
330          foreach ($find_time as $key => $value)
331          {
332              $s_find_active_time .= '<option value="' . $key . '">' . $value . '</option>';
333          }
334   
335          $sql = 'SELECT group_id, group_name
336              FROM ' . GROUPS_TABLE . '
337              WHERE group_type <> ' . GROUP_SPECIAL . '
338              ORDER BY group_name ASC';
339          $result = $db->sql_query($sql);
340   
341          $s_group_list = '';
342          while ($row = $db->sql_fetchrow($result))
343          {
344              $s_group_list .= '<option value="' . $row['group_id'] . '">' . $row['group_name'] . '</option>';
345          }
346          $db->sql_freeresult($result);
347   
348          if ($s_group_list)
349          {
350              // Only prepend the "All groups" option if there are groups,
351              // otherwise we don't want to display this option at all.
352              $s_group_list = '<option value="0">' . $user->lang['PRUNE_USERS_GROUP_NONE'] . '</option>' . $s_group_list;
353          }
354   
355          $template->assign_vars(array(
356              'U_ACTION'            => $this->u_action,
357              'S_ACTIVE_OPTIONS'    => $s_find_active_time,
358              'S_GROUP_LIST'        => $s_group_list,
359              'S_COUNT_OPTIONS'    => $s_find_count,
360              'U_FIND_USERNAME'    => append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=searchuser&amp;form=acp_prune&amp;field=users'),
361          ));
362      }
363   
364      /**
365      * Get user_ids/usernames from those being pruned
366      */
367      function get_prune_users(&$user_ids, &$usernames)
368      {
369          global $user, $db, $request;
370   
371          $users_by_name = request_var('users', '', true);
372          $users_by_id = request_var('user_ids', array(0));
373          $group_id = request_var('group_id', 0);
374          $posts_on_queue = (trim($request->variable('posts_on_queue', '')) === '') ? false : $request->variable('posts_on_queue', 0);
375   
376          if ($users_by_name)
377          {
378              $users = explode("\n", $users_by_name);
379              $where_sql = ' AND ' . $db->sql_in_set('username_clean', array_map('utf8_clean_string', $users));
380          }
381          else if (!empty($users_by_id))
382          {
383              $user_ids = $users_by_id;
384              user_get_id_name($user_ids, $usernames);
385   
386              $where_sql = ' AND ' . $db->sql_in_set('user_id', $user_ids);
387          }
388          else
389          {
390              $username = request_var('username', '', true);
391              $email = request_var('email', '');
392   
393              $active_select = request_var('active_select', 'lt');
394              $count_select = request_var('count_select', 'eq');
395              $queue_select = request_var('queue_select', 'gt');
396              $joined_before = request_var('joined_before', '');
397              $joined_after = request_var('joined_after', '');
398              $active = request_var('active', '');
399   
400              $count = request_var('count', 0);
401   
402              $active = ($active) ? explode('-', $active) : array();
403              $joined_before = ($joined_before) ? explode('-', $joined_before) : array();
404              $joined_after = ($joined_after) ? explode('-', $joined_after) : array();
405   
406              // calculate the conditions required by the join time criteria
407              $joined_sql = '';
408              if (!empty($joined_before) && !empty($joined_after))
409              {
410                  // if the two entered dates are equal, we need to adjust
411                  // so that our time range is a full day instead of 1 second
412                  if ($joined_after == $joined_before)
413                  {
414                      $joined_after[2] += 1;
415                  }
416   
417                  $joined_sql = ' AND user_regdate BETWEEN ' . gmmktime(0, 0, 0, (int) $joined_after[1], (int) $joined_after[2], (int) $joined_after[0]) .
418                      ' AND ' . gmmktime(0, 0, 0, (int) $joined_before[1], (int) $joined_before[2], (int) $joined_before[0]);
419              }
420              else if (empty($joined_before) && !empty($joined_after))
421              {
422                  $joined_sql = ' AND user_regdate > ' . gmmktime(0, 0, 0, (int) $joined_after[1], (int) $joined_after[2], (int) $joined_after[0]);
423              }
424              else if (empty($joined_after) && !empty($joined_before))
425              {
426                  $joined_sql = ' AND user_regdate < ' . gmmktime(0, 0, 0, (int) $joined_before[1], (int) $joined_before[2], (int) $joined_before[0]);
427              }
428              // implicit else when both arrays are empty do nothing
429   
430              if ((sizeof($active) && sizeof($active) != 3) || (sizeof($joined_before) && sizeof($joined_before) != 3) || (sizeof($joined_after) && sizeof($joined_after) != 3))
431              {
432                  trigger_error($user->lang['WRONG_ACTIVE_JOINED_DATE'] . adm_back_link($this->u_action), E_USER_WARNING);
433              }
434   
435              $key_match = array('lt' => '<', 'gt' => '>', 'eq' => '=');
436              $sort_by_types = array('username', 'user_email', 'user_posts', 'user_regdate', 'user_lastvisit');
437   
438              $where_sql = '';
439              $where_sql .= ($username) ? ' AND username_clean ' . $db->sql_like_expression(str_replace('*', $db->get_any_char(), utf8_clean_string($username))) : '';
440              $where_sql .= ($email) ? ' AND user_email ' . $db->sql_like_expression(str_replace('*', $db->get_any_char(), $email)) . ' ' : '';
441              $where_sql .= $joined_sql;
442              $where_sql .= ($count) ? " AND user_posts " . $key_match[$count_select] . ' ' . (int) $count . ' ' : '';
443   
444              // First handle pruning of users who never logged in, last active date is 0000-00-00
445              if (sizeof($active) && (int) $active[0] == 0 && (int) $active[1] == 0 && (int) $active[2] == 0)
446              {
447                  $where_sql .= ' AND user_lastvisit = 0';
448              }
449              else if (sizeof($active) && $active_select != 'lt')
450              {
451                  $where_sql .= ' AND user_lastvisit ' . $key_match[$active_select] . ' ' . gmmktime(0, 0, 0, (int) $active[1], (int) $active[2], (int) $active[0]);
452              }
453              else if (sizeof($active))
454              {
455                  $where_sql .= ' AND (user_lastvisit > 0 AND user_lastvisit < ' . gmmktime(0, 0, 0, (int) $active[1], (int) $active[2], (int) $active[0]) . ')';
456              }
457          }
458   
459          // If no search criteria were provided, go no further.
460          if (!$where_sql && !$group_id && $posts_on_queue === false)
461          {
462              return;
463          }
464   
465          // Get bot ids
466          $sql = 'SELECT user_id
467              FROM ' . BOTS_TABLE;
468          $result = $db->sql_query($sql);
469   
470          $bot_ids = array();
471          while ($row = $db->sql_fetchrow($result))
472          {
473              $bot_ids[] = $row['user_id'];
474          }
475          $db->sql_freeresult($result);
476   
477          // Protect the admin, do not prune if no options are given...
478          if ($where_sql)
479          {
480              // Do not prune founder members
481              $sql = 'SELECT user_id, username
482                  FROM ' . USERS_TABLE . '
483                  WHERE user_id <> ' . ANONYMOUS . '
484                      AND user_type <> ' . USER_FOUNDER . "
485                  $where_sql";
486              $result = $db->sql_query($sql);
487   
488              $user_ids = $usernames = array();
489   
490              while ($row = $db->sql_fetchrow($result))
491              {
492                  // Do not prune bots and the user currently pruning.
493                  if ($row['user_id'] != $user->data['user_id'] && !in_array($row['user_id'], $bot_ids))
494                  {
495                      $user_ids[] = $row['user_id'];
496                      $usernames[$row['user_id']] = $row['username'];
497                  }
498              }
499              $db->sql_freeresult($result);
500          }
501   
502          if ($group_id)
503          {
504              $sql = 'SELECT u.user_id, u.username
505                  FROM ' . USER_GROUP_TABLE . ' ug, ' . USERS_TABLE . ' u
506                  WHERE ug.group_id = ' . (int) $group_id . '
507                      AND ug.user_id <> ' . ANONYMOUS . '
508                      AND u.user_type <> ' . USER_FOUNDER . '
509                      AND ug.user_pending = 0 ' .
510                      ((!empty($user_ids)) ? 'AND ' . $db->sql_in_set('ug.user_id', $user_ids) : '') . '
511                      AND u.user_id = ug.user_id';
512              $result = $db->sql_query($sql);
513   
514              // we're performing an intersection operation, so all the relevant users
515              // come from this most recent query (which was limited to the results of the
516              // previous query)
517              $user_ids = $usernames = array();
518              while ($row = $db->sql_fetchrow($result))
519              {
520                  // Do not prune bots and the user currently pruning.
521                  if ($row['user_id'] != $user->data['user_id'] && !in_array($row['user_id'], $bot_ids))
522                  {
523                      $user_ids[] = $row['user_id'];
524                      $usernames[$row['user_id']] = $row['username'];
525                  }
526              }
527              $db->sql_freeresult($result);
528          }
529   
530          if ($posts_on_queue !== false)
531          {
532              $sql = 'SELECT u.user_id, u.username, COUNT(p.post_id) AS queue_posts
533                  FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u
534                  WHERE u.user_id <> ' . ANONYMOUS . '
535                      AND u.user_type <> ' . USER_FOUNDER .
536                      ((!empty($user_ids)) ? 'AND ' . $db->sql_in_set('p.poster_id', $user_ids) : '') . '
537                      AND ' . $db->sql_in_set('p.post_visibility', array(ITEM_UNAPPROVED, ITEM_REAPPROVE)) . '
538                      AND u.user_id = p.poster_id
539                  GROUP BY p.poster_id
540                  HAVING queue_posts ' . $key_match[$queue_select] . ' ' . $posts_on_queue;
541              $result = $db->sql_query($sql);
542   
543              // same intersection logic as the above group ID portion
544              $user_ids = $usernames = array();
545              while ($row = $db->sql_fetchrow($result))
546              {
547                  // Do not prune bots and the user currently pruning.
548                  if ($row['user_id'] != $user->data['user_id'] && !in_array($row['user_id'], $bot_ids))
549                  {
550                      $user_ids[] = $row['user_id'];
551                      $usernames[$row['user_id']] = $row['username'];
552                  }
553              }
554              $db->sql_freeresult($result);
555          }
556      }
557  }
558