PluginProbe
WP-Optimize – Cache, Compress images, Minify & Clean database to boost page speed & performance / 3.7.0
WP-Optimize – Cache, Compress images, Minify & Clean database to boost page speed & performance v3.7.0
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 / vendor / team-updraft / lib-central / central / bootstrap.php

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

832 lines 35.2 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.wp_unslash($_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><span id="udc-connect-failed">'.$updraftcentral_host_plugin->retrieve_show_message('updraftcentral_connection_failed').'</span></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, $updraftplus;
431
432 $updraftplus->ensure_phpseclib();
433
434 if (!class_exists('UpdraftPlus_Remote_Communications_V2')) include_once($updraftcentral_host_plugin->get_host_dir().'/vendor/team-updraft/common-libs/src/updraft-rpc/class-udrpc2.php');
435 $ud_rpc = new UpdraftPlus_Remote_Communications_V2($indicator_name);
436 $ud_rpc->set_can_generate(true);
437
438 return $ud_rpc;
439 }
440
441 private function create_remote_control_key($index = false, $extra_info = array(), $post_it = false) {
442 global $updraftcentral_host_plugin;
443
444 $our_keys = $this->get_central_localkeys();
445 if (!is_array($our_keys)) $our_keys = array();
446
447 if (false === $index) {
448 if (empty($our_keys)) {
449 $index = 0;
450 } else {
451 $index = max(array_keys($our_keys))+1;
452 }
453 }
454
455 $name_hash = $index;
456
457 if (isset($our_keys[$name_hash])) {
458 unset($our_keys[$name_hash]);
459 }
460
461 $indicator_name = $this->indicator_name_from_index($name_hash);
462 $ud_rpc = $this->get_udrpc($indicator_name);
463
464 if ('__updraftpluscom' == $post_it) {
465 $post_it = defined('UPDRAFTPLUS_OVERRIDE_UDCOM_DESTINATION') ? UPDRAFTPLUS_OVERRIDE_UDCOM_DESTINATION : 'https://updraftplus.com/?updraftcentral_action=receive_key';
466 $post_it_description = 'UpdraftPlus.Com';
467 } else {
468 $post_it_description = $post_it;
469 }
470
471 // 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.
472
473 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.
474
475 $key_size = (empty($extra_info['key_size']) || !is_numeric($extra_info['key_size']) || $extra_info['key_size'] < 512) ? 2048 : (int) $extra_info['key_size'];
476
477 if (is_object($ud_rpc) && $ud_rpc->generate_new_keypair($key_size)) {
478
479 if ($post_it && empty($extra_info['mothership_firewalled'])) {
480
481 $p_url = parse_url($post_it);
482 if (is_array($p_url) && !empty($p_url['user'])) {
483 $http_username = $p_url['user'];
484 $http_password = empty($p_url['pass']) ? '' : $p_url['pass'];
485 $post_it = $p_url['scheme'].'://'.$p_url['host'];
486 if (!empty($p_url['port'])) $post_it .= ':'.$p_url['port'];
487 $post_it .= $p_url['path'];
488 if (!empty($p_url['query'])) $post_it .= '?'.$p_url['query'];
489 }
490
491 $post_options = array(
492 'timeout' => 90,
493 'body' => array(
494 'updraftcentral_action' => 'receive_key',
495 'key' => $ud_rpc->get_key_remote()
496 )
497 );
498
499 if (!empty($http_username)) {
500 $post_options['headers'] = array(
501 'Authorization' => 'Basic '.base64_encode($http_username.':'.$http_password)
502 );
503 }
504
505 // 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.
506
507 $updraftcentral_host_plugin->register_wp_http_option_hooks();
508
509 $sent_key = wp_remote_post(
510 $post_it,
511 $post_options
512 );
513
514 $updraftcentral_host_plugin->register_wp_http_option_hooks(false);
515
516 $connection_troubleshooting_url = 'https://updraftplus.com/troubleshooting-updraftcentral-connection-issues/';
517 if (is_wp_error($sent_key) || empty($sent_key)) {
518
519 $err_msg = sprintf($updraftcentral_host_plugin->retrieve_show_message('attempt_to_register_failed'), (string) $post_it_description, $connection_troubleshooting_url);
520 if (is_wp_error($sent_key)) $err_msg .= ' '.$sent_key->get_error_message().' ('.$sent_key->get_error_code().')';
521 return array(
522 'r' => $err_msg
523 );
524 }
525
526 $response = json_decode(wp_remote_retrieve_body($sent_key), true);
527
528 if (!is_array($response) || !isset($response['key_id']) || !isset($response['key_public'])) {
529 return array(
530 'r' => sprintf($updraftcentral_host_plugin->retrieve_show_message('attempt_to_register_failed'), (string) $post_it_description, $connection_troubleshooting_url),
531 'raw' => wp_remote_retrieve_body($sent_key)
532 );
533 }
534
535 $key_hash = hash('sha256', $ud_rpc->get_key_remote());
536
537 $local_bundle = $ud_rpc->get_portable_bundle('base64_with_count', $extra_info, array('key' => array('key_hash' => $key_hash, 'key_id' => $response['key_id'])));
538
539 } elseif ($post_it) {
540 // 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
541
542 if (is_array($extra_info)) {
543 $extra_info['mothership_firewalled_callback_url'] = wp_nonce_url(admin_url('admin-ajax.php'), 'updraftcentral_receivepublickey');
544 $extra_info['updraft_key_index'] = $index;
545 }
546
547
548 $local_bundle = $ud_rpc->get_portable_bundle('base64_with_count', $extra_info, array('key' => $ud_rpc->get_key_remote()));
549 }
550
551
552 if (isset($extra_info['name'])) {
553 $name = (string) $extra_info['name'];
554 unset($extra_info['name']);
555 } else {
556 $name = 'UpdraftCentral Remote Control';
557 }
558
559 $our_keys[$name_hash] = array(
560 'name' => $name,
561 'key' => $ud_rpc->get_key_local(),
562 'extra_info' => $extra_info,
563 'created' => time(),
564 );
565 // Store the other side's public key
566 if (!empty($response) && is_array($response) && !empty($response['key_public'])) {
567 $our_keys[$name_hash]['publickey_remote'] = $response['key_public'];
568 }
569 $this->update_central_localkeys($our_keys, true, 'no');
570
571 return array(
572 'bundle' => $local_bundle,
573 'r' => $updraftcentral_host_plugin->retrieve_show_message('key_created_successfully').' '.$updraftcentral_host_plugin->retrieve_show_message('copy_paste_key'),
574 );
575 }
576
577 return false;
578
579 }
580
581 /**
582 * Get the HTML for the keys table
583 *
584 * @return String
585 */
586 public function get_keys_table() {
587
588 // This is an additional check - it implies requirement for a dashboard context
589 if (!current_user_can('manage_options')) return;
590
591 global $updraftcentral_host_plugin;
592
593 $ret = '';
594
595 $our_keys = $this->get_central_localkeys();
596 if (!is_array($our_keys)) $our_keys = array();
597
598 if (empty($our_keys)) {
599 $ret .= '<tr><td colspan="2"><em>'.$updraftcentral_host_plugin->retrieve_show_message('no_updraftcentral_dashboards').'</em></td></tr>';
600 }
601
602 foreach ($our_keys as $i => $key) {
603
604 if (empty($key['extra_info'])) continue;
605
606 $user_id = $key['extra_info']['user_id'];
607
608 if (!empty($key['extra_info']['mothership'])) {
609
610 $mothership_url = $key['extra_info']['mothership'];
611
612 if ('__updraftpluscom' == $mothership_url) {
613 $reconstructed_url = 'https://updraftplus.com';
614 } else {
615 $purl = parse_url($mothership_url);
616 $path = empty($purl['path']) ? '' : $purl['path'];
617
618 $reconstructed_url = $purl['scheme'].'://'.$purl['host'].(!empty($purl['port']) ? ':'.$purl['port'] : '').$path;
619 }
620
621 } else {
622 $reconstructed_url = $updraftcentral_host_plugin->retrieve_show_message('unknown');
623 }
624
625 $name = $key['name'];
626
627 $user = get_user_by('id', $user_id);
628
629 $user_display = is_a($user, 'WP_User') ? $user->user_login.' ('.$user->user_email.')' : $updraftcentral_host_plugin->retrieve_show_message('unknown');
630
631 $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>';
632
633 if (!empty($key['created'])) {
634 $ret .= $updraftcentral_host_plugin->retrieve_show_message('created').' '.date_i18n(get_option('date_format').' '.get_option('time_format'), $key['created']).'.';
635 if (!empty($key['extra_info']['key_size'])) {
636 $ret .= ' '.sprintf($updraftcentral_host_plugin->retrieve_show_message('key_size'), $key['extra_info']['key_size']).'.';
637 }
638 $ret .= '<br>';
639 }
640
641 $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>';
642 }
643
644
645 ob_start();
646 ?>
647 <div id="updraftcentral_keys_content" style="margin: 10px 0;">
648 <?php if (!empty($our_keys)) { ?>
649 <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>
650 <?php } ?>
651 <table id="updraftcentral_keys_table">
652 <thead>
653 <tr>
654 <th style="text-align:left;"><?php $updraftcentral_host_plugin->retrieve_show_message('key_description', true); ?></th>
655 <th style="text-align:left;"><?php $updraftcentral_host_plugin->retrieve_show_message('details', true); ?></th>
656 </tr>
657 </thead>
658 <tbody>
659 <?php
660
661 echo $ret;
662
663 ?>
664 </tbody>
665 </table>
666 </div>
667 <?php
668 return ob_get_clean();
669 }
670
671 /**
672 * Return HTML markup for the 'create key' section
673 *
674 * @return String - the HTML
675 */
676 private function create_key_markup() {
677 global $updraftcentral_host_plugin;
678
679 ob_start();
680 ?>
681 <div class="create_key_container">
682 <h4 class="updraftcentral_wizard_stage1"> <?php $updraftcentral_host_plugin->retrieve_show_message('connect_to_updraftcentral_dashboard', true); ?></h4>
683 <table style="width: 100%; table-layout:fixed;">
684 <thead></thead>
685 <tbody>
686 <tr class="updraftcentral_wizard_stage1">
687 <td>
688 <div class="updraftcentral_wizard_mothership updraftcentral_wizard_option">
689 <label class="button-primary" tabindex="0">
690 <input checked="checked" type="radio" name="updraftcentral_mothership" id="updraftcentral_mothership_updraftpluscom" style="display: none;">
691 UpdraftPlus.Com
692 </label><br>
693 <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>
694
695 </div>
696 <div class="updraftcentral_wizard_self_hosted_stage1 updraftcentral_wizard_option">
697 <label class="button-primary" tabindex="0">
698 <input type="radio" name="updraftcentral_mothership" id="updraftcentral_mothership_other" style="display: none;">
699 <?php $updraftcentral_host_plugin->retrieve_show_message('self_hosted_dashboard', true);?>
700 </label><br>
701 <div><?php printf($updraftcentral_host_plugin->retrieve_show_message('website_installed'), '<a target="_blank" href="https://wordpress.org/plugins/updraftcentral/">UpdraftCentral</a>'); ?></div>
702 </div>
703 <div class="updraftcentral_wizard_self_hosted_stage2" style="float:left; clear:left;display:none;">
704 <p style="font-size: 13px;"><?php echo $updraftcentral_host_plugin->retrieve_show_message('enter_url');?></p>
705 <p style="font-size: 13px;" id="updraftcentral_wizard_stage1_error"></p>
706 <input disabled="disabled" id="updraftcentral_keycreate_mothership" type="text" size="40" placeholder="<?php $updraftcentral_host_plugin->retrieve_show_message('updraftcentral_dashboard_url', true); ?>" value="">
707 <button type="button" class="button button-primary" id="updraftcentral_stage2_go"><?php $updraftcentral_host_plugin->retrieve_show_message('next', true); ?></button>
708 </div>
709 </td>
710 </tr>
711
712 <tr class="updraft_debugrow updraftcentral_wizard_stage2" style="display: none;">
713 <h4 class="updraftcentral_wizard_stage2" style="display: none;"><?php $updraftcentral_host_plugin->retrieve_show_message('updraftcentral_connection_details', true); ?></h4>
714 <td class="updraftcentral_keycreate_description">
715 <?php $updraftcentral_host_plugin->retrieve_show_message('description', true); ?>:
716 <input id="updraftcentral_keycreate_description" type="text" size="20" placeholder="<?php $updraftcentral_host_plugin->retrieve_show_message('enter_description', true); ?>" value="" >
717 </td>
718 </tr>
719
720 <tr class="updraft_debugrow updraftcentral_wizard_stage2" style="display: none;">
721 <td>
722 <?php $updraftcentral_host_plugin->retrieve_show_message('encryption_key_size', true); ?>
723 <select style="" id="updraftcentral_keycreate_keysize">
724 <option value="512"><?php echo sprintf($updraftcentral_host_plugin->retrieve_show_message('bits').' - '.$updraftcentral_host_plugin->retrieve_show_message('easy_to_break'), '512'); ?></option>
725 <option value="1024"><?php echo sprintf($updraftcentral_host_plugin->retrieve_show_message('bits').' - '.$updraftcentral_host_plugin->retrieve_show_message('faster'), '1024'); ?></option>
726 <option value="2048" selected="selected"><?php echo sprintf($updraftcentral_host_plugin->retrieve_show_message('bytes').' - '.$updraftcentral_host_plugin->retrieve_show_message('recommended'), '2048'); ?></option>
727 <option value="4096"><?php echo sprintf($updraftcentral_host_plugin->retrieve_show_message('bits').' - '.$updraftcentral_host_plugin->retrieve_show_message('slower'), '4096'); ?></option>
728 </select>
729 <br>
730 <div id="updraftcentral_keycreate_mothership_firewalled_container">
731 <label>
732 <input id="updraftcentral_keycreate_mothership_firewalled" type="checkbox">
733 <?php $updraftcentral_host_plugin->retrieve_show_message('use_alternative_method', true); ?>
734 <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>
735 <p id="updraftcentral_keycreate_altmethod_moreinfo" style="display:none; border: 1px dotted; padding: 3px; margin: 2px 10px 2px 24px;">
736 <em><?php $updraftcentral_host_plugin->retrieve_show_message('this_is_useful', true);?></em>
737 </p>
738 </label>
739 </div>
740 </td>
741 </tr>
742
743 <tr class="updraft_debugrow updraftcentral_wizard_stage2" style="display: none;">
744 <td>
745 <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>
746 </td>
747 </tr>
748 <tr class="updraft_debugrow updraftcentral_wizard_stage2" style="display: none;">
749 <td>
750 <a id="updraftcentral_stage1_go"><?php $updraftcentral_host_plugin->retrieve_show_message('back', true); ?></a>
751 </td>
752 </tr>
753 </tbody>
754 </table>
755 <div id="updraft-copy-modal" title="<?php _e('Copy to clipboard', 'updraftplus');?>">
756 <p>
757 <?php echo __('Your web browser prevented the copy operation.', 'updraftplus').' '.'<a href="https://updraftplus.com/faqs/how-do-i-set-clipboard-permissions-for-different-browsers/" target="__blank">'.' '.__('Follow this link to read about how to set browser permission', 'updraftplus').'</a>'; ?>
758 </p>
759 </div>
760 </div>
761 <?php
762 return ob_get_clean();
763 }
764
765 /**
766 * Get log event viewer mark-up
767 *
768 * @return String - the HTML
769 */
770 private function get_log_markup() {
771 global $updraftcentral_host_plugin;
772
773 ob_start();
774 ?>
775 <div id="updraftcentral_view_log_container" style="margin: 10px 0;">
776 <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>
777 <pre id="updraftcentral_view_log_contents" style="min-height: 110px; padding: 0 4px;">
778 </pre>
779 </div>
780 <?php
781 return ob_get_clean();
782 }
783
784 /**
785 * Echo the debug-tools dashboard HTML. Called by the WP action updraftplus_debugtools_dashboard.
786 */
787 public function debugtools_dashboard() {
788
789 $this->enqueue_central_scripts();
790
791 global $updraftcentral_host_plugin;
792
793 $including_desc = '';
794 if (function_exists('get_current_screen')) {
795 $screen = get_current_screen();
796 $hosts = apply_filters('updraftcentral_host_plugins', array());
797 $includes = $updraftcentral_host_plugin->retrieve_show_message('including_description');
798
799 foreach ($hosts as $plugin) {
800 if (false !== stripos($screen->id, $plugin)) {
801 $key = str_replace('-', '_', strtolower($plugin)).'_desc';
802 if (isset($includes[$key])) {
803 $including_desc = $includes[$key];
804 break;
805 }
806 }
807 }
808 }
809
810 $updraftcentral_description = preg_replace('/\s+/', ' ', sprintf($updraftcentral_host_plugin->retrieve_show_message('updraftcentral_description'), $including_desc));
811 ?>
812 <div class="advanced_tools updraft_central">
813 <h3><?php $updraftcentral_host_plugin->retrieve_show_message('updraftcentral_remote_control', true); ?></h3>
814 <p>
815 <?php echo $updraftcentral_description.' <a target="_blank" href="https://updraftcentral.com">'.$updraftcentral_host_plugin->retrieve_show_message('read_more').'</a>'; ?>
816 </p>
817 <div style="min-height: 310px;" id="updraftcentral_keys">
818 <?php echo $this->create_key_markup(); ?>
819 <?php echo $this->get_keys_table(); ?>
820 <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>
821 <?php echo $this->get_log_markup(); ?>
822 </div>
823 </div>
824 <?php
825 }
826 }
827
828 endif;
829
830 global $updraftcentral_main;
831 $updraftcentral_main = new UpdraftCentral_Main();
832