PluginProbe
The WP Remote WordPress Plugin / 5.88
The WP Remote WordPress Plugin v5.88
6.72 6.69 6.65 6.62 6.48 6.47 4.87 4.97 5.05 5.09 5.16 5.22 5.24 5.25 5.38 5.41 5.42 5.45 5.47 5.53 5.56 5.65 5.68 5.72 5.73 All 53 releases
← All changes | callback/request.php +130 -44 4.875.88 View file →
@@ -9,10 +9,11 @@
9 9 public $is_afterload;
10 10 public $is_admin_ajax;
11 11 public $is_debug;
12 12 public $account;
13 - public $calculated_mac;
13 + public $settings;
14 14 public $sig;
15 + public $sighshalgo;
15 16 public $time;
16 17 public $version;
17 18 public $is_sha1;
18 19 public $bvb64stream;
@@ -17,12 +18,17 @@
17 18 public $is_sha1;
18 19 public $bvb64stream;
19 20 public $bvb64cksize;
20 21 public $checksum;
22 + public $error = array();
23 + public $pubkey_name;
24 + public $bvprmsmac;
25 + public $bvboundry;
21 26
22 - public function __construct($account, $in_params) {
27 + public function __construct($account, $in_params, $settings) {
23 28 $this->params = array();
24 29 $this->account = $account;
30 + $this->settings = $settings;
25 31 $this->wing = $in_params['wing'];
26 32 $this->method = $in_params['bvMethod'];
27 33 $this->is_afterload = array_key_exists('afterload', $in_params);
28 34 $this->is_admin_ajax = array_key_exists('adajx', $in_params);
@@ -27,8 +33,9 @@
27 33 $this->is_afterload = array_key_exists('afterload', $in_params);
28 34 $this->is_admin_ajax = array_key_exists('adajx', $in_params);
29 35 $this->is_debug = array_key_exists('bvdbg', $in_params);
30 36 $this->sig = $in_params['sig'];
37 + $this->sighshalgo = !empty($in_params['sighshalgo']) ? $in_params['sighshalgo'] : null;
31 38 $this->time = intval($in_params['bvTime']);
32 39 $this->version = $in_params['bvVersion'];
33 40 $this->is_sha1 = array_key_exists('sha1', $in_params);
34 41 $this->bvb64stream = isset($in_params['bvb64stream']);
@@ -33,8 +40,12 @@
33 40 $this->is_sha1 = array_key_exists('sha1', $in_params);
34 41 $this->bvb64stream = isset($in_params['bvb64stream']);
35 42 $this->bvb64cksize = array_key_exists('bvb64cksize', $in_params) ? intval($in_params['bvb64cksize']) : false;
36 43 $this->checksum = array_key_exists('checksum', $in_params) ? $in_params['checksum'] : false;
44 + $this->pubkey_name = !empty($in_params['pubkeyname']) ?
45 + WPRAccount::sanitizeKey($in_params['pubkeyname']) : 'm_public';
46 + $this->bvprmsmac = !empty($in_params['bvprmsmac']) ? WPRAccount::sanitizeKey($in_params['bvprmsmac']) : "";
47 + $this->bvboundry = !empty($in_params['bvboundry']) ? $in_params['bvboundry'] : "";
37 48 }
38 49
39 50 public function isAPICall() {
40 51 return array_key_exists('apicall', $this->params);
@@ -39,38 +50,25 @@
39 50 public function isAPICall() {
40 51 return array_key_exists('apicall', $this->params);
41 52 }
42 53
43 - public function curlRequest($url, $body) {
44 - $ch = curl_init($url);
45 - curl_setopt($ch, CURLOPT_POST, 1);
46 - curl_setopt($ch, CURLOPT_TIMEOUT, 15);
47 - curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($body));
48 - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
49 - return curl_exec($ch);
50 - }
54 + public function http_request($url, $body) {
55 + $body = http_build_query($body);
56 + $response = wp_remote_post($url, array(
57 + 'body' => $body,
58 + 'timeout' => 15,
59 + 'headers' => array(
60 + 'Content-Type' => 'application/x-www-form-urlencoded',
61 + ),
62 + ));
51 63
52 - public function fileGetContentRequest($url, $body) {
53 - $options = array(
54 - 'http' => array(
55 - 'header' => "Content-type: application/x-www-form-urlencoded\r\n",
56 - 'method' => 'POST',
57 - 'content' => http_build_query($body)
58 - )
59 - );
64 + if (is_wp_error($response)) {
65 + return false;
66 + }
60 67
61 - $context = stream_context_create($options);
62 - return file_get_contents($url, false, $context);
68 + return wp_remote_retrieve_body($response);
63 69 }
64 70
65 - public function http_request($url, $body) {
66 - if (in_array('curl', get_loaded_extensions())) {
67 - return $this->curlRequest($url, $body);
68 - } else {
69 - return $this->fileGetContentRequest($url, $body);
70 - }
71 - }
72 -
73 71 public function get_params_via_api($params_key, $apiurl) {
74 72 $res = $this->http_request($apiurl, array('bvkey' => $params_key));
75 73
76 74 if ($res === FALSE) {
@@ -83,9 +81,10 @@
83 81 public function info() {
84 82 $info = array(
85 83 "requestedsig" => $this->sig,
86 84 "requestedtime" => $this->time,
87 - "requestedversion" => $this->version
85 + "requestedversion" => $this->version,
86 + "error" => $this->error
88 87 );
89 88 if ($this->is_debug) {
90 89 $info["inreq"] = $this->params;
91 90 }
@@ -94,11 +93,8 @@
94 93 }
95 94 if ($this->is_afterload) {
96 95 $info["afterload"] = true;
97 96 }
98 - if ($this->calculated_mac) {
99 - $info["calculated_mac"] = $this->calculated_mac;
100 - }
101 97 return $info;
102 98 }
103 99
104 100 public function processParams($in_params) {
@@ -127,22 +123,17 @@
127 123 $in_params["bvprms"] = $pdata;
128 124 }
129 125 }
130 126
131 - if (array_key_exists('bvprms', $in_params) && isset($in_params['bvprms']) &&
132 - array_key_exists('bvprmsmac', $in_params) && isset($in_params['bvprmsmac'])) {
133 - $digest_algo = 'SHA1';
134 - $sent_mac = WPRAccount::sanitizeKey($in_params['bvprmsmac']);
135 -
136 - if (array_key_exists('bvprmshshalgo', $in_params) && isset($in_params['bvprmshshalgo'])) {
137 - $digest_algo = $in_params['bvprmshshalgo'];
127 + if (array_key_exists('bvprms', $in_params) && isset($in_params['bvprms'])) {
128 + if (!empty($in_params['bvprmshshalgo']) && $in_params['bvprmshshalgo'] === 'sha256') {
129 + $calculated_mac = hash_hmac('SHA256', $in_params['bvprms'], $this->account->secret);
130 + } else {
131 + $calculated_mac = hash_hmac('SHA1', $in_params['bvprms'], $this->account->secret);
138 132 }
139 133
140 - $calculated_mac = hash_hmac($digest_algo, $in_params['bvprms'], $this->account->secret);
141 - $this->calculated_mac = substr($calculated_mac, 0, 6);
134 + if ($this->compare_mac($this->bvprmsmac, $calculated_mac) === true) {
142 135
143 - if ($this->compare_mac($sent_mac, $calculated_mac) === true) {
144 -
145 136 if (array_key_exists('b64', $in_params)) {
146 137 foreach ($in_params['b64'] as $key) {
147 138 if (is_array($in_params[$key])) {
148 139 $in_params[$key] = array_map('base64_decode', $in_params[$key]);
@@ -187,9 +178,8 @@
187 178
188 179 return $params;
189 180 }
190 181 }
191 -
192 182 return false;
193 183 }
194 184
195 185 private function compare_mac($l_hash, $r_hash) {
@@ -215,7 +205,103 @@
215 205 $data = base64_decode($data);
216 206 }
217 207
218 208 return $data;
209 + }
210 +
211 + public function authenticate() {
212 + if (!$this->account) {
213 + $this->error["message"] = "ACCOUNT_NOT_FOUND";
214 + return false;
215 + }
216 +
217 + $bv_last_recv_time = $this->settings->getOption('bvLastRecvTime');
218 + if ($this->time < intval($bv_last_recv_time) - 300) {
219 + return false;
220 + }
221 +
222 + $data = $this->method.$this->account->secret.$this->time.$this->version.$this->bvprmsmac;
223 + if (!$this->verify($data, base64_decode($this->sig), $this->sighshalgo)) {
224 + return false;
225 + }
226 + $this->settings->updateOption('bvLastRecvTime', $this->time);
227 +
228 + return 1;
229 + }
230 +
231 + public function verify($data, $sig, $sighshalgo) {
232 + if (!function_exists('openssl_verify') || !function_exists('openssl_pkey_get_public')) {
233 + $this->error["message"] = "OPENSSL_FUNCS_NOT_FOUND";
234 + return false;
235 + }
236 +
237 + $key_file = dirname( __DIR__ ) . '/public_keys/' . $this->pubkey_name . '.pub';
238 + if (!file_exists($key_file)) {
239 + $this->error["message"] = "PUBLIC_KEY_NOT_FOUND";
240 + return false;
241 + }
242 +
243 + $filesystem = WPRHelper::get_direct_filesystem();
244 + $public_key_str = $filesystem->get_contents($key_file);
245 +
246 + $public_key = openssl_pkey_get_public($public_key_str);
247 + if (!$public_key) {
248 + $this->error["message"] = "UNABLE_TO_LOAD_PUBLIC_KEY";
249 + return false;
250 + }
251 +
252 + if ($sighshalgo === 'sha256') {
253 + $verify = openssl_verify($data, $sig, $public_key, OPENSSL_ALGO_SHA256);
254 + } else {
255 + $verify = openssl_verify($data, $sig, $public_key);
256 + }
257 + if ($verify === 1) {
258 + return true;
259 + } elseif ($verify === 0) {
260 + $this->error["message"] = "INCORRECT_SIGNATURE";
261 + $this->error["pubkey_sig"] = substr(hash('md5', $public_key_str), 0, 8);
262 + } else {
263 + $this->error["message"] = "OPENSSL_VERIFY_FAILED";
264 + }
265 + return false;
266 + }
267 +
268 + public function corruptedParamsResp() {
269 + $bvinfo = new WPRInfo($this->settings);
270 +
271 + return array(
272 + "account_info" => $this->account->info(),
273 + "request_info" => $this->info(),
274 + "bvinfo" => $bvinfo->info(),
275 + "statusmsg" => "BVPRMS_CORRUPTED"
276 + );
277 + }
278 +
279 + public function authFailedResp() {
280 + $api_public_key = WPRAccount::getApiPublicKey($this->settings);
281 + $default_secret = WPRRecover::getDefaultSecret($this->settings);
282 + $default_account_pubkey = WPRAccount::getDefaultPublicKey();
283 + $bvinfo = new WPRInfo($this->settings);
284 + $resp = array(
285 + "request_info" => $this->info(),
286 + "bvinfo" => $bvinfo->info(),
287 + "statusmsg" => "FAILED_AUTH",
288 + "api_pubkey" => substr($api_public_key, 0, 8),
289 + "def_key_status" => WPRRecover::getSecretStatus($this->settings),
290 + "def_sigmatch" => substr(hash('sha1', $this->method.$default_secret.$this->time.$this->version), 0, 8)
291 + );
292 +
293 + if (is_string($default_account_pubkey) && strlen($default_account_pubkey) >= 32) {
294 + $resp["default_account_pubkey"] = substr($default_account_pubkey, 0, 8);
295 + }
296 +
297 + if ($this->account) {
298 + $resp["account_info"] = $this->account->info();
299 + $resp["sigmatch"] = substr(hash('sha1', $this->method.$this->account->secret.$this->time.$this->version), 0, 6);
300 + } else {
301 + $resp["account_info"] = array("error" => "ACCOUNT_NOT_FOUND");
302 + }
303 +
304 + return $resp;
219 305 }
220 306 }
221 307 endif;