PluginProbe
E2Pdf – Export Pdf Tool for WordPress / trunk
E2Pdf – Export Pdf Tool for WordPress vtrunk
1.32.48 1.32.43 1.32.40 1.32.34 1.32.32 1.32.31 1.32.26 1.32.22 1.32.23 1.32.18 1.32.17 1.32.15 trunk 1.00.00 1.00.13 1.01.01 1.02.02 1.03.07 1.04.07 1.05.03 1.06.02 1.07.11 1.08.00 1.08.06 1.08.09 All 71 releases
e2pdf / classes / model / e2pdf-gdrive.php

e2pdf-gdrive.php in E2Pdf – Export Pdf Tool for WordPress trunk, at classes/model/e2pdf-gdrive.php

347 lines 13.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * File: /model/e2pdf-gdrive.php
5 *
6 * @package E2Pdf
7 * @license GPLv3
8 * @link https://e2pdf.com
9 */
10 if (!defined('ABSPATH')) {
11 die('Access denied.');
12 }
13
14 class Model_E2pdf_Gdrive extends Model_E2pdf_Model {
15
16 protected $provider = [];
17
18 public function __construct() {
19 parent::__construct();
20 $this->provider = [
21 'client_id' => get_option('e2pdf_gdrive_client_id', ''),
22 'client_secret' => get_option('e2pdf_gdrive_client_secret', ''),
23 'access_token' => get_transient('e2pdf_gdrive_access_token'),
24 'refresh_token' => get_option('e2pdf_gdrive_refresh_token', ''),
25 'redirect_uri' => site_url('/e2pdf-rpc/v1/gdrive/auth?api_key=' . get_option('e2pdf_gdrive_api_key')),
26 ];
27 if (!$this->provider['access_token'] && $this->provider['refresh_token']) {
28 $this->refresh_token();
29 }
30 }
31
32 // get code
33 public function get_code() {
34 $response = [];
35 if ($this->provider['client_id'] && $this->provider['client_secret']) {
36 $response['redirect'] = add_query_arg(
37 [
38 'response_type' => 'code',
39 'client_id' => $this->provider['client_id'],
40 'redirect_uri' => $this->provider['redirect_uri'],
41 'scope' => 'https://www.googleapis.com/auth/drive.file',
42 'access_type' => 'offline',
43 'prompt' => 'consent',
44 ],
45 'https://accounts.google.com/o/oauth2/v2/auth'
46 );
47 }
48 return $response;
49 }
50
51 // get token
52 public function get_token($code = '') {
53 $response = wp_remote_post(
54 'https://oauth2.googleapis.com/token',
55 [
56 'headers' => [
57 'Content-Type' => 'application/x-www-form-urlencoded',
58 ],
59 'body' => [
60 'code' => $code,
61 'client_id' => $this->provider['client_id'],
62 'client_secret' => $this->provider['client_secret'],
63 'redirect_uri' => $this->provider['redirect_uri'],
64 'grant_type' => 'authorization_code',
65 ],
66 ]
67 );
68 if (is_wp_error($response)) {
69 return;
70 }
71 $request = json_decode(wp_remote_retrieve_body($response));
72 if (!empty($request->refresh_token) && !empty($request->access_token)) {
73 update_option('e2pdf_gdrive_refresh_token', $request->refresh_token);
74 set_transient('e2pdf_gdrive_access_token', $request->access_token, 1800);
75 }
76 }
77
78 public function refresh_token() {
79 $response = wp_remote_post(
80 'https://oauth2.googleapis.com/token',
81 [
82 'headers' => [
83 'Content-Type' => 'application/x-www-form-urlencoded',
84 ],
85 'body' => [
86 'client_id' => $this->provider['client_id'],
87 'client_secret' => $this->provider['client_secret'],
88 'refresh_token' => $this->provider['refresh_token'],
89 'grant_type' => 'refresh_token',
90 ],
91 ]
92 );
93 if (is_wp_error($response)) {
94 return;
95 }
96 $request = json_decode(wp_remote_retrieve_body($response));
97 if (!empty($request->access_token)) {
98 $this->provider['access_token'] = $request->access_token;
99 set_transient('e2pdf_gdrive_access_token', $request->access_token, 1800);
100 }
101 }
102
103 public function create_dir($dir) {
104
105 $parts = array_values(array_filter(explode('/', trim($this->helper->load('convert')->to_file_dir($dir), '/'))));
106 $parent_id = 'root';
107
108 if (!empty($parts)) {
109 try {
110 foreach ($parts as $part) {
111 // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.urlencode_urlencode
112 $query = urlencode("name = '$part' and mimeType = 'application/vnd.google-apps.folder' and '$parent_id' in parents and trashed = false");
113 $response = wp_remote_get(
114 'https://www.googleapis.com/drive/v3/files?q=' . $query . '&fields=files(id,name)',
115 [
116 'headers' => [
117 'Authorization' => 'Bearer ' . $this->provider['access_token'],
118 'Accept' => 'application/json',
119 ],
120 ]
121 );
122 if (is_wp_error($response)) {
123 throw new Exception('Request failed: ' . $response->get_error_message());
124 }
125 $data = json_decode(wp_remote_retrieve_body($response), true);
126 if (!empty($data['files'])) {
127 $parent_id = $data['files'][0]['id'];
128 } else {
129 $create_url = 'https://www.googleapis.com/drive/v3/files?fields=id';
130 $body = [
131 'name' => $part,
132 'mimeType' => 'application/vnd.google-apps.folder',
133 'parents' => [$parent_id],
134 ];
135
136 $response = wp_remote_post(
137 $create_url,
138 [
139 'headers' => [
140 'Authorization' => 'Bearer ' . $this->provider['access_token'],
141 'Content-Type' => 'application/json',
142 ],
143 'body' => json_encode($body), // phpcs:ignore WordPress.WP.AlternativeFunctions.json_encode_json_encode
144 ]
145 );
146
147 if (is_wp_error($response)) {
148 throw new Exception('Request failed: ' . $response->get_error_message());
149 }
150 $data = json_decode(wp_remote_retrieve_body($response), true);
151 $parent_id = isset($data['id']) ? $data['id'] : 'root';
152 }
153 }
154 } catch (Exception $ex) {
155 return 'root';
156 }
157 }
158
159 return $parent_id;
160 }
161
162 public function upload($file, $file_name, $dir = 'root') {
163 if (!$file) {
164 return false;
165 }
166 try {
167 // phpcs:ignore WordPress.WP.AlternativeFunctions.json_encode_json_encode
168 $meta = json_encode(
169 [
170 'name' => $file_name,
171 'parents' => [$dir],
172 ]
173 );
174
175 $boundary = uniqid();
176 $delimiter = "------$boundary";
177
178 $body = $this->body($delimiter, $meta, $file);
179
180 $response = wp_remote_post(
181 'https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart',
182 [
183 'headers' => [
184 'Authorization' => 'Bearer ' . $this->provider['access_token'],
185 'Content-Type' => "multipart/related; boundary=$delimiter",
186 'Content-Length' => strlen($body),
187 ],
188 'body' => $body,
189 ]
190 );
191
192 if (is_wp_error($response)) {
193 return false;
194 }
195 $data = json_decode(wp_remote_retrieve_body($response), true);
196 return isset($data['id']) ? $data['id'] : false;
197 } catch (Exception $ex) {
198 return false;
199 }
200 return false;
201 }
202
203 public function reupload($file, $file_id) {
204 if ($file_id) {
205 try {
206 $response = wp_remote_request(
207 'https://www.googleapis.com/upload/drive/v3/files/' . $file_id . '?uploadType=media',
208 [
209 'method' => 'PATCH',
210 'headers' => [
211 'Authorization' => 'Bearer ' . $this->provider['access_token'],
212 ],
213 'body' => $file,
214 ]
215 );
216 if (is_wp_error($response)) {
217 return false;
218 }
219 $data = json_decode(wp_remote_retrieve_body($response), true);
220 return isset($data['id']) ? $data['id'] : false;
221 } catch (Exception $ex) {
222 return false;
223 }
224 }
225 return false;
226 }
227
228 public function permission($file_id, $role = 'reader', $type = 'anyone', $email = false) {
229 if ($file_id) {
230 try {
231 $permission = [
232 'role' => $role,
233 'type' => $type,
234 ];
235 if ($email && $type === 'user') {
236 $permission['emailAddress'] = $email;
237 }
238
239 $response = wp_remote_post(
240 'https://www.googleapis.com/drive/v3/files/' . $file_id . '/permissions',
241 [
242 'headers' => [
243 'Authorization' => 'Bearer ' . $this->provider['access_token'],
244 'Content-Type' => 'application/json',
245 ],
246 'body' => json_encode($permission), // phpcs:ignore WordPress.WP.AlternativeFunctions.json_encode_json_encode
247 ]
248 );
249
250 if (is_wp_error($response)) {
251 return false;
252 }
253 $code = wp_remote_retrieve_response_code($response);
254 return $code >= 200 && $code < 300;
255 } catch (Exception $ex) {
256 return false;
257 }
258 }
259 return false;
260 }
261
262 public function download($file_id) {
263 if ($file_id) {
264 $response = wp_remote_get(
265 'https://www.googleapis.com/drive/v3/files/' . $file_id . '?fields=name',
266 [
267 'headers' => [
268 'Authorization' => 'Bearer ' . $this->provider['access_token'],
269 ],
270 ]
271 );
272 if (is_wp_error($response)) {
273 return false;
274 }
275 $code = wp_remote_retrieve_response_code($response);
276 if ($code !== 200) {
277 return false;
278 }
279 $data = json_decode(wp_remote_retrieve_body($response), true);
280 if (!isset($data['name'])) {
281 return false;
282 }
283 $name = $data['name'];
284 $response = wp_remote_get(
285 'https://www.googleapis.com/drive/v3/files/' . $file_id . '?alt=media',
286 [
287 'headers' => [
288 'Authorization' => 'Bearer ' . $this->provider['access_token'],
289 ],
290 ]
291 );
292 if (is_wp_error($response)) {
293 return false;
294 }
295 $code = wp_remote_retrieve_response_code($response);
296 if ($code !== 200) {
297 return false;
298 }
299 $file = wp_remote_retrieve_body($response);
300 return [
301 'name' => $name,
302 'file' => $file,
303 ];
304 }
305 return false;
306 }
307
308 public function body($delimiter, $meta, $file) {
309 $body = '';
310 $body .= '--' . $delimiter . "\r\n";
311 $body .= 'Content-Type: application/json; charset=UTF-8' . "\r\n\r\n";
312 $body .= $meta . "\r\n";
313 $body .= '--' . $delimiter . "\r\n";
314 $body .= "\r\n";
315 $body .= $file . "\r\n";
316 $body .= '--' . $delimiter . '--' . "\r\n";
317 return $body;
318 }
319
320 public function exists($file_id) {
321 if ($file_id) {
322 $response = wp_remote_get(
323 'https://www.googleapis.com/drive/v3/files/' . $file_id . '?fields=id,name,trashed',
324 [
325 'headers' => [
326 'Authorization' => 'Bearer ' . $this->provider['access_token'],
327 ],
328 ]
329 );
330 if (!is_wp_error($response)) {
331 $code = wp_remote_retrieve_response_code($response);
332 if ($code === 200) {
333 $body = wp_remote_retrieve_body($response);
334 $data = json_decode($body, true);
335 if (isset($data['name'])) {
336 if (isset($data['trashed']) && $data['trashed'] === true) {
337 return false;
338 }
339 return $data['name'];
340 }
341 }
342 }
343 }
344 return false;
345 }
346 }
347