public function actionExternalAccounts()
 {
     $response = parent::actionExternalAccounts();
     if ($response instanceof XenForo_ControllerResponse_View && $response->subView instanceof XenForo_ControllerResponse_View) {
         $params =& $response->subView->params;
         if (!empty($params['external']['accountsfreedom'])) {
             $external = $params['external']['accountsfreedom'];
             $accounts = new AnyTV_AccountsAuthentication_Accounts();
             $extraData = unserialize($external['extra_data']);
             $accountsUser = $accounts->getUserInfo($external['provider_key'], $extraData['token']);
             if (!empty($accountsUser)) {
                 $accountsUser = $accountsUser;
             } else {
                 $accountsUser = false;
             }
             $params['accountsUser'] = $accountsUser;
         }
     }
     return $response;
 }
 public function actionAccountsfreedom()
 {
     $accounts = new AnyTV_AccountsAuthentication_Accounts();
     if (!$accounts->isConnectable()) {
         return $this->responseError(new XenForo_Phrase('something_went_wrong_please_try_again'));
     }
     $assocUserId = $this->_input->filterSingle('assoc', XenForo_Input::UINT);
     $redirect = $this->_getExternalAuthRedirect();
     $session = XenForo_Application::getSession();
     $redirectUri = XenForo_Link::buildPublicLink('canonical:register/accountsfreedom', false, array('assoc' => $assocUserId ? $assocUserId : false));
     if ($this->_input->filterSingle('reg', XenForo_Input::UINT)) {
         $session->set('loginRedirect', $redirect);
         $session->remove('accountsToken');
         return $this->responseRedirect(XenForo_ControllerResponse_Redirect::RESOURCE_CANONICAL, $accounts->getAccountsRequestUrl($redirectUri));
     }
     $accountsToken = $this->_input->filterSingle('token', XenForo_Input::STRING);
     if (!$accountsToken) {
         $accountsToken = $session->get('accountsToken');
     }
     $accountsUser = false;
     if (!$accountsToken) {
         $error = $this->_input->filterSingle('error', XenForo_Input::STRING);
         if ($error == 'access_denied') {
             return $this->responseError(new XenForo_Phrase('you_did_not_grant_permission_to_access_external_account'));
         }
         $code = $this->_input->filterSingle('code', XenForo_Input::STRING);
         if (!$code) {
             return $this->responseError(new XenForo_Phrase('accountsfreedom_error_occurred_while_connecting_with_accountsfreedom1'));
         }
         $state = $this->_input->filterSingle('state', XenForo_Input::STRING);
         if (!$state || !$session->get('accountsCsrfState') || $state !== $session->get('accountsCsrfState')) {
             return $this->responseRedirect(XenForo_ControllerResponse_Redirect::SUCCESS, XenForo_Link::buildPublicLink('canonical:index'));
         }
         $token = $accounts->getAccessTokenFromCode($code, $redirectUri);
         if (!isset($token['access_token'])) {
             return $this->responseError(new XenForo_Phrase('accountsfreedom_error_occurred_while_connecting_with_accountsfreedom2'));
         }
         $accountsToken = $token['access_token'];
         $accountsUser = $accounts->getUserInfo(null, $accountsToken);
     }
     if (!isset($accountsUser['user_id'])) {
         return $this->responseError(new XenForo_Phrase('accountsfreedom_error_occurred_while_connecting_with_accountsfreedom3'));
     }
     $userModel = $this->_getUserModel();
     $userExternalModel = $this->_getUserExternalModel();
     $accountsAssoc = $userExternalModel->getExternalAuthAssociation('accountsfreedom', $accountsUser['user_id']);
     if ($accountsAssoc && $userModel->getUserById($accountsAssoc['user_id'])) {
         $userExternalModel->updateExternalAuthAssociationExtra($accountsAssoc['user_id'], 'accountsfreedom', array('token' => $accountsToken));
         $userExternalModel->updateExternalAuthAssociationExtra($accountsAssoc['user_id'], 'accountsfreedom', array('data' => $accountsUser));
         $redirect = XenForo_Application::getSession()->get('loginRedirect');
         if (!$redirect) {
             $redirect = $this->getDynamicRedirect(false, false);
         }
         $visitor = XenForo_Visitor::setup($accountsAssoc['user_id']);
         XenForo_Application::getSession()->userLogin($accountsAssoc['user_id'], $visitor['password_date']);
         $this->_getUserModel()->setUserRememberCookie($accountsAssoc['user_id']);
         return $this->responseRedirect(XenForo_ControllerResponse_Redirect::SUCCESS, $redirect);
     }
     $existingUser = false;
     $emailMatch = false;
     if (XenForo_Visitor::getUserId()) {
         $existingUser = XenForo_Visitor::getInstance();
     } else {
         if ($assocUserId) {
             $existingUser = $userModel->getUserById($assocUserId);
         }
     }
     $existingUser = $userModel->getUserByEmail($accountsUser['email']);
     if ($existingUser) {
         $emailMatch = true;
     }
     $viewName = 'AnyTV_AccountsAuthentication_ViewPublic_Accounts_Register';
     $templateName = 'register_accountsfreedom';
     XenForo_Application::getSession()->set('accountsToken', $accountsToken);
     XenForo_Application::getSession()->set('accountsUser', $accountsUser);
     if ($existingUser) {
         // must associate: matching user
         return $this->_getExternalRegisterFormResponse($viewName, $templateName, array('associateOnly' => true, 'accountsfreedom' => $accountsUser, 'existingUser' => $existingUser, 'emailMatch' => $emailMatch, 'redirect' => $redirect));
     }
     $this->_assertRegistrationActive();
     if (!empty($accountsUser['birthday'])) {
         $this->_validateBirthdayString($accountsUser['birthday'], 'm/d/y');
     }
     return $this->_getExternalRegisterFormResponse($viewName, $templateName, array('accountsfreedom' => $accountsUser, 'redirect' => $redirect, 'showDob' => empty($accountsUser['birthday'])));
 }