diff --git a/src/activitypub/inbox.js b/src/activitypub/inbox.js index 78de0bfb69..40f45f43d7 100644 --- a/src/activitypub/inbox.js +++ b/src/activitypub/inbox.js @@ -32,7 +32,7 @@ inbox.follow = async (req) => { type: 'Accept', object: { type: 'Follow', - actor: from.actorUri, + actor: from.id, }, }); diff --git a/src/activitypub/index.js b/src/activitypub/index.js index ff9dcf259c..0919ea1636 100644 --- a/src/activitypub/index.js +++ b/src/activitypub/index.js @@ -23,6 +23,7 @@ ActivityPub.getActor = async (input) => { require_host: true, protocols: ['https'], require_valid_protocol: true, + require_tld: false, })) { uri = input; } else if (input.indexOf('@') !== -1) { // Webfinger @@ -177,15 +178,11 @@ ActivityPub.send = async (uid, targets, payload) => { }; await Promise.all(inboxes.map(async (uri) => { - const { date, digest, signature } = await ActivityPub.sign(uid, uri, payload); - + const headers = await ActivityPub.sign(uid, uri, payload); const { response } = await request.post(uri, { headers: { - date, - digest, - signature, + ...headers, 'content-type': 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"', - accept: 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"', }, body: payload, }); diff --git a/src/api/activitypub.js b/src/api/activitypub.js index 733a0cbcee..22426b1f64 100644 --- a/src/api/activitypub.js +++ b/src/api/activitypub.js @@ -8,20 +8,23 @@ * If you use api methods in this file, be prepared that they may be removed or modified with no warning. */ +const nconf = require('nconf'); + const db = require('../database'); const activitypub = require('../activitypub'); +const user = require('../user'); const activitypubApi = module.exports; activitypubApi.follow = async (caller, { actorId } = {}) => { - const object = activitypub.getActor(actorId); + const object = await activitypub.getActor(actorId); if (!object) { throw new Error('[[error:invalid-uid]]'); // should be activitypub-specific } await activitypub.send(caller.uid, actorId, { type: 'Follow', - object: object.actorUri, + object: object.id, }); const now = Date.now(); @@ -32,15 +35,18 @@ activitypubApi.follow = async (caller, { actorId } = {}) => { }; activitypubApi.unfollow = async (caller, { actorId }) => { - if (!actorId) { + const object = await activitypub.getActor(actorId); + const userslug = await user.getUserField(caller.uid, 'userslug'); + if (!object) { throw new Error('[[error:invalid-uid]]'); // should be activitypub-specific } await activitypub.send(caller.uid, actorId, { - type: 'Unfollow', + type: 'Undo', object: { - type: 'Person', - name: actorId, + type: 'Follow', + actor: `${nconf.get('url')}/user/${userslug}`, + object: object.id, }, });