2018-04-03

This commit is contained in:
Visman 2018-04-03 19:07:19 +07:00
parent 40600704f4
commit eb5124817d
8 changed files with 117 additions and 74 deletions

View file

@ -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) {

View file

@ -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'],

View file

@ -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'] = [

View file

@ -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;
}
/**
* Завершение регистрации
*

View file

@ -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;
}
}

View file

@ -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
View 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;
}
}

View file

@ -117,6 +117,7 @@ return [
'file' => '%MAX_FILE_SIZE%',
'img' => '%MAX_IMG_SIZE%',
],
'Validators' => \ForkBB\Models\Validators::class,
],
'multiple' => [