PostValidatorTrait.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. <?php
  2. namespace ForkBB\Models\Pages;
  3. use ForkBB\Core\Validator;
  4. use ForkBB\Models\Model;
  5. trait PostValidatorTrait
  6. {
  7. /**
  8. * Дополнительная проверка subject
  9. *
  10. * @param Validator $v
  11. * @param string $subject
  12. *
  13. * @return string
  14. */
  15. public function vCheckSubject(Validator $v, $subject, $attr, $executive)
  16. {
  17. // после цензуры заголовок темы путой
  18. if (\ForkBB\cens($subject) == '') {
  19. $v->addError('No subject after censoring');
  20. // заголовок темы только заглавными буквами
  21. } elseif (! $executive
  22. && '0' == $this->c->config->p_subject_all_caps
  23. && \preg_match('%\p{Lu}%u', $subject)
  24. && ! \preg_match('%\p{Ll}%u', $subject)
  25. ) {
  26. $v->addError('All caps subject');
  27. }
  28. return $subject;
  29. }
  30. /**
  31. * Дополнительная проверка message
  32. *
  33. * @param Validator $v
  34. * @param string $message
  35. *
  36. * @return string
  37. */
  38. public function vCheckMessage(Validator $v, $message, $attr, $executive)
  39. {
  40. // после цензуры текст сообщения пустой
  41. if (\ForkBB\cens($message) == '') {
  42. $v->addError('No message after censoring');
  43. // текст сообщения только заглавными буквами
  44. } elseif (! $executive
  45. && '0' == $this->c->config->p_message_all_caps
  46. && \preg_match('%\p{Lu}%u', $message)
  47. && ! \preg_match('%\p{Ll}%u', $message)
  48. ) {
  49. $v->addError('All caps message');
  50. // проверка парсером
  51. } else {
  52. $message = $this->c->Parser->prepare($message); //????
  53. foreach($this->c->Parser->getErrors() as $error) {
  54. $v->addError($error);
  55. }
  56. }
  57. return $message;
  58. }
  59. /**
  60. * Проверка времени ограничения флуда
  61. *
  62. * @param Validator $v
  63. * @param null|string $submit
  64. *
  65. * @return null|string
  66. */
  67. public function vCheckTimeout(Validator $v, $submit)
  68. {
  69. if (null === $submit) {
  70. return null;
  71. }
  72. $time = \time() - (int) $this->user->last_post;
  73. if ($time < $this->user->g_post_flood) {
  74. $v->addError(\ForkBB\__('Flood start', $this->user->g_post_flood, $this->user->g_post_flood - $time), 'e');
  75. }
  76. return $submit;
  77. }
  78. /**
  79. * Подготовка валидатора к проверке данных из формы создания темы/сообщения
  80. *
  81. * @param Model $model
  82. * @param string $marker
  83. * @param array $args
  84. * @param bool $editPost
  85. * @param bool $editSubject
  86. *
  87. * @return Validator
  88. */
  89. protected function messageValidator(Model $model, string $marker, array $args, bool $editPost = false, bool $editSubject = false): Validator
  90. {
  91. if ($this->user->isGuest) {
  92. $ruleEmail = ('1' == $this->c->config->p_force_guest_email ? 'required|' : '') . 'string:trim|email:noban';
  93. $ruleUsername = 'required|string:trim,spaces|username';
  94. } else {
  95. $ruleEmail = 'absent';
  96. $ruleUsername = 'absent';
  97. }
  98. if ($this->user->isAdmin || $this->user->isModerator($model)) {
  99. if ($editSubject) {
  100. $ruleStickTopic = 'checkbox';
  101. $ruleStickFP = 'checkbox';
  102. } else {
  103. $ruleStickTopic = 'absent';
  104. $ruleStickFP = 'absent';
  105. }
  106. if (! $editSubject && ! $editPost) {
  107. $ruleMergePost = 'checkbox';
  108. } else {
  109. $ruleMergePost = 'absent';
  110. }
  111. if ($editPost && ! $model->user->isGuest && ! $model->user->isAdmin) {
  112. $ruleEditPost = 'checkbox';
  113. } else {
  114. $ruleEditPost = 'absent';
  115. }
  116. $executive = true;
  117. } else {
  118. $ruleStickTopic = 'absent';
  119. $ruleStickFP = 'absent';
  120. $ruleMergePost = 'absent:1';
  121. $ruleEditPost = 'absent';
  122. $executive = false;
  123. }
  124. if ($editSubject) {
  125. $ruleSubject = 'required|string:trim,spaces|min:1|max:70|' . ($executive ? '' : 'noURL|') . 'check_subject';
  126. } else {
  127. $ruleSubject = 'absent';
  128. }
  129. if ('1' == $this->c->config->o_smilies) {
  130. $ruleHideSmilies = 'checkbox';
  131. } else {
  132. $ruleHideSmilies = 'absent';
  133. }
  134. $v = $this->c->Validator->reset()
  135. ->addValidators([
  136. 'check_subject' => [$this, 'vCheckSubject'],
  137. 'check_message' => [$this, 'vCheckMessage'],
  138. 'check_timeout' => [$this, 'vCheckTimeout'],
  139. ])->addRules([
  140. 'token' => 'token:' . $marker,
  141. 'email' => $ruleEmail,
  142. 'username' => $ruleUsername,
  143. 'subject' => $ruleSubject,
  144. 'stick_topic' => $ruleStickTopic,
  145. 'stick_fp' => $ruleStickFP,
  146. 'merge_post' => $ruleMergePost,
  147. 'hide_smilies' => $ruleHideSmilies,
  148. 'edit_post' => $ruleEditPost,
  149. 'preview' => 'string',
  150. 'submit' => 'string|check_timeout',
  151. 'message' => 'required|string:trim|max:' . $this->c->MAX_POST_SIZE . '|check_message',
  152. ])->addAliases([
  153. 'email' => 'Email',
  154. 'username' => 'Username',
  155. 'subject' => 'Subject',
  156. ])->addArguments([
  157. 'token' => $args,
  158. 'subject.check_subject' => $executive,
  159. 'message.check_message' => $executive,
  160. 'email.email' => $this->user,
  161. ])->addMessages([
  162. 'username.login' => 'Login format',
  163. ]);
  164. return $v;
  165. }
  166. }