updated plugin ActivityPub version 3.3.3

This commit is contained in:
2024-10-09 12:44:17 +00:00
committed by Gitium
parent fb4b27bbc6
commit c54fa007bd
106 changed files with 7070 additions and 2918 deletions

View File

@ -1,25 +1,25 @@
<?php
/**
* Admin Class.
*
* @package Activitypub
*/
namespace Activitypub;
use WP_User_Query;
use Activitypub\Model\Blog;
use Activitypub\Activitypub;
use Activitypub\Collection\Users;
use function Activitypub\count_followers;
use function Activitypub\is_user_disabled;
use function Activitypub\was_comment_received;
use function Activitypub\is_comment_federatable;
use function Activitypub\add_default_actor_extra_fields;
use Activitypub\Collection\Extra_Fields;
/**
* ActivityPub Admin Class
* ActivityPub Admin Class.
*
* @author Matthias Pfefferle
*/
class Admin {
/**
* Initialize the class, registering WordPress hooks
* Initialize the class, registering WordPress hooks,
*/
public static function init() {
\add_action( 'admin_menu', array( self::class, 'admin_menu' ) );
@ -27,7 +27,7 @@ class Admin {
\add_action( 'load-comment.php', array( self::class, 'edit_comment' ) );
\add_action( 'load-post.php', array( self::class, 'edit_post' ) );
\add_action( 'load-edit.php', array( self::class, 'list_posts' ) );
\add_action( 'personal_options_update', array( self::class, 'save_user_description' ) );
\add_action( 'personal_options_update', array( self::class, 'save_user_settings' ) );
\add_action( 'admin_enqueue_scripts', array( self::class, 'enqueue_scripts' ) );
\add_action( 'admin_notices', array( self::class, 'admin_notices' ) );
@ -38,7 +38,7 @@ class Admin {
\add_filter( 'manage_posts_columns', array( static::class, 'manage_post_columns' ), 10, 2 );
\add_action( 'manage_posts_custom_column', array( self::class, 'manage_posts_custom_column' ), 10, 2 );
\add_filter( 'manage_users_columns', array( self::class, 'manage_users_columns' ), 10, 1 );
\add_filter( 'manage_users_columns', array( self::class, 'manage_users_columns' ) );
\add_action( 'manage_users_custom_column', array( self::class, 'manage_users_custom_column' ), 10, 3 );
\add_filter( 'bulk_actions-users', array( self::class, 'user_bulk_options' ) );
\add_filter( 'handle_bulk_actions-users', array( self::class, 'handle_bulk_request' ), 10, 3 );
@ -51,7 +51,7 @@ class Admin {
}
/**
* Add admin menu entry
* Add admin menu entry.
*/
public static function admin_menu() {
$settings_page = \add_options_page(
@ -62,22 +62,40 @@ class Admin {
array( self::class, 'settings_page' )
);
\add_action( 'load-' . $settings_page, array( self::class, 'add_settings_help_tab' ) );
\add_action(
'load-' . $settings_page,
array( self::class, 'add_settings_help_tab' )
);
// user has to be able to publish posts
// User has to be able to publish posts.
if ( ! is_user_disabled( get_current_user_id() ) ) {
$followers_list_page = \add_users_page( \__( 'Followers', 'activitypub' ), \__( 'Followers', 'activitypub' ), 'read', 'activitypub-followers-list', array( self::class, 'followers_list_page' ) );
$followers_list_page = \add_users_page(
\__( '⁂ Followers', 'activitypub' ),
\__( '⁂ Followers', 'activitypub' ),
'read',
'activitypub-followers-list',
array(
self::class,
'followers_list_page',
)
);
\add_action( 'load-' . $followers_list_page, array( self::class, 'add_followers_list_help_tab' ) );
\add_action(
'load-' . $followers_list_page,
array( self::class, 'add_followers_list_help_tab' )
);
\add_users_page( \__( 'Extra Fields', 'activitypub' ), \__( 'Extra Fields', 'activitypub' ), 'read', esc_url( admin_url( '/edit.php?post_type=ap_extrafield' ) ) );
\add_users_page(
\__( '⁂ Extra Fields', 'activitypub' ),
\__( '⁂ Extra Fields', 'activitypub' ),
'read',
\esc_url( \admin_url( '/edit.php?post_type=ap_extrafield' ) )
);
}
}
/**
* Display admin menu notices about configuration problems or conflicts.
*
* @return void
*/
public static function admin_notices() {
$permalink_structure = \get_option( 'permalink_structure' );
@ -87,11 +105,15 @@ class Admin {
}
$current_screen = get_current_screen();
if ( isset( $current_screen->id ) && 'edit-ap_extrafield' === $current_screen->id ) {
if ( ! $current_screen ) {
return;
}
if ( 'edit' === $current_screen->base && Extra_Fields::is_extra_fields_post_type( $current_screen->post_type ) ) {
?>
<div class="notice" style="margin: 0; background: none; border: none; box-shadow: none; padding: 15px 0 0 0; font-size: 14px;">
<?php esc_html_e( 'These are extra fields that are used for your ActivityPub profile. You can use your homepage, social profiles, pronouns, age, anything you want.', 'activitypub' ); ?>
<?php
esc_html_e( 'These are extra fields that are used for your ActivityPub profile. You can use your homepage, social profiles, pronouns, age, anything you want.', 'activitypub' );
?>
</div>
<?php
}
@ -101,9 +123,7 @@ class Admin {
* Display one admin menu notice about configuration problems or conflicts.
*
* @param string $admin_notice The notice to display.
* @param string $level The level of the notice (error, warning, success, info).
*
* @return void
* @param string $level The level of the notice (error, warning, success, info).
*/
private static function show_admin_notice( $admin_notice, $level ) {
?>
@ -116,7 +136,7 @@ class Admin {
}
/**
* Load settings page
* Load settings page.
*/
public static function settings_page() {
// phpcs:ignore WordPress.Security.NonceVerification.Recommended
@ -131,8 +151,14 @@ class Admin {
case 'settings':
\load_template( ACTIVITYPUB_PLUGIN_DIR . 'templates/settings.php' );
break;
case 'blog-profile':
wp_enqueue_media();
wp_enqueue_script( 'activitypub-header-image' );
\load_template( ACTIVITYPUB_PLUGIN_DIR . 'templates/blog-settings.php' );
break;
case 'followers':
\load_template( ACTIVITYPUB_PLUGIN_DIR . 'templates/blog-user-followers-list.php' );
\load_template( ACTIVITYPUB_PLUGIN_DIR . 'templates/blog-followers-list.php' );
break;
case 'welcome':
default:
@ -149,7 +175,7 @@ class Admin {
* Load user settings page
*/
public static function followers_list_page() {
// user has to be able to publish posts
// User has to be able to publish posts.
if ( ! is_user_disabled( get_current_user_id() ) ) {
\load_template( ACTIVITYPUB_PLUGIN_DIR . 'templates/user-followers-list.php' );
}
@ -163,8 +189,8 @@ class Admin {
'activitypub',
'activitypub_post_content_type',
array(
'type' => 'string',
'description' => \__( 'Use title and link, summary, full or custom content', 'activitypub' ),
'type' => 'string',
'description' => \__( 'Use title and link, summary, full or custom content', 'activitypub' ),
'show_in_rest' => array(
'schema' => array(
'enum' => array(
@ -174,34 +200,34 @@ class Admin {
),
),
),
'default' => 'content',
'default' => 'content',
)
);
\register_setting(
'activitypub',
'activitypub_custom_post_content',
array(
'type' => 'string',
'description' => \__( 'Define your own custom post template', 'activitypub' ),
'type' => 'string',
'description' => \__( 'Define your own custom post template', 'activitypub' ),
'show_in_rest' => true,
'default' => ACTIVITYPUB_CUSTOM_POST_CONTENT,
'default' => ACTIVITYPUB_CUSTOM_POST_CONTENT,
)
);
\register_setting(
'activitypub',
'activitypub_max_image_attachments',
array(
'type' => 'integer',
'type' => 'integer',
'description' => \__( 'Number of images to attach to posts.', 'activitypub' ),
'default' => ACTIVITYPUB_MAX_IMAGE_ATTACHMENTS,
'default' => ACTIVITYPUB_MAX_IMAGE_ATTACHMENTS,
)
);
\register_setting(
'activitypub',
'activitypub_object_type',
array(
'type' => 'string',
'description' => \__( 'The Activity-Object-Type', 'activitypub' ),
'type' => 'string',
'description' => \__( 'The Activity-Object-Type', 'activitypub' ),
'show_in_rest' => array(
'schema' => array(
'enum' => array(
@ -210,16 +236,25 @@ class Admin {
),
),
),
'default' => 'note',
'default' => 'note',
)
);
\register_setting(
'activitypub',
'activitypub_use_hashtags',
array(
'type' => 'boolean',
'type' => 'boolean',
'description' => \__( 'Add hashtags in the content as native tags and replace the #tag with the tag-link', 'activitypub' ),
'default' => '0',
'default' => '0',
)
);
\register_setting(
'activitypub',
'activitypub_use_opengraph',
array(
'type' => 'boolean',
'description' => \__( 'Automatically add "fediverse:creator" OpenGraph tags for Authors and the Blog-User.', 'activitypub' ),
'default' => '1',
)
);
\register_setting(
@ -234,14 +269,44 @@ class Admin {
);
\register_setting(
'activitypub',
'activitypub_blog_user_identifier',
'activitypub_enable_users',
array(
'type' => 'boolean',
'description' => \__( 'Every Author on this Blog (with the publish_posts capability) gets his own ActivityPub enabled Profile.', 'activitypub' ),
'default' => '1',
)
);
\register_setting(
'activitypub',
'activitypub_enable_blog_user',
array(
'type' => 'boolean',
'description' => \__( 'Your Blog becomes an ActivityPub compatible Profile.', 'activitypub' ),
'default' => '0',
)
);
// Blog-User Settings.
\register_setting(
'activitypub_blog',
'activitypub_blog_description',
array(
'type' => 'string',
'description' => \esc_html__( 'The Description of the Blog-User', 'activitypub' ),
'show_in_rest' => true,
'default' => '',
)
);
\register_setting(
'activitypub_blog',
'activitypub_blog_identifier',
array(
'type' => 'string',
'description' => \esc_html__( 'The Identifier of the Blog-User', 'activitypub' ),
'show_in_rest' => true,
'default' => Blog::get_default_username(),
'sanitize_callback' => function ( $value ) {
// hack to allow dots in the username
// Hack to allow dots in the username.
$parts = explode( '.', $value );
$sanitized = array();
@ -251,7 +316,7 @@ class Admin {
$sanitized = implode( '.', $sanitized );
// check for login or nicename.
// Check for login or nicename.
$user = new WP_User_Query(
array(
'search' => $sanitized,
@ -264,8 +329,8 @@ class Admin {
if ( $user->results ) {
add_settings_error(
'activitypub_blog_user_identifier',
'activitypub_blog_user_identifier',
'activitypub_blog_identifier',
'activitypub_blog_identifier',
\esc_html__( 'You cannot use an existing author\'s name for the blog profile ID.', 'activitypub' ),
'error'
);
@ -278,35 +343,40 @@ class Admin {
)
);
\register_setting(
'activitypub',
'activitypub_enable_users',
'activitypub_blog',
'activitypub_header_image',
array(
'type' => 'boolean',
'description' => \__( 'Every Author on this Blog (with the publish_posts capability) gets his own ActivityPub enabled Profile.', 'activitypub' ),
'default' => '1',
)
);
\register_setting(
'activitypub',
'activitypub_enable_blog_user',
array(
'type' => 'boolean',
'description' => \__( 'Your Blog becomes an ActivityPub compatible Profile.', 'activitypub' ),
'default' => '0',
'type' => 'integer',
'description' => \__( 'The Attachment-ID of the Sites Header-Image', 'activitypub' ),
'default' => null,
)
);
}
/**
* Adds the ActivityPub settings to the Help tab.
*/
public static function add_settings_help_tab() {
require_once ACTIVITYPUB_PLUGIN_DIR . 'includes/help.php';
}
/**
* Adds the follower list to the Help tab.
*/
public static function add_followers_list_help_tab() {
// todo
// todo.
}
/**
* Add the profile.
*
* @param \WP_User $user The user object.
*/
public static function add_profile( $user ) {
$description = get_user_meta( $user->ID, 'activitypub_user_description', true );
$description = \get_user_option( 'activitypub_description', $user->ID );
wp_enqueue_media();
wp_enqueue_script( 'activitypub-header-image' );
\load_template(
ACTIVITYPUB_PLUGIN_DIR . 'templates/user-settings.php',
@ -317,40 +387,97 @@ class Admin {
);
}
public static function save_user_description( $user_id ) {
/**
* Save the user settings.
*
* Handles the saving of the ActivityPub settings.
*
* @param int $user_id The user ID.
*/
public static function save_user_settings( $user_id ) {
if ( ! isset( $_REQUEST['_apnonce'] ) ) {
return false;
return;
}
$nonce = sanitize_text_field( wp_unslash( $_REQUEST['_apnonce'] ) );
if (
! wp_verify_nonce( $nonce, 'activitypub-user-description' ) ||
! wp_verify_nonce( $nonce, 'activitypub-user-settings' ) ||
! current_user_can( 'edit_user', $user_id )
) {
return false;
return;
}
$description = ! empty( $_POST['activitypub-user-description'] ) ? sanitize_text_field( wp_unslash( $_POST['activitypub-user-description'] ) ) : false;
$description = ! empty( $_POST['activitypub_description'] ) ? sanitize_textarea_field( wp_unslash( $_POST['activitypub_description'] ) ) : false;
if ( $description ) {
update_user_meta( $user_id, 'activitypub_user_description', $description );
}
}
public static function enqueue_scripts( $hook_suffix ) {
if ( false !== strpos( $hook_suffix, 'activitypub' ) ) {
wp_enqueue_style( 'activitypub-admin-styles', plugins_url( 'assets/css/activitypub-admin.css', ACTIVITYPUB_PLUGIN_FILE ), array(), get_plugin_version() );
wp_enqueue_script( 'activitypub-admin-script', plugins_url( 'assets/js/activitypub-admin.js', ACTIVITYPUB_PLUGIN_FILE ), array( 'jquery' ), get_plugin_version(), false );
\update_user_option( $user_id, 'activitypub_description', $description );
} else {
\delete_user_option( $user_id, 'activitypub_description' );
}
if ( 'index.php' === $hook_suffix ) {
wp_enqueue_style( 'activitypub-admin-styles', plugins_url( 'assets/css/activitypub-admin.css', ACTIVITYPUB_PLUGIN_FILE ), array(), get_plugin_version() );
$header_image = ! empty( $_POST['activitypub_header_image'] ) ? sanitize_text_field( wp_unslash( $_POST['activitypub_header_image'] ) ) : false;
if ( $header_image && \wp_attachment_is_image( $header_image ) ) {
\update_user_option( $user_id, 'activitypub_header_image', $header_image );
} else {
\delete_user_option( $user_id, 'activitypub_header_image' );
}
}
/**
* Hook into the edit_comment functionality
* Enqueue the admin scripts and styles.
*
* * Disable the edit_comment capability for federated comments.
* @param string $hook_suffix The current page.
*/
public static function enqueue_scripts( $hook_suffix ) {
wp_register_script(
'activitypub-header-image',
plugins_url(
'assets/js/activitypub-header-image.js',
ACTIVITYPUB_PLUGIN_FILE
),
array( 'jquery' ),
get_plugin_version(),
false
);
if ( false !== strpos( $hook_suffix, 'activitypub' ) ) {
wp_enqueue_style(
'activitypub-admin-styles',
plugins_url(
'assets/css/activitypub-admin.css',
ACTIVITYPUB_PLUGIN_FILE
),
array(),
get_plugin_version()
);
wp_enqueue_script(
'activitypub-admin-script',
plugins_url(
'assets/js/activitypub-admin.js',
ACTIVITYPUB_PLUGIN_FILE
),
array( 'jquery' ),
get_plugin_version(),
false
);
}
if ( 'index.php' === $hook_suffix ) {
wp_enqueue_style(
'activitypub-admin-styles',
plugins_url(
'assets/css/activitypub-admin.css',
ACTIVITYPUB_PLUGIN_FILE
),
array(),
get_plugin_version()
);
}
}
/**
* Hook into the edit_comment functionality.
*
* @return void
* Disables the edit_comment capability for federated comments.
*/
public static function edit_comment() {
// Disable the edit_comment capability for federated comments.
@ -372,6 +499,11 @@ class Admin {
);
}
/**
* Hook into the edit_post functionality.
*
* Disables the edit_post capability for federated posts.
*/
public static function edit_post() {
// Disable the edit_post capability for federated posts.
\add_filter(
@ -383,7 +515,7 @@ class Admin {
$post = get_post( $arg[2] );
if ( 'ap_extrafield' !== $post->post_type ) {
if ( ! Extra_Fields::is_extra_field_post_type( $post->post_type ) ) {
return $allcaps;
}
@ -399,9 +531,7 @@ class Admin {
}
/**
* Add ActivityPub specific actions/filters to the post list view
*
* @return void
* Add ActivityPub specific actions/filters to the post list view.
*/
public static function list_posts() {
// Show only the user's extra fields.
@ -420,20 +550,23 @@ class Admin {
add_filter(
"views_{$screen_id}",
function ( $views ) {
if ( 'ap_extrafield' === get_post_type() ) {
if ( Extra_Fields::is_extra_fields_post_type( get_current_screen()->post_type ) ) {
return array();
}
return $views;
}
);
// Set defaults for new extra fields.
if ( 'edit-ap_extrafield' === $screen_id ) {
Activitypub::default_actor_extra_fields( array(), get_current_user_id() );
}
}
/**
* Comment row actions.
*
* @param array $actions The existing actions.
* @param int|\WP_Comment $comment The comment object or ID.
*
* @return array The modified actions.
*/
public static function comment_row_actions( $actions, $comment ) {
if ( was_comment_received( $comment ) ) {
unset( $actions['edit'] );
@ -444,7 +577,7 @@ class Admin {
}
/**
* Add a column "activitypub"
* Add a column "activitypub".
*
* This column shows if the user has the capability to use ActivityPub.
*
@ -458,9 +591,11 @@ class Admin {
}
/**
* Add "comment-type" and "protocol" as column in WP-Admin
* Add "comment-type" and "protocol" as column in WP-Admin.
*
* @param array $columns the list of column names
* @param array $columns The list of column names.
*
* @return array The extended list of column names.
*/
public static function manage_comment_columns( $columns ) {
$columns['comment_type'] = esc_attr__( 'Comment-Type', 'activitypub' );
@ -470,13 +605,15 @@ class Admin {
}
/**
* Add "post_content" as column for Extra-Fields in WP-Admin
* Add "post_content" as column for Extra-Fields in WP-Admin.
*
* @param array $columns Tthe list of column names.
* @param array $columns The list of column names.
* @param string $post_type The post type.
*
* @return array The extended list of column names.
*/
public static function manage_post_columns( $columns, $post_type ) {
if ( 'ap_extrafield' === $post_type ) {
if ( Extra_Fields::is_extra_fields_post_type( $post_type ) ) {
$after_key = 'title';
$index = array_search( $after_key, array_keys( $columns ), true );
$columns = array_slice( $columns, 0, $index + 1 ) + array( 'extra_field_content' => esc_attr__( 'Content', 'activitypub' ) ) + $columns;
@ -486,10 +623,10 @@ class Admin {
}
/**
* Add "comment-type" and "protocol" as column in WP-Admin
* Add "comment-type" and "protocol" as column in WP-Admin.
*
* @param array $column The column to implement
* @param int $comment_id The comment id
* @param array $column The column to implement.
* @param int $comment_id The comment id.
*/
public static function manage_comments_custom_column( $column, $comment_id ) {
if ( 'comment_type' === $column && ! defined( 'WEBMENTION_PLUGIN_DIR' ) ) {
@ -527,7 +664,7 @@ class Admin {
}
/**
* Add a column "extra_field_content" to the post list view
* Add a column "extra_field_content" to the post list view.
*
* @param string $column_name The column name.
* @param int $post_id The post ID.
@ -535,32 +672,30 @@ class Admin {
* @return void
*/
public static function manage_posts_custom_column( $column_name, $post_id ) {
$post = get_post( $post_id );
if ( 'extra_field_content' === $column_name ) {
$post = get_post( $post_id );
if ( 'ap_extrafield' === $post->post_type ) {
if ( Extra_Fields::is_extra_fields_post_type( $post->post_type ) ) {
echo esc_attr( wp_strip_all_tags( $post->post_content ) );
}
}
}
/**
* Add options to the Bulk dropdown on the users page
* Add options to the Bulk dropdown on the users page.
*
* @param array $actions The existing bulk options.
*
* @return array The extended bulk options.
*/
public static function user_bulk_options( $actions ) {
$actions['add_activitypub_cap'] = __( 'Enable for ActivityPub', 'activitypub' );
$actions['add_activitypub_cap'] = __( 'Enable for ActivityPub', 'activitypub' );
$actions['remove_activitypub_cap'] = __( 'Disable for ActivityPub', 'activitypub' );
return $actions;
}
/**
* Handle bulk activitypub requests
* Handle bulk activitypub requests.
*
* * `add_activitypub_cap` - Add the activitypub capability to the selected users.
* * `remove_activitypub_cap` - Remove the activitypub capability from the selected users.
@ -595,7 +730,7 @@ class Admin {
}
/**
* Add ActivityPub infos to the dashboard glance items
* Add ActivityPub infos to the dashboard glance items.
*
* @param array $items The existing glance items.
*
@ -606,7 +741,7 @@ class Admin {
if ( ! is_user_disabled( get_current_user_id() ) ) {
$follower_count = sprintf(
// translators: %s: number of followers
// translators: %s: number of followers.
_n(
'%s Follower',
'%s Followers',
@ -625,7 +760,7 @@ class Admin {
if ( ! is_user_type_disabled( 'blog' ) && current_user_can( 'manage_options' ) ) {
$follower_count = sprintf(
// translators: %s: number of followers
// translators: %s: number of followers.
_n(
'%s Follower (Blog)',
'%s Followers (Blog)',
@ -642,7 +777,7 @@ class Admin {
);
}
\remove_filter( 'number_format_i18n', '\Activitypub\custom_large_numbers', 10, 3 );
\remove_filter( 'number_format_i18n', '\Activitypub\custom_large_numbers' );
return $items;
}