PostValidatorTrait.php 6.3 KB

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