*/ public function readable_option_exact_names(): array { return self::READABLE_OPTION_EXACT; } /** * Return public option-name prefixes for storage-level filtering. * * @return array */ public function readable_option_prefixes(): array { return self::READABLE_OPTION_PREFIXES; } /** * Return whether a single option name is readable. * * @param string $name Option name. * @param bool $dev_mode Whether the internal dev module is active. */ public function is_option_readable( string $name, bool $dev_mode = false ): bool { if ( $dev_mode ) { return true; } if ( in_array( $name, self::READABLE_OPTION_EXACT, true ) ) { return true; } foreach ( self::READABLE_OPTION_PREFIXES as $prefix ) { if ( '' !== $prefix && str_starts_with( $name, $prefix ) ) { return true; } } return false; } /** * Filter a list of option documents down to the readable allowlist. * * Filtering happens before pagination so a page is never silently shrunk * by a later redaction pass. * * @param array $documents Option documents shaped `{identity:{name},...}`. * @param bool $dev_mode Whether the internal dev module is active. * @return array */ public function filter_readable_options( array $documents, bool $dev_mode = false ): array { if ( $dev_mode ) { return $documents; } return array_values( array_filter( $documents, function ( $document ): bool { $name = is_array( $document ) && isset( $document['identity']['name'] ) ? (string) $document['identity']['name'] : ''; return '' !== $name && $this->is_option_readable( $name, false ); } ) ); } }