Skip to content
Merged
7 changes: 6 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
- Tags: nodeinfo, fediverse, ostatus, diaspora, activitypub
- Requires at least: 6.6
- Tested up to: 6.9
- Stable tag: 3.0.0
- Stable tag: 3.1.0
- Requires PHP: 7.2
- License: MIT
- License URI: https://opensource.org/licenses/MIT
Expand Down Expand Up @@ -81,6 +81,11 @@ If either check fails, you'll see recommendations on how to fix the issue.

Project and support maintained on github at [pfefferle/wordpress-nodeinfo](https://github.com/pfefferle/wordpress-nodeinfo).

### 3.1.0

* Added singleton-based plugin loading mechanism for better extensibility
* Added backwards compatibility handler for deprecated `wellknown_nodeinfo_data` filter

### 3.0.0

* Refactored to filter-based architecture for better extensibility
Expand Down
183 changes: 183 additions & 0 deletions includes/class-nodeinfo.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
<?php
/**
* Nodeinfo Class
*
* @package Nodeinfo
*/

namespace Nodeinfo;

use Nodeinfo\Controller\Nodeinfo as Controller_Nodeinfo;
use Nodeinfo\Controller\Nodeinfo2 as Controller_Nodeinfo2;
use Nodeinfo\Integration\Nodeinfo10;
use Nodeinfo\Integration\Nodeinfo11;
use Nodeinfo\Integration\Nodeinfo20;
use Nodeinfo\Integration\Nodeinfo21;
use Nodeinfo\Integration\Nodeinfo22;

/**
* Nodeinfo Class
*
* @package Nodeinfo
*/
class Nodeinfo {
/**
* Instance of the class.
*
* @var Nodeinfo
*/
private static $instance;

/**
* Whether the class has been initialized.
*
* @var boolean
*/
private $initialized = false;

/**
* Get the instance of the class.
*
* @return Nodeinfo
*/
public static function get_instance() {
if ( null === self::$instance ) {
self::$instance = new self();
}

return self::$instance;
}

/**
* Do not allow multiple instances of the class.
*/
private function __construct() {
// Do nothing.
}

/**
* Initialize the plugin.
*/
public function init() {
if ( $this->initialized ) {
return;
}

$this->register_integrations();
$this->register_hooks();

if ( \is_admin() ) {
$this->register_admin_hooks();
}

$this->initialized = true;
}

/**
* Register NodeInfo version integrations.
*
* These only register filters, so they can be called directly.
*/
public function register_integrations() {
Nodeinfo10::init();
Nodeinfo11::init();
Nodeinfo20::init();
Nodeinfo21::init();
Nodeinfo22::init();
}

/**
* Register hooks.
*/
public function register_hooks() {
// Register REST routes.
\add_action( 'rest_api_init', array( $this, 'register_routes' ) );

// Add WebFinger and Host-Meta discovery.
\add_filter( 'webfinger_user_data', array( Controller_Nodeinfo::class, 'jrd' ), 10, 3 );
\add_filter( 'webfinger_post_data', array( Controller_Nodeinfo::class, 'jrd' ), 10, 3 );
\add_filter( 'host_meta', array( Controller_Nodeinfo::class, 'jrd' ) );

// Add rewrite rules for well-known endpoints (only during flush).
\add_filter( 'rewrite_rules_array', array( $this, 'add_rewrite_rules' ) );

// Register deprecated filter handlers.
\add_filter( 'nodeinfo_discovery', array( $this, 'deprecated_wellknown_nodeinfo_data' ), 99 );
}

/**
* Handles the deprecated wellknown_nodeinfo_data filter.
*
* @param array $discovery The discovery document.
* @return array The filtered discovery document.
*/
public function deprecated_wellknown_nodeinfo_data( $discovery ) {
/**
* Filters the NodeInfo discovery document.
*
* @deprecated 3.0.0 Use nodeinfo_discovery instead.
*
* @param array $discovery The discovery document.
*/
return \apply_filters_deprecated(
'wellknown_nodeinfo_data',
array( $discovery ),
'3.0.0',
'nodeinfo_discovery'
);
}

/**
* Register admin hooks.
*/
public function register_admin_hooks() {
// Initialize Site Health checks.
\add_action( 'admin_init', array( Health_Check::class, 'init' ) );
}

/**
* Register REST API routes.
*/
public function register_routes() {
$nodeinfo_controller = new Controller_Nodeinfo();
$nodeinfo_controller->register_routes();

$nodeinfo2_controller = new Controller_Nodeinfo2();
$nodeinfo2_controller->register_routes();
}

/**
* Add rewrite rules for well-known endpoints.
*
* @param array $rules The existing rewrite rules.
* @return array The modified rewrite rules.
*/
public function add_rewrite_rules( $rules ) {
$new_rules = array(
'^.well-known/nodeinfo' => 'index.php?rest_route=/nodeinfo/discovery',
'^.well-known/x-nodeinfo2' => 'index.php?rest_route=/nodeinfo2/1.0',
);

return \array_merge( $new_rules, $rules );
}

/**
* Handle plugin activation.
*
* Initializes the plugin and flushes rewrite rules. The rewrite_rules_array
* filter will add our rules during the flush.
*/
public static function activate() {
self::get_instance()->init();
\flush_rewrite_rules();
}

/**
* Handle plugin deactivation.
*
* Should be called on plugin deactivation.
*/
public static function deactivate() {
\flush_rewrite_rules();
}
}
45 changes: 0 additions & 45 deletions languages/nodeinfo.pot

This file was deleted.

78 changes: 17 additions & 61 deletions nodeinfo.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,12 @@
* Plugin Name: NodeInfo
* Plugin URI: https://github.com/pfefferle/wordpress-nodeinfo/
* Description: NodeInfo is an effort to create a standardized way of exposing metadata about a server running one of the distributed social networks.
* Version: 3.0.0
* Version: 3.1.0
* Author: Matthias Pfefferle
* Author URI: https://notiz.blog/
* License: MIT
* License URI: http://opensource.org/licenses/MIT
* Text Domain: nodeinfo
* Domain Path: /languages
*
* @package Nodeinfo
*/
Expand All @@ -32,65 +31,22 @@
require_once NODEINFO_PLUGIN_DIR . 'includes/class-nodeinfo-endpoint.php';

/**
* Initialize the plugin.
*/
function nodeinfo_init() {
// Initialize NodeInfo version integrations.
Nodeinfo\Integration\Nodeinfo10::init();
Nodeinfo\Integration\Nodeinfo11::init();
Nodeinfo\Integration\Nodeinfo20::init();
Nodeinfo\Integration\Nodeinfo21::init();
Nodeinfo\Integration\Nodeinfo22::init();

// Register REST routes.
add_action( 'rest_api_init', 'nodeinfo_register_routes' );

// Add WebFinger and Host-Meta discovery.
add_filter( 'webfinger_user_data', array( Nodeinfo\Controller\Nodeinfo::class, 'jrd' ), 10, 3 );
add_filter( 'webfinger_post_data', array( Nodeinfo\Controller\Nodeinfo::class, 'jrd' ), 10, 3 );
add_filter( 'host_meta', array( Nodeinfo\Controller\Nodeinfo::class, 'jrd' ) );
}
add_action( 'init', 'nodeinfo_init', 9 );

/**
* Initialize admin-only features.
*/
function nodeinfo_admin_init() {
// Initialize Site Health checks.
Nodeinfo\Health_Check::init();
}
add_action( 'admin_init', 'nodeinfo_admin_init' );

/**
* Register REST API routes.
*/
function nodeinfo_register_routes() {
$nodeinfo_controller = new Nodeinfo\Controller\Nodeinfo();
$nodeinfo_controller->register_routes();

$nodeinfo2_controller = new Nodeinfo\Controller\Nodeinfo2();
$nodeinfo2_controller->register_routes();
}

/**
* Add rewrite rules for well-known endpoints.
*/
function nodeinfo_add_rewrite_rules() {
add_rewrite_rule( '^.well-known/nodeinfo', 'index.php?rest_route=/nodeinfo/discovery', 'top' );
add_rewrite_rule( '^.well-known/x-nodeinfo2', 'index.php?rest_route=/nodeinfo2/1.0', 'top' );
}
add_action( 'init', 'nodeinfo_add_rewrite_rules', 1 );

/**
* Flush rewrite rules on activation.
* Plugin initialization function.
*
* @return Nodeinfo\Nodeinfo The plugin instance.
*/
function nodeinfo_activate() {
nodeinfo_add_rewrite_rules();
flush_rewrite_rules();
function nodeinfo_plugin() {
return Nodeinfo\Nodeinfo::get_instance();
}
register_activation_hook( __FILE__, 'nodeinfo_activate' );

/**
* Flush rewrite rules on deactivation.
*/
register_deactivation_hook( __FILE__, 'flush_rewrite_rules' );
// Initialize the plugin after all plugins are loaded.
add_action(
'plugins_loaded',
function () {
nodeinfo_plugin()->init();
}
);

// Register activation and deactivation hooks.
register_activation_hook( __FILE__, array( Nodeinfo\Nodeinfo::class, 'activate' ) );
register_deactivation_hook( __FILE__, array( Nodeinfo\Nodeinfo::class, 'deactivate' ) );
Loading