reset_to_defaults();
add_action( 'shutdown', array( $this, 'shutdown' ) );
}
public static function set_success( $success ) {
$self = self::get_instance();
$old_success = $self->success;
$self->success = (bool) $success;
return $old_success;
}
public static function is_success() {
$self = self::get_instance();
return $self->success;
}
public static function set_response( $response ) {
$self = self::get_instance();
$old_response = $self->response;
$self->response = $response;
return $old_response;
}
public static function get_response() {
$self = self::get_instance();
return $self->response;
}
public static function add_errors( $errors ) {
foreach ( $errors as $error ) {
self::add_error( $error );
}
}
public static function add_error( $error ) {
$self = self::get_instance();
$self->errors[] = $error;
}
public static function get_errors() {
$self = self::get_instance();
return $self->errors;
}
public static function add_warnings( $warnings ) {
foreach ( $warnings as $warning ) {
self::add_warning( $warning );
}
}
public static function add_warning( $warning ) {
$self = self::get_instance();
$self->warnings[] = $warning;
}
public static function get_warnings() {
$self = self::get_instance();
return $self->warnings;
}
public static function get_error_count() {
$self = self::get_instance();
return count( $self->errors );
}
public static function add_messages( $messages ) {
foreach ( $messages as $message ) {
self::add_message( $message );
}
}
public static function add_message( $message ) {
$self = self::get_instance();
$self->messages[] = $message;
}
public static function get_messages() {
$self = self::get_instance();
return $self->messages;
}
public static function add_infos( $messages ) {
foreach ( $messages as $message ) {
self::add_info( $message );
}
}
public static function add_info( $message ) {
$self = self::get_instance();
$self->infos[] = $message;
}
public static function get_infos() {
$self = self::get_instance();
return $self->infos;
}
public static function add_js_function_call( $js_function, $args = null ) {
$self = self::get_instance();
if ( is_null( $args ) ) {
$call = array( $js_function );
} else {
$call = array( $js_function, $args );
}
if ( ! in_array( $call, $self->js_function_calls ) ) {
$self->js_function_calls[] = $call;
}
}
public static function get_js_function_calls() {
$self = self::get_instance();
return $self->js_function_calls;
}
public static function set_show_default_success_message( $show_default_success_message ) {
$self = self::get_instance();
$old_show_default_success_message = $self->show_default_success_message;
$self->show_default_success_message = $show_default_success_message;
return $old_show_default_success_message;
}
public static function get_show_default_success_message() {
$self = self::get_instance();
return $self->show_default_success_message;
}
public static function set_show_default_error_message( $show_default_error_message ) {
$self = self::get_instance();
$old_show_default_error_message = $self->show_default_error_message;
$self->show_default_error_message = $show_default_error_message;
return $old_show_default_error_message;
}
public static function get_show_default_error_message() {
$self = self::get_instance();
return $self->show_default_error_message;
}
public static function prevent_modal_close() {
$self = self::get_instance();
$self->close_modal = false;
}
public static function reload_module( $module ) {
$self = self::get_instance();
$self->add_js_function_call( 'reloadModule', $module );
}
public static function reload_all_modules() {
self::get_instance()->add_js_function_call( 'reloadAllModules' );
}
public static function refresh_page() {
self::get_instance()->add_js_function_call( 'refreshPage' );
}
public static function regenerate_wp_config() {
$self = self::get_instance();
$self->regenerate_wp_config = true;
self::reload_module( 'wp-config-rules' );
}
public static function regenerate_server_config() {
$self = self::get_instance();
$self->regenerate_server_config = true;
self::reload_module( 'server-config-rules' );
}
public static function force_logout() {
$self = self::get_instance();
if ( $self->force_logout ) {
return;
}
$self->force_logout = true;
self::redirect( add_query_arg( 'loggedout', 'true', wp_login_url() ) );
}
public static function redirect( $redirect ) {
$self = self::get_instance();
$self->redirect = $redirect;
}
public static function maybe_regenerate_wp_config() {
$self = self::get_instance();
if ( $self->regenerate_wp_config ) {
ITSEC_Files::regenerate_wp_config();
$self->regenerate_wp_config = false;
}
}
public static function maybe_regenerate_server_config() {
$self = self::get_instance();
if ( $self->regenerate_server_config ) {
ITSEC_Files::regenerate_server_config();
$self->regenerate_server_config = false;
}
}
public static function maybe_do_force_logout() {
$self = self::get_instance();
if ( $self->force_logout ) {
@wp_clear_auth_cookie();
$self->force_logout = false;
}
}
public static function maybe_do_redirect() {
$self = self::get_instance();
if ( $self->redirect ) {
wp_safe_redirect( $self->redirect );
exit();
}
}
public static function maybe_flag_new_notifications_available() {
$nc = ITSEC_Core::get_notification_center();
$current = array_keys( $nc->get_notifications() );
$nc->clear_notifications_cache();
$new = array_keys( $nc->get_notifications() );
$added = array_diff( $new, $current );
if ( $added ) {
self::flag_new_notifications_available();
}
}
public static function flag_new_notifications_available() {
static $run_count = 0;
if ( $run_count++ > 0 ) {
return;
}
self::reload_module( 'notification-center' );
self::get_instance()->has_new_notifications = true;
self::get_instance()->add_info( sprintf(
esc_html__( 'New notifications available in the %1$sNotification Center%2$s.', 'better-wp-security' ),
'',
''
) );
}
public static function get_raw_data() {
$self = self::get_instance();
self::maybe_regenerate_wp_config();
self::maybe_regenerate_server_config();
self::maybe_do_force_logout();
if ( is_wp_error( $self->response ) ) {
$self->add_error( $self->response );
$self->set_response( null );
}
$data = array(
'source' => 'ITSEC_Response',
'success' => $self->success,
'response' => $self->response,
'errors' => self::get_error_strings( $self->errors ),
'warnings' => self::get_error_strings( $self->warnings ),
'messages' => $self->messages,
'infos' => $self->infos,
'functionCalls' => self::parse_js_function_calls_for_module_reloads(),
'redirect' => $self->redirect,
'closeModal' => $self->close_modal,
'newNotifications' => $self->has_new_notifications,
);
return $data;
}
public static function send_json() {
$data = self::get_raw_data();
wp_send_json( $data );
}
public static function get_instance() {
if ( ! self::$instance ) {
self::$instance = new self;
}
return self::$instance;
}
public function reset_to_defaults() {
$this->response = null;
$this->errors = array();
$this->warnings = array();
$this->messages = array();
$this->infos = array();
$this->success = true;
$this->js_function_calls = array();
$this->show_default_success_message = true;
$this->show_default_error_message = true;
$this->force_logout = false;
$this->redirect = false;
$this->close_modal = true;
$this->regenerate_wp_config = false;
$this->regenerate_server_config = false;
}
public static function get_error_strings( $error ) {
if ( is_string( $error ) ) {
return array( $error );
} else if ( is_a( $error, 'WP_Error' ) ) {
/* translators: 1: error message, 2: error code */
$format = __( '%1$s (%2$s)', 'better-wp-security' );
$errors = array();
foreach ( $error->get_error_codes() as $code ) {
$message = implode( ' ', (array) $error->get_error_messages( $code ) );
$errors[] = sprintf( $format, $message, $code ) . ' ';
}
return $errors;
} else if ( is_array( $error ) ) {
$errors = array();
foreach ( $error as $error_item ) {
$new_errors = self::get_error_strings( $error_item );
$errors = array_merge( $errors, $new_errors );
}
return $errors;
}
/* translators: 1: variable type */
return array( sprintf( __( 'Unknown error type received: %1$s.', 'better-wp-security' ), gettype( $error ) ) );
}
private static function parse_js_function_calls_for_module_reloads() {
$has_reload_all = false;
$function_calls = self::get_instance()->js_function_calls;
foreach ( $function_calls as $function_call ) {
if ( $function_call[0] === 'reloadAllModules' ) {
$has_reload_all = true;
break;
}
}
if ( ! $has_reload_all ) {
return $function_calls;
}
foreach ( $function_calls as $i => $function_call ) {
if ( $function_call[0] === 'reloadModule' ) {
unset( $function_calls[ $i ] );
}
}
return array_values( $function_calls );
}
public function shutdown() {
self::maybe_regenerate_wp_config();
self::maybe_regenerate_server_config();
self::maybe_do_force_logout();
}
}