settings_views = array_filter(
$settings_views,
function ( $setting ) {
return $setting instanceof Settings\SettingTab;
}
);
$this->settings_updaters = array_filter(
$settings_updaters,
function ( $setting ) {
return $setting instanceof SettingUpdatable;
}
);
$this->license_repository = $license_repository instanceof WpOptionsLicenseRepository ? new WpOptionsLicenseRepository( new LicenseOptions() ) : null;
}
/**
* Get system information for the settings page.
*
* @return array
*/
public static function get_information() {
global $wpdb;
$information = [];
// WordPress version.
$information['wpversion']['label'] = __( 'WordPress version', 'backwpup' );
$information['wpversion']['value'] = BackWPup::get_plugin_data( 'wp_version' );
// BackWPup version.
if ( ! BackWPup::is_pro() ) {
$information['bwuversion']['label'] = esc_html__( 'BackWPup version', 'backwpup' );
$information['bwuversion']['value'] = BackWPup::get_plugin_data( 'Version' );
$information['bwuversion']['html'] = BackWPup::get_plugin_data( 'Version' ) .
' ' .
esc_html__( 'Get pro.', 'backwpup' ) . '';
} else {
$information['bwuversion']['label'] = __( 'BackWPup Pro version', 'backwpup' );
$information['bwuversion']['value'] = BackWPup::get_plugin_data( 'Version' );
}
// PHP version.
$information['phpversion']['label'] = esc_html__( 'PHP version', 'backwpup' );
$bit = '';
if ( PHP_INT_SIZE === 4 ) {
$bit = ' (32bit)';
} elseif ( PHP_INT_SIZE === 8 ) {
$bit = ' (64bit)';
}
$information['phpversion']['value'] = PHP_VERSION . ' ' . $bit;
// MySQL version.
$information['mysqlversion']['label'] = esc_html__( 'MySQL version', 'backwpup' );
$information['mysqlversion']['value'] = $wpdb->db_version();
// Curl version.
$information['curlversion']['label'] = esc_html__( 'cURL version', 'backwpup' );
if ( function_exists( 'curl_version' ) ) {
$curl_version = curl_version();
$information['curlversion']['value'] = $curl_version['version'];
$information['curlsslversion']['label'] = __( 'cURL SSL version', 'backwpup' );
$information['curlsslversion']['value'] = $curl_version['ssl_version'];
} else {
$information['curlversion']['value'] = esc_html__( 'unavailable', 'backwpup' );
}
// WP cron URL.
$information['wpcronurl']['label'] = esc_html__( 'WP-Cron url', 'backwpup' );
$information['wpcronurl']['value'] = site_url( 'wp-cron.php' );
// Response test.
$server_connect = [];
$server_connect['label'] = __( 'Server self connect', 'backwpup' );
$raw_response = BackWPup_Job::get_jobrun_url( 'test' );
$response_code = wp_remote_retrieve_response_code( $raw_response );
$response_body = wp_remote_retrieve_body( $raw_response );
if ( strstr( $response_body, 'BackWPup test request' ) === false ) {
$server_connect['value'] = esc_html__( 'Not expected HTTP response:', 'backwpup' ) . "\n";
$server_connect['html'] = wp_kses(
__( 'Not expected HTTP response:
', 'backwpup' ),
[ 'strong' => [] ]
);
if ( ! $response_code ) {
$server_connect['value'] .= sprintf(
/* translators: %s: HTTP error message. */
wp_kses_post( __( 'WP Http Error: %s', 'backwpup' ) ),
$raw_response->get_error_message()
) . "\n";
$server_connect['html'] = sprintf(
/* translators: %s: HTTP error message. */
__( 'WP Http Error: %s', 'backwpup' ),
esc_html( $raw_response->get_error_message() )
) . '
';
} else {
$server_connect['value'] .= sprintf(
/* translators: %d: HTTP status code. */
__( 'Status-Code: %d', 'backwpup' ),
$response_code
) . "\n";
$server_connect['html'] .= sprintf(
/* translators: %d: HTTP status code. */
__( 'Status-Code: %d', 'backwpup' ),
esc_html( $response_code )
) . '
';
}
$response_headers = wp_remote_retrieve_headers( $raw_response );
foreach ( $response_headers as $key => $value ) {
$server_connect['value'] .= ucfirst( $key ) . ": {$value}\n";
$server_connect['html'] .= esc_html( ucfirst( $key ) ) . ': ' . esc_html(
$value
) . '
';
}
$content = wp_remote_retrieve_body( $raw_response );
if ( $content ) {
$server_connect['value'] .= sprintf(
/* translators: %s: response content. */
__( 'Content: %s', 'backwpup' ),
$content
);
$server_connect['html'] .= sprintf(
/* translators: %s: response content. */
__( 'Content: %s', 'backwpup' ),
esc_html( $content )
);
}
} else {
$server_connect['value'] = __( 'Response Test O.K.', 'backwpup' );
}
$information['serverconnect'] = $server_connect;
// Document root.
$information['docroot']['label'] = 'Document root';
$document_root = isset( $_SERVER['DOCUMENT_ROOT'] ) ? sanitize_text_field( wp_unslash( $_SERVER['DOCUMENT_ROOT'] ) ) : '';
$information['docroot']['value'] = $document_root;
// Temp folder.
$information['tmpfolder']['label'] = esc_html__( 'Temp folder', 'backwpup' );
if ( ! is_dir( BackWPup::get_plugin_data( 'TEMP' ) ) ) {
$information['tmpfolder']['value'] = sprintf(
/* translators: %s: temporary folder path. */
esc_html__( 'Temp folder %s doesn\'t exist.', 'backwpup' ),
BackWPup::get_plugin_data( 'TEMP' )
);
} elseif ( ! is_writable( BackWPup::get_plugin_data( 'TEMP' ) ) ) { // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_is_writable
$information['tmpfolder']['value'] = sprintf(
/* translators: %s: temporary folder path. */
esc_html__( 'Temporary folder %s is not writable.', 'backwpup' ),
BackWPup::get_plugin_data( 'TEMP' )
);
} else {
$information['tmpfolder']['value'] = BackWPup::get_plugin_data( 'TEMP' );
}
// Log folder.
$information['logfolder']['label'] = esc_html__( 'Log folder', 'backwpup' );
$log_folder = BackWPup_File::get_absolute_path(
get_site_option( 'backwpup_cfg_logfolder' )
);
if ( ! is_dir( $log_folder ) ) {
$information['logfolder']['value'] = sprintf(
/* translators: %s: log folder path. */
esc_html__( 'Log folder %s does not exist.', 'backwpup' ),
$log_folder
);
} elseif ( ! is_writable( $log_folder ) ) { // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_is_writable
$information['logfolder']['value'] = sprintf(
/* translators: %s: log folder path. */
esc_html__( 'Log folder %s is not writable.', 'backwpup' ),
$log_folder
);
} else {
$information['logfolder']['value'] = $log_folder;
}
// Server.
$information['server']['label'] = esc_html__( 'Server', 'backwpup' );
$server_software = isset( $_SERVER['SERVER_SOFTWARE'] ) ? sanitize_text_field( wp_unslash( $_SERVER['SERVER_SOFTWARE'] ) ) : '';
$information['server']['value'] = $server_software;
// OS.
$information['os']['label'] = esc_html__( 'Operating System', 'backwpup' );
$information['os']['value'] = PHP_OS;
// PHP SAPI.
$information['phpsapi']['label'] = esc_html__( 'PHP SAPI', 'backwpup' );
$information['phpsapi']['value'] = PHP_SAPI;
// PHP user.
$information['phpuser']['label'] = esc_html__( 'Current PHP user', 'backwpup' );
if ( function_exists( 'get_current_user' ) ) {
$information['phpuser']['value'] = get_current_user();
} else {
$information['phpuser']['value'] = esc_html__( 'Function Disabled', 'backwpup' );
}
// Maximum execution time.
$information['maxexectime']['label'] = esc_html__( 'Maximum execution time', 'backwpup' );
$information['maxexectime']['value'] = sprintf(
/* translators: %d: time in seconds. */
__( '%d seconds', 'backwpup' ),
ini_get( 'max_execution_time' )
);
// BackWPup Maximum script execution time.
$information['jobmaxexecutiontime']['label'] = esc_html__(
'BackWPup maximum script execution time',
'backwpup'
);
$information['jobmaxexecutiontime']['value'] = sprintf(
/* translators: %d: time in seconds. */
__( '%d seconds', 'backwpup' ),
absint( get_site_option( 'backwpup_cfg_jobmaxexecutiontime' ) )
);
// Alternate WP cron.
$information['altwpcron']['label'] = esc_html__( 'Alternative WP Cron', 'backwpup' );
if ( defined( 'ALTERNATE_WP_CRON' ) && ALTERNATE_WP_CRON ) {
$information['altwpcron']['value'] = esc_html__( 'On', 'backwpup' );
} else {
$information['altwpcron']['value'] = esc_html__( 'Off', 'backwpup' );
}
// Disable WP cron.
$information['disablewpcron']['label'] = esc_html__( 'Disabled WP Cron', 'backwpup' );
if ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON ) {
$information['disablewpcron']['value'] = esc_html__( 'On', 'backwpup' );
} else {
$information['disablewpcron']['value'] = esc_html__( 'Off', 'backwpup' );
}
$current_time = time() - HOUR_IN_SECONDS;
$next_cron_times = array_keys( _get_cron_array() );
sort( $next_cron_times );
$information['cronworking']['label'] = esc_html__( 'WP Cron is working', 'backwpup' );
$information['cronworking']['value'] = esc_html__( 'Yes', 'backwpup' );
if ( isset( $next_cron_times[0] ) && $next_cron_times[0] < $current_time ) {
$information['cronworking']['value'] = esc_html__( 'No', 'backwpup' );
}
// CHMOD dir.
$information['chmoddir']['label'] = esc_html__( 'CHMOD Dir', 'backwpup' );
if ( defined( 'FS_CHMOD_DIR' ) ) {
$information['chmoddir']['value'] = FS_CHMOD_DIR;
} else {
$information['chmoddir']['value'] = '0755';
}
// Server time.
$information['servertime']['label'] = esc_html__( 'Server Time', 'backwpup' );
$now = localtime( time(), true );
$information['servertime']['value'] = $now['tm_hour'] . ':' . $now['tm_min'];
// Blog time.
$information['blogtime']['label'] = esc_html__( 'Blog Time', 'backwpup' );
$information['blogtime']['value'] = wp_date( 'H:i', time() );
// Blog timezone.
$information['blogtz']['label'] = esc_html__( 'Blog Timezone', 'backwpup' );
$information['blogtz']['value'] = get_option( 'timezone_string' );
// Blog time offset.
$information['blogoffset']['label'] = esc_html__( 'Blog Time offset', 'backwpup' );
$information['blogoffset']['value'] = sprintf(
/* translators: %s: hours offset. */
esc_html__( '%s hours', 'backwpup' ),
(int) get_option( 'gmt_offset' )
);
// Blog language.
$information['bloglang']['label'] = esc_html__( 'Blog language', 'backwpup' );
$information['bloglang']['value'] = get_bloginfo( 'language' );
// MySQL encoding.
$information['mysqlencoding']['label'] = esc_html__( 'MySQL Client encoding', 'backwpup' );
$information['mysqlencoding']['value'] = defined( 'DB_CHARSET' ) ? DB_CHARSET : '';
// PHP memory limit.
$information['phpmemlimit']['label'] = esc_html__( 'PHP Memory limit', 'backwpup' );
$information['phpmemlimit']['value'] = ini_get( 'memory_limit' );
// WP memory limit.
$information['wpmemlimit']['label'] = esc_html__( 'WP memory limit', 'backwpup' );
$information['wpmemlimit']['value'] = WP_MEMORY_LIMIT;
// WP maximum memory limit.
$information['wpmaxmemlimit']['label'] = esc_html__( 'WP maximum memory limit', 'backwpup' );
$information['wpmaxmemlimit']['value'] = WP_MAX_MEMORY_LIMIT;
// Memory in use.
$information['memusage']['label'] = esc_html__( 'Memory in use', 'backwpup' );
$memory_usage = function_exists( 'memory_get_usage' ) ? memory_get_usage( true ) : 0;
$information['memusage']['value'] = size_format( $memory_usage, 2 );
// Disabled PHP functions.
$disabled = esc_html( ini_get( 'disable_functions' ) );
if ( ! empty( $disabled ) ) {
$information['disabledfunctions']['label'] = esc_html__( 'Disabled PHP Functions:', 'backwpup' );
$information['disabledfunctions']['value'] = implode( ', ', explode( ',', $disabled ) );
}
// Loaded PHP extensions.
$information['loadedextensions']['label'] = esc_html__( 'Loaded PHP Extensions:', 'backwpup' );
$extensions = get_loaded_extensions();
sort( $extensions );
$information['loadedextensions']['value'] = implode( ', ', $extensions );
return $information;
}
/**
* Enqueue settings page scripts.
*
* @return void
*/
public function admin_print_scripts() {
$suffix = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min';
wp_enqueue_script(
'backwpuppagesettings',
untrailingslashit( BackWPup::get_plugin_data( 'URL' ) ) . "/assets/js/page_settings{$suffix}.js",
[
'jquery',
'backwpupgeneral',
'backwpup_clipboard',
],
BackWPup::get_plugin_data( 'Version' ),
true
);
if ( \BackWPup::is_pro() ) {
wp_enqueue_script(
'backwpuppagesettings-encryption',
untrailingslashit( BackWPup::get_plugin_data( 'URL' ) ) . "/assets/js/settings-encryption{$suffix}.js",
[
'underscore',
'jquery',
'backwpuppagesettings',
'thickbox',
],
BackWPup::get_plugin_data( 'Version' ),
true
);
wp_localize_script(
'backwpuppagesettings-encryption',
'settingsEncryptionVariables',
[
'validPublicKey' => esc_html__( 'Public key is valid.', 'backwpup' ),
'invalidPublicKey' => esc_html__( 'Public key is invalid.', 'backwpup' ),
'privateKeyMissed' => esc_html__( 'Please enter your private key.', 'backwpup' ),
'publicKeyMissed' => esc_html__(
'Please enter a public key first, or generate a key pair.',
'backwpup'
),
'mustDownloadPrivateKey' => esc_html__(
'Please download the private key before continuing. If you do not save it locally, you cannot decrypt your backups later.',
'backwpup'
),
'mustDownloadSymmetricKey' => esc_html__(
'Please download the key before continuing. If you do not save it locally, you cannot decrypt your backups later.',
'backwpup'
),
]
);
}
}
/**
* Save settings from post form.
*
* @return void
*/
public function save_post_form() {
// phpcs:disable WordPress.Security.NonceVerification.Missing
if ( ! current_user_can( 'backwpup_settings' ) ) {
return;
}
// Set default options if button clicked.
if (isset($_POST['default_settings']) && $_POST['default_settings']) { // phpcs:ignore
delete_site_option( 'backwpup_cfg_showadminbar' );
delete_site_option( 'backwpup_cfg_showfoldersize' );
delete_site_option( 'backwpup_cfg_jobstepretry' );
delete_site_option( 'backwpup_cfg_jobmaxexecutiontime' );
delete_site_option( 'backwpup_cfg_loglevel' );
delete_site_option( 'backwpup_cfg_jobwaittimems' );
delete_site_option( 'backwpup_cfg_jobrunauthkey' );
delete_site_option( 'backwpup_cfg_jobdooutput' );
delete_site_option( 'backwpup_cfg_windows' );
delete_site_option( 'backwpup_cfg_maxlogs' );
delete_site_option( 'backwpup_cfg_gzlogs' );
delete_site_option( 'backwpup_cfg_authentication' );
delete_site_option( 'backwpup_cfg_logfolder' );
delete_site_option( 'backwpup_cfg_dropboxappkey' );
delete_site_option( 'backwpup_cfg_dropboxappsecret' );
delete_site_option( 'backwpup_cfg_dropboxsandboxappkey' );
delete_site_option( 'backwpup_cfg_dropboxsandboxappsecret' );
delete_site_option( 'backwpup_cfg_sugarsynckey' );
delete_site_option( 'backwpup_cfg_sugarsyncsecret' );
delete_site_option( 'backwpup_cfg_sugarsyncappid' );
delete_site_option( 'backwpup_cfg_hash' );
delete_site_option( 'backwpup_cfg_keepplugindata' );
foreach ( $this->settings_updaters as $setting ) {
$setting->reset();
}
$this->license_repository->delete_instance_key();
$this->license_repository->delete_api_key();
$this->license_repository->delete_product_id();
$this->license_repository->delete_status();
BackWPup_Option::default_site_options();
BackWPup_Admin::message( __( 'Settings reset to default', 'backwpup' ) );
return;
}
foreach ( $this->settings_updaters as $setting ) {
$setting->update();
}
// Load current settings.
$current_options = [
'backwpup_cfg_jobstepretry' => get_site_option( 'backwpup_cfg_jobstepretry' ),
'backwpup_cfg_jobmaxexecutiontime' => get_site_option( 'backwpup_cfg_jobmaxexecutiontime' ),
'backwpup_cfg_loglevel' => get_site_option( 'backwpup_cfg_loglevel' ),
'backwpup_cfg_jobwaittimems' => get_site_option( 'backwpup_cfg_jobwaittimems' ),
'backwpup_cfg_jobdooutput' => get_site_option( 'backwpup_cfg_jobdooutput' ),
'backwpup_cfg_windows' => get_site_option( 'backwpup_cfg_windows' ),
'backwpup_cfg_maxlogs' => get_site_option( 'backwpup_cfg_maxlogs' ),
'backwpup_cfg_gzlogs' => get_site_option( 'backwpup_cfg_gzlogs' ),
'backwpup_cfg_jobrunauthkey' => get_site_option( 'backwpup_cfg_jobrunauthkey' ),
'backwpup_cfg_logfolder' => get_site_option( 'backwpup_cfg_logfolder' ),
'backwpup_cfg_authentication' => get_site_option( 'backwpup_cfg_authentication' ),
'backwpup_cfg_keepplugindata' => get_site_option( 'backwpup_cfg_keepplugindata' ),
'backwpup_cfg_mailaddresslog' => get_site_option( 'backwpup_cfg_mailaddresslog' ),
'backwpup_cfg_mailaddresssenderlog' => get_site_option( 'backwpup_cfg_mailaddresssenderlog' ),
'backwpup_cfg_mailerroronly' => get_site_option( 'backwpup_cfg_mailerroronly' ),
];
// Validate and add new options values.
$new_options = [];
if ( isset( $_POST['jobstepretry'] ) && is_numeric( $_POST['jobstepretry'] ) && $_POST['jobstepretry'] >= 1 && $_POST['jobstepretry'] <= 100 ) {
$new_options['backwpup_cfg_jobstepretry'] = absint( $_POST['jobstepretry'] );
}
if ( isset( $_POST['jobmaxexecutiontime'] ) && is_numeric( $_POST['jobmaxexecutiontime'] ) && $_POST['jobmaxexecutiontime'] <= 300 ) {
$new_options['backwpup_cfg_jobmaxexecutiontime'] = absint( $_POST['jobmaxexecutiontime'] );
}
if ( isset( $_POST['loglevel'] ) && in_array( $_POST['loglevel'], [ 'normal_translated', 'normal', 'debug_translated', 'debug' ], true ) ) {
$new_options['backwpup_cfg_loglevel'] = sanitize_text_field( wp_unslash( $_POST['loglevel'] ) );
// activate debug log count.
if ( $current_options['backwpup_cfg_loglevel'] !== $new_options['backwpup_cfg_loglevel'] ) {
if ( strpos( $new_options['backwpup_cfg_loglevel'], 'debug' ) !== false ) {
$count = wpm_apply_filters_typed( 'integer', 'backwpup_debug_log_count', 5 );
update_site_option( 'backwpup_debug_log_count', $count );
} else {
delete_site_option( 'backwpup_debug_log_count' );
}
}
}
if ( isset( $_POST['jobwaittimems'] ) && is_numeric( $_POST['jobwaittimems'] ) ) {
$new_options['backwpup_cfg_jobwaittimems'] = absint( $_POST['jobwaittimems'] );
}
// As jobdooutput and windows are checkbox, check another field to know if they are checked.
if ( isset( $_POST['jobwaittimems'] ) ) {
$new_options['backwpup_cfg_jobdooutput'] = ! empty( $_POST['jobdooutput'] );
$new_options['backwpup_cfg_windows'] = ! empty( $_POST['windows'] );
}
if ( isset( $_POST['maxlogs'] ) && is_numeric( $_POST['maxlogs'] ) ) {
$new_options['backwpup_cfg_maxlogs'] = absint( $_POST['maxlogs'] );
}
$new_options['backwpup_cfg_gzlogs'] = ! empty( $_POST['gzlogs'] );
if ( isset( $_POST['jobrunauthkey'] ) ) {
$new_options['backwpup_cfg_jobrunauthkey'] = preg_replace( '/[^a-zA-Z0-9]/', '', trim( (string) sanitize_text_field( wp_unslash( $_POST['jobrunauthkey'] ) ) ) );
}
if ( isset( $_POST['logfolder'] ) ) {
try {
$new_options['backwpup_cfg_logfolder'] = trailingslashit(
BackWPup_File::normalize_path( BackWPup_Path_Fixer::slashify( sanitize_text_field( wp_unslash( $_POST['logfolder'] ) ) ) )
);
} catch ( InvalidArgumentException $e ) {
delete_site_option( 'backwpup_cfg_logfolder' );
BackWPup_Option::default_site_options();
}
}
if ( isset( $_POST['authentication_method'] ) && in_array( $_POST['authentication_method'], [ '', 'user', 'basic', 'query_arg' ], true ) ) {
$authentication = get_site_option(
'backwpup_cfg_authentication',
[
'method' => '',
'basic_user' => '',
'basic_password' => '',
'user_id' => 0,
'query_arg' => '',
]
);
$authentication['method'] = sanitize_text_field( wp_unslash( $_POST['authentication_method'] ) );
$authentication['basic_user'] = isset( $_POST['authentication_basic_user'] ) ? sanitize_text_field( wp_unslash( $_POST['authentication_basic_user'] ) ) : '';
$authentication['basic_password'] = isset( $_POST['authentication_basic_password'] ) ? BackWPup_Encryption::encrypt( (string) sanitize_text_field( wp_unslash( $_POST['authentication_basic_password'] ) ) ) : '';
$authentication['query_arg'] = isset( $_POST['authentication_query_arg'] ) ? sanitize_text_field( wp_unslash( $_POST['authentication_query_arg'] ) ) : '';
$authentication['user_id'] = isset( $_POST['authentication_user_id'] ) ? absint( sanitize_text_field( wp_unslash( $_POST['authentication_user_id'] ) ) ) : 0;
$new_options['backwpup_cfg_authentication'] = $authentication;
$this->test_basic_authentication( $authentication );
}
$new_options['backwpup_cfg_keepplugindata'] = ! empty( $_POST['keepplugindata'] );
if ( isset( $_POST['mailaddresslog'] ) ) {
$emails = explode( ',', sanitize_text_field( wp_unslash( $_POST['mailaddresslog'] ) ) );
foreach ( $emails as $key => $email ) {
$emails[ $key ] = sanitize_email( trim( $email ) );
if ( ! is_email( $emails[ $key ] ) ) {
unset( $emails[ $key ] );
}
}
$new_options['backwpup_cfg_mailaddresslog'] = implode( ', ', $emails );
}
if ( isset( $_POST['mailaddresssenderlog'] ) ) {
$new_options['backwpup_cfg_mailaddresssenderlog'] = sanitize_email( wp_unslash( $_POST['mailaddresssenderlog'] ) );
}
// As mailerroronly is a checkbox, check another field to know if it is checked.
if ( isset( $_POST['loglevel'] ) ) {
$new_options['backwpup_cfg_mailerroronly'] = ! empty( $_POST['mailerroronly'] );
}
// Merge actual options with new ones.
$merged_options = array_merge( $current_options, $new_options );
// Update options.
foreach ( $merged_options as $option_name => $option_value ) {
update_site_option( $option_name, $option_value );
}
BackWPup_Admin::message( esc_html__( 'Settings saved', 'backwpup' ) );
// phpcs:enable
}
/**
* Render the settings page.
*
* @return void
*/
public function page() {
?>