/home/edulekha/crm.edulekha.com/application/controllers/admin/Smtp_oauth_google.php
<?php

/**
* Aliases for League Provider Classes
* Make sure you have added these to your composer.json and run `composer install`
* Plenty to choose from here:
* @see http://oauth2-client.thephpleague.com/providers/thirdparty/
*/
//@see https://github.com/thephpleague/oauth2-google
use League\OAuth2\Client\Provider\Google;

class Smtp_oauth_google extends AdminController
{
    public function token()
    {
        $providerName = 'Google';
        $clientId     = get_option('google_mail_client_id');
        $clientSecret = $this->encryption->decrypt(get_option('google_mail_client_secret'));
        
        if (!$clientId && !$clientSecret) {
            die('Add client ID and Client Secret in settings.');
        }
        
        $redirectUri = admin_url('smtp_oauth_google/token');
        
        $params = [
            'clientId'     => $clientId,
            'clientSecret' => $clientSecret,
            'redirectUri'  => $redirectUri,
            'accessType'   => 'offline',
        ];
        
        $options  = [];
        $provider = null;
        
        switch ($providerName) {
            
            case 'Google':
                $provider = new Google($params);
                $options = ['scope' => [ 'https://mail.google.com/' ]];
                    
                break;
        }

        if (null === $provider) {
            exit('Provider missing');
        }
                
        if (!isset($_GET['code'])) {
            //If we don't have an authorization code then get one
            $authUrl = $provider->getAuthorizationUrl($options);
            $this->session->set_userdata(['oauth2state' => $provider->getState()]);
            header('Location: ' . $authUrl);
            exit;
        //Check given state against previously stored one to mitigate CSRF attack
        } elseif (empty($_GET['state']) || ($_GET['state'] !== $this->session->userdata('oauth2state'))) {
            $this->session->unset_userdata('oauth2state');
            exit('Invalid state');
        }

        try {
            //Try to get an access token (using the authorization code grant)
            $token = $provider->getAccessToken(
                'authorization_code',
                [
                    'code' => $_GET['code'],
                ]
            );

            //Use this to interact with an API on the users behalf
            //Use this to get a new access token if the old one expires
            if($refreshToken = $token->getRefreshToken()) {
                update_option('google_mail_refresh_token', $refreshToken);
            }

            update_option('smtp_email', $provider->getResourceOwner($token)->getEmail());
             
        } catch(Exception $e) {
            set_alert('warning', $e->getMessage());
        }

        redirect(admin_url('settings?group=email'));
    }
}