Повторная Активация (1.10.* микрохак)

1620
Всем привет!

Настраивал сегодня у себя отправку писем с активацией аккаунта,
и случайно смоделировал сбой отправки письма с сайта)

Пользователь успешно создался, но письмо Не пришло ..
Первым делом я решил войти на сайт, что конечно же не получилось ..
Второе, по логике - это попытался восстановить пароль.



Письмо успешно отправилось, но смысла в восстановлении пароля нет, так как
учетная запись попросту не активирована...
Плюс ко всему повторно на этот же почтовый ящик зарегистрироваться система не дает ...

.. Для пользователя все плохо.. Или новый ящик заводить или админу писать ..
время потеряно.. нервы тоже ..

Решил доделать немного систему восстановления пароля, что бы она сама решала, что делать :

или письмо на смену пароля слать
или письмо с активацией послать

В общем решение простое и вмешательство будет всего в один файл:

components\registration\frontend.php


нужно найти условие :

Код PHP:
  1. if(!$usr) {
  2. cmsCore::addSessionMessage($_LANG['ADRESS'].' "'.$email.'" '.$_LANG['NOT_IN_OUR_BASE'], 'error');
  3. cmsCore::redirectBack();
  4. }
и сразу после добавить :

Код PHP:
  1.  
  2. elseif($usr['is_locked'] && !$usr['is_logged_once']) {
  3. $usrid = $usr['id'];
  4. $logn = substr(($usr['login']), 0, 5);
  5. $pas = $logn.(rand(111111, 9999999));
  6. $pasmd = md5($pas);
  7. $inDB->query("DELETE FROM cms_users_activate WHERE user_id = '$usrid'");
  8. $inDB->query("UPDATE cms_users SET password = '{$pasmd}' WHERE id = '$usrid'");
  9. $model->sendActivationNotice($pas, $usrid);
  10. $pas = null; $pasmd = null;
  11. cmsCore::addSessionMessage('Вам повторно выслана инструкция по активации аккаунта
  12.  
  13. Новая ссылка активации будет действовать в течении 3х дней
  14.  
  15. Новый пароль указан в инструкции
  16.  
  17. Если активация не происходит, обратитесь пожалуйста к Администратору сайта', 'info');
  18. $inDB->query("DELETE FROM cms_users_activate WHERE DATEDIFF(NOW(), pubdate) > 3");
  19. cmsUser::clearCsrfToken();
  20. cmsCore::redirectBack();
  21. }
  22.  

Все. Теперь если активация не пройдена (только в этом случае!) ,
пользователь введя емайл в поле восстановления пароля, получит подсказку и письмо на почту в придачу.
В письме будет новая ссылка на Активацию, а так же прописан Логин и новый сгенерированный Пароль.

.. Плюс попутно почистится таблица активаций в базе от устаревших записей ..
вроде мелочь, а приятно )
FAQ - уведомление и простая модерация (*1.10...) мини_хак | АнтиСпам для Блогов (ver. 1.10.* & 1.9)
Комментарии (10)
eoleg 10 февраля 2013 в 16:56 +4
+
это должно быть в дистрибутиве
lokanaft 10 февраля 2013 в 17:06 +1
А проверяется ли, что юзер не был попросту заблокирован админом? is_logged_once можно было бы заюзать для этого)
KS 10 февраля 2013 в 17:33 0
Да, это нужно делать!, Пост поправил!
По хорошему на восстановление пароля тоже проверку нужно ставить..
Хотя с другой стороны, баном чаще пользуются ..
lokanaft 10 февраля 2013 в 17:39 0
Как по мне, так бан вообще безполезная вещь, у одного юзера этих айпи как грязи мб и в тоже время целый город можно забанить случайно.
KS 10 февраля 2013 в 17:50 0
Верно, но все же от спама немного спасает )

А блокировка аккаунта оч хороша там где инвайты.
Роман 10 февраля 2013 в 17:11 +1
Нужный хак!
KS 10 февраля 2013 в 18:00 0
Добавил себе, может еще кому пригодится :

При смене пароля на заблокированном аккаунте
предупреждение (без принуждений)):

после строки :
Код PHP:
  1. cmsCore::addSessionMessage($_LANG['NEW_PAS_SENDED'], 'info');
добавить вот такую :
Код PHP:
  1. if($usr['is_locked'] && $usr['is_logged_once']) {cmsCore::addSessionMessage('*Возможно Ваш аккаунт заблокирован! Обратитесь к администрации сайта!', 'error');}
KS 10 февраля 2013 в 18:01 0
так видней:
Код PHP:
  1. if($usr['is_locked'] && $usr['is_logged_once'])
  2. {cmsCore::addSessionMessage('*Возможно Ваш аккаунт заблокирован!
  3. Обратитесь к администрации сайта!', 'error');}
Константин Г. 7 апреля 2013 в 14:44 0
Спасибо. хорошо.
Александр 5 октября 2016 в 18:24 0
Понадобилось, добавил, работает, спасибо, единственное в 1.10.6 строчка выглядит вот так:
if(!$usr || $usr['is_locked'] || $usr['is_deleted']) {

и что бы заработало пришлось из нее убрать || $usr['is_locked'] - верно или есть подводные камни?

з.ы. это надо включать в коробку...