dashboard_dir = WP_PROMETHEUS_PATH . 'assets/dashboards/'; $this->dashboards = array( 'wordpress-overview' => array( 'title' => __( 'WordPress Overview', 'wp-prometheus' ), 'description' => __( 'General WordPress metrics including users, posts, comments, and plugins.', 'wp-prometheus' ), 'file' => 'wordpress-overview.json', 'icon' => 'dashicons-wordpress', ), 'wordpress-runtime' => array( 'title' => __( 'Runtime Performance', 'wp-prometheus' ), 'description' => __( 'HTTP request metrics, database query performance, and response times.', 'wp-prometheus' ), 'file' => 'wordpress-runtime.json', 'icon' => 'dashicons-performance', ), 'wordpress-woocommerce' => array( 'title' => __( 'WooCommerce Store', 'wp-prometheus' ), 'description' => __( 'WooCommerce metrics including products, orders, revenue, and customers.', 'wp-prometheus' ), 'file' => 'wordpress-woocommerce.json', 'icon' => 'dashicons-cart', ), ); } /** * Get list of available dashboards. * * @return array */ public function get_available(): array { $available = array(); foreach ( $this->dashboards as $slug => $dashboard ) { $file_path = $this->dashboard_dir . $dashboard['file']; if ( file_exists( $file_path ) ) { $available[ $slug ] = $dashboard; } } return $available; } /** * Get dashboard content by slug. * * @param string $slug Dashboard slug. * @return string|null JSON content or null if not found. */ public function get_dashboard( string $slug ): ?string { // Validate slug to prevent directory traversal. $slug = sanitize_file_name( $slug ); if ( ! isset( $this->dashboards[ $slug ] ) ) { return null; } $file_path = $this->dashboard_dir . $this->dashboards[ $slug ]['file']; // Security: Ensure file is within dashboard directory. $real_path = realpath( $file_path ); $real_dir = realpath( $this->dashboard_dir ); if ( false === $real_path || false === $real_dir || strpos( $real_path, $real_dir ) !== 0 ) { return null; } if ( ! file_exists( $file_path ) || ! is_readable( $file_path ) ) { return null; } // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents $content = file_get_contents( $file_path ); if ( false === $content ) { return null; } return $content; } /** * Get dashboard metadata by slug. * * @param string $slug Dashboard slug. * @return array|null Dashboard metadata or null if not found. */ public function get_metadata( string $slug ): ?array { $slug = sanitize_file_name( $slug ); if ( ! isset( $this->dashboards[ $slug ] ) ) { return null; } return $this->dashboards[ $slug ]; } /** * Get filename for download. * * @param string $slug Dashboard slug. * @return string|null Filename or null if not found. */ public function get_filename( string $slug ): ?string { $slug = sanitize_file_name( $slug ); if ( ! isset( $this->dashboards[ $slug ] ) ) { return null; } return $this->dashboards[ $slug ]['file']; } }