diff --git a/application/controllers/Google.php b/application/controllers/Google.php index 016f462a..455d8908 100644 --- a/application/controllers/Google.php +++ b/application/controllers/Google.php @@ -82,29 +82,37 @@ class Google extends CI_Controller { */ public function oauth_callback() { - if ($this->input->get('code')) + $code = $this->input->get('code'); + + if (empty($code)) { - $this->load->library('Google_sync'); - $token = $this->google_sync->authenticate($this->input->get('code')); + $this->output->set_output('Code authorization failed.'); + return; + } - // Store the token into the database for future reference. - $oauth_provider_id = $this->session->userdata('oauth_provider_id'); + $this->load->library('Google_sync'); - if ($oauth_provider_id) - { - $this->load->model('providers_model'); - $this->providers_model->set_setting('google_sync', TRUE, $oauth_provider_id); - $this->providers_model->set_setting('google_token', $token, $oauth_provider_id); - $this->providers_model->set_setting('google_calendar', 'primary', $oauth_provider_id); - } - else - { - $this->output->set_output('

Sync provider id not specified!

'); - } + $token = $this->google_sync->authenticate($code); + + if (empty($token)) + { + $this->output->set_output('Token authorization failed.'); + return; + } + + // Store the token into the database for future reference. + $oauth_provider_id = $this->session->userdata('oauth_provider_id'); + + if ($oauth_provider_id) + { + $this->load->model('providers_model'); + $this->providers_model->set_setting('google_sync', TRUE, $oauth_provider_id); + $this->providers_model->set_setting('google_token', json_encode($token), $oauth_provider_id); + $this->providers_model->set_setting('google_calendar', 'primary', $oauth_provider_id); } else { - $this->output->set_output('

Authorization Failed!

'); + $this->output->set_output('Sync provider id not specified.'); } } diff --git a/application/libraries/Google_sync.php b/application/libraries/Google_sync.php index 07388b7d..00cfaa13 100644 --- a/application/libraries/Google_sync.php +++ b/application/libraries/Google_sync.php @@ -62,7 +62,11 @@ class Google_Sync { $this->client->setClientSecret($this->framework->config->item('google_client_secret')); $this->client->setDeveloperKey($this->framework->config->item('google_api_key')); $this->client->setRedirectUri(site_url('google/oauth_callback')); - $this->client->setScopes('https://www.googleapis.com/auth/calendar'); + $this->client->setAccessType('offline'); + $this->client->addScope([ + Google_Service_Calendar::CALENDAR, + Google_Service_Calendar::CALENDAR_READONLY + ]); $this->service = new Google_Service_Calendar($this->client); } @@ -88,12 +92,22 @@ class Google_Sync { * provided. Using this code, we can authenticate the API usage and store the * token information to the database. * - * @see Google Controller + * @param $code + * + * @return array + * + * @throws Exception */ - public function authenticate($auth_code) + public function authenticate($code) { - $this->client->authenticate($auth_code); - return $this->client->getAccessToken(); + $response = $this->client->fetchAccessTokenWithAuthCode($code); + + if (isset($response['error'])) + { + throw new Exception('Google Authentication Error (' . $response['error'] . '): ' . $response['error_description']); + } + + return $response; } /** diff --git a/assets/js/backend_calendar_default_view.js b/assets/js/backend_calendar_default_view.js index 26d753ac..b4cfbe97 100755 --- a/assets/js/backend_calendar_default_view.js +++ b/assets/js/backend_calendar_default_view.js @@ -250,12 +250,12 @@ window.BackendCalendarDefaultView = window.BackendCalendarDefaultView || {}; // If the user has already the sync enabled then apply the proper style changes. if ($('#select-filter-item option:selected').attr('google-sync') === 'true') { - $('#enable-sync').addClass('btn-danger enabled'); - $('#enable-sync span:eq(1)').text(EALang.disable_sync); + $('#enable-sync').removeClass('btn-light').addClass('btn-danger enabled'); + $('#enable-sync span').text(EALang.disable_sync); $('#google-sync').prop('disabled', false); } else { - $('#enable-sync').removeClass('btn-danger enabled'); - $('#enable-sync span:eq(1)').text(EALang.enable_sync); + $('#enable-sync').removeClass('btn-danger enabled').addClass('btn-light'); + $('#enable-sync span').text(EALang.enable_sync); $('#google-sync').prop('disabled', true); } } diff --git a/assets/js/backend_calendar_google_sync.js b/assets/js/backend_calendar_google_sync.js index 6f3a85c7..19268859 100644 --- a/assets/js/backend_calendar_google_sync.js +++ b/assets/js/backend_calendar_google_sync.js @@ -53,8 +53,8 @@ window.BackendCalendarGoogleSync = window.BackendCalendarGoogleSync || {}; // The user has granted access to his data. windowHandle.close(); window.clearInterval(authInterval); - $('#enable-sync').addClass('btn-danger enabled'); - $('#enable-sync span:eq(1)').text(EALang.disable_sync); + $('#enable-sync').addClass('btn-danger enabled').removeClass('btn-light'); + $('#enable-sync span').text(EALang.disable_sync); $('#google-sync').prop('disabled', false); $('#select-filter-item option:selected').attr('google-sync', 'true'); @@ -71,8 +71,9 @@ window.BackendCalendarGoogleSync = window.BackendCalendarGoogleSync || {}; $.post(url, data) .done(function (response) { $('#google-calendar').empty(); - response.forEach(response, function (event) { - $('#google-calendar').append(new Option(event.summary, event.id)); + + response.forEach(function (calendar) { + $('#google-calendar').append(new Option(calendar.summary, calendar.id)); }); $('#select-google-calendar').modal('show'); @@ -94,7 +95,7 @@ window.BackendCalendarGoogleSync = window.BackendCalendarGoogleSync || {}; var providerId = $('#select-filter-item').val(); var provider = GlobalVariables.availableProviders.find(function (availableProvider) { - return Number(provider.id) === Number(providerId); + return Number(availableProvider.id) === Number(providerId); }); provider.settings.google_sync = '0'; @@ -102,8 +103,8 @@ window.BackendCalendarGoogleSync = window.BackendCalendarGoogleSync || {}; disableProviderSync(provider.id); - $('#enable-sync').removeClass('btn-danger enabled'); - $('#enable-sync span:eq(1)').text(EALang.enable_sync); + $('#enable-sync').removeClass('btn-danger enabled').addClass('btn-light'); + $('#enable-sync span').text(EALang.enable_sync); $('#google-sync').prop('disabled', true); $('#select-filter-item option:selected').attr('google-sync', 'false'); }