exists() ? $theme->get( 'Name' ) : __( 'Unknown', 'nyxonn-builder' ); $theme_version = $theme->exists() ? $theme->get( 'Version' ) : ''; $enabled_types = Builder_Settings::get_enabled_post_types(); $supported = Builder_Settings::get_supported_post_types(); $enabled_labels = []; foreach ( $enabled_types as $post_type ) { $enabled_labels[] = isset( $supported[ $post_type ] ) ? $supported[ $post_type ]->labels->singular_name : $post_type; } return [ __( 'Nyxonn Builder version', 'nyxonn-builder' ) => NYXONN_BUILDER_VERSION, __( 'WordPress version', 'nyxonn-builder' ) => (string) $wp_version, __( 'PHP version', 'nyxonn-builder' ) => PHP_VERSION, __( 'Active theme', 'nyxonn-builder' ) => trim( $theme_name . ( $theme_version ? ' ' . $theme_version : '' ) ), __( 'Site URL', 'nyxonn-builder' ) => self::sanitize_support_url( site_url() ), __( 'Home URL', 'nyxonn-builder' ) => self::sanitize_support_url( home_url() ), __( 'PHP memory limit', 'nyxonn-builder' ) => (string) ini_get( 'memory_limit' ), __( 'WordPress memory limit', 'nyxonn-builder' ) => defined( 'WP_MEMORY_LIMIT' ) ? WP_MEMORY_LIMIT : __( 'Not defined', 'nyxonn-builder' ), __( 'Upload max filesize', 'nyxonn-builder' ) => size_format( wp_max_upload_size() ), __( 'Max execution time', 'nyxonn-builder' ) => self::execution_time_label(), __( 'REST API', 'nyxonn-builder' ) => function_exists( 'rest_get_server' ) && function_exists( 'rest_url' ) ? __( 'Available', 'nyxonn-builder' ) : __( 'Unavailable', 'nyxonn-builder' ), __( 'Pretty permalinks', 'nyxonn-builder' ) => get_option( 'permalink_structure' ) ? __( 'Enabled', 'nyxonn-builder' ) : __( 'Disabled', 'nyxonn-builder' ), __( 'Multisite', 'nyxonn-builder' ) => is_multisite() ? __( 'Enabled', 'nyxonn-builder' ) : __( 'Disabled', 'nyxonn-builder' ), __( 'WordPress debug', 'nyxonn-builder' ) => defined( 'WP_DEBUG' ) && WP_DEBUG ? __( 'Enabled', 'nyxonn-builder' ) : __( 'Disabled', 'nyxonn-builder' ), __( 'Nyxonn Builder Pro', 'nyxonn-builder' ) => function_exists( 'nyxonn_fx_has_extension' ) && nyxonn_fx_has_extension( 'pro' ) ? __( 'Active', 'nyxonn-builder' ) : __( 'Inactive', 'nyxonn-builder' ), __( 'Safe Mode', 'nyxonn-builder' ) => function_exists( 'nyxonn_fx_is_safe_mode' ) && nyxonn_fx_is_safe_mode() ? __( 'Active', 'nyxonn-builder' ) : __( 'Inactive', 'nyxonn-builder' ), __( 'Enabled Builder post types', 'nyxonn-builder' ) => $enabled_labels ? implode( ', ', $enabled_labels ) : __( 'None', 'nyxonn-builder' ), ]; } private static function execution_time_label() { $seconds = (int) ini_get( 'max_execution_time' ); return $seconds > 0 ? sprintf( /* translators: %d: elapsed seconds. */ __( '%d seconds', 'nyxonn-builder' ), $seconds ) : __( 'Unlimited', 'nyxonn-builder' ); } /** Remove URL user-info so diagnostics can never expose embedded credentials. */ private static function sanitize_support_url( $url ) { $url = esc_url_raw( (string) $url, [ 'http', 'https' ] ); return preg_replace( '#^(https?://)(?:[^/@]+@)#i', '$1', $url ); } public static function get_support_text() { $lines = [ 'Nyxonn Builder System Information' ]; foreach ( self::get_system_information() as $label => $value ) { $lines[] = sanitize_text_field( $label ) . ': ' . sanitize_text_field( (string) $value ); } return implode( "\n", $lines ); } public static function build_export_data() { return [ 'format' => self::EXPORT_FORMAT, 'schema' => self::EXPORT_SCHEMA, 'nyxonn_version' => NYXONN_BUILDER_VERSION, 'settings' => [ 'builder' => [ 'post_types' => Builder_Settings::get_enabled_post_types() ], 'global' => Global_Settings::get_settings(), 'performance' => Performance_Settings::get_settings(), 'roles' => Role_Manager::get_capability_mapping(), ], ]; } public static function validate_import_json( $json ) { if ( ! is_string( $json ) || '' === trim( $json ) || strlen( $json ) > self::MAX_IMPORT_BYTES ) { return new \WP_Error( 'invalid_import', __( 'Choose a non-empty JSON export smaller than 1 MB.', 'nyxonn-builder' ) ); } $payload = json_decode( $json, true, 32 ); if ( JSON_ERROR_NONE !== json_last_error() || ! is_array( $payload ) ) { return new \WP_Error( 'invalid_json', __( 'The selected file does not contain valid JSON.', 'nyxonn-builder' ) ); } if ( self::EXPORT_FORMAT !== ( $payload['format'] ?? '' ) || self::EXPORT_SCHEMA !== ( $payload['schema'] ?? null ) ) { return new \WP_Error( 'invalid_format', __( 'This is not a supported Nyxonn Builder settings export.', 'nyxonn-builder' ) ); } if ( ! isset( $payload['settings'] ) || ! is_array( $payload['settings'] ) ) { return new \WP_Error( 'missing_settings', __( 'The export does not contain a settings object.', 'nyxonn-builder' ) ); } $settings = $payload['settings']; $clean = []; if ( array_key_exists( 'builder', $settings ) ) { $clean['builder'] = Builder_Settings::sanitize_import_settings( $settings['builder'] ); } if ( array_key_exists( 'global', $settings ) ) { $clean['global'] = Global_Settings::sanitize_import_settings( $settings['global'] ); } if ( array_key_exists( 'performance', $settings ) ) { $clean['performance'] = Performance_Settings::sanitize_import_settings( $settings['performance'] ); } if ( array_key_exists( 'roles', $settings ) ) { $clean['roles'] = Role_Manager::sanitize_capability_mapping( $settings['roles'] ); } if ( ! $clean ) { return new \WP_Error( 'no_supported_settings', __( 'The export contains no supported Nyxonn Builder settings.', 'nyxonn-builder' ) ); } return $clean; } public static function apply_import( $settings ) { if ( isset( $settings['builder'] ) ) { update_option( Builder_Settings::OPTION_KEY, $settings['builder'], false ); } if ( isset( $settings['global'] ) ) { Global_Settings::import_settings( $settings['global'] ); } if ( isset( $settings['performance'] ) ) { update_option( Performance_Settings::OPTION_KEY, $settings['performance'], false ); } if ( isset( $settings['roles'] ) ) { Role_Manager::apply_capability_mapping( $settings['roles'] ); } } public static function handle_export() { self::authorize( 'nyxonn_builder_export_settings' ); $json = wp_json_encode( self::build_export_data(), JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES ); if ( false === $json ) { wp_die( esc_html__( 'Nyxonn Builder could not create the settings export.', 'nyxonn-builder' ), '', [ 'response' => 500 ] ); } nocache_headers(); header( 'Content-Type: application/json; charset=utf-8' ); header( 'Content-Disposition: attachment; filename="nyxonn-fx-settings-' . gmdate( 'Y-m-d' ) . '.json"' ); echo $json; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- JSON download, not HTML. exit; } public static function handle_import() { self::authorize( 'nyxonn_builder_import_settings' ); $file = isset( $_FILES['nyxonn_builder_settings_file'] ) && is_array( $_FILES['nyxonn_builder_settings_file'] ) ? $_FILES['nyxonn_builder_settings_file'] : []; $error = isset( $file['error'] ) ? (int) $file['error'] : UPLOAD_ERR_NO_FILE; $size = isset( $file['size'] ) ? (int) $file['size'] : 0; $name = isset( $file['name'] ) ? sanitize_file_name( wp_unslash( $file['name'] ) ) : ''; $tmp_name = isset( $file['tmp_name'] ) ? (string) $file['tmp_name'] : ''; if ( UPLOAD_ERR_OK !== $error || $size < 1 || $size > self::MAX_IMPORT_BYTES || 'json' !== strtolower( pathinfo( $name, PATHINFO_EXTENSION ) ) || ! is_uploaded_file( $tmp_name ) ) { self::redirect_with_notice( 'invalid_file' ); } $json = file_get_contents( $tmp_name ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents -- validated local upload. $settings = self::validate_import_json( $json ); if ( is_wp_error( $settings ) ) { self::redirect_with_notice( 'invalid_import' ); } self::apply_import( $settings ); self::redirect_with_notice( 'imported' ); } private static function authorize( $nonce_action ) { if ( ! current_user_can( 'manage_options' ) ) { wp_die( esc_html__( 'You do not have permission to use Nyxonn Builder tools.', 'nyxonn-builder' ), '', [ 'response' => 403 ] ); } check_admin_referer( $nonce_action ); } private static function redirect_with_notice( $notice ) { wp_safe_redirect( add_query_arg( 'nyxonn_builder_notice', sanitize_key( $notice ), admin_url( 'admin.php?page=nyxonn-builder-tools' ) ) ); exit; } }