); } public function get_export_description(): string { return __( 'List of active modules.', 'better-wp-security' ); } public function get_export_options_schema(): array { return []; } public function get_export_schema(): array { return [ 'type' => 'object', 'additionalProperties' => [ 'type' => 'string', 'enum' => [ 'active', 'inactive' ], ], ]; } public function get_transformations(): array { return []; } public function export( $options ): Result { $data = []; foreach ( self::get_available_modules() as $module ) { if ( ! self::is_always_active( $module ) ) { $data[ $module ] = self::is_active( $module ) ? 'active' : 'inactive'; } } return Result::success( $data ); } public function import( Export $from, Import_Context $context ): Result { $result = Result::success(); if ( ! $from->has_data( $this->get_export_slug() ) ) { return $result; } foreach ( $from->get_data( $this->get_export_slug() ) as $module => $status ) { $success = true; if ( $status === 'active' && ! self::is_active( $module ) ) { $success = self::activate( $module ); } elseif ( $status === 'inactive' && self::is_active( $module ) ) { $success = self::deactivate( $module ); } if ( is_wp_error( $success ) ) { $result->add_warning_message( ...ITSEC_Lib::get_error_strings( $success ) ); } } return $result; } /** * Validates a module's schema. * * @param array $config * * @return true|WP_Error */ private static function validate_module_config( $config ) { $self = self::get_instance(); if ( ! $self->module_schema ) { $self->module_schema = ITSEC_Lib::resolve_schema_refs( json_decode( file_get_contents( __DIR__ . '/module-schema.json' ), true ) ); } return rest_validate_value_from_schema( $config, $self->module_schema, 'config' ); } /** * Initializes the module's feature flags. * * @param Module_Config $config */ private static function initialize_feature_flags( Module_Config $config ) { if ( ! $config->get_feature_flags() ) { return; } $flags = $config->get_feature_flags(); if ( self::is_active( $config->get_id() ) ) { $register = array_keys( $flags ); } else { $register = $config->get_requirements()['feature-flags']['flags'] ?? []; } foreach ( $register as $flag ) { if ( isset( $flags[ $flag ] ) ) { ITSEC_Lib_Feature_Flags::register_flag( $flag, $flags[ $flag ] ); } } } /** * Checks if the given module has the requested file. * * @param string $module The module id. * @param string $file The filename to check. * * @return bool */ private static function module_has_file( $module, $file ) { return file_exists( self::get_instance()->_module_paths[ $module ] . '/' . $file ); } /** * Transforms a module specifier to a list of modules. * * @param string|array $modules The modules specifier. * * @return string[] */ private static function transform_modules_specifier( $modules ) { if ( ':all' === $modules ) { return self::get_available_modules(); } if ( ':active' === $modules ) { return self::get_active_modules_to_run(); } if ( ':active-early' === $modules ) { return array_filter( self::get_active_modules_to_run(), function ( $module ) { return self::get_instance()->module_config[ $module ]->can_load_early(); } ); } if ( ':active-normal' === $modules ) { return array_filter( self::get_active_modules_to_run(), function ( $module ) { return ! self::get_instance()->module_config[ $module ]->can_load_early(); } ); } if ( is_string( $modules ) ) { return [ $modules ]; } if ( is_array( $modules ) ) { return $modules; } return []; } private function run( $definition ) { if ( $definition && is_string( $definition ) ) { $object = $this->container->get( $definition ); if ( $object instanceof Runnable ) { $object->run(); } } } /** * Load the container definitions for a module. * * @param string $module */ private function load_container_definitions( $module ) { if ( ! isset( $this->loaded_containers[ $module ] ) && isset( $this->_module_paths[ $module ] ) ) { $path = $this->_module_paths[ $module ] . '/container.php'; if ( file_exists( $this->_module_paths[ $module ] . '/container.php' ) && $register = include( $path ) ) { $this->loaded_containers[ $module ] = true; $register( $this->pimple ); } else { $this->loaded_containers[ $module ] = false; } } } } ITSEC_Modules::get_instance();