PluginProbe
WP-Optimize – Cache, Compress images, Minify & Clean database to boost page speed & performance / 3.2.21
WP-Optimize – Cache, Compress images, Minify & Clean database to boost page speed & performance v3.2.21
4.7.0 4.6.1 4.6.0 4.5.5 4.5.4 4.5.3 4.5.2 3.2.20 3.2.21 3.2.22 3.2.3 3.2.5 3.2.6 3.2.7 3.2.9 3.3.0 3.3.1 3.3.2 3.4.0 3.4.1 3.4.2 3.5.0 3.6.0 3.7.0 3.7.1 All 111 releases
wp-optimize / central / bootstrap.php

bootstrap.php in WP-Optimize – Cache, Compress images, Minify & Clean database to boost page speed & performance 3.2.21, at central/bootstrap.php

825 lines 34.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 if (!defined('ABSPATH')) die('No direct access.');
4
5 global $updraftcentral_host_plugin;
6 if (!$updraftcentral_host_plugin->is_host_dir_set()) die('No access.');
7
8 // This file is included during plugins_loaded
9
10 // Load the listener class that we rely on to pick up messages
11 if (!class_exists('UpdraftCentral_Listener')) require_once('listener.php');
12
13 // We exit if class already exists. More common if two or more plugins integrated
14 // the same `UpdraftCentral` client folder.
15 if (!class_exists('UpdraftCentral_Main')) :
16
17 class UpdraftCentral_Main {
18
19 /**
20 * Class constructor
21 */
22 public function __construct() {
23
24 add_action('udrpc_log', array($this, 'udrpc_log'), 10, 3);
25
26 add_action('wp_ajax_updraftcentral_receivepublickey', array($this, 'wp_ajax_updraftcentral_receivepublickey'));
27 add_action('wp_ajax_nopriv_updraftcentral_receivepublickey', array($this, 'wp_ajax_updraftcentral_receivepublickey'));
28
29 // The host plugin's command class is registered in its "plugins_loaded" method (e.g. UpdraftPlus::plugins_loaded()).
30 //
31 // N.B. The new filter "updraftcentral_remotecontrol_command_classes" was introduced on Jan. 2021 and will soon replace the
32 // old filter "updraftplus_remotecontrol_command_classes" (below). This was done in order to synchronize all available filters
33 // and actions related to UpdraftCentral so that we can easily port the UpdraftCentral client code into our other plugins.
34 //
35 // If you happened to use the old filter from any of your projects then you might as well update it with the new filter as the
36 // old filter has already been marked as deprecated, though currently supported as can be seen below but will soon be remove
37 // from this code block.
38 $command_classes = apply_filters('updraftcentral_remotecontrol_command_classes', array(
39 'core' => 'UpdraftCentral_Core_Commands',
40 'updates' => 'UpdraftCentral_Updates_Commands',
41 'users' => 'UpdraftCentral_Users_Commands',
42 'comments' => 'UpdraftCentral_Comments_Commands',
43 'analytics' => 'UpdraftCentral_Analytics_Commands',
44 'plugin' => 'UpdraftCentral_Plugin_Commands',
45 'theme' => 'UpdraftCentral_Theme_Commands',
46 'posts' => 'UpdraftCentral_Posts_Commands',
47 'media' => 'UpdraftCentral_Media_Commands',
48 'pages' => 'UpdraftCentral_Pages_Commands'
49 ));
50
51 // N.B. This "updraftplus_remotecontrol_command_classes" filter has been marked as deprecated and will be remove after May 2021.
52 // Please see above code comment for further explanation and its alternative.
53 $command_classes = apply_filters('updraftplus_remotecontrol_command_classes', $command_classes);
54
55 // If nothing was sent, then there is no incoming message, so no need to set up a listener (or CORS request, etc.). This avoids a DB SELECT query on the option below in the case where it didn't get autoloaded, which is the case when there are no keys.
56 if (!empty($_SERVER['REQUEST_METHOD']) && ('GET' == $_SERVER['REQUEST_METHOD'] || 'POST' == $_SERVER['REQUEST_METHOD']) && (empty($_REQUEST['action']) || 'updraft_central' !== $_REQUEST['action']) && empty($_REQUEST['udcentral_action']) && empty($_REQUEST['udrpc_message'])) return;
57
58 // Remote control keys
59 // These are different from the remote send keys, which are set up in the Migrator add-on
60 $our_keys = $this->get_central_localkeys();
61
62 if (is_array($our_keys) && !empty($our_keys)) {
63 new UpdraftCentral_Listener($our_keys, $command_classes);
64 }
65
66 }
67
68 /**
69 * Enqueues the needed styles and scripts for UpdraftCentral
70 *
71 * @return void
72 */
73 public function enqueue_central_scripts() {
74
75 // This is an additional check; the caller is assumed to have already run checks before painting its page in general
76 if (!current_user_can('manage_options')) return;
77
78 global $updraftcentral_host_plugin;
79 $version = $updraftcentral_host_plugin->get_version();
80
81 $enqueue_version = (defined('WP_DEBUG') && WP_DEBUG) ? $version.'.'.time() : $version;
82 $min_or_not = (defined('SCRIPT_DEBUG') && SCRIPT_DEBUG) ? '' : '.min';
83
84 // Fallback to unminified version if the minified version is not found.
85 if (!empty($min_or_not) && !file_exists(UPDRAFTCENTRAL_CLIENT_DIR.'/js/central'.$min_or_not.'.js')) {
86 $min_or_not = '';
87 }
88
89 wp_enqueue_script('updraft-central', UPDRAFTCENTRAL_CLIENT_URL.'/js/central'.$min_or_not.'.js', array(), $enqueue_version);
90 wp_enqueue_style('updraft-central', UPDRAFTCENTRAL_CLIENT_URL.'/css/central'.$min_or_not.'.css', array(), $enqueue_version);
91
92 $localize = array_merge(
93 array(
94 'central_url' => UPDRAFTCENTRAL_CLIENT_URL,
95 'plugin_name' => $updraftcentral_host_plugin->get_plugin_name(),
96 'updraftcentral_request_nonce' => wp_create_nonce('updraftcentral-request-nonce'),
97 ),
98 $updraftcentral_host_plugin->translations
99 );
100
101 wp_localize_script('updraft-central', 'uclion', apply_filters('updraftcentral_uclion', $localize));
102 }
103
104 /**
105 * Retrieves current clean url for anchor link where href attribute value is not url (for ex. #div) or empty. Output is not escaped (caller should escape).
106 *
107 * @return String - current clean url
108 */
109 public function get_current_clean_url() {
110
111 // Within an UpdraftCentral context, there should be no prefix on the anchor link
112 if (defined('UPDRAFTCENTRAL_COMMAND') && UPDRAFTCENTRAL_COMMAND || defined('WP_CLI') && WP_CLI) return '';
113
114 if (defined('DOING_AJAX') && DOING_AJAX && !empty($_SERVER['HTTP_REFERER'])) {
115 $current_url = $_SERVER['HTTP_REFERER'];
116 } else {
117 $url_prefix = is_ssl() ? 'https' : 'http';
118 $host = empty($_SERVER['HTTP_HOST']) ? parse_url(network_site_url(), PHP_URL_HOST) : $_SERVER['HTTP_HOST'];
119 $current_url = $url_prefix."://".$host.$_SERVER['REQUEST_URI'];
120 }
121 $remove_query_args = array('state', 'action', 'oauth_verifier', 'nonce', 'updraftplus_instance', 'access_token', 'user_id', 'updraftplus_googledriveauth');
122
123 $query_string = remove_query_arg($remove_query_args, $current_url);
124 return function_exists('wp_unslash') ? wp_unslash($query_string) : stripslashes_deep($query_string);
125 }
126
127 /**
128 * Get the WordPress version
129 *
130 * @return String - the version
131 */
132 public function get_wordpress_version() {
133 static $got_wp_version = false;
134 if (!$got_wp_version) {
135 @include(ABSPATH.WPINC.'/version.php');// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function.
136 $got_wp_version = $wp_version;// phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UndefinedVariable -- The variable is defined inside the ABSPATH.WPINC.'/version.php'.
137 }
138 return $got_wp_version;
139 }
140
141 /**
142 * Retrieves the UpdraftCentral generated keys
143 *
144 * @param Mixed $default default value to return when option is not found
145 *
146 * @return Mixed
147 */
148 private function get_central_localkeys($default = null) {
149
150 $option = 'updraft_central_localkeys';
151 $ret = get_option($option, $default);
152 return apply_filters('updraftcentral_get_option', $ret, $option, $default);
153 }
154
155 /**
156 * Updates the UpdraftCentral's keys
157 *
158 * @param string $value Specify option value
159 * @param bool $use_cache Whether or not to use the WP options cache
160 * @param string $autoload Whether to autoload (only takes effect on a change of value)
161 *
162 * @return bool
163 */
164 private function update_central_localkeys($value, $use_cache = true, $autoload = 'yes') {
165 $option = 'updraft_central_localkeys';
166
167 return update_option($option, apply_filters('updraftcentral_update_option', $value, $option, $use_cache), $autoload);
168 }
169
170 /**
171 * Receive a new public key in $_GET, and echo a response. Will die() if called.
172 */
173 public function wp_ajax_updraftcentral_receivepublickey() {
174 global $updraftcentral_host_plugin;
175
176 // The actual nonce check is done in the method below
177 if (empty($_GET['_wpnonce']) || empty($_GET['public_key']) || !isset($_GET['updraft_key_index'])) die;
178
179 $result = $this->receive_public_key();
180 if (!is_array($result) || empty($result['responsetype'])) die;
181
182 $style = 'body {text-align: center;font-family: Helvetica,Arial,Lucida,sans-serif;background-color: #A64C1A;color: #FFF;height: 100%;width: 100%;margin: 0;padding: 0;}#main {height: 100%;width: 100%;display: table;}#wrapper {display: table-cell;height: 100%;vertical-align: middle;}h1 {margin-bottom: 5px;}h2 {margin-top: 0;font-size: 22px;color: #FFF;}#btn-close {color: #FFF;font-size: 20px;font-weight: 500;padding: .3em 1em;line-height: 1.7em !important;background-color: transparent;background-size: cover;background-position: 50%;background-repeat: no-repeat;border: 2px solid;border-radius: 3px;-webkit-transition-duration: .2s;transition-duration: .2s;-webkit-transition-property: all !important;transition-property: all !important;text-decoration: none;}#btn-close:hover {background-color: #DE6726;}';
183
184 echo '<html><head><title>UpdraftCentral</title><style>'.$style.'</style></head><body><div id="main"><div id="wrapper"><img src="'.UPDRAFTCENTRAL_CLIENT_URL.'/images/ud-logo.png" width="60" /> <h1>'.$updraftcentral_host_plugin->retrieve_show_message('updraftcentral_connection').'</h1><h2>'.htmlspecialchars(network_site_url()).'</h2><p>';
185
186 if ('ok' == $result['responsetype']) {
187 $updraftcentral_host_plugin->retrieve_show_message('updraftcentral_connection_successful', true);
188 } else {
189 echo '<strong>'.$updraftcentral_host_plugin->retrieve_show_message('updraftcentral_connection_failed').'</strong><br>';
190 switch ($result['code']) {
191 case 'unknown_key':
192 $updraftcentral_host_plugin->retrieve_show_message('unknown_key', true);
193 break;
194 case 'not_logged_in':
195 echo $updraftcentral_host_plugin->retrieve_show_message('not_logged_in').' '.$updraftcentral_host_plugin->retrieve_show_message('must_visit_url');
196 break;
197 case 'nonce_failure':
198 $updraftcentral_host_plugin->retrieve_show_message('security_check', true);
199 $updraftcentral_host_plugin->retrieve_show_message('must_visit_link', true);
200 break;
201 case 'already_have':
202 $updraftcentral_host_plugin->retrieve_show_message('connection_already_made', true);
203 break;
204 case 'insufficient_privilege':
205 $updraftcentral_host_plugin->retrieve_show_message('insufficient_privilege', true);
206 break;
207 default:
208 echo htmlspecialchars(print_r($result, true));
209 break;
210 }
211 }
212
213 echo '</p><p><a id="btn-close" href="'.esc_url($this->get_current_clean_url()).'" onclick="window.close();">'.$updraftcentral_host_plugin->retrieve_show_message('close').'</a></p></div></div>';
214 die;
215 }
216
217 /**
218 * Checks _wpnonce, and if successful, saves the public key found in $_GET
219 *
220 * @return Array - with keys responsetype (can be 'error' or 'ok') and code, indicating whether the parse was successful
221 */
222 private function receive_public_key() {
223
224 if (!is_user_logged_in()) {
225 return array('responsetype' => 'error', 'code' => 'not_logged_in');
226 }
227
228 if (!wp_verify_nonce($_GET['_wpnonce'], 'updraftcentral_receivepublickey')) return array('responsetype' => 'error', 'code' => 'nonce_failure');
229
230 $updraft_key_index = $_GET['updraft_key_index'];
231 $our_keys = $this->get_central_localkeys();
232
233 if (!is_array($our_keys)) $our_keys = array();
234
235 if (!isset($our_keys[$updraft_key_index])) {
236 return array('responsetype' => 'error', 'code' => 'unknown_key');
237 }
238
239 if (!empty($our_keys[$updraft_key_index]['publickey_remote'])) {
240 return array('responsetype' => 'error', 'code' => 'already_have');
241 }
242
243 $our_keys[$updraft_key_index]['publickey_remote'] = base64_decode(stripslashes($_GET['public_key']));
244 $this->update_central_localkeys($our_keys, true, 'no');
245
246 return array('responsetype' => 'ok', 'code' => 'ok');
247 }
248
249 /**
250 * Action parameters, from udrpc: $message, $level, $this->key_name_indicator, $this->debug, $this
251 *
252 * @param string $message The log message
253 * @param string $level Log level
254 * @param string $key_name_indicator This indicates the key name
255 */
256 public function udrpc_log($message, $level, $key_name_indicator) {
257
258 $udrpc_log = get_site_option('updraftcentral_client_log');
259 if (!is_array($udrpc_log)) $udrpc_log = array();
260
261 $new_item = array(
262 'time' => time(),
263 'level' => $level,
264 'message' => $message,
265 'key_name_indicator' => $key_name_indicator
266 );
267
268 if (!empty($_SERVER['REMOTE_ADDR'])) {
269 $new_item['remote_ip'] = $_SERVER['REMOTE_ADDR'];
270 }
271 if (!empty($_SERVER['HTTP_USER_AGENT'])) {
272 $new_item['http_user_agent'] = $_SERVER['HTTP_USER_AGENT'];
273 }
274 if (!empty($_SERVER['HTTP_X_SECONDARY_USER_AGENT'])) {
275 $new_item['http_secondary_user_agent'] = $_SERVER['HTTP_X_SECONDARY_USER_AGENT'];
276 }
277
278 $udrpc_log[] = $new_item;
279
280 if (count($udrpc_log) > 50) array_shift($udrpc_log);
281
282 update_site_option('updraftcentral_client_log', $udrpc_log);
283 }
284
285 /**
286 * Delete UpdraftCentral Key
287 *
288 * @param array $key_id key_id of UpdraftCentral
289 *
290 * @return array which contains deleted flag and key table. If error, Returns array which contains fatal_error flag and fatal_error_message
291 */
292 public function delete_key($key_id) {
293
294 $our_keys = $this->get_central_localkeys();
295 if (is_array($key_id) && isset($key_id['key_id'])) {
296 $key_id = $key_id['key_id'];
297 }
298
299 if (!is_array($our_keys)) $our_keys = array();
300 if (isset($our_keys[$key_id])) {
301 unset($our_keys[$key_id]);
302 $this->update_central_localkeys($our_keys);
303 }
304 return array('deleted' => 1, 'keys_table' => $this->get_keys_table());
305 }
306
307 /**
308 * Get UpdraftCentral Log
309 *
310 * @return array which contains log_contents. If error, Returns array which contains fatal_error flag and fatal_error_message
311 */
312 public function get_log() {
313
314 global $updraftcentral_host_plugin;
315
316 $udrpc_log = get_site_option('updraftcentral_client_log');
317 if (!is_array($udrpc_log)) $udrpc_log = array();
318
319 $log_contents = '';
320
321 // Events are appended to the array in the order they happen. So, reversing the order gets them into most-recent-first order.
322 rsort($udrpc_log);
323
324 if (empty($udrpc_log)) {
325 $log_contents = '<em>'.$updraftcentral_host_plugin->retrieve_show_message('nothing_yet_logged').'</em>';
326 }
327
328 foreach ($udrpc_log as $m) {
329
330 // Skip invalid data
331 if (!isset($m['time'])) continue;
332
333 $time = gmdate('Y-m-d H:i:s O', $m['time']);
334 // $level is not used yet. We could put the message in different colours for different levels, if/when it becomes used.
335
336 $key_name_indicator = empty($m['key_name_indicator']) ? '' : $m['key_name_indicator'];
337
338 $log_contents .= '<span title="'.esc_attr(print_r($m, true)).'">'."$time ";
339
340 if (!empty($m['remote_ip'])) $log_contents .= '['.htmlspecialchars($m['remote_ip']).'] ';
341
342 $log_contents .= "[".htmlspecialchars($key_name_indicator)."] ".htmlspecialchars($m['message'])."</span>\n";
343 }
344
345 return array('log_contents' => $log_contents);
346
347 }
348
349 public function create_key($params) {
350
351 global $updraftcentral_host_plugin;
352
353 // Use the site URL - this means that if the site URL changes, communication ends; which is the case anyway
354 $user = wp_get_current_user();
355
356 if (!is_object($user) || empty($user->ID)) return array('error' => $updraftcentral_host_plugin->retrieve_show_message('insufficient_privilege'));
357
358 if (!current_user_can('manage_options')) return array('error' => $updraftcentral_host_plugin->retrieve_show_message('insufficient_privilege'));
359
360 $where_send = empty($params['where_send']) ? '' : (string) $params['where_send'];
361
362 if ('__updraftpluscom' != $where_send) {
363 $purl = parse_url($where_send);
364 if (empty($purl) || !array($purl) || empty($purl['scheme']) || empty($purl['host'])) return array('error' => $updraftcentral_host_plugin->retrieve_show_message('invalid_url'));
365 }
366
367 // ENT_HTML5 exists only on PHP 5.4+
368 // @codingStandardsIgnoreLine
369 $flags = defined('ENT_HTML5') ? ENT_QUOTES | ENT_HTML5 : ENT_QUOTES;
370
371 $extra_info = array(
372 'user_id' => $user->ID,
373 'user_login' => $user->user_login,
374 'ms_id' => get_current_blog_id(),
375 'site_title' => html_entity_decode(get_bloginfo('name'), $flags),
376 );
377
378 if ($where_send) {
379 $extra_info['mothership'] = $where_send;
380 if (!empty($params['mothership_firewalled'])) {
381 $extra_info['mothership_firewalled'] = true;
382 }
383 }
384
385 if (!empty($params['key_description'])) {
386 $extra_info['name'] = (string) $params['key_description'];
387 }
388
389 $key_size = (empty($params['key_size']) || !is_numeric($params['key_size']) || $params['key_size'] < 512) ? 2048 : (int) $params['key_size'];
390
391 $extra_info['key_size'] = $key_size;
392
393 $created = $this->create_remote_control_key(false, $extra_info, $where_send);
394
395 if (is_array($created)) {
396 $created['keys_table'] = $this->get_keys_table();
397
398 $created['keys_guide'] = '<h2 class="updraftcentral_wizard_success">'. $updraftcentral_host_plugin->retrieve_show_message('updraftcentral_key_created') .'</h2>';
399
400 if ('__updraftpluscom' != $where_send) {
401 $created['keys_guide'] .= '<div class="updraftcentral_wizard_success"><p>'.sprintf($updraftcentral_host_plugin->retrieve_show_message('need_to_copy_key'), '<a href="'.$where_send.'" target="_blank">UpdraftCentral dashboard</a>').'</p><p>'.$updraftcentral_host_plugin->retrieve_show_message('press_add_site_button').'</p><p>'.sprintf($updraftcentral_host_plugin->retrieve_show_message('detailed_instructions'), '<a target="_blank" href="https://updraftplus.com/updraftcentral-how-to-add-a-site/">UpdraftPlus.com</a>').'</p></div>';
402 } else {
403 $created['keys_guide'] .= '<div class="updraftcentral_wizard_success"><p>'. sprintf($updraftcentral_host_plugin->retrieve_show_message('control_this_site'), '<a target="_blank" href="https://updraftplus.com/my-account/updraftcentral-remote-control/">UpdraftPlus.com</a>').'</p></div>';
404 }
405 }
406
407 return $created;
408 }
409
410 /**
411 * Given an index, return the indicator name
412 *
413 * @param String $index
414 *
415 * @return String
416 */
417 private function indicator_name_from_index($index) {
418 return $index.'.central.updraftplus.com';
419 }
420
421 /**
422 * Gets an RPC object, and sets some defaults on it that we always want
423 *
424 * @param string $indicator_name indicator name
425 *
426 * @return array
427 */
428 public function get_udrpc($indicator_name = 'migrator.updraftplus.com') {
429
430 global $updraftcentral_host_plugin;
431
432 if (!class_exists('UpdraftPlus_Remote_Communications')) include_once($updraftcentral_host_plugin->get_host_dir().'/vendor/team-updraft/common-libs/src/updraft-rpc/class-udrpc.php');
433 $ud_rpc = new UpdraftPlus_Remote_Communications($indicator_name);
434 $ud_rpc->set_can_generate(true);
435
436 return $ud_rpc;
437 }
438
439 private function create_remote_control_key($index = false, $extra_info = array(), $post_it = false) {
440 global $updraftcentral_host_plugin;
441
442 $our_keys = $this->get_central_localkeys();
443 if (!is_array($our_keys)) $our_keys = array();
444
445 if (false === $index) {
446 if (empty($our_keys)) {
447 $index = 0;
448 } else {
449 $index = max(array_keys($our_keys))+1;
450 }
451 }
452
453 $name_hash = $index;
454
455 if (isset($our_keys[$name_hash])) {
456 unset($our_keys[$name_hash]);
457 }
458
459 $indicator_name = $this->indicator_name_from_index($name_hash);
460 $ud_rpc = $this->get_udrpc($indicator_name);
461
462 if ('__updraftpluscom' == $post_it) {
463 $post_it = defined('UPDRAFTPLUS_OVERRIDE_UDCOM_DESTINATION') ? UPDRAFTPLUS_OVERRIDE_UDCOM_DESTINATION : 'https://updraftplus.com/?updraftcentral_action=receive_key';
464 $post_it_description = 'UpdraftPlus.Com';
465 } else {
466 $post_it_description = $post_it;
467 }
468
469 // Normally, key generation takes seconds, even on a slow machine. However, some Windows machines appear to have a setup in which it takes a minute or more. And then, if you're on a double-localhost setup on slow hardware - even worse. It doesn't hurt to just raise the maximum execution time.
470
471 if (function_exists('set_time_limit')) @set_time_limit(UPDRAFTCENTRAL_SET_TIME_LIMIT);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function.
472
473 $key_size = (empty($extra_info['key_size']) || !is_numeric($extra_info['key_size']) || $extra_info['key_size'] < 512) ? 2048 : (int) $extra_info['key_size'];
474
475 if (is_object($ud_rpc) && $ud_rpc->generate_new_keypair($key_size)) {
476
477 if ($post_it && empty($extra_info['mothership_firewalled'])) {
478
479 $p_url = parse_url($post_it);
480 if (is_array($p_url) && !empty($p_url['user'])) {
481 $http_username = $p_url['user'];
482 $http_password = empty($p_url['pass']) ? '' : $p_url['pass'];
483 $post_it = $p_url['scheme'].'://'.$p_url['host'];
484 if (!empty($p_url['port'])) $post_it .= ':'.$p_url['port'];
485 $post_it .= $p_url['path'];
486 if (!empty($p_url['query'])) $post_it .= '?'.$p_url['query'];
487 }
488
489 $post_options = array(
490 'timeout' => 90,
491 'body' => array(
492 'updraftcentral_action' => 'receive_key',
493 'key' => $ud_rpc->get_key_remote()
494 )
495 );
496
497 if (!empty($http_username)) {
498 $post_options['headers'] = array(
499 'Authorization' => 'Basic '.base64_encode($http_username.':'.$http_password)
500 );
501 }
502
503 // This option allows the key to be sent to the other side via a known-secure channel (e.g. http over SSL), rather than potentially allowing it to travel over an unencrypted channel (e.g. http back to the user's browser). As such, if specified, it is compulsory for it to work.
504
505 $updraftcentral_host_plugin->register_wp_http_option_hooks();
506
507 $sent_key = wp_remote_post(
508 $post_it,
509 $post_options
510 );
511
512 $updraftcentral_host_plugin->register_wp_http_option_hooks(false);
513
514 $connection_troubleshooting_url = 'https://updraftplus.com/troubleshooting-updraftcentral-connection-issues/';
515 if (is_wp_error($sent_key) || empty($sent_key)) {
516
517 $err_msg = sprintf($updraftcentral_host_plugin->retrieve_show_message('attempt_to_register_failed'), (string) $post_it_description, $connection_troubleshooting_url);
518 if (is_wp_error($sent_key)) $err_msg .= ' '.$sent_key->get_error_message().' ('.$sent_key->get_error_code().')';
519 return array(
520 'r' => $err_msg
521 );
522 }
523
524 $response = json_decode(wp_remote_retrieve_body($sent_key), true);
525
526 if (!is_array($response) || !isset($response['key_id']) || !isset($response['key_public'])) {
527 return array(
528 'r' => sprintf($updraftcentral_host_plugin->retrieve_show_message('attempt_to_register_failed'), (string) $post_it_description, $connection_troubleshooting_url),
529 'raw' => wp_remote_retrieve_body($sent_key)
530 );
531 }
532
533 $key_hash = hash('sha256', $ud_rpc->get_key_remote());
534
535 $local_bundle = $ud_rpc->get_portable_bundle('base64_with_count', $extra_info, array('key' => array('key_hash' => $key_hash, 'key_id' => $response['key_id'])));
536
537 } elseif ($post_it) {
538 // Don't send; instead, include in the bundle info that the mothership is firewalled; this will then tell the mothership to try the reverse connection instead
539
540 if (is_array($extra_info)) {
541 $extra_info['mothership_firewalled_callback_url'] = wp_nonce_url(admin_url('admin-ajax.php'), 'updraftcentral_receivepublickey');
542 $extra_info['updraft_key_index'] = $index;
543 }
544
545
546 $local_bundle = $ud_rpc->get_portable_bundle('base64_with_count', $extra_info, array('key' => $ud_rpc->get_key_remote()));
547 }
548
549
550 if (isset($extra_info['name'])) {
551 $name = (string) $extra_info['name'];
552 unset($extra_info['name']);
553 } else {
554 $name = 'UpdraftCentral Remote Control';
555 }
556
557 $our_keys[$name_hash] = array(
558 'name' => $name,
559 'key' => $ud_rpc->get_key_local(),
560 'extra_info' => $extra_info,
561 'created' => time(),
562 );
563 // Store the other side's public key
564 if (!empty($response) && is_array($response) && !empty($response['key_public'])) {
565 $our_keys[$name_hash]['publickey_remote'] = $response['key_public'];
566 }
567 $this->update_central_localkeys($our_keys, true, 'no');
568
569 return array(
570 'bundle' => $local_bundle,
571 'r' => $updraftcentral_host_plugin->retrieve_show_message('key_created_successfully').' '.$updraftcentral_host_plugin->retrieve_show_message('copy_paste_key'),
572 );
573 }
574
575 return false;
576
577 }
578
579 /**
580 * Get the HTML for the keys table
581 *
582 * @return String
583 */
584 public function get_keys_table() {
585
586 // This is an additional check - it implies requirement for a dashboard context
587 if (!current_user_can('manage_options')) return;
588
589 global $updraftcentral_host_plugin;
590
591 $ret = '';
592
593 $our_keys = $this->get_central_localkeys();
594 if (!is_array($our_keys)) $our_keys = array();
595
596 if (empty($our_keys)) {
597 $ret .= '<tr><td colspan="2"><em>'.$updraftcentral_host_plugin->retrieve_show_message('no_updraftcentral_dashboards').'</em></td></tr>';
598 }
599
600 foreach ($our_keys as $i => $key) {
601
602 if (empty($key['extra_info'])) continue;
603
604 $user_id = $key['extra_info']['user_id'];
605
606 if (!empty($key['extra_info']['mothership'])) {
607
608 $mothership_url = $key['extra_info']['mothership'];
609
610 if ('__updraftpluscom' == $mothership_url) {
611 $reconstructed_url = 'https://updraftplus.com';
612 } else {
613 $purl = parse_url($mothership_url);
614 $path = empty($purl['path']) ? '' : $purl['path'];
615
616 $reconstructed_url = $purl['scheme'].'://'.$purl['host'].(!empty($purl['port']) ? ':'.$purl['port'] : '').$path;
617 }
618
619 } else {
620 $reconstructed_url = $updraftcentral_host_plugin->retrieve_show_message('unknown');
621 }
622
623 $name = $key['name'];
624
625 $user = get_user_by('id', $user_id);
626
627 $user_display = is_a($user, 'WP_User') ? $user->user_login.' ('.$user->user_email.')' : $updraftcentral_host_plugin->retrieve_show_message('unknown');
628
629 $ret .= '<tr class="updraft_debugrow"><td style="vertical-align:top;">'.htmlspecialchars($name).' ('.htmlspecialchars($i).')</td><td>'.$updraftcentral_host_plugin->retrieve_show_message('access_as_user')." ".htmlspecialchars($user_display)."<br>".$updraftcentral_host_plugin->retrieve_show_message('public_key_sent').' '.htmlspecialchars($reconstructed_url).'<br>';
630
631 if (!empty($key['created'])) {
632 $ret .= $updraftcentral_host_plugin->retrieve_show_message('created').' '.date_i18n(get_option('date_format').' '.get_option('time_format'), $key['created']).'.';
633 if (!empty($key['extra_info']['key_size'])) {
634 $ret .= ' '.sprintf($updraftcentral_host_plugin->retrieve_show_message('key_size'), $key['extra_info']['key_size']).'.';
635 }
636 $ret .= '<br>';
637 }
638
639 $ret .= '<a href="'.esc_url($this->get_current_clean_url()).'" data-key_id="'.esc_attr($i).'" class="updraftcentral_key_delete">'.$updraftcentral_host_plugin->retrieve_show_message('delete').'</a></td></tr>';
640 }
641
642
643 ob_start();
644 ?>
645 <div id="updraftcentral_keys_content" style="margin: 10px 0;">
646 <?php if (!empty($our_keys)) { ?>
647 <a href="<?php echo esc_url($this->get_current_clean_url()); ?>" class="updraftcentral_keys_show hidden-in-updraftcentral"><?php printf($updraftcentral_host_plugin->retrieve_show_message('manage_keys'), count($our_keys)); ?></a>
648 <?php } ?>
649 <table id="updraftcentral_keys_table">
650 <thead>
651 <tr>
652 <th style="text-align:left;"><?php $updraftcentral_host_plugin->retrieve_show_message('key_description', true); ?></th>
653 <th style="text-align:left;"><?php $updraftcentral_host_plugin->retrieve_show_message('details', true); ?></th>
654 </tr>
655 </thead>
656 <tbody>
657 <?php
658
659 echo $ret;
660
661 ?>
662 </tbody>
663 </table>
664 </div>
665 <?php
666 return ob_get_clean();
667 }
668
669 /**
670 * Return HTML markup for the 'create key' section
671 *
672 * @return String - the HTML
673 */
674 private function create_key_markup() {
675 global $updraftcentral_host_plugin;
676
677 ob_start();
678 ?>
679 <div class="create_key_container">
680 <h4 class="updraftcentral_wizard_stage1"> <?php $updraftcentral_host_plugin->retrieve_show_message('connect_to_updraftcentral_dashboard', true); ?></h4>
681 <table style="width: 100%; table-layout:fixed;">
682 <thead></thead>
683 <tbody>
684 <tr class="updraftcentral_wizard_stage1">
685 <td>
686 <div class="updraftcentral_wizard_mothership updraftcentral_wizard_option">
687 <label class="button-primary" tabindex="0">
688 <input checked="checked" type="radio" name="updraftcentral_mothership" id="updraftcentral_mothership_updraftpluscom" style="display: none;">
689 UpdraftPlus.Com
690 </label><br>
691 <div><?php printf($updraftcentral_host_plugin->retrieve_show_message('in_example'), '<a target="_blank" href="https://updraftplus.com/my-account/">'.$updraftcentral_host_plugin->retrieve_show_message('an_account').'</a>'); ?></div>
692
693 </div>
694 <div class="updraftcentral_wizard_self_hosted_stage1 updraftcentral_wizard_option">
695 <label class="button-primary" tabindex="0">
696 <input type="radio" name="updraftcentral_mothership" id="updraftcentral_mothership_other" style="display: none;">
697 <?php $updraftcentral_host_plugin->retrieve_show_message('self_hosted_dashboard', true);?>
698 </label><br>
699 <div><?php printf($updraftcentral_host_plugin->retrieve_show_message('website_installed'), '<a target="_blank" href="https://wordpress.org/plugins/updraftcentral/">UpdraftCentral</a>'); ?></div>
700 </div>
701 <div class="updraftcentral_wizard_self_hosted_stage2" style="float:left; clear:left;display:none;">
702 <p style="font-size: 13px;"><?php echo $updraftcentral_host_plugin->retrieve_show_message('enter_url');?></p>
703 <p style="font-size: 13px;" id="updraftcentral_wizard_stage1_error"></p>
704 <input disabled="disabled" id="updraftcentral_keycreate_mothership" type="text" size="40" placeholder="<?php $updraftcentral_host_plugin->retrieve_show_message('updraftcentral_dashboard_url', true); ?>" value="">
705 <button type="button" class="button button-primary" id="updraftcentral_stage2_go"><?php $updraftcentral_host_plugin->retrieve_show_message('next', true); ?></button>
706 </div>
707 </td>
708 </tr>
709
710 <tr class="updraft_debugrow updraftcentral_wizard_stage2" style="display: none;">
711 <h4 class="updraftcentral_wizard_stage2" style="display: none;"><?php $updraftcentral_host_plugin->retrieve_show_message('updraftcentral_connection_details', true); ?></h4>
712 <td class="updraftcentral_keycreate_description">
713 <?php $updraftcentral_host_plugin->retrieve_show_message('description', true); ?>:
714 <input id="updraftcentral_keycreate_description" type="text" size="20" placeholder="<?php $updraftcentral_host_plugin->retrieve_show_message('enter_description', true); ?>" value="" >
715 </td>
716 </tr>
717
718 <tr class="updraft_debugrow updraftcentral_wizard_stage2" style="display: none;">
719 <td>
720 <?php $updraftcentral_host_plugin->retrieve_show_message('encryption_key_size', true); ?>
721 <select style="" id="updraftcentral_keycreate_keysize">
722 <option value="512"><?php echo sprintf($updraftcentral_host_plugin->retrieve_show_message('bits').' - '.$updraftcentral_host_plugin->retrieve_show_message('easy_to_break'), '512'); ?></option>
723 <option value="1024"><?php echo sprintf($updraftcentral_host_plugin->retrieve_show_message('bits').' - '.$updraftcentral_host_plugin->retrieve_show_message('faster'), '1024'); ?></option>
724 <option value="2048" selected="selected"><?php echo sprintf($updraftcentral_host_plugin->retrieve_show_message('bytes').' - '.$updraftcentral_host_plugin->retrieve_show_message('recommended'), '2048'); ?></option>
725 <option value="4096"><?php echo sprintf($updraftcentral_host_plugin->retrieve_show_message('bits').' - '.$updraftcentral_host_plugin->retrieve_show_message('slower'), '4096'); ?></option>
726 </select>
727 <br>
728 <div id="updraftcentral_keycreate_mothership_firewalled_container">
729 <label>
730 <input id="updraftcentral_keycreate_mothership_firewalled" type="checkbox">
731 <?php $updraftcentral_host_plugin->retrieve_show_message('use_alternative_method', true); ?>
732 <a href="<?php echo esc_url($this->get_current_clean_url()); ?>" id="updraftcentral_keycreate_altmethod_moreinfo_get"><?php $updraftcentral_host_plugin->retrieve_show_message('more_information', true); ?></a>
733 <p id="updraftcentral_keycreate_altmethod_moreinfo" style="display:none; border: 1px dotted; padding: 3px; margin: 2px 10px 2px 24px;">
734 <em><?php $updraftcentral_host_plugin->retrieve_show_message('this_is_useful', true);?></em>
735 </p>
736 </label>
737 </div>
738 </td>
739 </tr>
740
741 <tr class="updraft_debugrow updraftcentral_wizard_stage2" style="display: none;">
742 <td>
743 <button style="margin-top: 5px;" type="button" class="button button-primary" id="updraftcentral_keycreate_go"><?php $updraftcentral_host_plugin->retrieve_show_message('create', true); ?></button>
744 </td>
745 </tr>
746 <tr class="updraft_debugrow updraftcentral_wizard_stage2" style="display: none;">
747 <td>
748 <a id="updraftcentral_stage1_go"><?php $updraftcentral_host_plugin->retrieve_show_message('back', true); ?></a>
749 </td>
750 </tr>
751 </tbody>
752 </table>
753 </div>
754 <?php
755 return ob_get_clean();
756 }
757
758 /**
759 * Get log event viewer mark-up
760 *
761 * @return String - the HTML
762 */
763 private function get_log_markup() {
764 global $updraftcentral_host_plugin;
765
766 ob_start();
767 ?>
768 <div id="updraftcentral_view_log_container" style="margin: 10px 0;">
769 <a href="<?php echo esc_url($this->get_current_clean_url()); ?>" id="updraftcentral_view_log"><?php $updraftcentral_host_plugin->retrieve_show_message('view_log_events', true); ?>...</a><br>
770 <pre id="updraftcentral_view_log_contents" style="min-height: 110px; padding: 0 4px;">
771 </pre>
772 </div>
773 <?php
774 return ob_get_clean();
775 }
776
777 /**
778 * Echo the debug-tools dashboard HTML. Called by the WP action updraftplus_debugtools_dashboard.
779 */
780 public function debugtools_dashboard() {
781
782 $this->enqueue_central_scripts();
783
784 global $updraftcentral_host_plugin;
785
786 $including_desc = '';
787 if (function_exists('get_current_screen')) {
788 $screen = get_current_screen();
789 $hosts = apply_filters('updraftcentral_host_plugins', array());
790 $includes = $updraftcentral_host_plugin->retrieve_show_message('including_description');
791
792 foreach ($hosts as $plugin) {
793 if (false !== stripos($screen->id, $plugin)) {
794 $key = str_replace('-', '_', strtolower($plugin)).'_desc';
795 if (isset($includes[$key])) {
796 $including_desc = $includes[$key];
797 break;
798 }
799 }
800 }
801 }
802
803 $updraftcentral_description = preg_replace('/\s+/', ' ', sprintf($updraftcentral_host_plugin->retrieve_show_message('updraftcentral_description'), $including_desc));
804 ?>
805 <div class="advanced_tools updraft_central">
806 <h3><?php $updraftcentral_host_plugin->retrieve_show_message('updraftcentral_remote_control', true); ?></h3>
807 <p>
808 <?php echo $updraftcentral_description.' <a target="_blank" href="https://updraftcentral.com">'.$updraftcentral_host_plugin->retrieve_show_message('read_more').'</a>'; ?>
809 </p>
810 <div style="min-height: 310px;" id="updraftcentral_keys">
811 <?php echo $this->create_key_markup(); ?>
812 <?php echo $this->get_keys_table(); ?>
813 <button style="display: none;" type="button" class="button button-primary" id="updraftcentral_wizard_go"><?php $updraftcentral_host_plugin->retrieve_show_message('create_another_key', true); ?></button>
814 <?php echo $this->get_log_markup(); ?>
815 </div>
816 </div>
817 <?php
818 }
819 }
820
821 endif;
822
823 global $updraftcentral_main;
824 $updraftcentral_main = new UpdraftCentral_Main();
825