2018-04-03
This commit is contained in:
parent
40600704f4
commit
eb5124817d
8 changed files with 117 additions and 74 deletions
|
@ -98,7 +98,7 @@ class Validator
|
|||
}
|
||||
|
||||
/**
|
||||
* Сброс настроек
|
||||
* Сбрасывает настройки к начальным состояниям
|
||||
*
|
||||
* @return Validator
|
||||
*/
|
||||
|
@ -139,7 +139,7 @@ class Validator
|
|||
}
|
||||
|
||||
/**
|
||||
* Добавление новых валидаторов
|
||||
* Добавляет валидаторы
|
||||
*
|
||||
* @param array $validators
|
||||
*
|
||||
|
@ -152,7 +152,7 @@ class Validator
|
|||
}
|
||||
|
||||
/**
|
||||
* Добавление правил проверки
|
||||
* Добавляет правила
|
||||
*
|
||||
* @param array $list
|
||||
*
|
||||
|
@ -170,7 +170,7 @@ class Validator
|
|||
}
|
||||
$rules = [];
|
||||
// перебор правил для текущего поля
|
||||
foreach (\explode('|', $raw) as $rule) { //???? нужно экоанирование для разделителей
|
||||
foreach (\explode('|', $raw) as $rule) { //???? нужно экранирование для разделителей
|
||||
$tmp = \explode(':', $rule, 2);
|
||||
if (empty($this->validators[$tmp[0]])) {
|
||||
throw new RuntimeException($tmp[0] . ' validator not found');
|
||||
|
@ -188,7 +188,7 @@ class Validator
|
|||
}
|
||||
|
||||
/**
|
||||
* Добавление дополнительных аргументов для конкретных "имя поля"."имя правила".
|
||||
* Добавляет дополнительные аргументы для конкретных "имя поля"."имя правила".
|
||||
*
|
||||
* @param array $arguments
|
||||
*
|
||||
|
@ -201,7 +201,7 @@ class Validator
|
|||
}
|
||||
|
||||
/**
|
||||
* Добавление сообщений для конкретных "имя поля"."имя правила".
|
||||
* Добавляет сообщения для конкретных "имя поля"."имя правила".
|
||||
*
|
||||
* @param array $messages
|
||||
*
|
||||
|
@ -214,7 +214,7 @@ class Validator
|
|||
}
|
||||
|
||||
/**
|
||||
* Добавление псевдонимов имен полей для сообщений об ошибках
|
||||
* Добавляет псевдонимы имен полей для сообщений об ошибках
|
||||
*
|
||||
* @param array $aliases
|
||||
*
|
||||
|
@ -227,7 +227,7 @@ class Validator
|
|||
}
|
||||
|
||||
/**
|
||||
* Проверка данных
|
||||
* Проверяет данные
|
||||
*
|
||||
* @param array $raw
|
||||
*
|
||||
|
@ -300,7 +300,7 @@ class Validator
|
|||
}
|
||||
|
||||
/**
|
||||
* Проверка значения списком правил
|
||||
* Проверяет значение списком правил
|
||||
*
|
||||
* @param mixed $value
|
||||
* @param array $rules
|
||||
|
@ -331,7 +331,7 @@ class Validator
|
|||
}
|
||||
|
||||
/**
|
||||
* Добавление ошибки
|
||||
* Добавляет ошибку
|
||||
*
|
||||
* @param mixed $error
|
||||
* @param string $type
|
||||
|
@ -371,7 +371,7 @@ class Validator
|
|||
}
|
||||
|
||||
/**
|
||||
* Получение дополнительных аргументов
|
||||
* Возвращает дополнительные аргументы
|
||||
*
|
||||
* @param string $field
|
||||
* @param string $rule
|
||||
|
@ -430,6 +430,16 @@ class Validator
|
|||
return $this->errors;
|
||||
}
|
||||
|
||||
/**
|
||||
* Выполняет проверку значения по правилу
|
||||
*
|
||||
* @param Validator $first ссылка на валидатор
|
||||
* @param mixed $second проверяемое значение
|
||||
* @param mixed $third атрибут правила
|
||||
* @param mixed $fourth дополнительный аргумент
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
protected function vAbsent($v, $value, $attr)
|
||||
{
|
||||
if (null !== $value) {
|
||||
|
|
|
@ -27,32 +27,6 @@ trait PostValidatorTrait
|
|||
return $email;
|
||||
}
|
||||
|
||||
/**
|
||||
* Дополнительная проверка username
|
||||
*
|
||||
* @param Validator $v
|
||||
* @param string $username
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function vCheckUsername(Validator $v, $username)
|
||||
{
|
||||
$user = $this->c->users->create();
|
||||
$user->username = $username;
|
||||
|
||||
// username = Гость
|
||||
if (\preg_match('%^(guest|' . \preg_quote(\ForkBB\__('Guest'), '%') . ')$%iu', $username)) { // ???? а зачем?
|
||||
$v->addError('Username guest');
|
||||
// цензура
|
||||
} elseif (\ForkBB\cens($user->username) !== $username) {
|
||||
$v->addError('Username censor');
|
||||
// username забанен
|
||||
} elseif ($this->c->bans->isBanned($user) > 0) {
|
||||
$v->addError('Banned username');
|
||||
}
|
||||
return $username;
|
||||
}
|
||||
|
||||
/**
|
||||
* Дополнительная проверка subject
|
||||
*
|
||||
|
@ -200,7 +174,7 @@ trait PostValidatorTrait
|
|||
$v = $this->c->Validator->reset()
|
||||
->addValidators([
|
||||
'check_email' => [$this, 'vCheckEmail'],
|
||||
'check_username' => [$this, 'vCheckUsername'],
|
||||
'check_username' => [$this->c->Validators, 'vCheckUsername'],
|
||||
'check_subject' => [$this, 'vCheckSubject'],
|
||||
'check_message' => [$this, 'vCheckMessage'],
|
||||
'check_timeout' => [$this, 'vCheckTimeout'],
|
||||
|
|
|
@ -55,12 +55,23 @@ class Profile extends Page
|
|||
if ($isEdit && 'POST' === $method) {
|
||||
$v = $this->c->Validator->reset()
|
||||
->addValidators([
|
||||
'check_username' => [$this->c->Validators, 'vCheckUsername'],
|
||||
])->addRules([
|
||||
'token' => 'token:EditUserProfile',
|
||||
'upload_avatar' => $rules->useAvatar ? 'image|max:' . $this->c->Files->maxImgSize('K') : 'absent',
|
||||
'username' => $rules->rename? 'required|string:trim,spaces|min:2|max:25|login|check_username' : 'absent',
|
||||
'title' => $rules->setTitle ? 'string:trim|max:50' : 'absent',
|
||||
'upload_avatar' => $rules->useAvatar ? "image|max:{$this->c->Files->maxImgSize('K')}" : 'absent',
|
||||
'admin_note' => $this->user->isAdmMod ? 'string:trim|max:30' : 'absent',
|
||||
'realname' => 'string:trim|max:40',
|
||||
'gender' => 'required|integer|in:0,1,2',
|
||||
'location' => 'string:trim|max:30',
|
||||
'email_setting' => 'required|integer|in:0,1,2',
|
||||
'url' => 'string:trim|max:100',
|
||||
'signature' => $rules->useSignature ? 'string:trim|max:' . $this->c->config->p_sig_length . '' : 'absent',
|
||||
])->addAliases([
|
||||
])->addArguments([
|
||||
'token' => ['id' => $curUser->id],
|
||||
'token' => ['id' => $curUser->id],
|
||||
'username.check_username' => $curUser,
|
||||
])->addMessages([
|
||||
]);
|
||||
|
||||
|
@ -269,7 +280,7 @@ class Profile extends Page
|
|||
$fields['location'] = [
|
||||
'id' => 'location',
|
||||
'type' => 'text',
|
||||
'maxlength' => 40,
|
||||
'maxlength' => 30,
|
||||
'caption' => \ForkBB\__('Location'),
|
||||
'value' => $curUser->location,
|
||||
];
|
||||
|
@ -366,7 +377,7 @@ class Profile extends Page
|
|||
}
|
||||
|
||||
// подпись
|
||||
if ('1' == $this->c->config->o_signatures) {
|
||||
if ($rules->useSignature) {
|
||||
$fields = [];
|
||||
if ($isEdit) {
|
||||
$fields['signature'] = [
|
||||
|
|
|
@ -21,7 +21,7 @@ class Register extends Page
|
|||
$v = $this->c->Validator->reset()
|
||||
->addValidators([
|
||||
'check_email' => [$this, 'vCheckEmail'],
|
||||
'check_username' => [$this, 'vCheckUsername'],
|
||||
'check_username' => [$this->c->Validators, 'vCheckUsername'],
|
||||
])->addRules([
|
||||
'token' => 'token:RegisterForm',
|
||||
'agree' => 'required|token:Register',
|
||||
|
@ -87,34 +87,6 @@ class Register extends Page
|
|||
return $email;
|
||||
}
|
||||
|
||||
/**
|
||||
* Дополнительная проверка username
|
||||
*
|
||||
* @param Validator $v
|
||||
* @param string $username
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function vCheckUsername(Validator $v, $username)
|
||||
{
|
||||
$user = $this->c->users->create(['username' => $username]);
|
||||
|
||||
// username = Гость
|
||||
if (\preg_match('%^(guest|' . \preg_quote(\ForkBB\__('Guest'), '%') . ')$%iu', $username)) { // ???? а зачем?
|
||||
$v->addError('Username guest');
|
||||
// цензура
|
||||
} elseif ($this->c->censorship->censor($username) !== $username) {
|
||||
$v->addError('Username censor');
|
||||
// username забанен
|
||||
} elseif ($this->c->bans->isBanned($user) > 0) {
|
||||
$v->addError('Banned username');
|
||||
// есть пользователь с похожим именем
|
||||
} elseif (empty($v->getErrors()) && ! $this->c->users->isUniqueName($user)) {
|
||||
$v->addError('Username not unique');
|
||||
}
|
||||
return $username;
|
||||
}
|
||||
|
||||
/**
|
||||
* Завершение регистрации
|
||||
*
|
||||
|
|
|
@ -82,4 +82,9 @@ class Profile extends Rules
|
|||
{
|
||||
return '1' == $this->c->config->o_avatars;
|
||||
}
|
||||
|
||||
protected function getuseSignature()
|
||||
{
|
||||
return '1' == $this->c->config->o_signatures;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,10 +17,11 @@ class IsUniqueName extends Action
|
|||
public function isUniqueName(User $user)
|
||||
{
|
||||
$vars = [
|
||||
':name' => $user->username,
|
||||
':other' => \preg_replace('%[^\p{L}\p{N}]%u', '', $user->username), //????
|
||||
':id' => (int) $user->id,
|
||||
':name' => $user->username,
|
||||
':other' => \preg_replace('%[^\p{L}\p{N}]%u', '', $user->username), //???? что за бред :)
|
||||
];
|
||||
$result = $this->c->DB->query('SELECT username FROM ::users WHERE LOWER(username)=LOWER(?s:name) OR LOWER(username)=LOWER(?s:other)', $vars)->fetchAll();
|
||||
$result = $this->c->DB->query('SELECT username FROM ::users WHERE (LOWER(username)=LOWER(?s:name) OR LOWER(username)=LOWER(?s:other)) AND id!=?i:id', $vars)->fetchAll();
|
||||
return ! \count($result);
|
||||
}
|
||||
}
|
||||
|
|
69
app/Models/Validators.php
Normal file
69
app/Models/Validators.php
Normal file
|
@ -0,0 +1,69 @@
|
|||
<?php
|
||||
|
||||
namespace ForkBB\Models;
|
||||
|
||||
use ForkBB\Core\Container;
|
||||
use ForkBB\Core\Validator;
|
||||
use ForkBB\Models\User\Model as User;
|
||||
|
||||
class Validators
|
||||
{
|
||||
/**
|
||||
* Контейнер
|
||||
* @var Container
|
||||
*/
|
||||
protected $c;
|
||||
|
||||
/**
|
||||
* Конструктор
|
||||
*
|
||||
* @param Container $container
|
||||
*/
|
||||
public function __construct(Container $container)
|
||||
{
|
||||
$this->c = $container;
|
||||
}
|
||||
|
||||
/**
|
||||
* Дополнительная проверка username
|
||||
*
|
||||
* @param Validator $v
|
||||
* @param string $username
|
||||
* @param string $data
|
||||
* @param mixed $originalUser
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function vCheckUsername(Validator $v, $username, $zero, $originalUser)
|
||||
{
|
||||
if ($originalUser instanceof User) {
|
||||
$id = $originalUser->id;
|
||||
$old = $originalUser->username;
|
||||
} else {
|
||||
$id = null;
|
||||
$old = null;
|
||||
}
|
||||
|
||||
if ($old !== $username) {
|
||||
|
||||
$user = $this->c->users->create(['id' => $id, 'username' => $username]);
|
||||
|
||||
// username = Гость
|
||||
if (\preg_match('%^(guest|' . \preg_quote(\ForkBB\__('Guest'), '%') . ')$%iu', $username)) { // ???? а зачем?
|
||||
$v->addError('Username guest');
|
||||
// цензура
|
||||
} elseif ($this->c->censorship->censor($username) !== $username) {
|
||||
$v->addError('Username censor');
|
||||
// username забанен
|
||||
} elseif ($this->c->bans->isBanned($user) > 0) {
|
||||
$v->addError('Banned username');
|
||||
// есть пользователь с похожим именем
|
||||
} elseif (empty($v->getErrors()) && ! $this->c->users->isUniqueName($user)) {
|
||||
$v->addError('Username not unique');
|
||||
}
|
||||
}
|
||||
|
||||
return $username;
|
||||
}
|
||||
|
||||
}
|
|
@ -117,6 +117,7 @@ return [
|
|||
'file' => '%MAX_FILE_SIZE%',
|
||||
'img' => '%MAX_IMG_SIZE%',
|
||||
],
|
||||
'Validators' => \ForkBB\Models\Validators::class,
|
||||
|
||||
],
|
||||
'multiple' => [
|
||||
|
|
Loading…
Reference in a new issue