You are here

public function Callback::callbackUrl in Google API PHP Client 8.4

Same name and namespace in other branches
  1. 8 src/Controller/Callback.php \Drupal\google_api_client\Controller\Callback::callbackUrl()
  2. 8.2 src/Controller/Callback.php \Drupal\google_api_client\Controller\Callback::callbackUrl()
  3. 8.3 src/Controller/Callback.php \Drupal\google_api_client\Controller\Callback::callbackUrl()

Callback URL for Google API Auth.

Parameters

\Symfony\Component\HttpFoundation\Request $request: Request.

Return value

array Return markup for the page.

1 string reference to 'Callback::callbackUrl'
google_api_client.routing.yml in ./google_api_client.routing.yml
google_api_client.routing.yml

File

src/Controller/Callback.php, line 95

Class

Callback
Google Client Callback Controller.

Namespace

Drupal\google_api_client\Controller

Code

public function callbackUrl(Request $request) {
  if ($state = $request
    ->get('state')) {
    $state = Json::decode($state);
    if (isset($state['src']) && !in_array('google_api_client', $state['src'])) {

      // Handle response only if the request was from google_api_client.
      // Here some other module has set that we don't process standard
      // google_api_client so we invoke the webhook and return.
      $this->moduleHandler
        ->invokeAll('google_api_client_google_response', [
        $request,
      ]);

      // We return to home page if not redirected in the webhook.
      return $this
        ->redirect('<front>');
    }
  }
  $tempStore = $this->tempStoreFactory
    ->get('google_api_client');
  if ($request
    ->get('error')) {
    if ($request
      ->get('error') == 'access_denied') {
      $this
        ->messenger()
        ->addError($this
        ->t('You denied access so account is not authenticated'));
    }
    else {
      $this
        ->messenger()
        ->addError($this
        ->t('Something caused error in authentication.'));
    }
    $tempStore
      ->delete('account_id');
    $tempStore
      ->delete('account_type');
    if ($tempStore
      ->get('state_destination')) {
      $destination = $tempStore
        ->get('state_destination');
      $tempStore
        ->delete('state_destination');
      return new RedirectResponse(Url::fromUserInput($destination)
        ->toString());
    }
    $tempStore
      ->delete('state_src');
    $tempStore
      ->delete('state_hash');
    return $this
      ->redirect('<front>');
  }
  $account_id = $request
    ->get('id');
  $entity_type = $request
    ->get('type');
  if ($entity_type) {
    $tempStore
      ->set('account_type', $entity_type);
  }
  else {
    if ($tempStore
      ->get('account_type')) {
      $entity_type = $tempStore
        ->get('account_type');
    }
    else {
      $entity_type = 'google_api_client';
      $tempStore
        ->set('account_type', $entity_type);
    }
  }
  if (!google_api_client_load_library()) {

    // We don't have library installed notify admin and abort.
    $status_report_link = Link::createFromRoute($this
      ->t('Status Report'), 'system.status')
      ->toString();
    $this
      ->messenger()
      ->addError($this
      ->t("Can't authenticate with google as library is missing check %status_report for more details", [
      '%status_report' => $status_report_link,
    ]));
    return $this
      ->redirect('entity.google_api_client.collection');
  }
  if ($account_id == NULL && $tempStore
    ->get('account_id')) {
    $account_id = $tempStore
      ->get('account_id');
  }
  elseif ($account_id) {
    $tempStore
      ->set('account_id', $account_id);
  }
  if ($account_id) {
    $google_api_client = $this
      ->entityTypeManager()
      ->getStorage($entity_type)
      ->load($account_id);
    $this->googleApiClientService
      ->setGoogleApiClient($google_api_client);
    $this->googleApiClientService->googleClient
      ->setApplicationName("Google OAuth2");
    if ($request
      ->get('code')) {
      $this->googleApiClientService->googleClient
        ->fetchAccessTokenWithAuthCode($request
        ->get('code'));
      $google_api_client
        ->setAccessToken(Json::encode($this->googleApiClientService->googleClient
        ->getAccessToken()));
      $google_api_client
        ->setAuthenticated(TRUE);
      $google_api_client
        ->save();
      $destination = FALSE;
      if ($tempStore
        ->get('state_destination')) {
        $destination = $tempStore
          ->get('state_destination');
      }
      $tempStore
        ->delete('state_destination');
      $tempStore
        ->delete('state_src');
      $tempStore
        ->delete('state_hash');
      $tempStore
        ->delete('account_id');
      $tempStore
        ->delete('account_type');
      $this
        ->messenger()
        ->addMessage($this
        ->t('Api Account saved'));

      // Let other modules act of google response.
      $this->moduleHandler
        ->invokeAll('google_api_client_google_response', [
        $request,
      ]);
      if ($destination) {
        return new RedirectResponse(Url::fromUserInput($destination)
          ->toString());
      }
      return $this
        ->redirect('entity.google_api_client.collection');
    }
    if ($this->googleApiClientService->googleClient) {
      if ($tempStore
        ->get('state_src')) {
        $state = [
          'src' => $tempStore
            ->get('state_src'),
          'hash' => $tempStore
            ->get('state_hash'),
        ];
      }
      else {
        $state = [
          'src' => [
            'google_api_client',
          ],
          'hash' => md5(rand()),
        ];
        if ($destination = $request
          ->get('destination')) {
          $tempStore
            ->set('state_destination', $destination);
          $this->requestStack
            ->getCurrentRequest()->query
            ->remove('destination');
        }
      }

      // Allow other modules to alter the state param.
      $this->moduleHandler
        ->alter('google_api_client_state', $state, $google_api_client);
      $tempStore
        ->set('state_src', $state['src']);
      $tempStore
        ->set('state_hash', $state['hash']);
      $state = Json::encode($state);
      $this->googleApiClientService->googleClient
        ->setState($state);
      $auth_url = $this->googleApiClientService->googleClient
        ->createAuthUrl();
      $request
        ->getSession()
        ->save();
      $response = new TrustedRedirectResponse($auth_url);
      $response
        ->send();
      exit;
    }
  }
  return $this
    ->redirect('entity.google_api_client.collection');
}