Load.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. <?php
  2. /**
  3. * This file is part of the ForkBB <https://github.com/forkbb>.
  4. *
  5. * @copyright (c) Visman <mio.visman@yandex.ru, https://github.com/MioVisman>
  6. * @license The MIT License (MIT)
  7. */
  8. declare(strict_types=1);
  9. namespace ForkBB\Models\BanList;
  10. use ForkBB\Models\Method;
  11. use ForkBB\Models\BanList\BanList;
  12. use RuntimeException;
  13. class Load extends Method
  14. {
  15. /**
  16. * Загружает список банов из БД для модели и кеша
  17. */
  18. public function load(): array
  19. {
  20. $userList = [];
  21. $emailList = [];
  22. $ipList = [];
  23. $banList = [];
  24. $first = 0;
  25. $query = 'SELECT b.id, b.username, b.ip, b.email, b.message, b.expire
  26. FROM ::bans AS b';
  27. $stmt = $this->c->DB->query($query);
  28. while ($row = $stmt->fetch()) {
  29. $name = $this->model->trimToNull($row['username'], true);
  30. if (null !== $name) {
  31. $userList[$name] = $row['id'];
  32. }
  33. $email = $this->model->trimToNull($row['email']);
  34. if (null !== $email) {
  35. $email = $this->c->NormEmail->normalize($email);
  36. $emailList[$email] = $row['id']; // ???? TODO если домен забанен, то email не добавлять
  37. }
  38. $ips = $this->model->trimToNull($row['ip']);
  39. if (null !== $ips) {
  40. foreach (\explode(' ', $ips) as $ip) {
  41. $list = &$ipList;
  42. $letters = \str_split($this->model->ip2hex($ip));
  43. $count = \count($letters);
  44. foreach ($letters as $letter) {
  45. if (--$count) {
  46. if (! isset($list[$letter])) {
  47. $list[$letter] = [];
  48. } elseif (! \is_array($list[$letter])) {
  49. break;
  50. }
  51. $list = &$list[$letter];
  52. } else {
  53. $list[$letter] = $row['id']; // ???? может не перезаписывать предыдущий бан?
  54. }
  55. }
  56. unset($list);
  57. }
  58. }
  59. $message = $this->model->trimToNull($row['message']);
  60. $expire = empty($row['expire']) ? null : $row['expire'];
  61. if (
  62. null === $message
  63. && null === $expire
  64. ) {
  65. continue;
  66. }
  67. $banList[$row['id']] = [
  68. 'message' => $message,
  69. 'expire' => $expire,
  70. ];
  71. if (
  72. null !== $expire
  73. && $expire > 0
  74. && (
  75. 0 === $first
  76. || $expire < $first
  77. )
  78. ) {
  79. $first = $expire;
  80. }
  81. }
  82. return [
  83. 'banList' => $banList,
  84. 'userList' => $userList,
  85. 'emailList' => $emailList,
  86. 'ipList' => $ipList,
  87. 'firstExpire' => $first,
  88. ];
  89. }
  90. }