PluginProbe ʕ •ᴥ•ʔ
Transferito: WP Migration / 14.0.0
Transferito: WP Migration v14.0.0
trunk 11.4.0 12.0.0 13.1.0 14.0.0 14.0.11 14.0.7 14.1.0 14.1.1 14.1.2 14.1.3 14.1.4
transferito / src / Models / Settings / Setup.php
transferito / src / Models / Settings Last commit date
Setup.php 10 months ago Telemetry.php 10 months ago
Setup.php
570 lines
1 <?php
2
3 namespace Transferito\Models\Settings;
4
5 use Transferito\Controllers\Transfer as TransferController;
6 use Transferito\Models\Core\Api as TransferitoAPI;
7 use Transferito\Models\Core\Config;
8
9 if (!defined('ABSPATH')) exit;
10
11 class Setup {
12
13 /**
14 * Holds the values to be used in the fields callbacks
15 */
16 private $options;
17 private $emptyApiKeys;
18 private $api;
19 private $transfer;
20
21 public function __construct()
22 {
23 if (current_user_can('activate_plugins')) {
24 add_action( 'admin_menu', array($this, "createMenuPage"));
25 add_action( 'admin_init', array($this, "createOptions"));
26 add_action( 'admin_enqueue_scripts', array($this, "loadTransferitoAssets"));
27 add_action( 'admin_notices', array($this, "userNotification") );
28 add_action( 'plugin_action_links_transferito/transferito.php', array($this, "actionLinks" ));
29 add_action( 'admin_post_transferito_add_connected_site', array($this, "addConnectedSites" ) );
30
31 add_filter( 'wp_script_attributes', array($this, "modifyAttributes" ), 10, 3 );
32 add_filter( 'plugin_row_meta', array($this, "upgradePluginMetaLink"), 100, 4 );
33
34 $this->api = new TransferitoAPI();
35 $this->transfer = new TransferController();
36 $this->options = get_option('transferito_settings_option');
37 $publicKey = isset($this->options['public_transferito_key']) ? $this->options['public_transferito_key'] : '';
38 $secretKey = isset($this->options['secret_transferito_key']) ? $this->options['secret_transferito_key'] : '';
39 $this->emptyApiKeys = filter_var(!($publicKey && $secretKey), FILTER_VALIDATE_BOOLEAN);
40
41 set_transient('transferito_empty_keys', $this->emptyApiKeys);
42 }
43 }
44
45 public function addConnectedSites()
46 {
47 check_ajax_referer('add_connected_site_nonce', 'connected_site_nonce');
48
49 /**
50 * Get the request fields
51 * Once the nonce has been verified
52 */
53 $url = isset($_POST['connected_site_url']) ? wp_kses(wp_unslash($_POST['connected_site_url']), []) : '';
54 $filename = isset($_POST['connected_site_filename']) ? wp_kses(wp_unslash($_POST['connected_site_filename']), []) : '';
55 $token = isset($_POST['connected_site_token']) ? wp_kses(wp_unslash($_POST['connected_site_token']), []) : '';
56
57 /**
58 * Check or Create Validation Details
59 */
60 $destinationServerValidationCheck = $this->transfer->addCheckServerValidation($url, $filename, $token);
61
62 /**
63 * Set the Status based on the Connection Check
64 */
65 $status = $destinationServerValidationCheck ? 'completed' : 'failed';
66
67 /**
68 * Redirect to the correct page based on check result
69 */
70 wp_redirect(admin_url('admin.php?page=transferito-connected-sites&status=' . $status));
71 exit;
72 }
73
74 public function actionLinks($links)
75 {
76 $links = array_merge(
77 array(
78 '<a href="' . esc_url( admin_url( '/admin.php?page=transferito-main' ) ) . '">' . __( 'Start Migration', 'transferito' ) . '</a>',
79 ),
80 $links
81 );
82
83 return $links;
84 }
85
86 public function upgradePluginMetaLink($plugin_meta, $plugin_file, $plugin_data, $status)
87 {
88 if ( false !== strpos($plugin_file, 'transferito.php') ) {
89 $pro_slug = plugin_basename( __FILE__ );
90 $installed_plugins = get_plugins();
91 $is_pro_installed = array_key_exists( $pro_slug, $installed_plugins ) || in_array( $pro_slug, $installed_plugins, true );
92
93 $plugin_meta[] = sprintf(
94 '<a style="color: #B30507; font-weight: bold;" href="https://transferito.com/pricing/" rel="noopener noreferrer" title="Go Pro" target="_blank">%1$s <span class="dashicons dashicons-external"></span></a>',
95 __('Upgrade to Premium', 'transferito')
96 );
97 }
98 return $plugin_meta;
99 }
100
101 public function userNotification()
102 {
103 $showMessage = get_transient( 'transferito_settings_update_counter' );
104
105 if ($showMessage) {
106 ?>
107 <div class="notice notice-success is-dismissible">
108 <p>Your settings have been updated!</p>
109 </div>
110 <?php
111 }
112
113 delete_transient('transferito_settings_update_counter');
114 }
115
116 public function createMenuPage()
117 {
118 add_menu_page(
119 __( 'Transferito1', 'transferito' ),
120 'Transferito',
121 'manage_options',
122 'transferito-main',
123 '',
124 'none',
125 26
126 );
127
128 add_submenu_page(
129 'transferito-main',
130 'Start Migration',
131 'Start Migration',
132 'manage_options',
133 'transferito-main',
134 array($this, 'createTransferHTML')
135 );
136
137 add_submenu_page(
138 'transferito-main',
139 'Settings',
140 'Settings',
141 'manage_options',
142 'transferito-settings',
143 array($this, 'settingsHTML')
144 );
145
146 add_submenu_page(
147 '',
148 'Connected Sites',
149 'Connected Sites',
150 'manage_options',
151 'transferito-connected-sites',
152 array($this, 'sitesHTML')
153 );
154 }
155
156 public function createOptions()
157 {
158 register_setting(
159 'transferito_settings_group', // Option group
160 'transferito_settings_option', // Option name
161 array( $this, 'sanitize' ) // Sanitize
162 );
163
164 add_settings_section(
165 'transferito_settings_section', // ID
166 '', // Title
167 array( $this, 'settingSection' ), // Callback
168 'transferito-settings' // Page
169 );
170
171 /**
172 * API Keys fields
173 */
174 add_settings_field(
175 'public_transferito_key', // ID
176 'Public Key', // Title
177 array( $this, 'publicKeyField' ), // Callback
178 'transferito-settings', // Page
179 'transferito_settings_section'
180 );
181
182 add_settings_field(
183 'secret_transferito_key', // ID
184 'Secret Key', // Title
185 array( $this, 'secretKeyField' ), // Callback
186 'transferito-settings', // Page
187 'transferito_settings_section'
188 );
189
190 add_settings_field(
191 'transferito_chunk_size', // ID
192 'Set download chunk size', // Title
193 array( $this, 'chunkSizeField' ), // Callback
194 'transferito-settings', // Page
195 'transferito_settings_section'
196 );
197
198 add_settings_field(
199 'transferito_upload_chunk_size', // ID
200 'Set upload chunk size', // Title
201 array( $this, 'uploadChunkSizeField' ), // Callback
202 'transferito-settings', // Page
203 'transferito_settings_section'
204 );
205
206 add_settings_field(
207 'transferito_force_upload', // ID
208 'Always upload to our secure servers', // Title
209 array( $this, 'forceUploadField' ), // Callback
210 'transferito-settings', // Page
211 'transferito_settings_section'
212 );
213
214 add_settings_field(
215 'transferito_force_tar_backup', // ID
216 'Use TAR as default compression format', // Title
217 array( $this, 'forceTarArchive' ), // Callback
218 'transferito-settings', // Page
219 'transferito_settings_section'
220 );
221
222 add_settings_field(
223 'transferito_include_htaccess', // ID
224 'Include htaccess file', // Title
225 array( $this, 'includeHtaccess' ), // Callback
226 'transferito-settings', // Page
227 'transferito_settings_section'
228 );
229
230 add_settings_field(
231 'transferito_use_default_collation', // ID
232 'Use default database configuration', // Title
233 array( $this, 'useDefaultCollation' ), // Callback
234 'transferito-settings', // Page
235 'transferito_settings_section'
236 );
237
238 add_settings_field(
239 'transferito_bypass_exec_archive_creation', // ID
240 'Create backup file without using exec', // Title
241 array( $this, 'bypassExecArchiveCreation' ), // Callback
242 'transferito-settings', // Page
243 'transferito_settings_section'
244 );
245
246 add_settings_field(
247 'transferito_disable_wordpress_cache', // ID
248 'Disable WordPress object cache', // Title
249 array( $this, 'disableWordPressObjectCache' ), // Callback
250 'transferito-settings', // Page
251 'transferito_settings_section'
252 );
253
254 add_settings_field(
255 'transferito_malcare_waf_plugin_fix', // ID
256 'Disable Malcare WAF plugin', // Title
257 array( $this, 'malcareWAFPluginFix' ), // Callback
258 'transferito-settings', // Page
259 'transferito_settings_section'
260 );
261
262 add_settings_field(
263 'transferito_delete_verification_file', // ID
264 'Delete Verification File After Completed Migration', // Title
265 array( $this, 'deleteVerificationFile' ), // Callback
266 'transferito-settings', // Page
267 'transferito_settings_section'
268 );
269
270 add_settings_field(
271 'transferito_hide_welcome_screen', // ID
272 'Hide Welcome Screen', // Title
273 array( $this, 'hideWelcomeScreen' ), // Callback
274 'transferito-settings', // Page
275 'transferito_settings_section'
276 );
277
278 add_settings_field(
279 'transferito_enable_debug_tracking', // ID
280 'Enable Debug Tracking', // Title
281 array( $this, 'enableDebugTracking' ), // Callback
282 'transferito-settings', // Page
283 'transferito_settings_section'
284 );
285 }
286
287 public function modifyAttributes($attribute)
288 {
289 if ($attribute['id'] === 'transferito_sentry-js-js') {
290 $attribute['integrity'] = "sha384-8WK0y5yz2y0ti+wMW84WAgeQI72MHZIGHN3B30ljAcDfexPZRbv3eQ+eqzPKDDqE";
291 $attribute['crossorigin'] = "anonymous";
292 }
293 return $attribute;
294 }
295
296 public function loadTransferitoAssets($hook)
297 {
298 $dashIconFont = plugins_url( '../Views/Assets/css/transferito-font.css', dirname(__FILE__));
299
300 /**
301 * To load the icon on every admin page
302 */
303 wp_register_style('transferito_font_css', $dashIconFont, false, TRANSFERITO_VERSION);
304 wp_enqueue_style( 'transferito_font_css' );
305
306 wp_enqueue_style(
307 'transferito-google-fonts',
308 'https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;600;700&family=Montserrat:wght@400;500;600;700&display=swap',
309 false,
310 TRANSFERITO_VERSION
311 );
312
313 /**
314 * Display on all pages
315 */
316 if ($hook === 'transferito_page_transferito-settings' || $hook === 'toplevel_page_transferito-main' || $hook === "admin_page_transferito-connected-sites" ) {
317 /**
318 * New Styles
319 */
320 $updatedStyles = plugins_url( '../Views/Assets/css/transferito-styles.min.css', dirname(__FILE__));
321
322 wp_register_style('transferito_updated_css', $updatedStyles, false, TRANSFERITO_VERSION);
323 wp_enqueue_style( 'transferito_updated_css' );
324 }
325
326 /**
327 * Only display on the create migration page
328 */
329 if ($hook === 'toplevel_page_transferito-main') {
330
331 /**
332 * Check to see if the tracking has been opted in
333 */
334 $trackingEnabled = isset($this->options['transferito_enable_debug_tracking'])
335 ? $this->options['transferito_enable_debug_tracking']
336 : false;
337
338 $script = plugins_url( '../Views/Assets/js/transferito.js', dirname(__FILE__));
339 $sentryScript = 'https://browser.sentry-cdn.com/7.40.0/bundle.replay.min.js';
340 $sentryImplementationScript = plugins_url( '../Views/Assets/js/transferito-sentry.js', dirname(__FILE__));
341
342 wp_register_script('transferito_js', $script, array ('jquery'), TRANSFERITO_VERSION, false);
343 wp_register_script('transferito_sentry-js', $sentryScript, null, TRANSFERITO_VERSION, false);
344 wp_register_script('transferito_sentry-implement-js', $sentryImplementationScript, array('transferito_sentry-js'), TRANSFERITO_VERSION, false);
345
346 if ($trackingEnabled) {
347 wp_enqueue_script( 'transferito_sentry-js' );
348 wp_enqueue_script( 'transferito_sentry-implement-js' );
349 }
350
351 wp_enqueue_script( 'transferito_js' );
352
353 wp_localize_script('transferito_js', 'transferitoData', [ 'baseUrl' => Config::getBaseApiUrl() ]);
354 }
355 }
356
357 public function sanitize( $input )
358 {
359 $new_input = array();
360
361 if( isset( $input['public_transferito_key'] ) ) {
362 $new_input['public_transferito_key'] = sanitize_text_field( $input['public_transferito_key'] );
363 }
364
365 if( isset( $input['secret_transferito_key'] ) ) {
366 $new_input['secret_transferito_key'] = sanitize_text_field( $input['secret_transferito_key'] );
367 }
368
369 if( isset( $input['transferito_chunk_size'] ) ) {
370 $new_input['transferito_chunk_size'] = sanitize_text_field( $input['transferito_chunk_size'] );
371 }
372
373 if( isset( $input['transferito_upload_chunk_size'] ) ) {
374 $new_input['transferito_upload_chunk_size'] = sanitize_text_field( $input['transferito_upload_chunk_size'] );
375 }
376
377 $new_input['transferito_force_upload'] = isset($input['transferito_force_upload']) && $input['transferito_force_upload'] == 'on' ? true : false;
378 $new_input['transferito_include_htaccess'] = isset($input['transferito_include_htaccess']) && $input['transferito_include_htaccess'] == 'on' ? true : false;
379 $new_input['transferito_force_tar_backup'] = isset($input['transferito_force_tar_backup']) && $input['transferito_force_tar_backup'] == 'on' ? true : false;
380 $new_input['transferito_use_default_collation'] = isset($input['transferito_use_default_collation']) && $input['transferito_use_default_collation'] == 'on' ? true : false;
381 $new_input['transferito_bypass_exec_archive_creation'] = isset($input['transferito_bypass_exec_archive_creation']) && $input['transferito_bypass_exec_archive_creation'] == 'on' ? true : false;
382 $new_input['transferito_disable_wordpress_cache'] = isset($input['transferito_disable_wordpress_cache']) && $input['transferito_disable_wordpress_cache'] == 'on' ? true : false;
383 $new_input['transferito_malcare_waf_plugin_fix'] = isset($input['transferito_malcare_waf_plugin_fix']) && $input['transferito_malcare_waf_plugin_fix'] == 'on' ? true : false;
384 $new_input['transferito_delete_verification_file'] = isset($input['transferito_delete_verification_file']) && $input['transferito_delete_verification_file'] == 'on' ? true : false;
385 $new_input['transferito_enable_debug_tracking'] = isset($input['transferito_enable_debug_tracking']) && $input['transferito_enable_debug_tracking'] == 'on' ? true : false;
386
387 /**
388 * Do not save to the settings options
389 */
390 $hideWelcomeScreen = isset($input['transferito_hide_welcome_screen']) && $input['transferito_hide_welcome_screen'] == 'on' ? true : false;
391
392 set_transient('transferito_hide_welcome_screen', $hideWelcomeScreen);
393 set_transient( 'transferito_settings_update_counter', 1 );
394
395 return $new_input;
396 }
397
398 /**
399 * Print the Section text
400 */
401 public function settingSection()
402 {
403 print '';
404 }
405
406 /**
407 * Get the settings option array and print one of its values
408 */
409 public function publicKeyField()
410 {
411 printf(
412 '<input type="text" class="transferito-input__text-box transferito-form-element transferito-input__text-box--full-width transferito-input__text-box--thin" id="public_transferito_key" name="transferito_settings_option[public_transferito_key]" value="%s" />',
413 isset( $this->options['public_transferito_key'] ) ? esc_attr( $this->options['public_transferito_key']) : ''
414 );
415 }
416
417 public function secretKeyField()
418 {
419 printf(
420 '<input type="text" class="transferito-input__text-box transferito-form-element transferito-input__text-box--full-width transferito-input__text-box--thin" id="secret_transferito_key" name="transferito_settings_option[secret_transferito_key]" value="%s" />',
421 isset( $this->options['secret_transferito_key'] ) ? esc_attr( $this->options['secret_transferito_key']) : ''
422 );
423 }
424
425 public function chunkSizeField()
426 {
427 $chunkSize = isset( $this->options['transferito_chunk_size'] ) ? esc_attr( $this->options['transferito_chunk_size']) : '';
428
429 $html = '<select id="transferito_chunk_size" class="transferito-form-element transferito-input__dropdown transferito-input__dropdown--full-width transferito-input__dropdown--large" name="transferito_settings_option[transferito_chunk_size]">';
430 $html .= $chunkSize == "" ? '<option selected disabled>Use default Download Chunk Size</option>' : '<option disabled>Use default Download Chunk Size</option>';
431 $html .= $chunkSize == "1" ? '<option selected>1</option>' : '<option>1</option>';
432 $html .= $chunkSize == "5" ? '<option selected>5</option>' : '<option>5</option>';
433 $html .= $chunkSize == "10" ? '<option selected>10</option>' : '<option>10</option>';
434 $html .= $chunkSize == "25" ? '<option selected>25</option>' : '<option>25</option>';
435 $html .= $chunkSize == "50" ? '<option selected>50</option>' : '<option>50</option>';
436 $html .= $chunkSize == "100" ? '<option selected>100</option>' : '<option>100</option>';
437 $html .= $chunkSize == "250" ? '<option selected>250</option>' : '<option>250</option>';
438 $html .= '</select>';
439
440 echo wp_kses($html, [
441 'select' => [
442 'id' => [],
443 'class' => [],
444 'name' => []
445 ],
446 'option' => [
447 'selected' => [],
448 'disabled' => [],
449 ]
450 ]);
451 }
452
453 public function uploadChunkSizeField()
454 {
455 $chunkSize = isset( $this->options['transferito_upload_chunk_size'] ) ? esc_attr( $this->options['transferito_upload_chunk_size']) : '';
456
457 $html = '<select id="transferito_upload_chunk_size" class="transferito-form-element transferito-input__dropdown transferito-input__dropdown--full-width transferito-input__dropdown--large" name="transferito_settings_option[transferito_upload_chunk_size]">';
458 $html .= $chunkSize == "" ? '<option selected disabled>Use default Upload Chunk Size</option>' : '<option disabled>Use default Upload Chunk Size</option>';
459 $html .= $chunkSize == "1" ? '<option selected>1</option>' : '<option>1</option>';
460 $html .= $chunkSize == "5" ? '<option selected>5</option>' : '<option>5</option>';
461 $html .= $chunkSize == "10" ? '<option selected>10</option>' : '<option>10</option>';
462 $html .= $chunkSize == "25" ? '<option selected>25</option>' : '<option>25</option>';
463 $html .= $chunkSize == "50" ? '<option selected>50</option>' : '<option>50</option>';
464 $html .= $chunkSize == "100" ? '<option selected>100</option>' : '<option>100</option>';
465 $html .= '</select>';
466
467 echo wp_kses($html, [
468 'select' => [
469 'id' => [],
470 'class' => [],
471 'name' => []
472 ],
473 'option' => [
474 'selected' => [],
475 'disabled' => [],
476 ]
477 ]);
478 }
479
480 public function forceUploadField()
481 {
482 $checked = isset($this->options['transferito_force_upload']) && $this->options['transferito_force_upload'] ? 'checked' : '';
483 echo '<input type="checkbox" id="transferito_force_upload" name="transferito_settings_option[transferito_force_upload]"' . esc_html($checked) . '/>';
484 }
485
486 public function includeHtaccess()
487 {
488 $checked = isset($this->options['transferito_include_htaccess']) && $this->options['transferito_include_htaccess'] ? 'checked' : '';
489 echo '<input type="checkbox" id="transferito_include_htaccess" name="transferito_settings_option[transferito_include_htaccess]"' . esc_html($checked) . '/>';
490 }
491
492 public function forceTarArchive()
493 {
494 $checked = isset($this->options['transferito_force_tar_backup']) && $this->options['transferito_force_tar_backup'] ? 'checked' : '';
495 echo '<input type="checkbox" id="transferito_force_tar_backup" name="transferito_settings_option[transferito_force_tar_backup]"' . esc_html($checked) . '/>';
496 }
497
498 public function useDefaultCollation()
499 {
500 $checked = isset($this->options['transferito_use_default_collation']) && $this->options['transferito_use_default_collation'] ? 'checked' : '';
501 echo '<input type="checkbox" id="transferito_use_default_collation" name="transferito_settings_option[transferito_use_default_collation]"' . esc_html($checked) . '/>';
502 }
503
504 public function bypassExecArchiveCreation()
505 {
506 $checked = isset($this->options['transferito_bypass_exec_archive_creation']) && $this->options['transferito_bypass_exec_archive_creation'] ? 'checked' : '';
507 echo '<input type="checkbox" id="transferito_bypass_exec_archive_creation" name="transferito_settings_option[transferito_bypass_exec_archive_creation]"' . esc_html($checked) . '/>';
508 }
509
510 public function disableWordPressObjectCache()
511 {
512 $checked = isset($this->options['transferito_disable_wordpress_cache']) && $this->options['transferito_disable_wordpress_cache'] ? 'checked' : '';
513 echo '<input type="checkbox" id="transferito_disable_wordpress_cache" name="transferito_settings_option[transferito_disable_wordpress_cache]"' . esc_html($checked) . '/>';
514 }
515
516 public function malcareWAFPluginFix()
517 {
518 $checked = isset($this->options['transferito_malcare_waf_plugin_fix']) && $this->options['transferito_malcare_waf_plugin_fix'] ? 'checked' : '';
519 echo '<input type="checkbox" id="transferito_malcare_waf_plugin_fix" name="transferito_settings_option[transferito_malcare_waf_plugin_fix]"' . esc_html($checked) . '/>';
520 }
521
522 public function deleteVerificationFile()
523 {
524 $checked = isset($this->options['transferito_delete_verification_file']) && $this->options['transferito_delete_verification_file'] ? 'checked' : '';
525 echo '<input type="checkbox" id="transferito_delete_verification_file" name="transferito_settings_option[transferito_delete_verification_file]"' . esc_html($checked) . '/>';
526 }
527
528 public function hideWelcomeScreen()
529 {
530 $welcomeScreenHidden = get_transient('transferito_hide_welcome_screen');
531
532 $checked = $welcomeScreenHidden ? 'checked' : '';
533 echo '<input type="checkbox" id="transferito_hide_welcome_screen" name="transferito_settings_option[transferito_hide_welcome_screen]"' . esc_html($checked) . '/>';
534 }
535
536 public function enableDebugTracking()
537 {
538 $checked = isset($this->options['transferito_enable_debug_tracking']) && $this->options['transferito_enable_debug_tracking'] ? 'checked' : '';
539 echo '<input type="checkbox" id="transferito_enable_debug_tracking" name="transferito_settings_option[transferito_enable_debug_tracking]"' . esc_html($checked) . '/>';
540 }
541
542 public function settingsHTML()
543 {
544 $publicKey = isset($this->options['public_transferito_key']) ? $this->options['public_transferito_key'] : '';
545 $secretKey = isset($this->options['secret_transferito_key']) ? $this->options['secret_transferito_key'] : '';
546 $hasAPIKeys = $this->emptyApiKeys;
547
548 include TRANSFERITO_PATH . "src" . DIRECTORY_SEPARATOR . "Views" . DIRECTORY_SEPARATOR . 'settings.php';
549 }
550
551 public function sitesHTML()
552 {
553 include TRANSFERITO_PATH . "src" . DIRECTORY_SEPARATOR . "Views" . DIRECTORY_SEPARATOR . 'connected-sites.php';
554 }
555
556 public function createTransferHTML()
557 {
558 /**
559 * Get logged in user's information
560 */
561 $userData = wp_get_current_user();
562 $name = (isset($userData->user_firstname) && $userData->user_firstname !== '')
563 ? $userData->user_firstname
564 : $userData->display_name;
565 $userWithoutAPIKeys = $this->emptyApiKeys;
566 include TRANSFERITO_PATH . "src" . DIRECTORY_SEPARATOR . "Views" . DIRECTORY_SEPARATOR . 'create-transfer.php';
567 }
568
569 }
570