mirror of
				https://github.com/NodeBB/NodeBB.git
				synced 2025-11-03 04:25:55 +01:00 
			
		
		
		
	fix: move all actor object urls to immutable variants
This commit is contained in:
		@@ -94,9 +94,15 @@ Helpers.resolveLocalUid = async (input) => {
 | 
			
		||||
		const { host, pathname } = new URL(input);
 | 
			
		||||
 | 
			
		||||
		if (host === nconf.get('url_parsed').host) {
 | 
			
		||||
			return pathname.replace(nconf.get('relative_path'), '').split('/').filter(Boolean)[1];
 | 
			
		||||
			const [type, value] = pathname.replace(nconf.get('relative_path'), '').split('/').filter(Boolean)[1];
 | 
			
		||||
			if (type === 'uid') {
 | 
			
		||||
				return value;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			slug = value;
 | 
			
		||||
		} else {
 | 
			
		||||
			throw new Error('[[error:activitypub.invalid-id]]');
 | 
			
		||||
		}
 | 
			
		||||
		throw new Error('[[error:activitypub.invalid-id]]');
 | 
			
		||||
	} else if (input.indexOf('@') !== -1) { // Webfinger
 | 
			
		||||
		([slug] = input.replace(/^acct:/, '').split('@'));
 | 
			
		||||
	} else {
 | 
			
		||||
 
 | 
			
		||||
@@ -87,8 +87,7 @@ ActivityPub.sign = async (uid, url, payload) => {
 | 
			
		||||
	const { host, pathname } = new URL(url);
 | 
			
		||||
	const date = new Date().toUTCString();
 | 
			
		||||
	const key = await ActivityPub.getPrivateKey(uid);
 | 
			
		||||
	const userslug = await user.getUserField(uid, 'userslug');
 | 
			
		||||
	const keyId = `${nconf.get('url')}${uid > 0 ? `/user/${userslug}` : '/actor'}#key`;
 | 
			
		||||
	const keyId = `${nconf.get('url')}${uid > 0 ? `/uid/${uid}` : '/actor'}#key`;
 | 
			
		||||
	let digest = null;
 | 
			
		||||
 | 
			
		||||
	let headers = '(request-target) host date';
 | 
			
		||||
 
 | 
			
		||||
@@ -137,10 +137,10 @@ Mocks.actor = async (uid) => {
 | 
			
		||||
		'@context': 'https://www.w3.org/ns/activitystreams',
 | 
			
		||||
		id: `${nconf.get('url')}/uid/${uid}`,
 | 
			
		||||
		url: `${nconf.get('url')}/user/${userslug}`,
 | 
			
		||||
		followers: `${nconf.get('url')}/user/${userslug}/followers`,
 | 
			
		||||
		following: `${nconf.get('url')}/user/${userslug}/following`,
 | 
			
		||||
		inbox: `${nconf.get('url')}/user/${userslug}/inbox`,
 | 
			
		||||
		outbox: `${nconf.get('url')}/user/${userslug}/outbox`,
 | 
			
		||||
		followers: `${nconf.get('url')}/uid/${uid}/followers`,
 | 
			
		||||
		following: `${nconf.get('url')}/uid/${uid}/following`,
 | 
			
		||||
		inbox: `${nconf.get('url')}/uid/${uid}/inbox`,
 | 
			
		||||
		outbox: `${nconf.get('url')}/uid/${uid}/outbox`,
 | 
			
		||||
 | 
			
		||||
		type: 'Person',
 | 
			
		||||
		name,
 | 
			
		||||
@@ -150,8 +150,8 @@ Mocks.actor = async (uid) => {
 | 
			
		||||
		image: cover,
 | 
			
		||||
 | 
			
		||||
		publicKey: {
 | 
			
		||||
			id: `${nconf.get('url')}/user/${userslug}#key`,
 | 
			
		||||
			owner: `${nconf.get('url')}/user/${userslug}`,
 | 
			
		||||
			id: `${nconf.get('url')}/uid/${uid}#key`,
 | 
			
		||||
			owner: `${nconf.get('url')}/uid/${uid}`,
 | 
			
		||||
			publicKeyPem: publicKey,
 | 
			
		||||
		},
 | 
			
		||||
	};
 | 
			
		||||
@@ -161,14 +161,11 @@ Mocks.note = async (post) => {
 | 
			
		||||
	const id = `${nconf.get('url')}/post/${post.pid}`;
 | 
			
		||||
	const published = new Date(parseInt(post.timestamp, 10)).toISOString();
 | 
			
		||||
 | 
			
		||||
	const [raw, userslug] = await Promise.all([
 | 
			
		||||
		posts.getPostField(post.pid, 'content'),
 | 
			
		||||
		user.getUserField(post.user.uid, 'userslug'),
 | 
			
		||||
	]);
 | 
			
		||||
	const raw = await posts.getPostField(post.pid, 'content');
 | 
			
		||||
 | 
			
		||||
	// todo: post visibility, category privileges integration
 | 
			
		||||
	const to = [activitypub._constants.publicAddress];
 | 
			
		||||
	const cc = [`${nconf.get('url')}/user/${userslug}/followers`];
 | 
			
		||||
	const cc = [`${nconf.get('url')}/uid/${post.user.uid}/followers`];
 | 
			
		||||
 | 
			
		||||
	let inReplyTo = null;
 | 
			
		||||
	let name = null;
 | 
			
		||||
 
 | 
			
		||||
@@ -11,14 +11,14 @@ Controller.actors = require('./actors');
 | 
			
		||||
Controller.topics = require('./topics');
 | 
			
		||||
 | 
			
		||||
Controller.getFollowing = async (req, res) => {
 | 
			
		||||
	const { followingCount: totalItems } = await user.getUserFields(res.locals.uid, ['followingCount']);
 | 
			
		||||
	const { followingCount: totalItems } = await user.getUserFields(req.params.uid, ['followingCount']);
 | 
			
		||||
 | 
			
		||||
	const page = parseInt(req.query.page, 10) || 1;
 | 
			
		||||
	const resultsPerPage = 50;
 | 
			
		||||
	const start = Math.max(0, page - 1) * resultsPerPage;
 | 
			
		||||
	const stop = start + resultsPerPage - 1;
 | 
			
		||||
 | 
			
		||||
	let orderedItems = await user.getFollowing(res.locals.uid, start, stop);
 | 
			
		||||
	let orderedItems = await user.getFollowing(req.params.uid, start, stop);
 | 
			
		||||
	orderedItems = orderedItems.map(({ userslug }) => `${nconf.get('url')}/user/${userslug}`);
 | 
			
		||||
	res.status(200).json({
 | 
			
		||||
		'@context': 'https://www.w3.org/ns/activitystreams',
 | 
			
		||||
@@ -29,14 +29,14 @@ Controller.getFollowing = async (req, res) => {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
Controller.getFollowers = async (req, res) => {
 | 
			
		||||
	const { followerCount: totalItems } = await user.getUserFields(res.locals.uid, ['followerCount']);
 | 
			
		||||
	const { followerCount: totalItems } = await user.getUserFields(req.params.uid, ['followerCount']);
 | 
			
		||||
 | 
			
		||||
	const page = parseInt(req.query.page, 10) || 1;
 | 
			
		||||
	const resultsPerPage = 50;
 | 
			
		||||
	const start = Math.max(0, page - 1) * resultsPerPage;
 | 
			
		||||
	const stop = start + resultsPerPage - 1;
 | 
			
		||||
 | 
			
		||||
	let orderedItems = await user.getFollowers(res.locals.uid, start, stop);
 | 
			
		||||
	let orderedItems = await user.getFollowers(req.params.uid, start, stop);
 | 
			
		||||
	orderedItems = orderedItems.map(({ userslug }) => `${nconf.get('url')}/user/${userslug}`);
 | 
			
		||||
	res.status(200).json({
 | 
			
		||||
		'@context': 'https://www.w3.org/ns/activitystreams',
 | 
			
		||||
 
 | 
			
		||||
@@ -18,14 +18,14 @@ module.exports = function (app, middleware, controllers) {
 | 
			
		||||
	app.get('/uid/:uid', middlewares, controllers.activitypub.actors.user);
 | 
			
		||||
	app.get('/user/:userslug', [...middlewares, middleware.exposeUid], controllers.activitypub.actors.userBySlug);
 | 
			
		||||
 | 
			
		||||
	app.get('/user/:userslug/inbox', [...middlewares, middleware.exposeUid], controllers.activitypub.getInbox);
 | 
			
		||||
	app.post('/user/:userslug/inbox', [...middlewares, middleware.activitypub.validate, middleware.exposeUid], controllers.activitypub.postInbox);
 | 
			
		||||
	app.get('/uid/:uid/inbox', middlewares, controllers.activitypub.getInbox);
 | 
			
		||||
	app.post('/uid/:uid/inbox', [...middlewares, middleware.activitypub.validate], controllers.activitypub.postInbox);
 | 
			
		||||
 | 
			
		||||
	app.get('/user/:userslug/outbox', [...middlewares, middleware.exposeUid], controllers.activitypub.getOutbox);
 | 
			
		||||
	app.post('/user/:userslug/outbox', [...middlewares, middleware.exposeUid], controllers.activitypub.postOutbox);
 | 
			
		||||
	app.get('/uid/:uid/outbox', middlewares, controllers.activitypub.getOutbox);
 | 
			
		||||
	app.post('/uid/:uid/outbox', middlewares, controllers.activitypub.postOutbox);
 | 
			
		||||
 | 
			
		||||
	app.get('/user/:userslug/following', [...middlewares, middleware.exposeUid], controllers.activitypub.getFollowing);
 | 
			
		||||
	app.get('/user/:userslug/followers', [...middlewares, middleware.exposeUid], controllers.activitypub.getFollowers);
 | 
			
		||||
	app.get('/uid/:uid/following', middlewares, controllers.activitypub.getFollowing);
 | 
			
		||||
	app.get('/uid/:uid/followers', middlewares, controllers.activitypub.getFollowers);
 | 
			
		||||
 | 
			
		||||
	app.get('/post/:pid', middlewares, controllers.activitypub.actors.note);
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user