| @@ -1,14 +1,12 @@ | ||
| 1 | 1 | <?php |
| 2 | 2 | |
| 3 | 3 | /** |
| 4 | - * E2pdf Api Model | |
| 5 | - * | |
| 6 | - * @copyright Copyright 2017 https://e2pdf.com | |
| 7 | - * @license GPL v2 | |
| 8 | - * @version 1 | |
| 9 | - * @link https://e2pdf.com | |
| 10 | - * @since 0.00.01 | |
| 4 | + * File: /model/e2pdf-api.php | |
| 5 | + * | |
| 6 | + * @package E2Pdf | |
| 7 | + * @license GPLv3 | |
| 8 | + * @link https://e2pdf.com | |
| 11 | 9 | */ |
| 12 | 10 | if (!defined('ABSPATH')) { |
| 13 | 11 | die('Access denied.'); |
| 14 | 12 | } |
| @@ -14,36 +12,54 @@ | ||
| 14 | 12 | } |
| 15 | 13 | |
| 16 | 14 | class Model_E2pdf_Api extends Model_E2pdf_Model { |
| 17 | 15 | |
| 18 | - protected $api = NULL; | |
| 16 | + protected $api; | |
| 19 | 17 | |
| 20 | - const API_URL = 'https://api.e2pdf.com/'; | |
| 21 | - | |
| 22 | - function __construct() { | |
| 18 | + public function __construct() { | |
| 23 | 19 | parent::__construct(); |
| 20 | + $this->api = new stdClass(); | |
| 24 | 21 | } |
| 25 | 22 | |
| 26 | - /** | |
| 27 | - * Submit API Request to Remote Server | |
| 28 | - * | |
| 29 | - * @param string $key - Return Value by Key | |
| 30 | - * | |
| 31 | - * @return mixed | |
| 32 | - */ | |
| 33 | - public function request($key = false) { | |
| 34 | - if ($this->api->action) { | |
| 23 | + // request | |
| 24 | + public function request($key = false, $api_server = false) { | |
| 35 | 25 | |
| 36 | - $data = array( | |
| 37 | - 'api_url' => site_url(), | |
| 26 | + $api_action = $this->get('action'); | |
| 27 | + if ($api_action) { | |
| 28 | + | |
| 29 | + // fix for upgrade via dashboard -> updates | |
| 30 | + if (method_exists($this->helper, 'set_time_limit')) { | |
| 31 | + $this->helper->set_time_limit((int) get_option('e2pdf_request_timeout', '420')); | |
| 32 | + } | |
| 33 | + | |
| 34 | + // fix for upgrade via dashboard -> updates | |
| 35 | + if ($api_action == 'update/info' && !method_exists($this->helper, 'get_site_url')) { | |
| 36 | + return []; | |
| 37 | + } | |
| 38 | + | |
| 39 | + $api_protocol = get_option('e2pdf_api_protocol', '0'); | |
| 40 | + $api_processor = get_option('e2pdf_debug', '0') && get_option('e2pdf_processor', '0') ? get_option('e2pdf_processor', '0') : '0'; | |
| 41 | + if ($api_processor == '2') { | |
| 42 | + $api_version = '1.16.19'; | |
| 43 | + } else { | |
| 44 | + $api_version = '1.32.39'; | |
| 45 | + } | |
| 46 | + | |
| 47 | + $data = [ | |
| 48 | + 'api_url' => $this->helper->get_site_url(), | |
| 38 | 49 | 'api_license_key' => $this->get_license(), |
| 39 | - 'api_processor' => get_option('e2pdf_processor') ? get_option('e2pdf_processor') : 0, | |
| 40 | - ); | |
| 41 | - $request_url = self::API_URL . $this->api->action; | |
| 50 | + 'api_processor' => apply_filters('e2pdf_api_processor', $api_processor), | |
| 51 | + 'api_version' => apply_filters('e2pdf_api_version', $api_version), | |
| 52 | + 'api_protocol' => $api_protocol, | |
| 53 | + ]; | |
| 54 | + if (!$api_server) { | |
| 55 | + $api_server = $this->get_api_server(); | |
| 56 | + } | |
| 57 | + $request_url = 'https://' . $api_server . '/' . $api_action; | |
| 42 | 58 | |
| 43 | - $timeout = get_option('e2pdf_connection_timeout') === false ? 300 : get_option('e2pdf_connection_timeout'); | |
| 44 | - | |
| 45 | - $ch = curl_init($request_url); | |
| 59 | + // phpcs:disable WordPress.WP.AlternativeFunctions | |
| 60 | + $ch = apply_filters('e2pdf_api_connection', curl_init($request_url)); | |
| 61 | + curl_setopt($ch, CURLOPT_USERAGENT, $this->helper->get_site_url()); | |
| 46 | 62 | curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); |
| 47 | 63 | curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); |
| 48 | 64 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); |
| 49 | 65 | if (!ini_get('safe_mode') && !ini_get('open_basedir')) { |
| @@ -48,49 +64,81 @@ | ||
| 48 | 64 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); |
| 49 | 65 | if (!ini_get('safe_mode') && !ini_get('open_basedir')) { |
| 50 | 66 | curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); |
| 51 | 67 | } |
| 52 | - curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); | |
| 68 | + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, (int) get_option('e2pdf_connection_timeout', '300')); | |
| 53 | 69 | |
| 54 | - if (!empty($this->api->data)) { | |
| 55 | - $data = array_merge($data, $this->api->data); | |
| 70 | + if (defined('E2PDF_API_PROXY')) { | |
| 71 | + curl_setopt($ch, CURLOPT_PROXY, E2PDF_API_PROXY); | |
| 56 | 72 | } |
| 73 | + if (defined('E2PDF_API_PROXYPORT')) { | |
| 74 | + curl_setopt($ch, CURLOPT_PROXYPORT, E2PDF_API_PROXYPORT); | |
| 75 | + } | |
| 76 | + if (defined('E2PDF_API_PROXYUSERPWD')) { | |
| 77 | + curl_setopt($ch, CURLOPT_PROXYUSERPWD, E2PDF_API_PROXYUSERPWD); | |
| 78 | + } | |
| 79 | + if (defined('E2PDF_API_PROXYTYPE')) { | |
| 80 | + curl_setopt($ch, CURLOPT_PROXYTYPE, E2PDF_API_PROXYTYPE); | |
| 81 | + } | |
| 82 | + if (defined('E2PDF_API_PROXYAUTH')) { | |
| 83 | + curl_setopt($ch, CURLOPT_PROXYAUTH, E2PDF_API_PROXYAUTH); | |
| 84 | + } | |
| 85 | + if (class_exists('CURLFile')) { | |
| 86 | + if (defined('CURLOPT_SAFE_UPLOAD')) { | |
| 87 | + curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true); | |
| 88 | + } | |
| 89 | + } else { | |
| 90 | + if (defined('CURLOPT_SAFE_UPLOAD')) { | |
| 91 | + curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false); | |
| 92 | + } | |
| 93 | + } | |
| 57 | 94 | |
| 58 | - curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); | |
| 95 | + if (!empty($this->get('data'))) { | |
| 96 | + $data = array_merge($data, $this->get('data')); | |
| 97 | + } | |
| 98 | + if ($api_action === 'template/upload2') { | |
| 99 | + curl_setopt($ch, CURLOPT_POSTFIELDS, $data); | |
| 100 | + } else { | |
| 101 | + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); | |
| 102 | + } | |
| 59 | 103 | |
| 60 | 104 | $json = curl_exec($ch); |
| 61 | 105 | $curl_errno = curl_errno($ch); |
| 62 | 106 | $curl_error = curl_error($ch); |
| 107 | + $curl_type = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); | |
| 108 | + $curl_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); | |
| 63 | 109 | curl_close($ch); |
| 110 | + // phpcs:enable | |
| 64 | 111 | |
| 65 | 112 | if ($curl_errno > 0) { |
| 66 | - $response['error'] = "[{$curl_errno}] {$curl_error}"; | |
| 113 | + if ($this->get_api_server() === $this->get_api_server($api_server)) { | |
| 114 | + $response['error'] = '[' . $curl_errno . '] ' . $curl_error; | |
| 115 | + } else { | |
| 116 | + return $this->request($key, $this->get_api_server($api_server)); | |
| 117 | + } | |
| 118 | + } elseif ($curl_code < 200 || $curl_code >= 300) { | |
| 119 | + if ($this->get_api_server() === $this->get_api_server($api_server)) { | |
| 120 | + $response['error'] = '[' . $curl_code . ']'; | |
| 121 | + } else { | |
| 122 | + return $this->request($key, $this->get_api_server($api_server)); | |
| 123 | + } | |
| 67 | 124 | } else { |
| 68 | - | |
| 69 | - if (($this->api->action === 'template/build' || $this->api->action === 'template/parse') && get_option('e2pdf_developer')) { | |
| 70 | - $model_e2pdf_options = new Model_E2pdf_Options(); | |
| 71 | - if (in_array($this->helper->get_ip(), $model_e2pdf_options->get_option('e2pdf_developer_ips'))) { | |
| 72 | - $data = array( | |
| 73 | - 'request_url' => $request_url, | |
| 74 | - 'data' => $data, | |
| 75 | - 'response' => $json | |
| 76 | - ); | |
| 77 | - var_dump("<PRE>"); | |
| 78 | - var_dump($data); | |
| 79 | - die(); | |
| 125 | + if ($api_protocol == '1' && strpos($curl_type, 'application/octet-stream') !== false) { | |
| 126 | + $response['file'] = $json; | |
| 127 | + } else { | |
| 128 | + $result = json_decode($json, true); | |
| 129 | + $response = isset($result['response']) ? $result['response'] : null; | |
| 130 | + if (!empty($response['file'])) { | |
| 131 | + // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_decode | |
| 132 | + $response['file'] = base64_decode($response['file']); | |
| 80 | 133 | } |
| 81 | 134 | } |
| 82 | - | |
| 83 | - $result = json_decode($json, true); | |
| 84 | - $response = $result['response']; | |
| 85 | - | |
| 86 | - | |
| 87 | - if (($this->api->action === 'common/activate' || $this->api->action === 'license/update') && isset($response['license_key'])) { | |
| 88 | - update_option('e2pdf_license', $response['license_key']); | |
| 89 | - } | |
| 90 | - | |
| 91 | 135 | if (empty($response)) { |
| 92 | - $response['error'] = __("Something went wrong!", "e2pdf"); | |
| 136 | + if ($this->get_api_server() === $this->get_api_server($api_server)) { | |
| 137 | + $response['error'] = __('Something went wrong!', 'e2pdf'); | |
| 138 | + } else { | |
| 139 | + return $this->request($key, $this->get_api_server($api_server)); | |
| 140 | + } | |
| 93 | 141 | } |
| 94 | 142 | } |
| 95 | 143 | |
| 96 | 144 | if ($key) { |
| @@ -99,8 +147,22 @@ | ||
| 99 | 147 | } else { |
| 100 | 148 | return false; |
| 101 | 149 | } |
| 102 | 150 | } else { |
| 151 | + if ($api_action == 'template/build' || ($api_action == 'license/info' && $this->get('reload') === false)) { | |
| 152 | + if (isset($response['error']) && $response['error'] == 'Site Url Not Found. Please try to "Reactivate" plugin.') { | |
| 153 | + $license = $this->helper->load('license'); | |
| 154 | + if ($license && method_exists($license, 'reactivate') && $license->reactivate()) { | |
| 155 | + return $this->request($key, $api_server); | |
| 156 | + } | |
| 157 | + } | |
| 158 | + if (isset($response['error']) && $response['error'] == 'License Key does not match this site. Please correct License Key to continue usage.') { | |
| 159 | + $license = $this->helper->load('license'); | |
| 160 | + if ($license && method_exists($license, 'restore') && $license->restore()) { | |
| 161 | + return $this->request($key, $api_server); | |
| 162 | + } | |
| 163 | + } | |
| 164 | + } | |
| 103 | 165 | return $response; |
| 104 | 166 | } |
| 105 | 167 | } |
| 106 | 168 | return false; |
| @@ -105,25 +167,38 @@ | ||
| 105 | 167 | } |
| 106 | 168 | return false; |
| 107 | 169 | } |
| 108 | 170 | |
| 109 | - /** | |
| 110 | - * Remove API Request options | |
| 111 | - */ | |
| 112 | - public function flush() { | |
| 113 | - $this->api = null; | |
| 171 | + public function get_api_server($api_server = false) { | |
| 172 | + if (!$api_server) { | |
| 173 | + if (defined('E2PDF_API_SERVER')) { | |
| 174 | + $api_server = E2PDF_API_SERVER; | |
| 175 | + } else { | |
| 176 | + $api_server = apply_filters('e2pdf_api', get_option('e2pdf_api', 'api.e2pdf.com')); | |
| 177 | + } | |
| 178 | + return $api_server; | |
| 179 | + } | |
| 180 | + switch ($api_server) { | |
| 181 | + case 'api.e2pdf.com': | |
| 182 | + $api_server = 'api2.e2pdf.com'; | |
| 183 | + break; | |
| 184 | + case 'api2.e2pdf.com': | |
| 185 | + $api_server = 'api3.e2pdf.com'; | |
| 186 | + break; | |
| 187 | + case 'api3.e2pdf.com': | |
| 188 | + $api_server = 'api4.e2pdf.com'; | |
| 189 | + break; | |
| 190 | + case 'api4.e2pdf.com': | |
| 191 | + $api_server = 'api.e2pdf.com'; | |
| 192 | + break; | |
| 193 | + default: | |
| 194 | + break; | |
| 195 | + } | |
| 196 | + return $api_server; | |
| 114 | 197 | } |
| 115 | 198 | |
| 116 | - /** | |
| 117 | - * Set options for API Request | |
| 118 | - * | |
| 119 | - * @param string $key - Key | |
| 120 | - * @param mixed $value - Value | |
| 121 | - */ | |
| 199 | + // set | |
| 122 | 200 | public function set($key, $value = false) { |
| 123 | - if (!$this->api) { | |
| 124 | - $this->api = new stdClass(); | |
| 125 | - } | |
| 126 | 201 | if (is_array($key)) { |
| 127 | 202 | foreach ($key as $attr => $value) { |
| 128 | 203 | $this->api->$attr = $value; |
| 129 | 204 | } |
| @@ -129,25 +204,16 @@ | ||
| 129 | 204 | } |
| 130 | 205 | } else { |
| 131 | 206 | $this->api->$key = $value; |
| 132 | 207 | } |
| 208 | + return $this; | |
| 133 | 209 | } |
| 134 | 210 | |
| 135 | - /** | |
| 136 | - * Get License | |
| 137 | - * | |
| 138 | - * @return string - License Key | |
| 139 | - */ | |
| 140 | - public function get_license() { | |
| 141 | - return get_option('e2pdf_license'); | |
| 211 | + public function get($key) { | |
| 212 | + return property_exists($this->api, $key) ? $this->api->$key : null; | |
| 142 | 213 | } |
| 143 | 214 | |
| 144 | - /** | |
| 145 | - * Get Domain | |
| 146 | - * | |
| 147 | - * @return string - Domain | |
| 148 | - */ | |
| 149 | - public function get_domain() { | |
| 150 | - return site_url(); | |
| 215 | + // get license | |
| 216 | + public function get_license() { | |
| 217 | + return get_option('e2pdf_license', false); | |
| 151 | 218 | } |
| 152 | - | |
| 153 | 219 | } |