OwlCyberSecurity - MANAGER
Edit File: class-wpvivid-base-dropbox.php
<?php if (!defined('WPVIVID_PLUGIN_DIR')){ die; } class Dropbox_Base{ const API_URL_V2 = 'https://api.dropboxapi.com/'; const CONTENT_URL_V2 = 'https://content.dropboxapi.com/2/'; const API_ID = 'cwn4z5jg8wy7b4u'; private $access_token; private $created; private $expires_in; private $refresh_token; private $option; public function __construct($option) { $this -> option = $option; $this -> access_token = $option['access_token']; $this -> created = $option['created']; $this -> expires_in = $option['expires_in']; $this -> refresh_token = $option['refresh_token']; } public function check_token() { if(!isset($this->option['refresh_token'])) { return array('result' => WPVIVID_FAILED,'error' => 'Invalid or expired token. Please remove '.$this -> option['name'].' from the storage list and re-authenticate it.'); } $now=time()-10; if ($now>$this->option['created']+$this->option['expires_in']) { $result=$this->getRefreshToken(); if($result['result']=='failed') { return array('result' => WPVIVID_FAILED,'error' => $result['error']); } else { $remote_options=WPvivid_Setting::get_remote_option($this->option['id']); if($remote_options!==false) { $remote_options['access_token']= base64_encode($result['data']['access_token']); if(!isset($remote_options['is_encrypt'])) { $remote_options['refresh_token']=base64_encode($remote_options['refresh_token']); $this -> refresh_token = base64_encode($this->option['refresh_token']); } else { $this -> refresh_token = $this->option['refresh_token']; } $remote_options['expires_in'] = $result['data']['expires_in']; $remote_options['created'] = time(); $remote_options['is_encrypt']=1; WPvivid_Setting::update_remote_option($this->option['id'],$remote_options); $this -> access_token = $remote_options['access_token']; $this -> created = $remote_options['created']; $this -> expires_in = $remote_options['expires_in']; $this -> option['is_encrypt']=1; $ret['result']='success'; return $ret; } else { return array('result' => WPVIVID_FAILED,'error'=>'get refresh token failed'); } } } else { $ret['result']='success'; return $ret; } } public function upload($target_path, $file_data, $mode = "add") { $endpoint = self::CONTENT_URL_V2."files/upload"; $headers = array( "Content-Type: application/octet-stream", "Dropbox-API-Arg: {\"path\": \"$target_path\", \"mode\": \"$mode\"}" ); if (file_exists($file_data)) $postdata = file_get_contents($file_data); else $postdata = $file_data; $returnData = $this ->postRequest($endpoint, $headers, $postdata); if(isset($returnData['error_summary']) && preg_match( "/Invalid or expired token. Please remove .* from the storage list and re-authenticate it/", $returnData['error_summary'], $matches )) { $ret=$this->check_token(); if($ret['result']=='failed') { return $returnData; } else { $returnData = $this ->postRequest($endpoint, $headers, $postdata); } } return $returnData; } public function upload_session_start() { $endpoint = self::CONTENT_URL_V2."files/upload_session/start"; $headers = array( "Content-Type: application/octet-stream", "Dropbox-API-Arg: {\"close\": false}" ); $returnData = $this ->postRequest($endpoint, $headers,null); if(isset($returnData['error_summary']) && preg_match( "/Invalid or expired token. Please remove .* from the storage list and re-authenticate it/", $returnData['error_summary'], $matches )) { $ret=$this->check_token(); if($ret['result']=='failed') { return $returnData; } else { $returnData = $this ->postRequest($endpoint, $headers,null); } } return $returnData; } public function upload_session_append_v2($session_id, $offset, $postdata) { $endpoint = self::CONTENT_URL_V2."files/upload_session/append_v2"; $headers = array( "Content-Type: application/octet-stream", "Dropbox-API-Arg: {\"cursor\": {\"session_id\": \"$session_id\",\"offset\": $offset},\"close\": false}" ); $returnData = $this ->postRequest($endpoint, $headers, $postdata); if(isset($returnData['error_summary']) && preg_match( "/Invalid or expired token. Please remove .* from the storage list and re-authenticate it/", $returnData['error_summary'], $matches )) { $ret=$this->check_token(); if($ret['result']=='failed') { return $returnData; } else { $returnData = $this ->postRequest($endpoint, $headers,null); } } return $returnData; } public function upload_session_finish($session_id, $filesize, $path, $mode = 'add') { $endpoint = self::CONTENT_URL_V2."files/upload_session/finish"; $entry = array( 'cursor' => array( 'session_id' => $session_id, 'offset' => $filesize, ), 'commit' => array( 'path' => $path, 'mode' => $mode, ), ); $headers = array( "Content-Type: application/octet-stream", "Dropbox-API-Arg: " . wp_json_encode($entry), ); $returnData = $this ->postRequest($endpoint, $headers,null); return $returnData; } public function download($path,$header = array()) { $endpoint = "https://content.dropboxapi.com/2/files/download"; $headers = array( "Content-Type: text/plain; charset=utf-8", "Dropbox-API-Arg: {\"path\": \"$path\"}" ); $headers = array_merge ($headers,$header); $data = $this ->postRequest($endpoint, $headers,null,false); return $data; } public function delete($path) { $endpoint = self::API_URL_V2."2/files/delete"; $headers = array( "Content-Type: application/json" ); $postdata = wp_json_encode(array( "path" => $path )); $returnData = $this -> postRequest($endpoint, $headers, $postdata); return $returnData; } public function revoke() { $endpoint = self::API_URL_V2."2/auth/token/revoke"; $headers = array(); $this -> postRequest($endpoint, $headers); } public function getUsage(){ $endpoint = self::API_URL_V2."2/users/get_space_usage"; $headers = array( "Content-Type: application/json" ); $postdata = "null"; $returnData = $this -> postRequest($endpoint, $headers,$postdata); return $returnData; } public static function getUrl($url,$state = '') { $params = array( 'client_id' => self::API_ID, 'response_type' => 'code', 'redirect_uri' => $url, 'token_access_type'=>'offline', 'state' => $state, ); $url = 'https://www.dropbox.com/oauth2/authorize?'; $url .= http_build_query($params,'','&'); return $url; } public function postRequest($endpoint, $headers, $data = null,$returnjson = true) { if(isset($this->option['is_encrypt']) && $this->option['is_encrypt'] == 1) { $access_token=base64_decode($this -> access_token); } else{ $access_token=$this -> access_token; } $ch = curl_init($endpoint); array_push($headers, "Authorization: Bearer " . $access_token); curl_setopt($ch, CURLOPT_POST, TRUE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //todo delete this code // curl_setopt($ch,CURLOPT_PROXY, '127.0.0.1:1080'); $r = curl_exec($ch); $chinfo = curl_getinfo($ch); $error = curl_error($ch); curl_close($ch); if($r === false){ $r['error_summary'] = $error; }else{ if($chinfo['http_code'] === 401) { $ret=$this->check_token(); if($ret['result']=='success') { $ch = curl_init($endpoint); array_push($headers, "Authorization: Bearer " . $access_token); curl_setopt($ch, CURLOPT_POST, TRUE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $r = curl_exec($ch); $chinfo = curl_getinfo($ch); $error = curl_error($ch); curl_close($ch); if($r === false) { $r['error_summary'] = $error; } else { if($chinfo['http_code'] === 401) { $r = array(); $r['error_summary'] = 'Invalid or expired token. Please remove '.$this -> option['name'].' from the storage list and re-authenticate it.'; } elseif($chinfo['http_code'] !== 200 && $chinfo['http_code'] !== 206) { $r = json_decode($r,true); } } } else { $r = array(); $r['error_summary'] = 'Invalid or expired token. Please remove '.$this -> option['name'].' from the storage list and re-authenticate it.'; } }elseif($chinfo['http_code'] !== 200 && $chinfo['http_code'] !== 206){ $r = json_decode($r,true); } } if($returnjson && !is_array($r)) $r = json_decode($r,true); return $r; } public function setAccessToken($access_token){ $this -> access_token = $access_token; } public function getRefreshToken() { if(isset($this->option['is_encrypt']) && $this->option['is_encrypt'] == 1) { $refresh_token=base64_decode($this -> refresh_token); } else{ $refresh_token=$this -> refresh_token; } $options=array(); $options['timeout']=30; $options['sslverify']=FALSE; $params = array( 'client_id' => self::API_ID, 'refresh_token' => $refresh_token, 'version'=>1 ); $url = 'https://auth.wpvivid.com/dropbox_v3/?'; $url .= http_build_query($params,'','&'); $request = wp_remote_request( $url,$options); if(!is_wp_error($request) && ($request['response']['code'] == 200)) { $json= wp_remote_retrieve_body($request); $body=json_decode($json,true); if(is_null($body)) { $ret['result']='failed'; $ret['error']='Get refresh token failed'; return $ret; } if($body['result']=='success') { return $body; } else { return $body; } } else { $ret['result']='failed'; $ret['error']='Get refresh token failed'; return $ret; } } }