This commit is contained in:
syuilo 2018-06-01 00:42:37 +09:00
parent 51255bb446
commit 35115607bc
9 changed files with 110 additions and 3 deletions
src
models
remote/activitypub
server/api/endpoints/users
services/user

View file

@ -416,7 +416,7 @@ export const pack = (
} }
if (meId && !meId.equals(_user.id)) { if (meId && !meId.equals(_user.id)) {
const [following1, following2, mute] = await Promise.all([ const [following1, following2, followReq1, followReq2, mute] = await Promise.all([
Following.findOne({ Following.findOne({
followerId: meId, followerId: meId,
followeeId: _user.id followeeId: _user.id
@ -425,6 +425,14 @@ export const pack = (
followerId: _user.id, followerId: _user.id,
followeeId: meId followeeId: meId
}), }),
_user.isLocked ? FollowRequest.findOne({
followerId: meId,
followeeId: _user.id
}) : Promise.resolve(null),
FollowRequest.findOne({
followerId: _user.id,
followeeId: meId
}),
Mute.findOne({ Mute.findOne({
muterId: meId, muterId: meId,
muteeId: _user.id muteeId: _user.id
@ -435,6 +443,9 @@ export const pack = (
_user.isFollowing = following1 !== null; _user.isFollowing = following1 !== null;
_user.isStalking = following1 && following1.stalk; _user.isStalking = following1 && following1.stalk;
_user.hasPendingFollowRequestFromYou = followReq1 !== null;
_user.hasPendingFollowRequestToYou = followReq2 !== null;
// Whether the user is followed // Whether the user is followed
_user.isFollowed = following2 !== null; _user.isFollowed = following2 !== null;

View file

@ -25,7 +25,7 @@ export default async (actor: IRemoteUser, activity: IAccept): Promise<void> => {
switch (object.type) { switch (object.type) {
case 'Follow': case 'Follow':
acceptFollow(resolver, actor, activity, object); acceptFollow(actor, object);
break; break;
default: default:

View file

@ -6,6 +6,8 @@ import follow from './follow';
import undo from './undo'; import undo from './undo';
import like from './like'; import like from './like';
import announce from './announce'; import announce from './announce';
import accept from './accept';
import reject from './reject';
const self = async (actor: IRemoteUser, activity: Object): Promise<void> => { const self = async (actor: IRemoteUser, activity: Object): Promise<void> => {
switch (activity.type) { switch (activity.type) {
@ -22,7 +24,11 @@ const self = async (actor: IRemoteUser, activity: Object): Promise<void> => {
break; break;
case 'Accept': case 'Accept':
// noop await accept(actor, activity);
break;
case 'Reject':
await reject(actor, activity);
break; break;
case 'Announce': case 'Announce':

View file

@ -0,0 +1,27 @@
import * as mongo from 'mongodb';
import User, { IRemoteUser } from '../../../../models/user';
import config from '../../../../config';
import reject from '../../../../services/user/reject-follow-request';
import { IFollow } from '../../type';
export default async (actor: IRemoteUser, activity: IFollow): Promise<void> => {
const id = typeof activity.object == 'string' ? activity.object : activity.object.id;
if (!id.startsWith(config.url + '/')) {
return null;
}
const follower = await User.findOne({
_id: new mongo.ObjectID(id.split('/').pop())
});
if (follower === null) {
throw new Error('follower not found');
}
if (follower.host != null) {
throw new Error('フォローリクエストしたユーザーはローカルユーザーではありません');
}
await reject(actor, follower);
};

View file

@ -0,0 +1,35 @@
import * as debug from 'debug';
import Resolver from '../../resolver';
import { IRemoteUser } from '../../../../models/user';
import rejectFollow from './follow';
import { IReject } from '../../type';
const log = debug('misskey:activitypub');
export default async (actor: IRemoteUser, activity: IReject): Promise<void> => {
const uri = activity.id || activity;
log(`Reject: ${uri}`);
const resolver = new Resolver();
let object;
try {
object = await resolver.resolve(activity.object);
} catch (e) {
log(`Resolution failed: ${e}`);
throw e;
}
switch (object.type) {
case 'Follow':
rejectFollow(actor, object);
break;
default:
console.warn(`Unknown reject type: ${object.type}`);
break;
}
};

View file

@ -0,0 +1,4 @@
export default object => ({
type: 'Reject',
object
});

View file

@ -83,6 +83,10 @@ export interface IAccept extends IActivity {
type: 'Accept'; type: 'Accept';
} }
export interface IReject extends IActivity {
type: 'Reject';
}
export interface ILike extends IActivity { export interface ILike extends IActivity {
type: 'Like'; type: 'Like';
_misskey_reaction: string; _misskey_reaction: string;
@ -100,5 +104,6 @@ export type Object =
IUndo | IUndo |
IFollow | IFollow |
IAccept | IAccept |
IReject |
ILike | ILike |
IAnnounce; IAnnounce;

View file

@ -36,6 +36,7 @@ module.exports = (params, me) => new Promise(async (res, rej) => {
_id: { _id: {
$nin: followingIds.concat(mutedUserIds) $nin: followingIds.concat(mutedUserIds)
}, },
isLocked: false,
$or: [{ $or: [{
lastUsedAt: { lastUsedAt: {
$gte: new Date(Date.now() - ms('7days')) $gte: new Date(Date.now() - ms('7days'))

View file

@ -0,0 +1,18 @@
import User, { IUser, isRemoteUser, ILocalUser } from "../../models/user";
import FollowRequest from "../../models/follow-request";
import pack from '../../remote/activitypub/renderer';
import renderFollow from '../../remote/activitypub/renderer/follow';
import renderReject from '../../remote/activitypub/renderer/reject';
import { deliver } from '../../queue';
export default async function(followee: IUser, follower: IUser) {
if (isRemoteUser(follower)) {
const content = pack(renderReject(renderFollow(follower, followee)));
deliver(followee as ILocalUser, content, follower.inbox);
}
FollowRequest.remove({
followeeId: followee._id,
followerId: follower._id
});
}