namespace IPSE\Authenticate\Pub\Controller;
use XF\Pub\Controller\AbstractController;
use XF\Mvc\ParameterBag;
class Register extends AbstractController {
public function actionIndex(ParameterBag $params) {
$redirect = $this->getDynamicRedirect();
$visitor = \XF::visitor();
if (!isset($params['auth_token'])) {
return $this->error('Missing authentication {auth_token}.');
}
$api = $this->options()->registerIPSEAPI;
$http_username = $this->options()->registerIPSEHttpUsername;
$endpoint = '/user/' . $params['auth_token'] . '/';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $api . $endpoint);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_USERPWD, "$http_username:");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
$output = curl_exec($ch);
curl_close($ch);
$json = json_decode($output);
if (isset($json->code) && $json->code == 404) {
return $this->error('Error: ' . $json->error);
}
if (isset($json->status) && $json->status == 401) {
return $this->error('Error: ' . $json->title);
}
if (isset($json->email_address)) {
$email = $json->email_address;
$session = $this->session();
$session->set('registerIPSE', [
'auth_token' => $params['auth_token'],
'email' => $email,
]);
$session->save();
}
else {
return $this->error('There was an error completing the Single Sign On.');
}
$emailUser = $this->em()
->findOne('XF:User', ['email' => $email]);
if (isset($emailUser) && isset($emailUser->user_id)) {
if ($visitor->user_id && $emailUser->user_id == $visitor->user_id) {
return $this->redirect($redirect);
}
if ($visitor->user_id && $emailUser->user_id != $visitor->user_id) {
$loginPlugin = $this->plugin('XF:Login');
$loginPlugin->logoutVisitor();
}
$loginPlugin = $this->plugin('XF:Login');
$loginPlugin->triggerIfTfaConfirmationRequired(
$emailUser,
$this->buildLink('login/two-step', NULL, [
'_xfRedirect' => $redirect,
'remember' => 1,
])
);
$loginPlugin->completeLogin($emailUser, TRUE);
return $this->redirect($redirect, '');
}
else {
$viewParams = [
'params' => $params,
'userData' => [
'email' => $email,
],
'redirect' => $redirect,
];
return $this->getRegisterResponse($viewParams);
}
}
protected function getRegisterResponse(array $viewParams) {
return $this->view('IPSE\Authenticate:View', 'register_ipse_account', $viewParams);
}
public function actionRegister(ParameterBag $params) {
$session = $this->session();
$registerIPSE = $session->get('registerIPSE');
if (isset($params['auth_token'])) {
if ($params['auth_token'] != $registerIPSE['auth_token']) {
$session->remove('registerIPSE');
$session->save();
return $this->error('Registration failed.');
}
}
$this->assertRegistrationActive();
$this->assertPostOnly();
$redirect = $this->getDynamicRedirect(NULL, FALSE);
$visitor = \XF::visitor();
if ($visitor->user_id) {
return $this->redirect($redirect);
}
$input = $this->getRegistrationInput();
$registration = $this->setupRegistration($input);
$registration->checkForSpam();
if (!$registration->validate($errors)) {
return $this->error($errors);
}
$user = $registration->save();
$this->finalizeRegistration($user);
return $this->redirect($this->buildLink('register/complete'));
}
protected function assertRegistrationActive() {
if (!$this->options()->registrationSetup['enabled']) {
throw $this->exception(
$this->error(\XF::phrase('new_registrations_currently_not_being_accepted'))
);
}
if ($this->options()->preventDiscouragedRegistration && $this->isDiscouraged()) {
throw $this->exception(
$this->error(\XF::phrase('new_registrations_currently_not_being_accepted'))
);
}
}
protected function getRegistrationInput() {
$input = $this->request->filter([
'username' => 'str',
'email' => 'str',
'timezone' => 'str',
'location' => 'str',
'dob_day' => 'uint',
'dob_month' => 'uint',
'dob_year' => 'uint',
'custom_fields' => 'array',
]);
$session = $this->session();
$registerIPSE = $session->get('registerIPSE');
$input['email'] = $registerIPSE['email'];
return $input;
}
protected function setupRegistration(array $input) {
$registration = $this->service('XF:User\Registration');
$registration->setFromInput($input);
$registration->setNoPassword();
$registration->skipEmailConfirmation();
return $registration;
}
protected function finalizeRegistration(\XF\Entity\User $user) {
$this->session()->changeUser($user);
\XF::setVisitor($user);
$loginPlugin = $this->plugin('XF:Login');
$loginPlugin->createVisitorRememberKey();
}
public
function assertViewingPermissions($action) {
}
}