You are here

public function miniorange_oauth_clientController::miniorange_oauth_client_mo_login in OAuth2 Login 8

1 string reference to 'miniorange_oauth_clientController::miniorange_oauth_client_mo_login'
oauth2_login.routing.yml in ./oauth2_login.routing.yml
oauth2_login.routing.yml

File

src/Controller/miniorange_oauth_clientController.php, line 73
Contains \Drupal\miniorange_oauth_client\Controller\DefaultController.

Class

miniorange_oauth_clientController

Namespace

Drupal\oauth2_login\Controller

Code

public function miniorange_oauth_client_mo_login() {
  $code = isset($_GET['code']) ? $_GET['code'] : '';
  $code = isset($code) ? Html::escape($code) : '';
  $state = isset($_GET['state']) ? $_GET['state'] : '';
  $state = isset($state) ? Html::escape($state) : '';
  if (isset($code) && isset($state)) {
    if (session_id() == '' || !isset($_SESSION)) {
      session_start();
    }
    if (!isset($code)) {
      if (isset($_GET['error_description'])) {
        exit($_GET['error_description']);
      }
      else {
        if (isset($_GET['error'])) {
          exit($_GET['error']);
        }
      }
      exit('Invalid response');
    }
    else {
      $currentappname = "";
      if (isset($_SESSION['appname']) && !empty($_SESSION['appname'])) {
        $currentappname = $_SESSION['appname'];
      }
      else {
        if (isset($state) && !empty($state)) {
          $currentappname = base64_decode($state);
        }
      }
      if (empty($currentappname)) {
        exit('No request found for this application.');
      }
    }
  }

  // Getting Access Token
  $app = [];
  $app = \Drupal::config('oauth2_login.settings')
    ->get('miniorange_oauth_client_appval');
  $name_attr = "";
  $email_attr = "";
  $name = "";
  $email = "";
  if (isset($app['miniorange_oauth_client_email_attr'])) {
    $email_attr = trim($app['miniorange_oauth_client_email_attr']);
  }
  if (isset($app['miniorange_oauth_client_name_attr'])) {
    $name_attr = trim($app['miniorange_oauth_client_name_attr']);
  }
  $parse_from_header = \Drupal::config('oauth2_login.settings')
    ->get('miniorange_oauth_send_with_header_oauth');
  $parse_from_body = \Drupal::config('oauth2_login.settings')
    ->get('miniorange_oauth_send_with_body_oauth');
  if (!$parse_from_header == TRUE || !$parse_from_header == 1) {
    $parse_from_header = FALSE;
  }
  if (!$parse_from_body == TRUE || !$parse_from_body == 1) {
    $parse_from_body = FALSE;
  }
  $accessToken = AccessToken::getAccessToken($app['access_token_ep'], 'authorization_code', $app['client_id'], $app['client_secret'], $code, $app['callback_uri'], $parse_from_header, $parse_from_body);
  if (!$accessToken) {
    print_r('Invalid token received.');
    exit;
  }
  $resourceownerdetailsurl = $app['user_info_ep'];
  if (substr($resourceownerdetailsurl, -1) == "=") {
    $resourceownerdetailsurl .= $accessToken;
  }
  $resourceOwner = UserResource::getResourceOwner($resourceownerdetailsurl, $accessToken);

  /*
   *   Test Configuration
   */
  if (isset($_COOKIE['Drupal_visitor_mo_oauth_test']) && $_COOKIE['Drupal_visitor_mo_oauth_test'] == TRUE) {
    $_COOKIE['Drupal_visitor_mo_oauth_test'] = 0;
    $module_path = \Drupal::service('extension.list.module')
      ->getPath('oauth2_login');
    $username = isset($resourceOwner['email']) ? $resourceOwner['email'] : 'User';
    \Drupal::configFactory()
      ->getEditable('oauth2_login.settings')
      ->set('miniorange_oauth_client_attr_list_from_server', $resourceOwner)
      ->save();
    echo '<div style="font-family:Calibri;padding:0 3%;">';
    echo '<div style="color: #3c763d;background-color: #dff0d8; padding:2%;margin-bottom:20px;text-align:center; border:1px solid #AEDB9A;
                        font-size:15pt;">
                        TEST SUCCESSFUL
                      </div>
                      <div style="display:block;text-align:center;margin-bottom:4%;">
                        <img style="width:15%;"src="' . $module_path . '/includes/images/green_check.png">
                      </div>';
    echo '<span style="font-size:13pt;"><b>Hello</b>, ' . $username . '</span><br/>
                      <p style="font-weight:bold;font-size:13pt;margin-left:1%;">ATTRIBUTES RECEIVED:</p>
                      <table style="border-collapse:collapse;border-spacing:0; display:table;width:100%; font-size:13pt;background-color:#EDEDED;">
                          <tr style="text-align:center;">
                              <td style="font-weight:bold;border:2px solid #949090;padding:2%;width: fit-content;">ATTRIBUTE NAME</td>
                              <td style="font-weight:bold;padding:2%;border:2px solid #949090; word-wrap:break-word;">ATTRIBUTE VALUE</td>
                          </tr>';
    self::testattrmappingconfig("", $resourceOwner);
    echo '</table></div>';
    echo '<div style="margin:3%;display:block;text-align:center;">
                        <input style="padding:1%;width:37%;background: #0091CD none repeat scroll 0% 0%;cursor: pointer;font-size:15px;
                            border-width: 1px;border-style: solid;border-radius: 3px;white-space: nowrap;box-sizing: border-box;border-color: #0073AA;
                            box-shadow: 0px 1px 0px rgba(120, 200, 230, 0.6) inset;color: #FFF;"type="button" value="Configure Attribute/Role Mapping"
                        onClick="close_and_redirect();">
                        <input style="padding:1%;width:100px;background: #0091CD none repeat scroll 0% 0%;cursor: pointer;font-size:15px;
                            border-width: 1px;border-style: solid;border-radius: 3px;white-space: nowrap;box-sizing: border-box;border-color: #0073AA;
                            box-shadow: 0px 1px 0px rgba(120, 200, 230, 0.6) inset;color: #FFF;"type="button" value="Done" onClick="self.close();">
                    </div>
                    <script>
                        function close_and_redirect(){
                            window.opener.redirect_to_attribute_mapping();
                            self.close();
                        }
                        function redirect_to_attribute_mapping(){
                            var baseurl = window.location.href.replace("config_clc","mapping");
                            window.location.href= baseurl;
                          }
                    </script>';
    return new Response();
    exit;
  }
  if (!empty($email_attr)) {
    $email = self::getnestedattribute($resourceOwner, $email_attr);
  }

  //$resourceOwner[$email_attr];
  if (!empty($name_attr)) {
    $name = self::getnestedattribute($resourceOwner, $name_attr);
  }

  //$resourceOwner[$name_attr];
  global $base_url;

  /*************==============Attributes not mapped check===============************/
  if (empty($email)) {
    echo '<div style="font-family:Calibri;padding:0 3%;">';
    echo '<div style="color: #a94442;background-color: #f2dede;padding: 15px;margin-bottom: 20px;text-align:center;border:1px solid #E6B3B2;font-size:18pt;"> ERROR</div>
                                <div style="color: #a94442;font-size:14pt; margin-bottom:20px;"><p><strong>Error: </strong>Email address does not received.</p>
                                    <p>Check your <b>Attribute Mapping</b> configuration.</p>
                                    <p><strong>Possible Cause: </strong>Email Attribute field is not configured.</p>
                                </div>
                                <div style="margin:3%;display:block;text-align:center;"></div>
                                <div style="margin:3%;display:block;text-align:center;">
                                    <form action="' . $base_url . '" method ="post">
                                        <input style="padding:1%;width:100px;background: #0091CD none repeat scroll 0% 0%;cursor: pointer;font-size:15px;border-width: 1px;border-style: solid;border-radius: 3px;white-space: nowrap;box-sizing: border-box;border-color: #0073AA;box-shadow: 0px 1px 0px rgba(120, 200, 230, 0.6) inset;color: #FFF;"type="submit" value="Done">
                                    </form>
                                </div>';
    exit;
    return new Response();
  }

  //Validates the email format
  if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo "Invalid email format of the received value";
    exit;
  }
  if (empty($name)) {
    $name = $email;
  }
  $account = '';
  if (!empty($email)) {
    $account = user_load_by_mail($email);
  }
  if ($account == NULL) {
    if (!empty($name) && isset($name)) {
      $account = user_load_by_name($name);
    }
  }
  global $user;

  // Creating a new user in case the user does not exists in the Drupal database
  $disable_create_user = \Drupal::config('oauth2_login.settings')
    ->get('miniorange_oauth_disable_autocreate_users');
  if ($disable_create_user) {
    $redirect = \Drupal::config('miniorange_oauth_client.settings')
      ->get('miniorange_oauth_redirect_url');
  }
  else {
    if (!isset($account->uid)) {
      $random_password = user_password(8);
      $new_user = [
        'name' => $name,
        'mail' => $email,
        'pass' => $random_password,
        'status' => 1,
      ];
      $account = User::create($new_user);
      $account
        ->save();
    }
    $user = \Drupal\user\Entity\User::load($account
      ->id());
    $edit = [];
    if (!empty(\Drupal::config('oauth2_login.settings')
      ->get('miniorange_oauth_client_base_url'))) {
      $baseUrlValue = \Drupal::config('oauth2_login.settings')
        ->get('miniorange_oauth_client_base_url');
    }
    else {
      $baseUrlValue = $base_url;
    }
    $edit['redirect'] = $baseUrlValue;
    user_login_finalize($account);

    // Update user fields here.
    $hook1 = 'oauth2_login_field_mapping';
    $implementations = \Drupal::moduleHandler()
      ->getImplementations($hook1);
    $user_updated = FALSE;
    foreach ($implementations as $implementation) {
      $func = $implementation . '_' . $hook1;
      $mapping = $func();
      foreach ($mapping as $fieldmap) {
        $user_updated = TRUE;
        $user
          ->set($fieldmap['local'], self::getnestedattribute($resourceOwner, $fieldmap['remote']));
      }
    }
    $disable_role_override = \Drupal::config('oauth2_login.settings')
      ->get('miniorange_disable_attribute');
    if (!$disable_role_override) {

      // Do role override
      $selected_role = \Drupal::config('oauth2_login.settings')
        ->get('miniorange_oauth_default_mapping');
      $user
        ->addRole($selected_role);
      $user_updated = TRUE;
    }
    if ($user_updated) {
      $user
        ->save();
    }
    $redirect = \Drupal::config('miniorange_oauth_client.settings')
      ->get('miniorange_oauth_redirect_url');
  }
  $response = new RedirectResponse($redirect);
  $response
    ->send();
  return new Response();
}