' . __( 'Export settings to the file', 'wp-cerber' ) . ''; $form .= '

' . __( 'When you click the button below you will get a configuration file, which you can upload on another site.', 'wp-cerber' ) . '

'; $form .= '

' . __( 'What do you want to export?', 'wp-cerber' ) . '

'; $form .= ' '; $form .= '

'; $form .= '

'; $nf = wp_nonce_field( 'crb_import', 'crb_field' ); $form .= '

' . __( 'Import settings from the file', 'wp-cerber' ) . '

'; $form .= '

' . __( 'When you click the button below, file will be uploaded and all existing settings will be overridden.', 'wp-cerber' ) . '

'; $form .= '

' . __( 'Select file to import.', 'wp-cerber' ) . ' ' . sprintf( __( 'Maximum upload file size: %s.' ), esc_html( size_format( wp_max_upload_size() ) ) ); $form .= '

' . $nf; $form .= '

'; $form .= '

' . __( 'What do you want to import?', 'wp-cerber' ) . '

'; $form .= '

'; $form .= '

'; $form .= '

Bulk load access list entries

'; $form .= '
' . $nf; $form .= '

Load to ' . __( 'White IP Access List', 'wp-cerber' ) . '

'; $form .= '

Load to ' . __( 'Black IP Access List', 'wp-cerber' ) . '

'; $form .= '

'; $form .= '

'; echo $form; } /* Create export file */ add_action( 'admin_init', 'cerber_export' ); function cerber_export() { global $wpdb; if ( ! cerber_is_http_get() || ! isset( $_GET['cerber_export'] ) ) { return; } if ( ! current_user_can( 'manage_options' ) ) { wp_die( 'Error!' ); } $p = cerber_plugin_data(); $data = array( 'cerber_version' => $p['Version'], 'home' => cerber_get_home_url(), 'date' => date( 'd M Y H:i:s' ) ); if ( ! empty( $_GET['exportset'] ) ) { $data ['options'] = crb_get_settings(); $data ['geo-rules'] = cerber_get_geo_rules(); } if ( ! empty( $_GET['exportacl'] ) ) { //$data ['acl'] = cerber_acl_all( 'ip, tag, comments, acl_slice' ); $data ['acl'] = $wpdb->get_results( 'SELECT ip, tag, comments, acl_slice FROM ' . CERBER_ACL_TABLE, ARRAY_N ); } $file = json_encode( $data ); $file .= '==/' . strlen( $file ) . '/' . crc32( $file ) . '/EOF'; crb_file_headers( 'wpcerber.config' ); echo $file; exit; } /** * Import plugin settings from a file * */ add_action( 'admin_init', 'cerber_import' ); function cerber_import() { global $wpdb, $wp_cerber; if ( ! isset( $_POST['cerber_import'] ) || ! cerber_is_http_post() ) { return; } check_admin_referer( 'crb_import', 'crb_field' ); if ( ! current_user_can( 'manage_options' ) ) { wp_die( 'Import failed.' ); } // Bulk load ACL if ( isset( $_POST['acl_text'] ) ) { if ( ! ( $text = crb_get_post_fields( 'import_acl_entries' ) ) || ! ( $tag = crb_get_post_fields( 'target_acl', false, 'W|B' ) ) ) { cerber_admin_notice( 'No data provided' ); return; } $text = sanitize_textarea_field( $text ); $list = explode( PHP_EOL, $text ); $count = 0; foreach ( $list as $line ) { if ( ! $line ) { continue; } list( $ip, $comment ) = explode( ',', $line . ',', 3 ); $ip = preg_replace( CRB_IP_NET_RANGE, ' ', $ip ); $ip = preg_replace( '/\s+/', ' ', $ip ); if ( ! $ip ) { continue; } if ( $tag == 'B' ) { if ( ! cerber_can_be_listed( $ip ) ) { cerber_admin_notice( 'Cannot be blacklisted: ' . $ip ); continue; } } $comment = trim( strip_tags( stripslashes( $comment ) ) ); $result = cerber_acl_add( $ip, $tag, $comment ); if ( $result !== true ) { $msg = 'SKIPPED: ' . $ip . ' ' . $comment; if ( is_wp_error( $result ) ) { $msg .= ' - ' . $result->get_error_message(); } cerber_admin_notice( $msg ); } else { $count ++; } } if ( $count ) { $msg = $count . ' access list entries were loaded. Manage access lists.'; } else { $msg = 'No entries were loaded'; } cerber_admin_message( $msg ); return; } // Import from a file $ok = true; if ( ! is_uploaded_file( $_FILES['ifile']['tmp_name'] ) ) { cerber_admin_notice( __( 'No file was uploaded or file is corrupted', 'wp-cerber' ) ); return; } elseif ( $file = file_get_contents( $_FILES['ifile']['tmp_name'] ) ) { $p = strrpos( $file, '==/' ); $data = substr( $file, 0, $p ); $sys = explode( '/', substr( $file, $p ) ); if ( $sys[3] == 'EOF' && crc32( $data ) == $sys[2] && ( $data = json_decode( $data, true ) ) ) { if ( isset( $_POST['importset'] ) && $data['options'] && ! empty( $data['options'] ) && is_array( $data['options'] ) ) { $data['options']['loginpath'] = urldecode( $data['options']['loginpath'] ); // needed for filter cerber_sanitize_m() if ( $data['home'] != cerber_get_home_url() ) { $data['options']['sitekey'] = $wp_cerber->getSettings( 'sitekey' ); $data['options']['secretkey'] = $wp_cerber->getSettings( 'secretkey' ); } cerber_save_settings( $data['options'] ); // @since 2.0 if ( isset( $data['geo-rules'] ) ) { update_site_option( 'geo_rule_set', $data['geo-rules'] ); } if ( ! empty( $data['options']['crb_role_policies'] ) ) { update_site_option( CERBER_SETTINGS, array( 'crb_role_policies' => $data['options']['crb_role_policies'] ) ); } } if ( isset( $_POST['importacl'] ) && ! empty( $data['acl'] ) && is_array( $data['acl'] ) ) { $acl_ok = true; if ( false === $wpdb->query( "DELETE FROM " . CERBER_ACL_TABLE ) ) { $acl_ok = false; } foreach ( $data['acl'] as $row ) { if ( ! cerber_acl_add( $row[0], $row[1], crb_array_get( $row, 2, '' ), crb_array_get( $row, 3, 0 ) ) ) { $acl_ok = false; break; } } if ( ! $acl_ok ) { cerber_admin_notice( __( 'A database error occurred while importing access list entries', 'wp-cerber' ) ); } cerber_acl_fixer(); } cerber_upgrade_settings(); // In case it was settings from an older version cerber_admin_message( __( 'Settings has imported successfully from', 'wp-cerber' ) . ' ' . $_FILES['ifile']['name'] ); } else { $ok = false; } } if ( ! $ok ) { cerber_admin_notice( __( 'Error while parsing file', 'wp-cerber' ) ); } } /** * Displays admin diagnostic page */ function cerber_show_diag(){ $sections = array(); cerber_cache_enable(); if ( $d = cerber_environment_diag() ) { $sections [] = $d; } ?>
'; echo '

'.$section[0].'

'; echo $section[1]; echo ''; } ?>

System Info

Database Info

Repair Cerber\'s Tables

'; ?>

Server Environment Variables

$value ) { $se[] = array( $key, @strip_tags( $value ) ); } echo cerber_make_plain_table( $se ); ?>

Cerber Security Cloud Status

Clear Up Cache Recheck Node Statuses

Maintenance Tasks

'; cerber_cron_diag(); echo ''; if ( $report = get_site_option( '_cerber_report' ) ) { echo '

Reports

'; echo cerber_ago_time($report[0]).' ('.cerber_date($report[0]).')'; if ($report[1]) { echo ' OK / '.get_site_transient( 'crb_hourly_2' ); } else { echo ' Unable to send email'; } echo '
'; } if ( $subs = get_site_option( '_cerber_subs' ) ) { echo '

Subscriptions for notifications

'; echo '
    '; foreach ( $subs as $hash => $sub ) { echo '
  1. '.$hash.' | '.__( 'Unsubscribe', 'wp-cerber' ).'
  2. '; } echo '
'; echo '
'; } if ( $status = CRB_DS::get_status() ) { echo '

Data Shield Status

'; echo $status; echo '
'; } ?>
This key is valid until ' . $expires . '

To move the key to another website or web server, please follow these steps: https://my.wpcerber.com/how-to-move-license-key/

'; } else { $valid = '

This license key is invalid or expired ' . $expires . '

If you believe this key is valid, please follow these steps: https://my.wpcerber.com/how-to-fix-invalid-or-expired-key/

'; } } else { $lic = ''; } ?>
License key for the PRO version
Site ID '.$key[0].'

'; ?>
' . $tz . '!' : $tz; if ( $c = CRB_Cache::checker() ) { $c = 'Yes | ' . cerber_date( $c ) . ' | ' . cerber_ago_time( $c ); if ( $stat = CRB_Cache::get_stat( true ) ) { $c .= ' | Cerber\'s entries: ' . count( $stat[1] ); $c .= ' | '.crb_confirmation_link( cerber_admin_link_add( array( 'cerber_admin_do' => 'clear_cache', ) ), 'Clear the cache' ); } } else { $c = 'Not detected'; } $sys = array( array( 'Web Server', $_SERVER['SERVER_SOFTWARE'] ), array( 'PHP version', phpversion() ), array( 'Server API', php_sapi_name() ), array( 'Server platform', PHP_OS ), array( 'Memory limit', @ini_get( 'memory_limit' ) ), array( 'Default PHP timezone', $tz ), array( 'Disabled PHP functions', @ini_get( 'disable_functions' ) ), array( 'WordPress version', cerber_get_wp_version() ), array( 'WordPress locale', get_locale() ), array( 'WordPress options DB table', $wpdb->prefix . 'options' ), array( 'MySQLi', ( function_exists( 'mysqli_connect' ) ) ? 'YES' : 'NO' ), array( 'MySQL Native Driver (mysqlnd)', ( function_exists( 'mysqli_fetch_all' ) ) ? 'YES' : 'NO' ), array( 'PHP allow_url_fopen', ( ini_get( 'allow_url_fopen' ) ) ? 'Enabled' : 'Disabled' ), array( 'PHP allow_url_include', ( ini_get( 'allow_url_include' ) ) ? 'Enabled' : 'Disabled' ), array( 'Persistent object cache', $c ), ); if ( 2 < substr_count( cerber_get_site_url(), '/' ) ) { $sys[] = array( 'Subfolder WP installation', 'YES' ); $sys[] = array( 'Site URL', cerber_get_site_url() ); $sys[] = array( 'Home URL', cerber_get_home_url() ); } if ( nexus_is_valid_request() ) { $sys[] = array( 'The IP address of the master is detected as', cerber_get_remote_ip() ); } else { $sys[] = array( 'Your IP address is detected as', cerber_get_remote_ip() . ' (check it on the What Is My IP Address page)' ); } $ret[] = cerber_make_plain_table( $sys ); $folder = cerber_get_the_folder(); if ( is_wp_error( $folder ) ) { $folder = $folder->get_error_message(); } else { $folder .= 'quarantine' . DIRECTORY_SEPARATOR; } if ( file_exists( ABSPATH . 'wp-config.php' )) { $config = ABSPATH . 'wp-config.php'; } elseif ( file_exists( dirname( ABSPATH ) . '/wp-config.php' ) ) { $config = dirname( ABSPATH ) . '/wp-config.php'; } else { $config = 'None?'; } $folders = array( array( 'WordPress root folder (ABSPATH) ', ABSPATH ), array( 'WordPress uploads folder', cerber_get_upload_dir() ), array( 'WordPress content folder', dirname( cerber_get_plugins_dir() ) ), array( 'WordPress plugins folder', cerber_get_plugins_dir() ), array( 'WordPress themes folder', cerber_get_themes_dir() ), array( 'WordPress must use plugin folder (WPMU_PLUGIN_DIR) ', WPMU_PLUGIN_DIR ), array( 'WordPress config file', $config ), array( 'PHP folder for uploading files', ini_get( 'upload_tmp_dir' ) ), array( 'Server folder for temporary files', sys_get_temp_dir() ), array( 'Server folder for user session data', session_save_path() ), array( 'Cerber\'s quarantine folder', $folder ), array( 'Cerber\'s diagnostic log', cerber_get_diag_log() ) ); //$folders[] = array( 'WordPress config file', $config ); if ( file_exists( ABSPATH . '.htaccess' ) ) { $folders[] = array( 'Main .htaccess file', ABSPATH . '.htaccess' ); } foreach ( $folders as &$folder ) { $folder[2] = ''; $folder[3] = ''; if ( @file_exists( $folder[1] ) ) { if ( wp_is_writable( $folder[1] ) ) { $folder[2] = 'Writable'; } else { $folder[2] = 'Write protected'; } $folder[3] = cerber_get_chmod( $folder[1] ); } else { $folder[2] = 'Not found (no access)'; } } $folders[] = array( 'Directory separator', DIRECTORY_SEPARATOR ); $ret[] = '

File system

'.cerber_make_plain_table( $folders ); if ( is_multisite() ) { $mu = array(); if ( defined( 'UPLOADS' ) ) { $mu[] = array( 'UPLOADS', UPLOADS ); } if ( defined( 'BLOGUPLOADDIR' ) ) { $mu[] = array( 'BLOGUPLOADDIR', BLOGUPLOADDIR ); } if ( defined( 'UPLOADBLOGSDIR' ) ) { $mu[] = array( 'UPLOADBLOGSDIR', UPLOADBLOGSDIR ); } $mu[] = array( 'Uploads folder for sites', cerber_get_upload_dir_mu() ); $ret[] = '

Multisite system constant

' . cerber_make_plain_table( $mu ); } $pls = array(); $list = get_option('active_plugins'); foreach($list as $plugin) { $data = get_plugin_data(WP_PLUGIN_DIR.'/'.$plugin); $pls[] = array($data['Name'], $data['Version']); } $ret[] = '

Active plugins

' . cerber_make_plain_table( $pls ); echo implode("\n",$ret); } function cerber_make_plain_table( $data, $header = null, $first_header = false, $eq = false ) { $class = 'crb-monospace '; if ( $first_header ) { $class .= ' crb-plain-fh '; } if ( ! $eq ) { $class .= ' crb-plain-fcw '; } $ret = '
'; if ( $header ) { $ret .= ''; } foreach ( $data as $row ) { $ret .= ''; } $ret .= '
' . implode( '', $header ) . '
' . implode( '', $row ) . '
'; return $ret; } function cerber_get_chmod( $file ) { return substr( sprintf( '%o', @fileperms( $file ) ), - 4 ); } /* * Create database diagnostic report * * */ function cerber_db_diag(){ global $wpdb; $ret = array(); $db_info = array(); $db_info[] = array( 'Database name', DB_NAME ); $var = crb_get_mysql_var( 'innodb_buffer_pool_size' ); $pool_size = round( $var / 1048576 ); $inno = $pool_size . ' MB'; if ( $pool_size < 16 ) { $inno .= ' Your pool size is extremely small!'; } elseif ( $pool_size < 64 ) { $inno .= ' It seems your pool size is too small.'; } $db_info[] = array( 'InnoDB buffer pool size', $inno ); $var = crb_get_mysql_var( 'max_allowed_packet' ); $db_info[] = array( 'Max allowed packet size', round( $var / 1048576 ) . ' MB' ); $db_info[] = array( 'Charset', $wpdb->charset ); $db_info[] = array( 'Collate', $wpdb->collate ); $ret[] = cerber_make_plain_table($db_info); $ret[] = cerber_table_info( CERBER_LOG_TABLE ); $ret[] = cerber_table_info( CERBER_ACL_TABLE ); $ret[] = cerber_table_info( CERBER_BLOCKS_TABLE ); $ret[] = cerber_table_info( CERBER_TRAF_TABLE ); if ( cerber_get_remote_ip() === CERBER_NO_REMOTE_IP ) { $ret[] = '

It seems that we are unable to get IP addresses.

'; } $err = ''; if ( $errors = get_site_option( '_cerber_db_errors' ) ) { $err = '

Some minor DB errors were detected

'; update_site_option( '_cerber_db_errors', '' ); } return $err . implode( '
', $ret ); } /** * Creates mini report about given database table * * @param $table * * @return string */ function cerber_table_info( $table ) { global $wpdb; if (!cerber_is_table($table)){ return '

ERROR. Database table ' . $table . ' not found! Click repair button below.

'; } $cols = $wpdb->get_results( "SHOW FULL COLUMNS FROM " . $table ); $tb = array(); //$columns = ''; foreach ( $cols as $column ) { $column = obj_to_arr_deep( $column ); $field = array_shift( $column ); $type = array_shift( $column ); $collation = array_shift( $column ); $tb[] = array( $field, $type, $collation ); //$columns .= ''; } //$columns .= '
FieldTypeCollation
' . $field . '' . $type . '' . $collation . '
'; $columns = cerber_make_plain_table( $tb, array( 'Field', 'Type', 'Collation' ) ); $rows = absint( cerber_db_get_var( 'SELECT COUNT(*) FROM ' . $table ) ); $sts = $wpdb->get_row( 'SHOW TABLE STATUS WHERE NAME = "' . $table .'"'); $tb = array(); foreach ( $sts as $key => $value ) { $tb[] = array( $key, $value ); } $status = cerber_make_plain_table( $tb, null, true ); $truncate = ''; if ($rows) { $truncate = ' Delete all rows'; } return '

Table: ' . $table . ', rows: ' . $rows . $truncate. '

' . $columns . ''. $status.'
'; } function cerber_environment_diag() { $issues = array(); if ( version_compare( '7.0', phpversion(), '>' ) ) { $issues[] = 'Your site run on an outdated (unsupported) version of PHP which is ' . phpversion() . '. We strongly encourage you to upgrade it to a newer version of PHP. See more at: http://php.net/supported-versions.php'; } if ( ! function_exists( 'http_response_code' ) ) { $issues[] = 'The PHP function http_response_code() is not found or disabled.'; } if ( ! is_numeric( $_SERVER['REQUEST_TIME_FLOAT'] ) ) { $issues[] = 'The server environment variable $_SERVER[\'REQUEST_TIME_FLOAT\'] is not set correctly.'; } /*if ( $c = cerber_cron_diag() ) { $issues[] = $c; }*/ $ret = null; if ( $issues ) { $issues = '

' . implode( '

', $issues ) . '

'; $ret = array( '

Some issues detected. They might affect plugin functionality.

', $issues ); } return $ret; } function cerber_cron_diag() { $planned = array(); $crb_crons = array( 'cerber_hourly_1' => 'Hourly task #1', 'cerber_hourly_2' => 'Hourly task #2', 'cerber_daily' => 'Daily task', //'cerber_bg_launcher' => 'Background tasks' ); foreach ( _get_cron_array() as $time => $item ) { foreach ( $crb_crons as $key => $val ) { if ( ! empty( $item[ $key ] ) ) { $planned[ $key ] = $val . ' scheduled for ' . cerber_date( $time ) . ' (' . cerber_ago_time( $time ) . ')'; } } } unset( $crb_crons['cerber_daily'] ); $crb_crons['cerber_daily_1'] = 'Daily task'; $errors = array(); $ok = array(); $no_cron = false; foreach ( $crb_crons as $key => $task ) { $h = get_site_transient( $key ); if ( ! $h || ! is_array( $h ) ) { $errors[] = $task . ' has never been executed'; if ( $oldest = cerber_db_get_var( 'SELECT MIN(stamp) FROM ' . CERBER_LOG_TABLE ) ) { if ( $oldest < ( time() - 24 * 3600 ) ) { $no_cron = true; } } continue; } if ( empty( $h[1] ) ) { $errors[] = $task . ' has not finished correctly'; continue; } $end = $h[1]; /* if ( $end < ( time() - 2 * 3600 ) ) { $errors[] = $val . ' has been executed ' . cerber_ago_time( $end ); } else { $ok[] = $val . ' has been executed ' . cerber_ago_time( $end ); } */ $dur = $end - $h[0]; if ( $dur > 60 ) { $errors[] = $task . ' has been executed ' . cerber_ago_time( $end ) . ' and it took ' . $dur . ' seconds.'; } else { $ok[] = $task . ' has been executed ' . cerber_ago_time( $end ) . ' and it took ' . $dur . ' seconds.'; } } if ( $errors ) { //echo 'There are some errors'; echo '

' . implode( '
', $errors ) . '

'; } if ( $ok ) { echo '

' . implode( '
', $ok ) . '

'; } if ( $planned ) { echo '

' . implode( '
', $planned ) . '

'; } $num = 0; if ( $bg = cerber_bg_task_get_all() ) { $num = count( $bg ); } echo '

Background tasks: ' . $num . '

'; if ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON ) { echo '

Note: the internal WordPress cron launcher is disabled on this site.

'; if ( $no_cron ) { echo '

An external cron launcher has not been configured or does not work properly.

'; } } } function cerber_show_diag_log() { $file = cerber_get_diag_log(); if ( ! is_file( $file ) ) { echo 'The log file has not been created yet.'; return; } if ( ! filesize( $file ) ) { echo 'The diagnostic log file is empty.'; return; } $reverse_log = crb_get_query_params( 'reverse_log', '\d' ); $clear = crb_confirmation_link( cerber_admin_link_add( array( 'cerber_admin_do' => 'manage_diag_log', 'do_this' => 'clear_it', ) ), 'Clear the log' ); $dnl = 'Download as a file'; $reverse = 'Reverse the order'; $nav = '
' . $reverse . ' | ' . $dnl . ' | ' . $clear . '
'; if ( empty( $reverse_log ) ) { $log = @fopen( $file, 'r' ); $text = fread( $log, 10000000 ); if ( ! $text ) { return; } fclose( $log ); /*$p = strpos( $text, PHP_EOL ); $text = substr( $text, $p + 1 );*/ echo $nav; echo '
' . nl2br( htmlentities( $text ) ) . '
'; } else { $lines = file( $file ); if ( ! $lines ) { return; } echo $nav; echo '
';
		for ( $i = count( $lines ) - 1; $i >= 0; $i -- ) {
			echo htmlentities( $lines[ $i ] ) . '
'; } echo '
'; } } function cerber_manage_diag_log( $v ) { if ( $v == 'clear_it' ) { cerber_truncate_log( 0 ); } elseif ( $v == 'download' ) { crb_file_headers( 'wpcerber.log' ); readfile( cerber_get_diag_log() ); exit; } } function cerber_show_change_log() { if ( ! $text = file( cerber_get_plugins_dir() . '/wp-cerber/changelog.txt' ) ) { echo 'File changelog.txt not found'; return; } echo '
'; foreach ( $text as $line ) { $line = htmlspecialchars( $line ); if ( preg_match_all( '/(\[.+?\])(\(.+?\))/', $line, $m ) ) { $anchors = $m[1]; $links = $m[2]; $replace = array(); foreach ( $anchors as $i => $anchor ) { $replace[] = '' . trim( $anchor, '[]' ) . ''; } $line = str_replace( $anchors, $replace, $line ); $line = str_replace( $links, '', $line ); } if ( preg_match( '/=([\d\.\s]+?)=/', $line, $m ) ) { $line = str_replace( $m[0], '' . $m[1] . '', $line ); } echo $line . '
'; } echo '
'; }