Баг с регистрацией нового пользователя. Исправляем

+34
2.82K
И снова здравствуй, дорогое сообщество!
Собственно хотел помочь человеку в теме instantcms.ru/forum/thread14031-1.html и залез в код, заметил в запросе кое-какой баг.
С одной стороны "зачем занимать логин, если профиль тебе не нужен" (я так понял, что разработчики придерживались этого, написав код), но с другой — система InstantCMS предусматривает возможность восстановления пользователя после удаления, но удалив профиль наш пользователь может его лишиться навсегда. Теряется доступ к своему профилю — невозможно будет авторизоваться и восстановить пользователь.

Объясню на примере. Мой логин на тестовом сайте WALTERZ. Удаляю свой профиль через настройки. Значение поля is_deleted меняется на 1. Захожу в регистрацию и пробую зарегистрироваться под логином WALTERZ.
Иллюстрация
Логин свободен и мы можем зарегистрироваться без проблем :)
В итоге:
Иллюстрация

Почему так происходит?

Всё очень просто на самом деле. Проверка свободного логина при регистрации осуществляется лишь по не удаленным профилям. Т.е. в запросе стоит условие is_deleted=0.

Исправляем.
Нам нужно убрать условие проверки на "удаленность" всего-то.

Файл /core/ajax/registration.php
InstantCMS 1.9 (в предыдущих версия наверняка также, не смотрел).
Заменяем:
  1. $sql = "SELECT id, login FROM cms_users WHERE (login LIKE '$data') AND (is_deleted = 0) LIMIT 1";
На:
  1. $sql = "SELECT id, login FROM cms_users WHERE (login LIKE '$data') LIMIT 1";
Файл /components/registration/frontend.php
Заменяем:
  1. $sql = "SELECT id, login, email FROM cms_users WHERE (login LIKE '$login' OR email LIKE '$email') AND (is_deleted = 0)";
На:
  1. $sql = "SELECT id, login, email FROM cms_users WHERE (login LIKE '$login' OR email LIKE '$email')";
InstantCMS 1.10+
Заменяем:
  1. $sql = "SELECT id, login FROM cms_users WHERE LOWER(login) LIKE '".mb_strtolower($data)."' AND is_deleted = 0 LIMIT 1";
На:
  1. $sql = "SELECT id, login FROM cms_users WHERE LOWER(login) LIKE '".mb_strtolower($data)."' LIMIT 1";
Файл /components/registration/frontend.php
Заменяем:
  1. $user_exist = $inDB->get_fields('cms_users', "(login LIKE '{$item['login']}' OR email LIKE '{$item['email']}') AND is_deleted = 0", 'id, login, email');
На:
  1. $user_exist = $inDB->get_fields('cms_users', "(login LIKE '{$item['login']}' OR email LIKE '{$item['email']}')", 'id, login, email');
Готово. Теперь проверка на уникальность логина будет осуществляться по всем пользователям.
+2
st.Puh st.Puh 11 лет назад #
Может я не внимательно читал, но по моему вы не указали в каком файле вносить правки
+2
WALTERZ WALTERZ 11 лет назад #
Действительно, извиняюсь. Добавил.
0
Def Def 11 лет назад #
а можно сделать и проверку занятости логина на аяксе? чтобы потом не удивляться занятости логина и не вводить заного даные
+3
WALTERZ WALTERZ 11 лет назад #
Уникальность логина и так работает через аякс. Не понял чего Вы хотите.
0
Роман Роман 11 лет назад #
Спасибо!
Если разработчики посчитают нужным, то можно и внести это уже в двиг.
Я так считаю что не повредило бы.
+1
picaboo picaboo 11 лет назад #
Ух ты, действительно важная штука! Спасибо
0
lokanaft lokanaft 11 лет назад #
Ммм... А кто мешает нажать кнопку регистрации, забив или не заметив эту надпись?) Мало того, валтерзы могут с одинаковыми емейлами нарегистроваться, потом вы их всех восстановите и будет у них прям раз100500ние личности)))
+2
WALTERZ WALTERZ 11 лет назад #
локанафт:
Ммм... А кто мешает нажать кнопку регистрации, забив или не заметив эту надпись?)
Не уловил мысли.
локанафт:
Мало того, валтерзы могут с одинаковыми емейлами нарегистроваться
А вот это верно, стоит обратить на это внимание.
0
lokanaft lokanaft 11 лет назад #
То что "Этот логин уже занят" ничего больше не делает, даже кнопку "Продолжить" не блокирует. Я абсолютно свободно могу нажать на неё и зарегистрироваться вторым, третьим...десятым вальтерзом))
+2
WALTERZ WALTERZ 11 лет назад #
С какого это перепуга?
""
0
Май Май 11 лет назад #
Спасибо, что обратили на это внимания, сейчас действительно не логично получается, например может возникнуть такая ситуация, что пользователь с логином ivan удалился, и после него зарегился другой человек под таким же логином, и получается что весь контент который вешается на другого человека который его не создавал, что безусловно не правильно.
Тут либо совсем убирать возможность регистрации под удаленным логином удаленного профиля, но с блокировкой регистрации (сейчас ее нет, lokanaft прав), еще круче было бы сделать возможность восстановления сделав привязку к email.

Да, и спасибо, что решились взятся помочь человеку из этой темы http://instantcms.ru/forum/thread14031-1.html (-:
0
Май Май 11 лет назад #
Сорри, за бессвязанную речь и что написал в ответ а не новым коментом, грипп подкосил, туман в голове.
+1
WALTERZ WALTERZ 11 лет назад #
С утра перед чашкой кофе посидел, времени было немного.
Как смогу, обязательно помогу с вашу темой ;)
0
Май Май 11 лет назад #
Отлично, думаю, что проверка уникальности никнейма еще кому-нибудь пригодится.

А на счет текущей темы: я тестировал на чистой 1.10.1, при попытке зарегить логин удаленного профиля - появляется сообщение что логин уже занят, но тем не менее можно продолжить регистрацию, и зарегить таки этот логин. С этим нужно что-то делать.
+1
WALTERZ WALTERZ 11 лет назад #
Я не понимаю, как это Вы регистрируетесь с занятым логином?
Вот только что попробовал - вылезла ошибка "Логин "walterz" уже занят!" и регистрацию продолжить невозможно.
0
Май Май 11 лет назад #
Вот смотрите

Удаляем пользователя с логином test
http://screenshotuploader.com/s/01/1n8fbg-6x

Регистрируем нового пользователя с логином test
http://screenshotuploader.com/s/01/bi9zv6ob2

Жмем кнопку Регистрация, и вуаля
http://screenshotuploader.com/s/01/dd7rvb1ze

Новый профиль с ранее удаленным логином создан.
+1
WALTERZ WALTERZ 11 лет назад #
Торопясь, совсем забыл про изменения во фронте написать. Я обновил. Внесите указанные изменения в файл frontend.php
0
Май Май 11 лет назад #
Теперь все правильно и логин и емэйл ранее зарегистрированные система не разрешает регистрировать.

Небольшое дополнение, чтобы хак был полностью законченным, возможно стоит сделать отображение сообщения "Указанный e-mail уже зарегистрирован!" внизу под полем ввода, сейчас не выводится, показывает только после попытки зарегистрировать.
+2
WALTERZ WALTERZ 11 лет назад #
ВНИМАНИЕ!
Пост обновлен.

Торопился с утра и как-то забыл написать про frontend.php.
+2
lokanaft lokanaft 11 лет назад #
Так бы сразу)
0
Константин Г. Константин Г. 10 лет назад #
а как с нагрузкой? сина становится? может проще сделать сначало по цифре 1 или 0 ,а если равен 1 то проверка по логину
+1
WALTERZ WALTERZ 10 лет назад #
Какой нагрузкой? Это исправление бага.
0
Константин Г. Константин Г. 10 лет назад #
для версии 1.10.1 неподхрдит, хотя и в ней этот баг есть. Посмотрите что можно сделать?
0
Константин Г. Константин Г. 10 лет назад #
для 1.10.1 неподходитюнету там таких строк.
+1
WALTERZ WALTERZ 10 лет назад #
Исправление бага писалось на версии 1.10.
1.10.1 тогда ещё не было. Наверное исправили.
0
Константин Г. Константин Г. 10 лет назад #
вот я на 1.10.1 сморел-ничо неодной строки ненашол такой. незнаю чо и делать.
0
Май Май 10 лет назад #
Все это есть в 1.10.1. Не нашел потому что разное количество пробелов в строках, запускайте поиск по имени переменной а не по целой строке.
0
Константин Г. Константин Г. 10 лет назад #
в 1.10.1 баг остался
+1
WALTERZ WALTERZ 10 лет назад #
В посте сначала написано для 1.9-
Делайте так, как написано после:
InstantCMS 1.10+
0
Константин Г. Константин Г. 10 лет назад #
а вот их я невидал... ща..
0
Константин Г. Константин Г. 10 лет назад #
Всё норм. на 1.10.1 палёт нармуль))
+1
WALTERZ WALTERZ 10 лет назад #
Вот и хорошо :)
+1
WALTERZ WALTERZ 9 лет назад #
Баг по-прежнему присутствует. В версии1.10.4 ничего не изменилось, касательно темы.
Так что в посте есть инструкция для актуальной версии (читать под надписью "InstantCMS 1.10+").
0
Андрей Андрей 9 лет назад #
разработчикам сообщали?
+1
WALTERZ WALTERZ 9 лет назад #
Разумеется. Видимо вылетело с головы, ведь в багтрекер я не писал. Обращался напрямую к Игорю.

Еще от автора

Урок. Расширяем функционал компонента ПОИСК. Вывод изображений
Долго отсутствовал, точнее не имел возможности. Поэтому рад снова вернуться к Вам! И так, этот пост о доработке поиска.
Доработка. Поиск клубов
И снова привет, дорогое сообщество! Писали, что поиск клубов не работает. Взглянул. Оказалось, что поисковик ищет лишь фотографии и блоги клубов.
Скроллер контента на InstantCMS 1.10 (UTF-8)
Скроллер контента из определенной категории под версию InstantCMS 1.10.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.