You are here

function miniorange_2fa_inline_registration::handle_page_four_submit in Google Authenticator / 2 Factor Authentication - 2FA 8

Same name and namespace in other branches
  1. 8.2 src/Form/miniorange_2fa_inline_registration.php \Drupal\miniorange_2fa\form\miniorange_2fa_inline_registration::handle_page_four_submit()

File

src/Form/miniorange_2fa_inline_registration.php, line 530

Class

miniorange_2fa_inline_registration

Namespace

Drupal\miniorange_2fa\form

Code

function handle_page_four_submit(array $form, \Drupal\Core\Form\FormStateInterface $form_state) {
  global $base_url;
  $storage = $form_state
    ->getStorage();
  $method = $storage['page_three_values']['mo_auth_method'];
  $form_state
    ->setRebuild();
  if ($method == AuthenticationType::$GOOGLE_AUTHENTICATOR['code']) {
    $email = $storage['page_one_values']['mo_auth_user_email'];
    $google_auth_response = $storage['page_four_values']['google_auth_response'];
    $token = $form['mo_auth_googleauth_token']['#value'];
    $secret = $google_auth_response->secret;
    $customer = new MiniorangeCustomerProfile();
    $miniorange_user = new MiniorangeUser($customer
      ->getCustomerID(), $email, NULL, NULL, AuthenticationType::$GOOGLE_AUTHENTICATOR['code']);
    $auth_api_handler = new AuthenticationAPIHandler($customer
      ->getCustomerID(), $customer
      ->getAPIKey());
    $response = $auth_api_handler
      ->register($miniorange_user, AuthenticationType::$GOOGLE_AUTHENTICATOR['code'], $secret, $token, NULL);
    if ($response->status == 'SUCCESS') {
      $page = [
        'page_five' => TRUE,
        'page_four_values' => $form_state
          ->getValues(),
        'page_three_values' => $storage['page_three_values'],
        'page_two_values' => $storage['page_two_values'],
        'page_one_values' => $storage['page_one_values'],
      ];
      $_SESSION['success_status'] = TRUE;
      $form_state
        ->setStorage($page);
      return;
    }
    elseif ($response->status == 'FAILED') {

      // Passcode incorrect. Try again - Show error form
      $page = [
        'page_four' => TRUE,
        'page_four_values' => [
          'google_auth_response' => $storage['page_four_values']['google_auth_response'],
        ],
        'page_three_values' => $storage['page_three_values'],
        'page_two_values' => $storage['page_two_values'],
        'page_one_values' => $storage['page_one_values'],
      ];
      $form_state
        ->setStorage($page);
      $_SESSION['success_status'] = FALSE;
      $form_state
        ->setRebuild();
      return;
    }
    elseif ($response->status != 'SUCCESS') {
      $form_state
        ->setRebuild();
      unset($_SESSION['success_status']);
      \Drupal::messenger()
        ->addMessage(t('An error occured while registering the user.'), 'error', TRUE);
      $response = new RedirectResponse($base_url . '/user/login');
      $response
        ->send();
    }
  }
  elseif ($method == AuthenticationType::$QR_CODE['code'] || $method == AuthenticationType::$SOFT_TOKEN['code'] || $method == AuthenticationType::$PUSH_NOTIFICATIONS['code']) {
    $qrcode_response = $storage['page_four_values']['qrcode_response'];
    $customer = new MiniorangeCustomerProfile();
    $auth_api_handler = new AuthenticationAPIHandler($customer
      ->getCustomerID(), $customer
      ->getAPIKey());
    $response = $auth_api_handler
      ->getRegistrationStatus($qrcode_response->txId);
    if ($response->status == 'SUCCESS') {
      $page = [
        'page_five' => TRUE,
        'page_four_values' => $form_state
          ->getValues(),
        'page_three_values' => $storage['page_three_values'],
        'page_two_values' => $storage['page_two_values'],
        'page_one_values' => $storage['page_one_values'],
      ];
      $form_state
        ->setStorage($page);
      return;
    }
  }
  elseif ($method == AuthenticationType::$SMS['code'] || $method == AuthenticationType::$SMS_AND_EMAIL['code'] || $method == AuthenticationType::$EMAIL['code'] || $method == AuthenticationType::$OTP_OVER_PHONE['code']) {
    $input = $form_state
      ->getUserInput();
    $phone = isset($input['mo_auth_otpoversms_phone']) ? $input['mo_auth_otpoversms_phone'] : '';
    $email = $storage['page_one_values']['mo_auth_user_email'];
    $customer = new MiniorangeCustomerProfile();
    if ($method == AuthenticationType::$SMS_AND_EMAIL['code']) {
      $miniorange_user = new MiniorangeUser($customer
        ->getCustomerID(), NULL, $phone, NULL, $method, $email);
    }
    elseif ($method == AuthenticationType::$SMS['code']) {
      $miniorange_user = new MiniorangeUser($customer
        ->getCustomerID(), NULL, $phone, NULL, $method, NULL);
    }
    elseif ($method == AuthenticationType::$EMAIL['code']) {
      $miniorange_user = new MiniorangeUser($customer
        ->getCustomerID(), NULL, NULL, NULL, $method, $email);
    }
    elseif ($method == AuthenticationType::$OTP_OVER_PHONE['code']) {
      $miniorange_user = new MiniorangeUser($customer
        ->getCustomerID(), NULL, $phone, NULL, $method, NULL);
    }
    $auth_api_handler = new AuthenticationAPIHandler($customer
      ->getCustomerID(), $customer
      ->getAPIKey());
    $response = $auth_api_handler
      ->challenge($miniorange_user);
    if ($response->status == 'SUCCESS') {
      $page = [
        'page_otp_validate' => TRUE,
        'page_four_values' => $form_state
          ->getValues(),
        [
          'user_challenge_response' => $response,
        ],
        'page_three_values' => $storage['page_three_values'],
        'page_two_values' => $storage['page_two_values'],
        'page_one_values' => $storage['page_one_values'],
      ];
      $_SESSION['message'] = 'INVALID OTP';
      $_SESSION['success_status'] = TRUE;
      $form_state
        ->setStorage($page);
      return;
    }
    elseif ($response->status == 'FAILED') {

      //$error = $response->message;
      $page = [
        'Page_four' => TRUE,
        'page_three_values' => $storage['page_three_values'],
        'page_two_values' => $storage['page_two_values'],
        'page_one_values' => $storage['page_one_values'],
      ];
      $_SESSION['message'] = 'Error during sending OTP. You may choose other methods.';
      $_SESSION['success_status'] = FALSE;
      $form_state
        ->setStorage($page);
      $form_state
        ->setRebuild();
      return;
    }
  }
  elseif ($method == AuthenticationType::$KBA['code']) {
    $this
      ->handle_page_five_submit($form, $form_state);
    return;
  }

  // Handle all error
}