refactor: update activitypub.getActor to accept either url or webfinger id

This commit is contained in:
Julian Lam
2023-12-13 13:14:51 -05:00
parent 1f79f54241
commit 68d5e4a8ab

View File

@@ -3,6 +3,7 @@
const request = require('request-promise-native'); const request = require('request-promise-native');
const nconf = require('nconf'); const nconf = require('nconf');
const { createHash, createSign, createVerify } = require('crypto'); const { createHash, createSign, createVerify } = require('crypto');
const validator = require('validator');
const db = require('../database'); const db = require('../database');
const user = require('../user'); const user = require('../user');
@@ -14,14 +15,24 @@ const ActivityPub = module.exports;
ActivityPub.helpers = require('./helpers'); ActivityPub.helpers = require('./helpers');
ActivityPub.inbox = require('./inbox'); ActivityPub.inbox = require('./inbox');
ActivityPub.getActor = async (id) => { ActivityPub.getActor = async (input) => {
if (actorCache.has(id)) { // Can be a webfinger id, uri, or object, handle as appropriate
return actorCache.get(id); let uri;
if (validator.isURL(input, {
require_protocol: true,
require_host: true,
protocols: ['https'],
require_valid_protocol: true,
})) {
uri = input;
} else if (input.indexOf('@') !== -1) { // Webfinger
({ actorUri: uri } = await ActivityPub.helpers.query(input));
} else {
throw new Error('[[error:invalid-data]]');
} }
const { hostname, actorUri: uri } = await ActivityPub.helpers.query(id); if (actorCache.has(uri)) {
if (!uri) { return actorCache.get(uri);
return false;
} }
const actor = await request({ const actor = await request({
@@ -32,9 +43,9 @@ ActivityPub.getActor = async (id) => {
json: true, json: true,
}); });
actor.hostname = hostname; actor.hostname = new URL(uri).hostname;
actorCache.set(id, actor); actorCache.set(uri, actor);
return actor; return actor;
}; };
@@ -181,7 +192,7 @@ ActivityPub.send = async (uid, targets, payload) => {
const { date, digest, signature } = await ActivityPub.sign(uid, uri, payload); const { date, digest, signature } = await ActivityPub.sign(uid, uri, payload);
const response = await request(uri, { const response = await request(uri, {
method: payload ? 'post' : 'get', method: 'post',
headers: { headers: {
date, date,
digest, digest,