PluginProbe
UpdraftPlus: WP Backup & Migration Plugin / 1.16.5
UpdraftPlus: WP Backup & Migration Plugin v1.16.5
1.26.7 1.26.6 1.26.5 1.26.4 1.26.3 1.9.19 1.9.25 1.9.26 1.9.30 1.9.31 1.9.32 1.9.4 1.9.40 1.9.41 1.9.42 1.9.43 1.9.44 1.9.45 1.9.46 1.9.5 1.9.50 1.9.51 1.9.60 1.9.62 1.9.63 All 371 releases
updraftplus / central / bootstrap.php

bootstrap.php in UpdraftPlus: WP Backup & Migration Plugin 1.16.5, at central/bootstrap.php

612 lines 25.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('UPDRAFTPLUS_DIR')) die('No access.');
4
5 if (defined('UPDRAFTCENTRAL_CLIENT_DIR')) return;
6
7 define('UPDRAFTCENTRAL_CLIENT_DIR', dirname(__FILE__));
8
9 // This file is included during plugins_loaded
10
11 // Load the listener class that we rely on to pick up messages
12 if (!class_exists('UpdraftPlus_UpdraftCentral_Listener')) require_once('listener.php');
13
14 class UpdraftPlus_UpdraftCentral_Main {
15
16 public function __construct() {
17
18 // Add the section to the 'advanced tools' page
19 add_action('updraftplus_debugtools_dashboard', array($this, 'debugtools_dashboard'), 20);
20 add_action('udrpc_log', array($this, 'udrpc_log'), 10, 3);
21
22 add_action('wp_ajax_updraftcentral_receivepublickey', array($this, 'wp_ajax_updraftcentral_receivepublickey'));
23 add_action('wp_ajax_nopriv_updraftcentral_receivepublickey', array($this, 'wp_ajax_updraftcentral_receivepublickey'));
24
25 // The 'updraftplus' commands are registered in UpdraftPlus::plugins_loaded()
26 $command_classes = apply_filters('updraftplus_remotecontrol_command_classes', array(
27 'core' => 'UpdraftCentral_Core_Commands',
28 'updates' => 'UpdraftCentral_Updates_Commands',
29 'users' => 'UpdraftCentral_Users_Commands',
30 'comments' => 'UpdraftCentral_Comments_Commands',
31 'analytics' => 'UpdraftCentral_Analytics_Commands',
32 'plugin' => 'UpdraftCentral_Plugin_Commands',
33 'theme' => 'UpdraftCentral_Theme_Commands',
34 'posts' => 'UpdraftCentral_Posts_Commands'
35 ));
36
37 // 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.
38 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;
39
40 // Remote control keys
41 // These are different from the remote send keys, which are set up in the Migrator add-on
42 $our_keys = UpdraftPlus_Options::get_updraft_option('updraft_central_localkeys');
43 if (is_array($our_keys) && !empty($our_keys)) {
44 $remote_control = new UpdraftPlus_UpdraftCentral_Listener($our_keys, $command_classes);
45 }
46
47 }
48
49 public function wp_ajax_updraftcentral_receivepublickey() {
50
51 // The actual nonce check is done in the method below
52 if (empty($_GET['_wpnonce']) || empty($_GET['public_key']) || !isset($_GET['updraft_key_index'])) die;
53
54 $result = $this->receive_public_key();
55 if (!is_array($result) || empty($result['responsetype'])) die;
56
57 echo '<html><head><title>UpdraftCentral</title></head><body><h1>'.__('UpdraftCentral Connection', 'updraftplus').'</h1><h2>'.htmlspecialchars(network_site_url()).'</h2><p>';
58
59 if ('ok' == $result['responsetype']) {
60 echo __('An UpdraftCentral connection has been made successfully.', 'updraftplus');
61 } else {
62 echo '<strong>'.__('A new UpdraftCentral connection has not been made.', 'updraftplus').'</strong><br>';
63 switch ($result['code']) {
64 case 'unknown_key':
65 echo __('The key referred to was unknown.', 'updraftplus');
66 break;
67 case 'not_logged_in':
68 echo __('You are not logged into this WordPress site in your web browser.', 'updraftplus').' '.__('You must visit this URL in the same browser and login session as you created the key in.', 'updraftplus');
69 break;
70 case 'nonce_failure':
71 echo 'Security check. ';
72 _e('You must visit this link in the same browser and login session as you created the key in.', 'updraftplus');
73 break;
74 case 'already_have':
75 echo __('This connection appears to already have been made.', 'updraftplus');
76 break;
77 default:
78 echo htmlspecialchars(print_r($result, true));
79 break;
80 }
81 }
82
83 echo '</p><p><a href="'.UpdraftPlus::get_current_clean_url().'" onclick="window.close();">'.__('Close...', 'updraftplus').'</a></p>';
84 die;
85 }
86
87 /**
88 * Checks _wpnonce, and if successful, saves the public key found in $_GET
89 *
90 * @return Array - with keys responsetype (can be 'error' or 'ok') and code, indicating whether the parse was successful
91 */
92 private function receive_public_key() {
93
94 if (!is_user_logged_in()) {
95 return array('responsetype' => 'error', 'code' => 'not_logged_in');
96 }
97
98 if (!wp_verify_nonce($_GET['_wpnonce'], 'updraftcentral_receivepublickey')) return array('responsetype' => 'error', 'code' => 'nonce_failure');
99
100 $updraft_key_index = $_GET['updraft_key_index'];
101
102 $our_keys = UpdraftPlus_Options::get_updraft_option('updraft_central_localkeys');
103 if (!is_array($our_keys)) $our_keys = array();
104
105 if (!isset($our_keys[$updraft_key_index])) {
106 return array('responsetype' => 'error', 'code' => 'unknown_key');
107 }
108
109 if (!empty($our_keys[$updraft_key_index]['publickey_remote'])) {
110 return array('responsetype' => 'error', 'code' => 'already_have');
111 }
112
113 $our_keys[$updraft_key_index]['publickey_remote'] = base64_decode($_GET['public_key']);
114 UpdraftPlus_Options::update_updraft_option('updraft_central_localkeys', $our_keys, true, 'no');
115
116 return array('responsetype' => 'ok', 'code' => 'ok');
117 }
118
119 /**
120 * Action parameters, from udrpc: $message, $level, $this->key_name_indicator, $this->debug, $this
121 *
122 * @param string $message The log message
123 * @param string $level Log level
124 * @param string $key_name_indicator This indicates the key name
125 */
126 public function udrpc_log($message, $level, $key_name_indicator) {
127 $udrpc_log = get_site_option('updraftcentral_client_log');
128 if (!is_array($udrpc_log)) $udrpc_log = array();
129
130 $new_item = array(
131 'time' => time(),
132 'level' => $level,
133 'message' => $message,
134 'key_name_indicator' => $key_name_indicator
135 );
136
137 if (!empty($_SERVER['REMOTE_ADDR'])) {
138 $new_item['remote_ip'] = $_SERVER['REMOTE_ADDR'];
139 }
140 if (!empty($_SERVER['HTTP_USER_AGENT'])) {
141 $new_item['http_user_agent'] = $_SERVER['HTTP_USER_AGENT'];
142 }
143 if (!empty($_SERVER['HTTP_X_SECONDARY_USER_AGENT'])) {
144 $new_item['http_secondary_user_agent'] = $_SERVER['HTTP_X_SECONDARY_USER_AGENT'];
145 }
146
147 $udrpc_log[] = $new_item;
148
149 if (count($udrpc_log) > 50) array_shift($udrpc_log);
150
151 update_site_option('updraftcentral_client_log', $udrpc_log);
152 }
153
154 /**
155 * Delete UpdraftCentral Key
156 *
157 * @param array $key_id key_id of UpdraftCentral
158 * @return array which contains deleted flag and key table. If error, Returns array which contains fatal_error flag and fatal_error_message
159 */
160 public function delete_key($key_id) {
161 $our_keys = UpdraftPlus_Options::get_updraft_option('updraft_central_localkeys');
162 if (!is_array($our_keys)) $our_keys = array();
163 if (isset($our_keys[$key_id])) {
164 unset($our_keys[$key_id]);
165 UpdraftPlus_Options::update_updraft_option('updraft_central_localkeys', $our_keys);
166 }
167 return array('deleted' => 1, 'keys_table' => $this->get_keys_table());
168 }
169
170 /**
171 * Get UpdraftCentral Log
172 *
173 * @param array $params which have action, subaction and nonce
174 * @return array which contains log_contents. If error, Returns array which contains fatal_error flag and fatal_error_message
175 */
176 public function get_log($params) {// phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.Found
177
178 $udrpc_log = get_site_option('updraftcentral_client_log');
179 if (!is_array($udrpc_log)) $udrpc_log = array();
180
181 $log_contents = '';
182
183 // Events are appended to the array in the order they happen. So, reversing the order gets them into most-recent-first order.
184 rsort($udrpc_log);
185
186 if (empty($udrpc_log)) {
187 $log_contents = '<em>'.__('(Nothing yet logged)', 'updraftplus').'</em>';
188 }
189
190 foreach ($udrpc_log as $m) {
191
192 // Skip invalid data
193 if (!isset($m['time'])) continue;
194
195 $time = gmdate('Y-m-d H:i:s O', $m['time']);
196 // $level is not used yet. We could put the message in different colours for different levels, if/when it becomes used.
197
198 $key_name_indicator = empty($m['key_name_indicator']) ? '' : $m['key_name_indicator'];
199
200 $log_contents .= '<span title="'.esc_attr(print_r($m, true)).'">'."$time ";
201
202 if (!empty($m['remote_ip'])) $log_contents .= '['.htmlspecialchars($m['remote_ip']).'] ';
203
204 $log_contents .= "[".htmlspecialchars($key_name_indicator)."] ".htmlspecialchars($m['message'])."</span>\n";
205 }
206
207 return array('log_contents' => $log_contents);
208
209 }
210
211 public function create_key($params) {
212 // Use the site URL - this means that if the site URL changes, communication ends; which is the case anyway
213 $user = wp_get_current_user();
214
215 $where_send = empty($params['where_send']) ? '' : (string) $params['where_send'];
216
217 if ('__updraftpluscom' != $where_send) {
218 $purl = parse_url($where_send);
219 if (empty($purl) || !array($purl) || empty($purl['scheme']) || empty($purl['host'])) return array('error' => __('An invalid URL was entered', 'updraftplus'));
220 }
221
222 // ENT_HTML5 exists only on PHP 5.4+
223 // @codingStandardsIgnoreLine
224 $flags = defined('ENT_HTML5') ? ENT_QUOTES | ENT_HTML5 : ENT_QUOTES;
225
226 $extra_info = array(
227 'user_id' => $user->ID,
228 'user_login' => $user->user_login,
229 'ms_id' => get_current_blog_id(),
230 'site_title' => html_entity_decode(get_bloginfo('name'), $flags),
231 );
232
233 if ($where_send) {
234 $extra_info['mothership'] = $where_send;
235 if (!empty($params['mothership_firewalled'])) {
236 $extra_info['mothership_firewalled'] = true;
237 }
238 }
239
240 if (!empty($params['key_description'])) {
241 $extra_info['name'] = (string) $params['key_description'];
242 }
243
244 $key_size = (empty($params['key_size']) || !is_numeric($params['key_size']) || $params['key_size'] < 512) ? 2048 : (int) $params['key_size'];
245
246 $extra_info['key_size'] = $key_size;
247
248 $created = $this->create_remote_control_key(false, $extra_info, $where_send);
249
250 if (is_array($created)) {
251 $created['keys_table'] = $this->get_keys_table();
252
253 $created['keys_guide'] = '<h2 class="updraftcentral_wizard_success">'. __('UpdraftCentral key created successfully') .'</h2>';
254
255 if ('__updraftpluscom' != $where_send) {
256 $created['keys_guide'] .= '<div class="updraftcentral_wizard_success"><p>'.sprintf(__('You now need to copy the key below and enter it at your %s.', 'updraftplus'), '<a href="'.$where_send.'" target="_blank">UpdraftCentral dashboard</a>').'</p><p>'.__('At your UpdraftCentral dashboard you should press the "Add Site" button then paste the key in the input box.', 'updraftplus').'</p><p>'.sprintf(__('Detailed instructions for this can be found at %s', 'updraftplus'), '<a target="_blank" href="https://updraftplus.com/updraftcentral-how-to-add-a-site/">UpdraftPlus.com</a>').'</p></div>';
257 } else {
258 $created['keys_guide'] .= '<div class="updraftcentral_wizard_success"><p>'. sprintf(__('You can now control this site via your UpdraftCentral dashboard at %s.', 'updraftplus'), '<a target="_blank" href="http://updraftplus.com/my-account/remote-control/">UpdraftPlus.com</a>').'</p></div>';
259 }
260 }
261
262 return $created;
263 }
264
265 private function indicator_name_from_index($index) {
266 return $index.'.central.updraftplus.com';
267 }
268
269 private function create_remote_control_key($index = false, $extra_info = array(), $post_it = false) {
270
271 global $updraftplus;
272
273 $our_keys = UpdraftPlus_Options::get_updraft_option('updraft_central_localkeys');
274 if (!is_array($our_keys)) $our_keys = array();
275
276 if (false === $index) {
277 if (empty($our_keys)) {
278 $index = 0;
279 } else {
280 $index = max(array_keys($our_keys))+1;
281 }
282 }
283
284 $name_hash = $index;
285
286 if (isset($our_keys[$name_hash])) {
287 unset($our_keys[$name_hash]);
288 }
289
290 $indicator_name = $this->indicator_name_from_index($name_hash);
291
292 $ud_rpc = $updraftplus->get_udrpc($indicator_name);
293
294 $send_to_updraftpluscom = false;
295 if ('__updraftpluscom' == $post_it) {
296 $send_to_updraftpluscom = true;
297 $post_it = defined('UPDRAFTPLUS_OVERRIDE_UDCOM_DESTINATION') ? UPDRAFTPLUS_OVERRIDE_UDCOM_DESTINATION : 'https://updraftplus.com/?updraftcentral_action=receive_key';
298 $post_it_description = 'UpdraftPlus.Com';
299 } else {
300 $post_it_description = $post_it;
301 }
302
303 // 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.
304
305 @set_time_limit(UPDRAFTPLUS_SET_TIME_LIMIT);
306
307 $key_size = (empty($extra_info['key_size']) || !is_numeric($extra_info['key_size']) || $extra_info['key_size'] < 512) ? 2048 : (int) $extra_info['key_size'];
308
309 if (is_object($ud_rpc) && $ud_rpc->generate_new_keypair($key_size)) {
310
311 if ($post_it && empty($extra_info['mothership_firewalled'])) {
312
313 $p_url = parse_url($post_it);
314 if (is_array($p_url) && !empty($p_url['user'])) {
315 $http_username = $p_url['user'];
316 $http_password = empty($p_url['pass']) ? '' : $p_url['pass'];
317 $post_it = $p_url['scheme'].'://'.$p_url['host'];
318 if (!empty($p_url['port'])) $post_it .= ':'.$p_url['port'];
319 $post_it .= $p_url['path'];
320 if (!empty($p_url['query'])) $post_it .= '?'.$p_url['query'];
321 }
322
323 $post_options = array(
324 'timeout' => 90,
325 'body' => array(
326 'updraftcentral_action' => 'receive_key',
327 'key' => $ud_rpc->get_key_remote()
328 )
329 );
330
331 if (!empty($http_username)) {
332 $post_options['headers'] = array(
333 'Authorization' => 'Basic '.base64_encode($http_username.':'.$http_password)
334 );
335 }
336
337 // 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.
338
339 $updraftplus->register_wp_http_option_hooks();
340
341 $sent_key = wp_remote_post(
342 $post_it,
343 $post_options
344 );
345
346 $updraftplus->register_wp_http_option_hooks(false);
347
348 if (is_wp_error($sent_key) || empty($sent_key)) {
349 $err_msg = sprintf(__('A key was created, but the attempt to register it with %s was unsuccessful - please try again later.', 'updraftplus'), (string) $post_it_description);
350 if (is_wp_error($sent_key)) $err_msg .= ' '.$sent_key->get_error_message().' ('.$sent_key->get_error_code().')';
351 return array(
352 'r' => $err_msg
353 );
354 }
355
356 $response = json_decode(wp_remote_retrieve_body($sent_key), true);
357
358 if (!is_array($response) || !isset($response['key_id']) || !isset($response['key_public'])) {
359 return array(
360 'r' => sprintf(__('A key was created, but the attempt to register it with %s was unsuccessful - please try again later.', 'updraftplus'), (string) $post_it_description),
361 'raw' => wp_remote_retrieve_body($sent_key)
362 );
363 }
364
365 $key_hash = hash('sha256', $ud_rpc->get_key_remote());
366
367 $local_bundle = $ud_rpc->get_portable_bundle('base64_with_count', $extra_info, array('key' => array('key_hash' => $key_hash, 'key_id' => $response['key_id'])));
368
369 } elseif ($post_it) {
370 // 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
371
372 if (is_array($extra_info)) {
373 $extra_info['mothership_firewalled_callback_url'] = wp_nonce_url(admin_url('admin-ajax.php'), 'updraftcentral_receivepublickey');
374 $extra_info['updraft_key_index'] = $index;
375 }
376
377
378 $local_bundle = $ud_rpc->get_portable_bundle('base64_with_count', $extra_info, array('key' => $ud_rpc->get_key_remote()));
379 }
380
381
382 if (isset($extra_info['name'])) {
383 $name = (string) $extra_info['name'];
384 unset($extra_info['name']);
385 } else {
386 $name = 'UpdraftCentral Remote Control';
387 }
388
389 $our_keys[$name_hash] = array(
390 'name' => $name,
391 'key' => $ud_rpc->get_key_local(),
392 'extra_info' => $extra_info,
393 'created' => time(),
394 );
395 // Store the other side's public key
396 if (!empty($response) && is_array($response) && !empty($response['key_public'])) {
397 $our_keys[$name_hash]['publickey_remote'] = $response['key_public'];
398 }
399 UpdraftPlus_Options::update_updraft_option('updraft_central_localkeys', $our_keys, true, 'no');
400
401 return array(
402 'bundle' => $local_bundle,
403 'r' => __('Key created successfully.', 'updraftplus').' '.__('You must copy and paste this key now - it cannot be shown again.', 'updraftplus'),
404 // 'selector' => $this->get_remotesites_selector(array()),
405 // 'ourkeys' => $this->list_our_keys($our_keys),
406 );
407 }
408
409 return false;
410
411 }
412
413 public function get_keys_table() {
414
415 $ret = '';
416
417 $our_keys = UpdraftPlus_Options::get_updraft_option('updraft_central_localkeys');
418 if (!is_array($our_keys)) $our_keys = array();
419
420 if (empty($our_keys)) {
421 $ret .= '<tr><td colspan="2"><em>'.__('There are no UpdraftCentral dashboards that can currently control this site.', 'updraftplus').'</em></td></tr>';
422 }
423
424 foreach ($our_keys as $i => $key) {
425
426 if (empty($key['extra_info'])) continue;
427
428 $user_id = $key['extra_info']['user_id'];
429
430 if (!empty($key['extra_info']['mothership'])) {
431
432 $mothership_url = $key['extra_info']['mothership'];
433
434 if ('__updraftpluscom' == $mothership_url) {
435 $reconstructed_url = 'https://updraftplus.com';
436 } else {
437 $purl = parse_url($mothership_url);
438 $path = empty($purl['path']) ? '' : $purl['path'];
439
440 $reconstructed_url = $purl['scheme'].'://'.$purl['host'].(!empty($purl['port']) ? ':'.$purl['port'] : '').$path;
441 }
442
443 } else {
444 $reconstructed_url = __('Unknown', 'updraftplus');
445 }
446
447 $name = $key['name'];
448
449 $user = get_user_by('id', $user_id);
450
451 $user_display = is_a($user, 'WP_User') ? $user->user_login.' ('.$user->user_email.')' : __('Unknown', 'updraftplus');
452
453 $ret .= '<tr class="updraft_debugrow"><td style="vertical-align:top;">'.htmlspecialchars($name).' ('.htmlspecialchars($i).')</td><td>'.__("Access this site as user:", 'updraftplus')." ".htmlspecialchars($user_display)."<br>".__('Public key was sent to:', 'updraftplus').' '.htmlspecialchars($reconstructed_url).'<br>';
454
455 if (!empty($key['created'])) {
456 $ret .= __('Created:', 'updraftplus').' '.date_i18n(get_option('date_format').' '.get_option('time_format'), $key['created']).'.';
457 if (!empty($key['extra_info']['key_size'])) {
458 $ret .= ' '.sprintf(__('Key size: %d bits', 'updraftplus'), $key['extra_info']['key_size']).'.';
459 }
460 $ret .= '<br>';
461 }
462
463 $ret .= '<a href="'.UpdraftPlus::get_current_clean_url().'" data-key_id="'.esc_attr($i).'" class="updraftcentral_key_delete">'.__('Delete...', 'updraftplus').'</a></td></tr>';
464 }
465
466
467 ob_start();
468 ?>
469 <div id="updraftcentral_keys_content" style="margin: 10px 0;">
470 <?php if (!empty($our_keys)) { ?>
471 <a href="<?php echo UpdraftPlus::get_current_clean_url(); ?>" class="updraftcentral_keys_show hidden-in-updraftcentral"><?php printf(__('Manage existing keys (%d)...', 'updraftplus'), count($our_keys)); ?></a>
472 <?php } ?>
473 <table id="updraftcentral_keys_table">
474 <thead>
475 <tr>
476 <th style="text-align:left;"><?php _e('Key description', 'updraftplus'); ?></th>
477 <th style="text-align:left;"><?php _e('Details', 'updraftplus'); ?></th>
478 </tr>
479 </thead>
480 <tbody>
481 <?php
482
483 echo $ret;
484
485 ?>
486 </tbody>
487 </table>
488 </div>
489 <?php
490 return ob_get_clean();
491 }
492
493 /**
494 * Return HTML markup for the 'create key' section
495 *
496 * @return String - the HTML
497 */
498 private function create_key_markup() {
499 ob_start();
500 ?>
501 <div class="create_key_container">
502 <h4 class="updraftcentral_wizard_stage1"> <?php _e('Connect this site to an UpdraftCentral dashboard found at...', 'updraftplus'); ?></h4>
503 <table style="width: 100%; table-layout:fixed;">
504 <thead></thead>
505 <tbody>
506 <tr class="updraftcentral_wizard_stage1">
507 <td>
508 <div class="updraftcentral_wizard_mothership updraftcentral_wizard_option">
509 <label class="button-primary">
510 <input checked="checked" type="radio" name="updraftcentral_mothership" id="updraftcentral_mothership_updraftpluscom" style="display: none;">
511 <?php _e('UpdraftPlus.Com', 'updraftplus');?>
512 </label><br>
513 <div><?php printf(__('i.e. if you have %s there', 'updraftplus'), '<a target="_blank" href="https://updraftplus.com/my-account/">'.__('an account', 'updraftplus').'</a>'); ?></div>
514
515 </div>
516 <div class="updraftcentral_wizard_self_hosted_stage1 updraftcentral_wizard_option">
517 <label class="button-primary">
518 <input type="radio" name="updraftcentral_mothership" id="updraftcentral_mothership_other" style="display: none;">
519 <?php _e('Self-hosted dashboard', 'updraftplus');?>
520 </label><br>
521 <div><?php printf(__('A website where you have installed %s', 'updraftplus'), '<a target="_blank" href="https://wordpress.org/plugins/updraftcentral/">UpdraftCentral</a>'); ?></div>
522 </div>
523 <div class="updraftcentral_wizard_self_hosted_stage2" style="float:left; clear:left;display:none;">
524 <p style="font-size: 13px;"><?php echo __('Enter the URL where your self-hosted install of UpdraftCentral is located:', 'updraftplus');?></p>
525 <p style="font-size: 13px;" id="updraftcentral_wizard_stage1_error"></p>
526 <input disabled="disabled" id="updraftcentral_keycreate_mothership" type="text" size="40" placeholder="<?php _e('URL for the site of your UpdraftCentral dashboard', 'updraftplus'); ?>" value="">
527 <button type="button" class="button button-primary" id="updraftcentral_stage2_go"><?php _e('Next', 'updraftplus'); ?></button>
528 </div>
529 </td>
530 </tr>
531
532 <tr class="updraft_debugrow updraftcentral_wizard_stage2" style="display: none;">
533 <h4 class="updraftcentral_wizard_stage2" style="display: none;"><?php _e('UpdraftCentral dashboard connection details', 'updraftplus'); ?></h4>
534 <td class="updraftcentral_keycreate_description">
535 <?php _e('Description', 'updraftplus'); ?>:
536 <input id="updraftcentral_keycreate_description" type="text" size="20" placeholder="<?php _e('Enter any description', 'updraftplus'); ?>" value="" >
537 </td>
538 </tr>
539
540 <tr class="updraft_debugrow updraftcentral_wizard_stage2" style="display: none;">
541 <td>
542 <?php _e('Encryption key size:', 'updraftplus'); ?>
543 <select style="" id="updraftcentral_keycreate_keysize">
544 <option value="512"><?php echo sprintf(__('%s bits', 'updraftplus').' - '.__('easy to break, fastest', 'updraftplus'), '512'); ?></option>
545 <option value="1024"><?php echo sprintf(__('%s bits', 'updraftplus').' - '.__('faster (possibility for slow PHP installs)', 'updraftplus'), '1024'); ?></option>
546 <option value="2048" selected="selected"><?php echo sprintf(__('%s bytes', 'updraftplus').' - '.__('recommended', 'updraftplus'), '2048'); ?></option>
547 <option value="4096"><?php echo sprintf(__('%s bits', 'updraftplus').' - '.__('slower, strongest', 'updraftplus'), '4096'); ?></option>
548 </select>
549 <br>
550 <div id="updraftcentral_keycreate_mothership_firewalled_container">
551 <label>
552 <input id="updraftcentral_keycreate_mothership_firewalled" type="checkbox">
553 <?php _e('Use the alternative method for making a connection with the dashboard.', 'updraftplus'); ?>
554 <a href="<?php echo UpdraftPlus::get_current_clean_url(); ?>" id="updraftcentral_keycreate_altmethod_moreinfo_get"><?php _e('More information...', 'updraftplus'); ?></a>
555 <p id="updraftcentral_keycreate_altmethod_moreinfo" style="display:none; border: 1px dotted; padding: 3px; margin: 2px 10px 2px 24px;">
556 <em><?php _e('This is useful if the dashboard webserver cannot be contacted with incoming traffic by this website (for example, this is the case if this website is hosted on the public Internet, but the UpdraftCentral dashboard is on localhost, or on an Intranet, or if this website has an outgoing firewall), or if the dashboard website does not have a SSL certificate.');?></em>
557 </p>
558 </label>
559 </div>
560 </td>
561 </tr>
562
563 <tr class="updraft_debugrow updraftcentral_wizard_stage2" style="display: none;">
564 <td>
565 <button style="margin-top: 5px;" type="button" class="button button-primary" id="updraftcentral_keycreate_go"><?php _e('Create', 'updraftplus'); ?></button>
566 </td>
567 </tr>
568 <tr class="updraft_debugrow updraftcentral_wizard_stage2" style="display: none;">
569 <td>
570 <a id="updraftcentral_stage1_go"><?php _e('Back...', 'updraftplus'); ?></a>
571 </td>
572 </tr>
573 </tbody>
574 </table>
575 </div>
576 <?php
577 return ob_get_clean();
578 }
579
580 private function create_log_markup() {
581 ob_start();
582 ?>
583 <div id="updraftcentral_view_log_container" style="margin: 10px 0;">
584 <a href="<?php echo UpdraftPlus::get_current_clean_url(); ?>" id="updraftcentral_view_log"><?php _e('View recent UpdraftCentral log events', 'updraftplus'); ?>...</a><br>
585 <pre id="updraftcentral_view_log_contents" style="min-height: 110px; padding: 0 4px;">
586 </pre>
587 </div>
588 <?php
589 return ob_get_clean();
590 }
591
592 public function debugtools_dashboard() {
593 ?>
594 <div class="advanced_tools updraft_central">
595 <h3><?php _e('UpdraftCentral (Remote Control)', 'updraftplus'); ?></h3>
596 <p>
597 <?php echo __('UpdraftCentral enables control of your WordPress sites (including management of backups and updates) from a central dashboard.', 'updraftplus').' <a target="_blank" href="https://updraftcentral.com">'.__('Read more about it here.', 'updraftplus').'</a>'; ?>
598 </p>
599 <div style="min-height: 310px;" id="updraftcentral_keys">
600 <?php echo $this->create_key_markup(); ?>
601 <?php echo $this->get_keys_table(); ?>
602 <button style="display: none;" type="button" class="button button-primary" id="updraftcentral_wizard_go"><?php _e('Create another key', 'updraftplus'); ?></button>
603 <?php echo $this->create_log_markup(); ?>
604 </div>
605 </div>
606 <?php
607 }
608 }
609
610 global $updraftplus_updraftcentral_main;
611 $updraftplus_updraftcentral_main = new UpdraftPlus_UpdraftCentral_Main();
612