Register > Activate * @copyright Tamaranga */ class Activate extends AuthForm { public function data() { if ($this->request->user()) { return Users::redirectToAccountSettings(); } # Activation key $key = $this->request->get('key', TYPE_NOTAGS); # InternalMail: new message + not activated receiver $isMessageRedirect = false; $messageKey = $this->request->get('msg', TYPE_NOTAGS); if (! empty($messageKey)) { list($authorID, $interlocutorID) = explode('-', (strpos($messageKey, '-') !== false ? $messageKey : '0-0-0'), 3); $isMessageRedirect = ($authorID && $interlocutorID); } $isAutoRegistration = $isMessageRedirect; $userData = Users::model()->userDataByFilter([ 'activated' => 0, 'blocked' => 0, ['activate_expire > :expire', ':expire' => $this->db->now()], 'activate_key' => $key, ], ['user_id', 'email', 'name']); # Failed to find user account by {key}: # 1) Activation key has expired or is invalid # 2) User acount is already activated or was blocked if (empty($userData)) { if ($isMessageRedirect) { return $this->authMessage( _t('users', 'View messages'), _t('users', 'You need to Sign In to view messages.', [ 'link_auth' => ' href="' . $this->loginUrl() . '"' ]) ); } return $this->authMessage( _t('users', 'Account activation'), _t('users', 'The activation key has expired.') ); } $userID = intval($userData['user_id']); # Activate user account $activate = [ # Activation link may only be sent on email, so verify email 'verifyEmail' => true, # Generate new password (automatic passwordless registration only) 'password' => ($isAutoRegistration ? $this->security->generatePassword() : null) ]; if (Users::userActivate($userID, $activate)) { if ($isAutoRegistration) { # Send email notification - registation finished Users::sendAutoRegistrationNotification($userID, $userData['name'], $userData['email'], $activate['password']); } } # Authenticate if (Users::authById($userID) === true) { # Save favorite listings to database Listings::favorites()->onUserLogin($userID); # todo: listen @see \modules\users\events\Login # Redirect to messages if ($isMessageRedirect) { $interlocutorData = Users::model()->userData($interlocutorID, ['user_id', 'login']); if (! empty($interlocutorData)) { return Redirect::to(InternalMail::url('account.messages', ['i' => $interlocutorData['login']])); } } } # Redirect to registration "Finished" step return Redirect::to($this->registrationUrl('finished')); } }