initial
This commit is contained in:
parent
34b7a6646c
commit
52f0d81228
14 changed files with 411 additions and 1 deletions
22
.editorconfig
Normal file
22
.editorconfig
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
# This file is for unifying the coding style for different editors and IDEs
|
||||||
|
# editorconfig.org
|
||||||
|
|
||||||
|
# WordPress Coding Standards
|
||||||
|
# https://make.wordpress.org/core/handbook/coding-standards/
|
||||||
|
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
|
[{.jshintrc,*.json,*.yml}]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
|
||||||
|
[{*.txt,wp-config-sample.php}]
|
||||||
|
end_of_line = crlf
|
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
/node_modules/
|
||||||
|
/vendor/
|
||||||
|
package-lock.json
|
||||||
|
composer.lock
|
66
Gruntfile.js
Normal file
66
Gruntfile.js
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
module.exports = function(grunt) {
|
||||||
|
// Project configuration.
|
||||||
|
grunt.initConfig({
|
||||||
|
checktextdomain: {
|
||||||
|
options:{
|
||||||
|
text_domain: 'activitypub',
|
||||||
|
keywords: [
|
||||||
|
'__:1,2d',
|
||||||
|
'_e:1,2d',
|
||||||
|
'_x:1,2c,3d',
|
||||||
|
'esc_html__:1,2d',
|
||||||
|
'esc_html_e:1,2d',
|
||||||
|
'esc_html_x:1,2c,3d',
|
||||||
|
'esc_attr__:1,2d',
|
||||||
|
'esc_attr_e:1,2d',
|
||||||
|
'esc_attr_x:1,2c,3d',
|
||||||
|
'_ex:1,2c,3d',
|
||||||
|
'_n:1,2,4d',
|
||||||
|
'_nx:1,2,4c,5d',
|
||||||
|
'_n_noop:1,2,3d',
|
||||||
|
'_nx_noop:1,2,3c,4d'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
files: {
|
||||||
|
src: [
|
||||||
|
'**/*.php', // Include all files
|
||||||
|
'includes/*.php', // Include includes
|
||||||
|
'!sass/**', // Exclude sass/
|
||||||
|
'!node_modules/**', // Exclude node_modules/
|
||||||
|
'!tests/**', // Exclude tests/
|
||||||
|
'!vendor/**', // Exclude vendor/
|
||||||
|
'!build/**', // Exclude build/
|
||||||
|
'!static/**', // Exclude static resources
|
||||||
|
],
|
||||||
|
expand: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
wp_readme_to_markdown: {
|
||||||
|
target: {
|
||||||
|
files: {
|
||||||
|
'README.md': 'readme.txt'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
makepot: {
|
||||||
|
target: {
|
||||||
|
options: {
|
||||||
|
mainFile: 'activitypub.php',
|
||||||
|
domainPath: '/languages',
|
||||||
|
exclude: ['bin/.*', '.git/.*', 'vendor/.*'],
|
||||||
|
potFilename: 'activitypub.pot',
|
||||||
|
type: 'wp-plugin',
|
||||||
|
updateTimestamp: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
grunt.loadNpmTasks('grunt-wp-readme-to-markdown');
|
||||||
|
grunt.loadNpmTasks('grunt-wp-i18n');
|
||||||
|
grunt.loadNpmTasks('grunt-checktextdomain');
|
||||||
|
|
||||||
|
// Default task(s).
|
||||||
|
grunt.registerTask('default', ['wp_readme_to_markdown', 'makepot', 'checktextdomain']);
|
||||||
|
};
|
13
README.md
13
README.md
|
@ -1 +1,12 @@
|
||||||
# wordpress-activitypub
|
# ActivityPub #
|
||||||
|
**Contributors:** [pfefferle](https://profiles.wordpress.org/pfefferle)
|
||||||
|
**Donate link:** https://notiz.blog/donate/
|
||||||
|
**Tags:** OStatus, fediverse, activitypub, activitystream
|
||||||
|
**Requires at least:** 4.7
|
||||||
|
**Tested up to:** 4.9.8
|
||||||
|
**Stable tag:** 1.0.0
|
||||||
|
**Requires PHP:** 5.3
|
||||||
|
**License:** MIT
|
||||||
|
**License URI:** http://opensource.org/licenses/MIT
|
||||||
|
|
||||||
|
The ActivityPub protocol is a decentralized social networking protocol based upon the ActivityStreams 2.0 data format.
|
||||||
|
|
27
activitypub.php
Normal file
27
activitypub.php
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Plugin Name: ActivityPub
|
||||||
|
* Plugin URI: https://github.com/pfefferle/wordpress-activitypub/
|
||||||
|
* Description: The ActivityPub protocol is a decentralized social networking protocol based upon the ActivityStreams 2.0 data format.
|
||||||
|
* Version: 1.0.0
|
||||||
|
* Author: Matthias Pfefferle
|
||||||
|
* Author URI: https://notiz.blog/
|
||||||
|
* License: MIT
|
||||||
|
* License URI: http://opensource.org/licenses/MIT
|
||||||
|
* Text Domain: activitypub
|
||||||
|
* Domain Path: /languages
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize plugin
|
||||||
|
*/
|
||||||
|
function activitypub_init() {
|
||||||
|
require_once dirname( __FILE__ ) . '/includes/functions.php';
|
||||||
|
|
||||||
|
require_once dirname( __FILE__ ) . '/includes/class-activitypub.php';
|
||||||
|
add_filter( 'template_include', array( 'Activity_Pub', 'render_profile' ), 99 );
|
||||||
|
add_action( 'webfinger_user_data', array( 'Activity_Pub', 'add_webfinger_discovery' ), 10, 3 );
|
||||||
|
add_filter( 'query_vars', array( 'Activity_Pub', 'add_query_vars' ) );
|
||||||
|
add_action( 'init', array( 'Activity_Pub', 'add_rewrite_endpoint' ) );
|
||||||
|
}
|
||||||
|
add_action( 'plugins_loaded', 'activitypub_init' );
|
19
composer.json
Normal file
19
composer.json
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"name": "pfefferle/wordpress-activitypub",
|
||||||
|
"description": "The ActivityPub protocol is a decentralized social networking protocol based upon the ActivityStreams 2.0 data format.",
|
||||||
|
"type": "wordpress-plugin",
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.0",
|
||||||
|
"composer/installers": "~1.0"
|
||||||
|
},
|
||||||
|
"license": "MIT",
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Matthias Pfefferle",
|
||||||
|
"email": "pfefferle@gmail.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"extra": {
|
||||||
|
"installer-name": "activitypub"
|
||||||
|
}
|
||||||
|
}
|
26
docker-compose.yml
Normal file
26
docker-compose.yml
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
version: '2'
|
||||||
|
services:
|
||||||
|
db:
|
||||||
|
image: mysql:5.7
|
||||||
|
restart: always
|
||||||
|
environment:
|
||||||
|
MYSQL_ROOT_PASSWORD: wordpress
|
||||||
|
MYSQL_DATABASE: wordpress
|
||||||
|
MYSQL_USER: wordpress
|
||||||
|
MYSQL_PASSWORD: wordpress
|
||||||
|
|
||||||
|
wordpress:
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
image: wordpress:latest
|
||||||
|
links:
|
||||||
|
- db
|
||||||
|
ports:
|
||||||
|
- "8076:80"
|
||||||
|
volumes:
|
||||||
|
- .:/var/www/html/wp-content/plugins/activitypub
|
||||||
|
restart: always
|
||||||
|
environment:
|
||||||
|
WORDPRESS_DB_HOST: db:3306
|
||||||
|
WORDPRESS_DB_PASSWORD: wordpress
|
||||||
|
WORDPRESS_DEBUG: 1
|
73
includes/class-activitypub.php
Normal file
73
includes/class-activitypub.php
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
class Activity_Pub {
|
||||||
|
public static function render_profile( $template ) {
|
||||||
|
if ( ! is_author() ) {
|
||||||
|
return $template;
|
||||||
|
}
|
||||||
|
|
||||||
|
$json_template = dirname( __FILE__ ) . '/../templates/author-profile.php';
|
||||||
|
|
||||||
|
global $wp_query;
|
||||||
|
|
||||||
|
if ( isset( $wp_query->query_vars['activitypub'] ) ) {
|
||||||
|
return $json_template;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! isset( $_SERVER['HTTP_ACCEPT'] ) ) {
|
||||||
|
return $template;
|
||||||
|
}
|
||||||
|
|
||||||
|
// interpret accept header
|
||||||
|
$pos = stripos( $_SERVER['HTTP_ACCEPT'], ';' );
|
||||||
|
if ( $pos ) {
|
||||||
|
$accept_header = substr( $_SERVER['HTTP_ACCEPT'], 0, $pos );
|
||||||
|
} else {
|
||||||
|
$accept_header = $_SERVER['HTTP_ACCEPT'];
|
||||||
|
}
|
||||||
|
// accept header as an array
|
||||||
|
$accept = explode( ',', trim( $accept_header ) );
|
||||||
|
|
||||||
|
if (
|
||||||
|
! in_array( 'application/activity+json', $accept, true ) &&
|
||||||
|
! in_array( 'application/ld+json', $accept, true )
|
||||||
|
) {
|
||||||
|
return $template;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $json_template;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add WebFinger discovery links
|
||||||
|
*
|
||||||
|
* @param array $array the jrd array
|
||||||
|
* @param string $resource the WebFinger resource
|
||||||
|
* @param WP_User $user the WordPress user
|
||||||
|
*/
|
||||||
|
public static function add_webfinger_discovery( $array, $resource, $user ) {
|
||||||
|
$array['links'][] = array(
|
||||||
|
'rel' => 'self',
|
||||||
|
'type' => 'aplication/activity+json',
|
||||||
|
'href' => get_author_posts_url( $user->ID ),
|
||||||
|
);
|
||||||
|
|
||||||
|
return $array;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add the 'photos' query variable so WordPress
|
||||||
|
* won't mangle it.
|
||||||
|
*/
|
||||||
|
public static function add_query_vars( $vars ) {
|
||||||
|
$vars[] = 'activitypub';
|
||||||
|
return $vars;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add our rewrite endpoint to permalinks and pages.
|
||||||
|
*/
|
||||||
|
public static function add_rewrite_endpoint() {
|
||||||
|
add_rewrite_endpoint( 'activitypub', EP_AUTHORS );
|
||||||
|
}
|
||||||
|
}
|
0
includes/functions.php
Normal file
0
includes/functions.php
Normal file
36
languages/activitypub.pot
Normal file
36
languages/activitypub.pot
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
# Copyright (C) 2018 Matthias Pfefferle
|
||||||
|
# This file is distributed under the MIT.
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: ActivityPub 1.0.0\n"
|
||||||
|
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/activitypub\n"
|
||||||
|
"POT-Creation-Date: 2018-08-18 10:35:26+00:00\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=utf-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"PO-Revision-Date: 2018-MO-DA HO:MI+ZONE\n"
|
||||||
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
"X-Generator: grunt-wp-i18n1.0.2\n"
|
||||||
|
|
||||||
|
#. Plugin Name of the plugin/theme
|
||||||
|
msgid "ActivityPub"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Plugin URI of the plugin/theme
|
||||||
|
msgid "https://github.com/pfefferle/wordpress-activitypub/"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Description of the plugin/theme
|
||||||
|
msgid ""
|
||||||
|
"The ActivityPub protocol is a decentralized social networking protocol "
|
||||||
|
"based upon the ActivityStreams 2.0 data format."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Author of the plugin/theme
|
||||||
|
msgid "Matthias Pfefferle"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Author URI of the plugin/theme
|
||||||
|
msgid "https://notiz.blog/"
|
||||||
|
msgstr ""
|
23
package.json
Normal file
23
package.json
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
{
|
||||||
|
"name": "activitypub",
|
||||||
|
"description": "The ActivityPub protocol is a decentralized social networking protocol based upon the ActivityStreams 2.0 data format.",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/pfefferle/wordpress-activitypub.git"
|
||||||
|
},
|
||||||
|
"author": {
|
||||||
|
"name": "Matthias Pfefferle",
|
||||||
|
"web": "https://notiz.blog"
|
||||||
|
},
|
||||||
|
"license": "MIT",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/pfefferle/wordpress-activitypub/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/pfefferle/wordpress-activitypub#readme",
|
||||||
|
"devDependencies": {
|
||||||
|
"grunt": "^1.0.3",
|
||||||
|
"grunt-checktextdomain": "^1.0.1",
|
||||||
|
"grunt-wp-i18n": "^1.0.2",
|
||||||
|
"grunt-wp-readme-to-markdown": "^2.0.1"
|
||||||
|
}
|
||||||
|
}
|
21
phpcs.xml
Normal file
21
phpcs.xml
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<ruleset name="WordPress ActivityPub">
|
||||||
|
<description>WordPress ActivityPub Standards</description>
|
||||||
|
<file>./activitypub.php</file>
|
||||||
|
<file>./includes/</file>
|
||||||
|
<config name="minimum_supported_wp_version" value="4.7"/>
|
||||||
|
<exclude-pattern>*/includes/*\.(inc|css|js|svg)</exclude-pattern>
|
||||||
|
<exclude-pattern>*/vendor/*</exclude-pattern>
|
||||||
|
<rule ref="PHPCompatibility"/>
|
||||||
|
<config name="testVersion" value="5.3-"/>
|
||||||
|
<rule ref="WordPress-Core" />
|
||||||
|
<rule ref="WordPress.Files.FileName">
|
||||||
|
<properties>
|
||||||
|
<property name="strict_class_file_names" value="false" />
|
||||||
|
</properties>
|
||||||
|
</rule>
|
||||||
|
<rule ref="WordPress.WP.DeprecatedFunctions" />
|
||||||
|
<rule ref="WordPress-Extra" />
|
||||||
|
<rule ref="WordPress.WP.I18n"/>
|
||||||
|
<config name="text_domain" value="activitypub,default"/>
|
||||||
|
</ruleset>
|
12
readme.txt
Normal file
12
readme.txt
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
=== ActivityPub ===
|
||||||
|
Contributors: pfefferle
|
||||||
|
Donate link: https://notiz.blog/donate/
|
||||||
|
Tags: OStatus, fediverse, activitypub, activitystream
|
||||||
|
Requires at least: 4.7
|
||||||
|
Tested up to: 4.9.8
|
||||||
|
Stable tag: 1.0.0
|
||||||
|
Requires PHP: 5.3
|
||||||
|
License: MIT
|
||||||
|
License URI: http://opensource.org/licenses/MIT
|
||||||
|
|
||||||
|
The ActivityPub protocol is a decentralized social networking protocol based upon the ActivityStreams 2.0 data format.
|
70
templates/author-profile.php
Normal file
70
templates/author-profile.php
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Activity Streams 1 Feed Template for displaying AS1 Posts feed.
|
||||||
|
*
|
||||||
|
* @link https://github.com/pento/7B a lot of changes made by @pento
|
||||||
|
*/
|
||||||
|
|
||||||
|
$author_id = get_the_author_meta( 'ID' );
|
||||||
|
|
||||||
|
$json = new stdClass();
|
||||||
|
|
||||||
|
$json->{'@context'} = array(
|
||||||
|
'https://www.w3.org/ns/activitystreams',
|
||||||
|
'https://w3id.org/security/v1',
|
||||||
|
);
|
||||||
|
|
||||||
|
$json->id = get_author_posts_url( $author_id );
|
||||||
|
$json->type = 'Person';
|
||||||
|
$json->name = get_the_author_meta( 'display_name', $author_id );
|
||||||
|
$json->summary = get_the_author_meta( 'description', $author_id );
|
||||||
|
$json->preferredUsername = get_the_author();
|
||||||
|
$json->url = get_author_posts_url( $author_id );
|
||||||
|
$json->icon = array(
|
||||||
|
'type' => 'Image',
|
||||||
|
'url' => get_avatar_url( $author_id, array( 'size' => 120 ) ),
|
||||||
|
);
|
||||||
|
|
||||||
|
if ( has_header_image() ) {
|
||||||
|
$json->image = array(
|
||||||
|
'type' => 'Image',
|
||||||
|
'url' => get_header_image(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( method_exists( 'Magic_Sig', 'get_public_key' ) ) {
|
||||||
|
$json->publicKey = array(
|
||||||
|
'id' => get_author_posts_url( $author_id ) . '#key',
|
||||||
|
'owner' => get_author_posts_url( $author_id ),
|
||||||
|
'publicKeyPem' => Magic_Sig::get_public_key( $author_id ),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
header( 'Content-Type: application/activity-json', true );
|
||||||
|
|
||||||
|
// filter output
|
||||||
|
$json = apply_filters( 'activitypub_profile_array', $json );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Action triggerd prior to the ActivityPub profile being created and sent to the client
|
||||||
|
*/
|
||||||
|
do_action( 'activitypub_profile_pre' );
|
||||||
|
|
||||||
|
$options = 0;
|
||||||
|
// JSON_PRETTY_PRINT added in PHP 5.4
|
||||||
|
if ( get_query_var( 'pretty' ) ) {
|
||||||
|
$options |= JSON_PRETTY_PRINT;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Options to be passed to json_encode()
|
||||||
|
*
|
||||||
|
* @param int $options The current options flags
|
||||||
|
*/
|
||||||
|
$options = apply_filters( 'activitypub_profile_options', $options );
|
||||||
|
echo wp_json_encode( $json, $options );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Action triggerd after the ActivityPub profile has been created and sent to the client
|
||||||
|
*/
|
||||||
|
do_action( 'activitypub_profile_post' );
|
Loading…
Reference in a new issue