Проверка уникальности никнейма для 1.10.x

+44
3.56K
Проверка уникальности никнейма при регистрации и редактировании профиля.
предыстория: instantcms.ru/forum/thread14031-1.html



Качать тут

Редактировались дефолтные файлы 1.10.1
Решил сделать "по феншую", поэтому добавил несколько строк в языковые файлы.
Не бойтесь менять core/ajax/registration.php — это не суперсистемный файл, а просто проверка логина при реге. Сейчас в него добавлена проверка никнейма.
В данном варианте никнейм может состоять из рус/анг букв, цифр, пробелов и символов _-
Если хотите добавить свои правила, нужно изменить Регулярное выражение, по которому осуществляется проверка аж в ЧЕТЫРЁХ файлах:
check.js
registration.php
/registration/frontend.php
/users/frontend.php
Это не я придумал — это так и было!

Спасибо за внимание.
+3
EVV EVV 11 лет назад #
по ссылке загружается файл создание статей с отложенной публикацией 1-10.rar
Олег Васильевич я Олег Васильевич я 11 лет назад #
Комментарий удален
Олег Васильевич я Олег Васильевич я 11 лет назад #
Комментарий удален
-1
letsgo letsgo 11 лет назад #
Причем тут стадо и оценки вообще? Странная логика.
+1
Роман Роман 11 лет назад #
Весна. Обострение :))
0
Сергей Петрович Сергей Петрович 11 лет назад #
))) Прошу прощения - не в тот файл ткнул, когда ссылку делал.
Всё поправил.
+1
Май Май 11 лет назад #
Ленивый, огромное спасибо, очень ждал этого хака. Потестил, все работает как надо. Очень сильно порадовали, для моего сайта это решение проблемы, уже накопилось множество дублей никнеймов, пользователи были не довольны этим. Теперь с этим будет порядок.
+3
Роман Роман 11 лет назад #
Осталось внести только в релиз
0
Май Май 11 лет назад #
Нашел серьезный баг. При попытке отредактировать профиль, оставляя никнейм без изменений, например изменить телефон или какую либо другую информацию - срабатывает блокировка, система проверяет никнейм находит его в базе и не дает сохранить изменения.

Ленивый, нид хелп!
+2
Сергей Петрович Сергей Петрович 11 лет назад #
Ух ты!! Прикольный косяк!!
Пришлось в com_users_edit_profile.tpl добавить скрытое поле со старым ником и делать проверку, только в случае, если ник был отредактирован.

Архив поправил, перезалил.
+1
lokanaft lokanaft 11 лет назад #
Он был настолько ленивым...
+1
Май Май 11 лет назад #
Спасибо. Теперь все работает правильно.
0
ded-pikto ded-pikto 11 лет назад #
Плюс, конечно! Но ведь нет предела совершенству)))
Задавал уже вопрос в теме http://instantcms.ru/forum/thread14031-2.html.
ded-pikto:
2. Запрещённые админом ники. Сообщения addSessionMessage имеются. Не хватает быстрых js сообщений под окном ввода никнейма. Ведь при данном хаке есть вероятность, что ДОпользователь сначала получит сообщение "Вы можете использовать этот никнейм", а после заполнения формы и нажатия на кнопку "Регистрация" система сообщит ему, что "Выбранный никнейм запрещен администратором!" Пока нашёл выход в том, чтобы или выводить сообщение "Вы можете использовать этот никнейм, если он не запрещён администратором", или не выводить никакого. Пробовал разными способами (см. "Мартышка и очки") вызвать проверку BadNickname из таблицы cms_components, дабы с if-else вывести сообщение о запрете ника. Но или руки))), или вложенность, или всё вместе мешают. Подскажите, как это можно сделать?
Можно ли в качестве костыля приспособить для быстрых запросов по запрещённым никам файл \www\components\registration\model.php\www\components\registration\model.php ?
0
ded-pikto ded-pikto 11 лет назад #
Извиняюсь, файл \www\components\registration\model.php
+1
Сергей Петрович Сергей Петрович 11 лет назад #
Мысль понял. Добавлю. В субботу.
0
Сергей Петрович Сергей Петрович 11 лет назад #
..и ещё, кажется Вы же задавали вопрос по поводу логинзы? Что она, зараза, может делать дубли никнеймов??
0
ded-pikto ded-pikto 11 лет назад #
Да, я - это был он.
Но логинза - такая скользкая штучка. Многие с ней намучились. Для её приживления без дублей и сопутствующих косяков в систему поди с десяток файлов лопатить понадобится?.. Вот зашёл в первый раз по логинзе в Вебмани и теперь я - ПочтовыйЯщик Батькович Фамильев))) Претензии администрацией не принимаются - сам дурак. Знаю, что дурак. "Но опыт есть!")))
+1
EVV EVV 11 лет назад #
Ленивый, хорошо было бы, если расписать, что в каких файлах заменено (добавлено). А то у меня (да думаю не только у меня) эти файлы модифицировались, поэтому заливать так невозможно.
0
ded-pikto ded-pikto 11 лет назад #
EVV, неленивый товарищ по движку мог бы сравнить мигратором или файловым менеджером хак и дефолтные файлы...
0
Тимофей Тимофей 11 лет назад #
Тоже озадачился этим вопросом, но тут все просто. Нашел в нете бесплатную программу которая сравнивает два файла.
""
WinMerge.
0
PolarOne PolarOne 11 лет назад #
расписал crazy
0
EVV EVV 11 лет назад #
При изменении данных в профиле они не сохраняются! У меня у одного так?
0
Тимофей Тимофей 11 лет назад #
Присоеденяюсь. Тоже самое. Пишет Никнейм ,,,,,, уже занят! И ничего не сохраняет.
0
Тимофей Тимофей 11 лет назад #
Сам спросил, сам разобрался и сам ответил)) Для тех кто скачал старый архив как я, достаточно скачать новый и заменить файлы /components/users/frontend.php и /templates/ваш_шаблон/components/com_users_edit_profile.tpl и все должно заработать.
+1
Май Май 11 лет назад #
Да. Надо было почитать коменты выше
0
EVV EVV 11 лет назад #
Скачал, заменил, но профиль все равно не сохраняется, причем проблем с никнеймом не было
0
Май Май 11 лет назад #
Подробнее опишите проблему, что значит не сохраняется? О каких проблемах с никнеймом вы говорите? Первоначально баг был в том, что производилась блокировка если в поле был тот же ник что и раньше, сейчас это пофиксили, и все работает правильно, изменения в профиле сохраняются. У меня работает корректно.
0
EVV EVV 11 лет назад #
Не сохраняется, когда изменяешь какие-нибудь параметры в настройках профиля
0
EVV EVV 11 лет назад #
Нашел у себя проблему. Конфликтовало с хаком "Обрезка аватара во время загрузки".
Удалил, теперь все работает.
0
ValeraK ValeraK 10 лет назад #
А можно лир исправить так что б конфликта с этим хаком Обрезка аватара не было? Нужно и обрезка аватара и проверка уникальности никнейма.
0
PolarOne PolarOne 11 лет назад #
Мне к сожалению не годилось - скачать и перезалить. Перелопачивать в ручную.
(У меня уже стояла проверка на уникальность логина, то ли базовая, то ли добавленная, не помню и измененная капча)
Сделал копии файлов на всякий случай) Но все. тьху тьху работает после правок.

1.\components\registration\frontend.php
около 150 строки заменил все // Проверяем nickname или имя и фамилию
Код PHP:
  1. // Проверяем nickname или имя и фамилию
  2. if($model->config['name_mode']=='nickname'){
  3. if(!$item['nickname']) { cmsCore::addSessionMessage($_LANG['TYPE_NICKNAME'], 'error'); $errors = true; }
  4. } else {
  5. if(!$item['realname1']) { cmsCore::addSessionMessage($_LANG['TYPE_NAME'], 'error'); $errors = true; }
  6. if(!$item['realname2']) { cmsCore::addSessionMessage($_LANG['TYPE_SONAME'], 'error'); $errors = true; }
  7. $item['nickname'] = trim($item['realname1']) . ' ' . trim($item['realname2']);
  8. }
  9. if(mb_strlen($item['nickname'])<2 || mb_strlen($item['nickname'])>25 || !preg_match("/^([a-zA-Zа-яА-Я0-9_ -])+$/ui", $item['nickname'])) {
  10. cmsCore::addSessionMessage($_LANG['ERR_NICKNAME'], 'error'); $errors = true;
  11. }
  12. if($model->getBadNickname($item['nickname'])){ cmsCore::addSessionMessage($_LANG['ERR_NICK_EXISTS'], 'error'); $errors = true;}
  13. if($inDB->get_field('cms_users', "nickname='".$item['nickname']."'", 'id') > 0){
  14. cmsCore::addSessionMessage($_LANG['NICKNAME'].' "'.$item['nickname'].'" '.$_LANG['IS_BUSY'], 'error'); $errors = true;
  15. }
2.\components\registration\js\check.js
Заменил полностью

3.\components\users\frontend.php
около 215 строки заменил все // Если сохраняем профиль
Код PHP:
  1. // Если сохраняем профиль
  2. if ($opt == 'save'){
  3. $errors = false;
  4. $users['nickname'] = cmsCore::request('nickname', 'str');
  5. if($users['nickname'] != cmsCore::request('nickname_old', 'str')){
  6. if(mb_strlen($users['nickname'])<2 || mb_strlen($users['nickname'])>25 || !preg_match("/^([a-zA-Zа-яА-Я0-9_ -])+$/ui", $users['nickname'])) {
  7. cmsCore::addSessionMessage($_LANG['ERR_NICKNAME'], 'error'); $errors = true;
  8. }
  9. cmsCore::loadModel('registration');
  10. $modreg = new cms_model_registration();
  11. if (!$inUser->is_admin){if($modreg->getBadNickname($users['nickname'])) { cmsCore::addSessionMessage($_LANG['ERR_NICK_EXISTS'], 'error'); $errors = true; }}
  12. if($inDB->get_field('cms_users', "nickname='".$users['nickname']."'", 'id') > 0){
  13. cmsCore::addSessionMessage($_LANG['NICKNAME'].' "'.$users['nickname'].'" '.$_LANG['IS_BUSY'], 'error'); $errors = true;
  14. }
  15. }
  16. $profiles['gender'] = cmsCore::request('gender', 'str');
  17. $profiles['city'] = cmsCore::request('city', 'str');
  18. if (mb_strlen($profiles['city'])>25) { cmsCore::addSessionMessage($_LANG['LONG_CITY_NAME'], 'error'); $errors = true; }
  19. $users['email'] = cmsCore::request('email', 'email');
  20. if (!$users['email']) { cmsCore::addSessionMessage($_LANG['REALY_ADRESS_EMAIL'], 'error'); $errors = true; }
  21. if($usr['email'] != $users['email']){
  22. $is_set_email = $inDB->get_field('cms_users', "email='{$users['email']}'", 'id');
  23. if ($is_set_email) { cmsCore::addSessionMessage($_LANG['ADRESS_EMAIL_IS_BUSY'], 'error'); $errors = true; }
  24. }
  25. $profiles['showmail'] = cmsCore::request('showmail', 'int');
  26. $profiles['email_newmsg'] = cmsCore::request('email_newmsg', 'int');
  27. $profiles['showbirth'] = cmsCore::request('showbirth', 'int');
  28. $profiles['description'] = cmsCore::request('description', 'str', '');
  29. $users['birthdate'] = (int)$_REQUEST['birthdate']['year'].'-'.(int)$_REQUEST['birthdate']['month'].'-'.(int)$_REQUEST['birthdate']['day'];
  30. $profiles['signature'] = $inDB->escape_string(cmsCore::request('signature', 'html', ''));
  31. $profiles['signature_html'] = $inDB->escape_string(cmsCore::parseSmiles(cmsCore::request('signature', 'html', ''), true));
  32. $profiles['allow_who'] = cmsCore::request('allow_who', 'str');
  33. if (!preg_match('/^([a-zA-Z]+)$/ui', $profiles['allow_who'])) { $errors = true; }
  34. $users['icq'] = preg_replace('/([^0-9])/ui', '', cmsCore::request('icq', 'str'));
  35. $profiles['showicq'] = cmsCore::request('showicq', 'int');
  36. $profiles['cm_subscribe'] = cmsCore::request('cm_subscribe', 'str');
  37. if (!preg_match('/^([a-zA-Z]+)$/ui', $profiles['cm_subscribe'])) { $errors = true; }
4.\core\ajax\registration.php
Заменил полностью

5.\languages\ru\components\users.php
Добавилась строчка (около 28)
Код PHP:
  1. $_LANG['ERR_NICKNAME'] ='Никнейм должен состоять только из русских или латинских букв и цифр, не короче 2 и не более 25 символов!';
6.\languages\ru\components\registration.php
Около 36 строчки добавилось следующее
Код PHP:
  1. $_LANG['ERR_NICKNAME'] ='Никнейм должен состоять только из русских или латинских букв и цифр, не короче 2 и не более 25 символов!';
  2. $_LANG['BIG_NICKNAME'] ='Никнейм не может быть длинее 25 символов!';
и около 53
Код PHP:
  1. $_LANG['YOU_NICKNAME_COMPLETE'] ='Вы можете использовать этот никнейм';
7.\templates\_default_\components\com_users_edit_profile.tpl
Не уверен что так уж оно нужно было
заменил свою строчку (около 38)
Код PHP:
  1. <input name="nickname" type="text" class="text-input" id="nickname" style="width:300px" value="{$usr.nickname|escape:'html'}"/>
на
Код PHP:
  1. <input name="nickname" type="text" class="text-input" id="nickname" style="width:300px" value="{$usr.nickname|escape:'html'}"/>
  2. <input name="nickname_old" type="hidden" class="text-input" id="nickname_old" style="width:300px" value="{$usr.nickname}"/>
8.\languages\ru\components\com_registration.tpl
заменил 48 строчку у себя
эту
Код PHP:
  1. <input name="nickname" id="nickinput" class="text-input" type="text" style="width:300px" value="{$item.nickname|escape:'html'}" />
  2. <span class="regstar">*</span>
на эту
Код PHP:
  1. <input name="nickname" id="nickinput" class="text-input" type="text" style="width:300px" value="{$item.nickname|escape:'html'}" onchange="checkNickname()" autocomplete="off"/>
  2. <span class="regstar">*</span>
  3. <div id="nicknamecheck"></div>
Если заметили ошибку - поправте меня авторы, ну в если кому пригодилось - не поленитесь, плюс в карму.
У меня проверка работает.
instantcms 1.10.1
0
propit propit 10 лет назад #
Все отлично работает на 1.10.3

Единственное пришлось подправить файл
2.\components\registration\js\check.js Заменил полностью

Готовое содержимое файла в спойлере:
Спойлер

и еще одно маленькое замечание. Путь к Файлу com_registration.tpl, описанному в пункте № 8
8.\languages\ru\components\com_registration.tpl
на самом деле находится тут:
8.\templates\_default_\components\com_registration.tpl

Огромное спасибо за труд!
0
mullo mullo 10 лет назад #
2.\components\registration\js\check.js Заменил полностью
У меня ироглифы показывает из этого файла при проверке
0
mullo mullo 10 лет назад #
и не чего не появляеться при проверке ника
0
Ivan84 Ivan84 10 лет назад #
Огромное спасибо за труд
0
Ivan84 Ivan84 10 лет назад #
У меня после обновления с 1.10.1 до 10.3 и наката хака не работает проверка на уникальность. при переходе на страницу регистрации вылетает белая - пустая страница и тоже самое с профилем пользователя. У кого нибудь есть соображение.
0
mashen&ka mashen&ka 9 лет назад #
Спасибо PolarOne и propit. Всё получилось, только вот не большая проблемка, теперь в профиле ничего не меняется. Я захожу в профиль меняю город, нажимаю "сохранить" он пишет "такой логин уже есть" и не сохраняет даже изменение города... или даты рождения... ну или еще чего-нибудь в профиле.
0
mashen&ka mashen&ka 9 лет назад #
Тут кто-нибудь есть?

Еще от автора

Тема для никого - 1.10.7 и PHP 5.2.12 (часть 1)
Сложность программы растёт до тех пор, пока не превысит способности программиста (Законы Мерфи для программистов) Недавно ставил себе на локалку 1.10.
Тема для никого - 1.10.7 и PHP 5.2.12 (часть 2)
Программисты действуют рационально, лишь тогда, когда другие способы исчерпаны (Законы Мерфи для программистов) Часть 1 Порадовавшись успешной установ
Тема для никого - 1.10.7 и PHP 5.2.12 (часть 3)
Если программа полезна, ее обязательно переделывают (Законы Мерфи для программистов) Часть 2 Запустив сайт я проверил все доступные после установки ра
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.