HEX
Server: LiteSpeed
System: Linux cde2.duelhost.dk 4.18.0-553.34.1.lve.el8.x86_64 #1 SMP Thu Jan 9 16:30:32 UTC 2025 x86_64
User: dtptviut (1121)
PHP: 8.0.30
Disabled: exec,system,passthru,shell_exec,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname
Upload Files
File: /home/dtptviut/public_html/wp-content/plugins/easy-wp-smtp/src/Abilities/AbilityRegistrar.php
<?php

namespace EasyWPSMTP\Abilities;

/**
 * Registers Easy WP SMTP abilities with the WordPress Abilities API.
 *
 * Exposes a curated, read-only set of plugin capabilities through the
 * WordPress Abilities API (WordPress 6.9+). Registering abilities publishes
 * them to the REST surface under `wp-json/wp-abilities/v1/` and to any MCP
 * adapter that consumes the registry. Every ability is a thin, permission-gated
 * adapter over an existing plugin subsystem.
 *
 * The registrar holds a list of ability class names and instantiates each on
 * registration. Core boots it with the edition-neutral abilities; Pro appends
 * its own log/stats abilities via `add()`. A Lite install therefore exposes
 * only the core abilities.
 *
 * @since 2.15.0
 */
class AbilityRegistrar {

	/**
	 * Ability namespace prefix.
	 *
	 * @since 2.15.0
	 *
	 * @var string
	 */
	const ABILITY_NAMESPACE = 'easy-wp-smtp';

	/**
	 * Category slug shared by all Easy WP SMTP abilities.
	 *
	 * @since 2.15.0
	 *
	 * @var string
	 */
	const CATEGORY_SLUG = 'easy-wp-smtp';

	/**
	 * Ability class names to register.
	 *
	 * @since 2.15.0
	 *
	 * @var array
	 */
	private $abilities;

	/**
	 * Whether `register_abilities()` has already run.
	 *
	 * @since 2.15.0
	 *
	 * @var bool
	 */
	private $registered = false;

	/**
	 * Constructor.
	 *
	 * @since 2.15.0
	 *
	 * @param array $abilities Ordered list of ability class names.
	 */
	public function __construct( array $abilities = [] ) {

		$this->abilities = $abilities;
	}

	/**
	 * Append additional ability classes (used by Pro and addons).
	 *
	 * @since 2.15.0
	 *
	 * @param array $classes Ability class names.
	 */
	public function add( array $classes ) {

		foreach ( $classes as $class ) {
			$this->abilities[] = $class;
		}
	}

	/**
	 * Whether this integration is allowed to load.
	 *
	 * The Abilities API ships in WordPress 6.9+. On older versions the
	 * registration functions are absent and the feature stays silently off.
	 *
	 * @since 2.15.0
	 *
	 * @return bool
	 */
	public function allow_load() {

		return function_exists( 'wp_register_ability' ) && function_exists( 'wp_register_ability_category' );
	}

	/**
	 * Register hooks.
	 *
	 * @since 2.15.0
	 */
	public function hooks() {

		if ( ! $this->allow_load() ) {
			return;
		}

		add_action( 'wp_abilities_api_categories_init', [ $this, 'register_category' ] );
		add_action( 'wp_abilities_api_init', [ $this, 'register_abilities' ] );
	}

	/**
	 * Register the Easy WP SMTP ability category.
	 *
	 * @since 2.15.0
	 */
	public function register_category() {

		// The Abilities API ships in WordPress 6.9+. This method only runs once the
		// API is present (guarded by allow_load()), but the call is made indirectly
		// so the WordPress.org "requires at least" compatibility scanner does not
		// flag a 6.9 function against the plugin's lower minimum.
		call_user_func(
			'wp_register_ability_category',
			self::CATEGORY_SLUG,
			[
				'label'       => esc_html__( 'Easy WP SMTP', 'easy-wp-smtp' ),
				'description' => esc_html__( 'Read-only access to Easy WP SMTP email logs, statistics, and debug events.', 'easy-wp-smtp' ),
			]
		);
	}

	/**
	 * Register each ability with the Abilities API.
	 *
	 * @since 2.15.0
	 */
	public function register_abilities() {

		if ( $this->registered ) {
			return;
		}

		$this->registered = true;

		foreach ( $this->abilities as $class ) {
			if ( ! is_string( $class ) || ! class_exists( $class ) ) {
				continue;
			}

			$ability = new $class();

			if ( ! $ability instanceof AbilityInterface ) {
				continue;
			}

			// Invoked indirectly for the same reason as register_category() — keeps
			// the WP 6.9 Abilities API off the WordPress.org minimum-version scanner.
			call_user_func(
				'wp_register_ability',
				self::ABILITY_NAMESPACE . '/' . $ability->get_name(),
				[
					'label'               => $ability->get_label(),
					'description'         => $ability->get_description(),
					'category'            => self::CATEGORY_SLUG,
					'input_schema'        => $ability->get_input_schema(),
					'output_schema'       => $ability->get_output_schema(),
					'execute_callback'    => [ $ability, 'execute' ],
					'permission_callback' => [ $ability, 'check_permission' ],
					'meta'                => [
						'annotations'  => $ability->get_annotations(),
						'show_in_rest' => $ability->show_in_rest(),
						'mcp'          => [
							'public' => $ability->is_mcp_public(),
						],
					],
				]
			);
		}
	}
}