From 53a61da397d0ba837dc05fe671559eac8a061974 Mon Sep 17 00:00:00 2001
From: Heshan Wanigasooriya <heshan@heidisoft.com>
Date: Fri, 9 Sep 2016 15:11:15 -0400
Subject: [PATCH] Adding the authorize button for the configuration page.

---
 freeagent_api.admin.inc | 40 +++++++++++++++++++++++++++++++++++++---
 1 file changed, 37 insertions(+), 3 deletions(-)

diff --git a/freeagent_api.admin.inc b/freeagent_api.admin.inc
index d8a9a60..671c5cd 100644
--- a/freeagent_api.admin.inc
+++ b/freeagent_api.admin.inc
@@ -10,7 +10,7 @@
  */
 function freeagent_api_admin_settings() {
   // check if the token need to be refreshed
-  if((isset($_GET['code']) || !empty(variable_get('freeagent_api_client_id', NULL)))){
+  if(isset($_GET['code'])){
     try {
       // TODO : We might need to add the $id if we use multiple oauth2
       $oauth2_config = array(
@@ -26,7 +26,7 @@ function freeagent_api_admin_settings() {
       variable_set('freeagent_api_access_token', $access_token);
     }
     catch (Exception $e) {
-      form_set_error('freeagent_api_client_id', t('We cannot get the access token please .'));
+      form_set_error('freeagent_api_client_id', t('We cannot get the access token please contact the administrator.'));
       watchdog('FreeAgent API', $e->getMessage(), array(), 'error');
     }
   }
@@ -72,10 +72,44 @@ function freeagent_api_admin_settings() {
     '#markup' => variable_get('freeagent_api_access_token', 'No Access Token'),
   );
   
+  $form['actions']['authorize'] = array(
+    '#type' => 'submit',
+    '#value' => t('Authorize')
+  );
+  $form['actions']['authorize']['#submit'] = array('freeagent_api_admin_settings_authorize_submit');
+  
   return system_settings_form($form);
 }
 
 /**
  * Settings form validate
  */
-function freeagent_api_admin_settings_validate($form, &$form_state) {}
\ No newline at end of file
+function freeagent_api_admin_settings_validate($form, &$form_state) {}
+
+/**
+ * Settings submit for the authorize
+ */
+function freeagent_api_admin_settings_authorize_submit($form, &$form_state){
+  // check if the token need to be refreshed
+  if(isset($form_state['values']['freeagent_api_client_id']) && isset($form_state['values']['freeagent_api_secret'])){
+    try {
+      // TODO : We might need to add the $id if we use multiple oauth2
+      $oauth2_config = array(
+        'token_endpoint' => $form_state['values']['freeagent_token_endpoint'],
+        'auth_flow' => 'server-side',
+        'client_id' => $form_state['values']['freeagent_api_client_id'],
+        'client_secret' => $form_state['values']['freeagent_api_secret'],
+        'authorization_endpoint' => $form_state['values']['freeagent_authorization_endpoint'],
+        'redirect_uri' => url(NULL, array('absolute' => TRUE)) . 'admin/config/services/freeagent-api',
+      );
+      $oauth2_client = new OAuth2\Client($oauth2_config);
+      $access_token = $oauth2_client->getAccessToken();
+      variable_set('freeagent_api_access_token', $access_token);
+      drupal_set_message(t('Authentication was successful.'));
+    }
+    catch (Exception $e) {
+      form_set_error('freeagent_api_client_id', t('We cannot get the access token please contact the administrator.'));
+      watchdog('FreeAgent API', $e->getMessage(), array(), 'error');
+    }
+  }
+}
\ No newline at end of file
-- 
2.2.1

From 8d9528a33528b5eb8aa8e8ff821b4280bb027700 Mon Sep 17 00:00:00 2001
From: Heshan Wanigasooriya <heshan@heidisoft.com>
Date: Fri, 9 Sep 2016 18:13:36 -0400
Subject: [PATCH] Adding authorization tokens to be stored in the DB and shared
 for other activities.

---
 freeagent_api.admin.inc | 55 +++++++++++++++++++++++++++++++++++++++++--------
 freeagent_api.module    | 12 +++++++++++
 2 files changed, 58 insertions(+), 9 deletions(-)

diff --git a/freeagent_api.admin.inc b/freeagent_api.admin.inc
index 671c5cd..a5a79a7 100644
--- a/freeagent_api.admin.inc
+++ b/freeagent_api.admin.inc
@@ -9,10 +9,17 @@
  * Settings form.
  */
 function freeagent_api_admin_settings() {
+  if(isset($_GET['success'])){
+    $id = md5(variable_get('freeagent_token_endpoint', 'https://api.sandbox.freeagent.com/v2/token_endpoint') . variable_get('freeagent_api_client_id', '') . 'server-side');
+    $tokens = oauth2_client_get_token($id);
+    foreach($tokens as $key => $value){
+      if(empty($value)) continue;
+      variable_set('freeagent_api_' . $key, $value);
+    }
+  }
   // check if the token need to be refreshed
   if(isset($_GET['code'])){
     try {
-      // TODO : We might need to add the $id if we use multiple oauth2
       $oauth2_config = array(
         'token_endpoint' => variable_get('freeagent_token_endpoint', 'https://api.freeagent.com/v2/token_endpoint'),
         'auth_flow' => 'server-side',
@@ -22,12 +29,11 @@ function freeagent_api_admin_settings() {
         'redirect_uri' => url(NULL, array('absolute' => TRUE)) . 'admin/config/services/freeagent-api',
       );
       $oauth2_client = new OAuth2\Client($oauth2_config);
-      $access_token = $oauth2_client->getAccessToken();
-      variable_set('freeagent_api_access_token', $access_token);
+      $oauth2_client->getAccessToken(); // redirect to the success=1
     }
     catch (Exception $e) {
       form_set_error('freeagent_api_client_id', t('We cannot get the access token please contact the administrator.'));
-      watchdog('FreeAgent API', $e->getMessage(), array(), 'error');
+      watchdog('FreeAgent API', $e->getMessage(), array(), WATCHDOG_ERROR);
     }
   }
   // start the form
@@ -66,16 +72,49 @@ function freeagent_api_admin_settings() {
     '#markup' => url('admin/config/services/freeagent-api', array('absolute' => TRUE))
   );
   
-  $form['freeagent_api_access_token'] = array(
+  $form['authorization'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('oAuth2 info'),
+    '#collapsed' => TRUE,
+    '#collapsible' => TRUE
+  );
+  
+  $form['authorization']['freeagent_api_access_token'] = array(
     '#type' => 'item',
     '#title' => t('App OAuth Access Token'),
     '#markup' => variable_get('freeagent_api_access_token', 'No Access Token'),
   );
   
+  $form['authorization']['freeagent_api_expires_in'] = array(
+    '#type' => 'item',
+    '#title' => t('Access Token expired in'),
+    '#markup' => format_interval(variable_get('freeagent_api_expires_in', 0)),
+  );
+  
+  $form['authorization']['freeagent_api_refresh_token'] = array(
+    '#type' => 'item',
+    '#title' => t('Refresh Token'),
+    '#markup' => variable_get('freeagent_api_refresh_token', 'No Refresh Token'),
+  );
+  
+  $form['authorization']['freeagent_api_expiration_time'] = array(
+    '#type' => 'item',
+    '#title' => t('Refresh Token expired in'),
+    '#markup' => format_interval(variable_get('freeagent_api_expiration_time', 0)),
+  );
+  
+  $form['authorization']['freeagent_api_token_type'] = array(
+    '#type' => 'item',
+    '#title' => t('Token type'),
+    '#markup' => variable_get('freeagent_api_token_type', 'bearer'),
+  );
+  
   $form['actions']['authorize'] = array(
     '#type' => 'submit',
-    '#value' => t('Authorize')
+    '#value' => t('Authorize'),
+    '#access' => !empty(variable_get('freeagent_api_client_id', NULL)) ? TRUE : FALSE
   );
+  
   $form['actions']['authorize']['#submit'] = array('freeagent_api_admin_settings_authorize_submit');
   
   return system_settings_form($form);
@@ -93,7 +132,6 @@ function freeagent_api_admin_settings_authorize_submit($form, &$form_state){
   // check if the token need to be refreshed
   if(isset($form_state['values']['freeagent_api_client_id']) && isset($form_state['values']['freeagent_api_secret'])){
     try {
-      // TODO : We might need to add the $id if we use multiple oauth2
       $oauth2_config = array(
         'token_endpoint' => $form_state['values']['freeagent_token_endpoint'],
         'auth_flow' => 'server-side',
@@ -104,12 +142,11 @@ function freeagent_api_admin_settings_authorize_submit($form, &$form_state){
       );
       $oauth2_client = new OAuth2\Client($oauth2_config);
       $access_token = $oauth2_client->getAccessToken();
-      variable_set('freeagent_api_access_token', $access_token);
       drupal_set_message(t('Authentication was successful.'));
     }
     catch (Exception $e) {
       form_set_error('freeagent_api_client_id', t('We cannot get the access token please contact the administrator.'));
-      watchdog('FreeAgent API', $e->getMessage(), array(), 'error');
+      watchdog('FreeAgent API', $e->getMessage(), array(), WATCHDOG_ERROR);
     }
   }
 }
\ No newline at end of file
diff --git a/freeagent_api.module b/freeagent_api.module
index 94e07d1..464334e 100644
--- a/freeagent_api.module
+++ b/freeagent_api.module
@@ -6,6 +6,18 @@
  */
 
 /**
+ * Implements hook_init()
+ */
+function freeagent_api_init() {
+  $client_id = md5(variable_get('freeagent_token_endpoint', 'https://api.sandbox.freeagent.com/v2/token_endpoint') . variable_get('freeagent_api_client_id', '') . 'server-side');
+  $tokens = oauth2_client_get_token($client_id);
+  foreach($tokens as $key => $value){
+    if(empty(variable_get('freeagent_api_' . $key, NULL))) continue;
+    $_SESSION['oauth2_client']['token'][$client_id][$key] = variable_get('freeagent_api_' . $key, $value);
+  }
+}
+
+/**
  * Implements hook_menu()
  */
 function freeagent_api_menu() {
-- 
2.2.1

