PluginProbe
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder / 2.21.13
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder v2.21.13
3.3.1 V-3.3.0 3.2.2 3.2.1 3.2.0 3.1.4 3.1.3 3.1.2 3.1.1 3.1.0 V3.0.3 V3.0.2 -3.0.1 V_3.0.0 1.1.1 1.1.8 1.2 1.3 1.4 1.4.18 1.5.2 1.9 2.0 2.10.0 2.10.1 All 138 releases
bit-form / includes / Core / Integration / OneDrive / OneDriveHandler.php

OneDriveHandler.php in Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder 2.21.13, at includes/Core/Integration/OneDrive/OneDriveHandler.php

258 lines 9.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace BitCode\BitForm\Core\Integration\OneDrive;
4
5 if (!defined('ABSPATH')) {
6 exit;
7 }
8
9 use BitCode\BitForm\Core\Integration\IntegrationHandler;
10 use BitCode\BitForm\Core\Integration\OneDrive\RecordApiHelper as OneDriveRecordApiHelper;
11 use BitCode\BitForm\Core\Util\ApiResponse;
12 use BitCode\BitForm\Core\Util\HttpHelper;
13 use BitCode\BitForm\Core\Util\IpTool;
14 use BitCode\BitForm\GlobalHelper;
15
16 class OneDriveHandler
17 {
18 private $formID;
19 private $integrationID;
20
21 public function __construct($integrationID, $fromID)
22 {
23 $this->formID = $fromID;
24 $this->integrationID = $integrationID;
25 }
26
27 public static function registerAjax()
28 {
29 add_action('wp_ajax_bitforms_oneDrive_authorization', [__CLASS__, 'authorization']);
30 add_action('wp_ajax_bitforms_oneDrive_get_all_folders', [__CLASS__, 'getAllFolders']);
31 add_action('wp_ajax_bitforms_oneDrive_get_single_folder', [__CLASS__, 'singleOneDriveFolderList']);
32 }
33
34 public static function authorization()
35 {
36 if (!isset($_REQUEST['_ajax_nonce']) && !wp_verify_nonce(sanitize_text_field(wp_unslash($_REQUEST['_ajax_nonce'])), 'bitforms_save')) {
37 wp_send_json_error(__('Token expired', 'bit-form'), 401);
38 }
39
40
41
42 GlobalHelper::requirePostMethod();
43
44 try {
45 $queryParams = GlobalHelper::formatRequestData();
46 } catch (\InvalidArgumentException $e) {
47 wp_send_json_error($e->getMessage(), 400);
48 }
49
50 if (empty($queryParams->clientId) || empty($queryParams->clientSecret) || empty($queryParams->code) || empty($queryParams->redirectURI)) {
51 wp_send_json_error(__('Requested parameter is empty', 'bit-form'), 400);
52 }
53
54 $body = [
55 'client_id' => $queryParams->clientId,
56 'redirect_uri' => urldecode($queryParams->redirectURI),
57 'client_secret' => $queryParams->clientSecret,
58 'grant_type' => 'authorization_code',
59 'code' => urldecode($queryParams->code)
60 ];
61
62 $apiEndpoint = 'https://login.live.com/oauth20_token.srf';
63 $header['Content-Type'] = 'application/x-www-form-urlencoded';
64 $apiResponse = HttpHelper::post($apiEndpoint, $body, $header);
65 if (is_wp_error($apiResponse) || !empty($apiResponse->error)) {
66 wp_send_json_error(empty($apiResponse->error_description) ? 'Unknown' : $apiResponse->error_description, 400);
67 }
68 $apiResponse->generates_on = \time();
69 wp_send_json_success($apiResponse, 200);
70 }
71
72 public static function getAllFolders()
73 {
74 if (!isset($_REQUEST['_ajax_nonce']) && !wp_verify_nonce(sanitize_text_field(wp_unslash($_REQUEST['_ajax_nonce'])), 'bitforms_save')) {
75 wp_send_json_error(__('Token expired', 'bit-form'), 401);
76 }
77
78
79
80 GlobalHelper::requirePostMethod();
81
82 try {
83 $queryParams = GlobalHelper::formatRequestData();
84 } catch (\InvalidArgumentException $e) {
85 wp_send_json_error($e->getMessage(), 400);
86 }
87 if (empty($queryParams->tokenDetails) || empty($queryParams->clientId) || empty($queryParams->clientSecret)) {
88 wp_send_json_error(__('Requested parameter is empty', 'bit-form'), 400);
89 }
90
91 $token = self::tokenExpiryCheck($queryParams->tokenDetails, $queryParams->clientId, $queryParams->clientSecret);
92 if ($token->access_token !== $queryParams->tokenDetails->access_token) {
93 self::saveRefreshedToken($queryParams->formID, $queryParams->id, $token);
94 }
95
96 $folders = self::getOneDriveFoldersList($token->access_token);
97 $foldersOnly = $folders->value;
98
99 $data = [];
100 if (is_array($foldersOnly)) {
101 foreach ($foldersOnly as $folder) {
102 if (property_exists($folder, 'folder')) {
103 $data[] = $folder;
104 }
105 }
106 }
107 $response['oneDriveFoldersList'] = $data;
108 $response['tokenDetails'] = $token;
109 wp_send_json_success($response, 200);
110 }
111
112 public static function getOneDriveFoldersList($token)
113 {
114 $headers = [
115 'Accept' => 'application/json',
116 'Content-Type' => 'application/json;',
117 'Authorization' => 'bearer ' . $token,
118 ];
119 $apiEndpoint = 'https://api.onedrive.com/v1.0/drive/root/children';
120 $apiResponse = HttpHelper::get($apiEndpoint, [], $headers);
121 if (is_wp_error($apiResponse) || !empty($apiResponse->error)) {
122 return false;
123 }
124 return $apiResponse;
125 }
126
127 public static function singleOneDriveFolderList()
128 {
129 if (!isset($_REQUEST['_ajax_nonce']) && !wp_verify_nonce(sanitize_text_field(wp_unslash($_REQUEST['_ajax_nonce'])), 'bitforms_save')) {
130 wp_send_json_error(__('Token expired', 'bit-form'), 401);
131 }
132
133
134
135 GlobalHelper::requirePostMethod();
136
137 try {
138 $queryParams = GlobalHelper::formatRequestData();
139 } catch (\InvalidArgumentException $e) {
140 wp_send_json_error($e->getMessage(), 400);
141 }
142
143 if (empty($queryParams->tokenDetails) || empty($queryParams->clientId) || empty($queryParams->clientSecret)) {
144 wp_send_json_error(__('Requested parameter is empty', 'bit-form'), 400);
145 }
146
147 $ids = explode('!', $queryParams->folder);
148 $token = self::tokenExpiryCheck($queryParams->tokenDetails, $queryParams->clientId, $queryParams->clientSecret);
149 if ($token->access_token !== $queryParams->tokenDetails->access_token) {
150 self::saveRefreshedToken($queryParams->formID, $queryParams->id, $token);
151 }
152
153 $headers = [
154 'Accept' => 'application/json',
155 'Content-Type' => 'application/json;',
156 'Authorization' => 'bearer ' . $queryParams->tokenDetails->access_token,
157 ];
158 $apiEndpoint = 'https://api.onedrive.com/v1.0/drives/' . $ids[0] . '/items/' . $queryParams->folder . '/children';
159 $apiResponse = HttpHelper::get($apiEndpoint, [], $headers);
160 $foldersOnly = $apiResponse->value;
161 $data = [];
162 if (is_array($foldersOnly)) {
163 foreach ($foldersOnly as $folder) {
164 if (property_exists($folder, 'folder')) {
165 $data[] = $folder;
166 }
167 }
168 }
169 $response['folders'] = $data;
170 $response['tokenDetails'] = $token;
171 wp_send_json_success($response, 200);
172 }
173
174 private static function tokenExpiryCheck($token, $clientId, $clientSecret)
175 {
176 if (!$token) {
177 return false;
178 }
179
180 if ((intval($token->generates_on) + (55 * 60)) < time()) {
181 $refreshToken = self::refreshToken($token->refresh_token, $clientId, $clientSecret);
182 if (is_wp_error($refreshToken) || !empty($refreshToken->error)) {
183 return false;
184 }
185 $token->access_token = $refreshToken->access_token;
186 $token->expires_in = $refreshToken->expires_in;
187 $token->generates_on = $refreshToken->generates_on;
188 }
189 return $token;
190 }
191
192 private static function refreshToken($refresh_token, $clientId, $clientSecret)
193 {
194 $body = [
195 'client_id' => $clientId,
196 'client_secret' => $clientSecret,
197 'grant_type' => 'refresh_token',
198 'refresh_token' => $refresh_token,
199 ];
200
201 $apiEndpoint = 'https://login.live.com/oauth20_token.srf';
202 $apiResponse = HttpHelper::post($apiEndpoint, $body);
203 if (is_wp_error($apiResponse) || !empty($apiResponse->error)) {
204 return false;
205 }
206 $token = $apiResponse;
207 $token->generates_on = \time();
208 return $token;
209 }
210
211 private static function saveRefreshedToken($formID, $integrationID, $tokenDetails)
212 {
213 if (empty($formID) || empty($integrationID)) {
214 return;
215 }
216
217 $integrationHandler = new IntegrationHandler($formID, IpTool::getUserDetail());
218 $oneDriveDetails = $integrationHandler->getAIntegration($integrationID);
219 if (is_wp_error($oneDriveDetails)) {
220 return;
221 }
222
223 $newDetails = json_decode($oneDriveDetails[0]->integration_details);
224 $newDetails->tokenDetails = $tokenDetails;
225 $integrationHandler->updateIntegration($integrationID, $oneDriveDetails[0]->integration_name, 'OneDrive', wp_json_encode($newDetails), 'form');
226 }
227
228 public function execute(IntegrationHandler $integrationHandler, $integrationData, $fieldValues, $entryID, $logID)
229 {
230 $integrationDetails = json_decode($integrationData->integration_details);
231
232 $entryDetails = [
233 'formID' => $this->formID,
234 'entryID' => $entryID,
235 'fieldValues' => $fieldValues
236 ];
237
238 if (empty($integrationDetails->tokenDetails->access_token)) {
239 (new ApiResponse())->apiResponse($logID, $this->integrationID, ['type' => 'record', 'type_name' => 'insert'], 'error', 'Not Authorization By OneDrive.', $entryDetails);
240 return;
241 }
242
243 $actions = $integrationDetails->actions;
244 $folderId = $integrationDetails->folder;
245 $fieldMap = $integrationDetails->field_map;
246 $tokenDetails = self::tokenExpiryCheck($integrationDetails->tokenDetails, $integrationDetails->clientId, $integrationDetails->clientSecret);
247 $parentId = $integrationDetails->folderMap[0];
248 if ($tokenDetails->access_token !== $integrationDetails->tokenDetails->access_token) {
249 self::saveRefreshedToken($this->formID, $this->integrationID, $tokenDetails);
250 }
251
252 $oneDriveRecordApiHelper = new OneDriveRecordApiHelper($tokenDetails->access_token, $this->formID, $entryID);
253
254 $oneDriveRecordApiHelper->executeRecordApi($this->integrationID, $logID, $fieldValues, $fieldMap, $actions, $folderId, $parentId, $this->formID);
255 return true;
256 }
257 }
258