diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2018-06-02 16:28:08 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-06-02 16:28:08 +0900 |
| commit | e25e1d88d60c4d427635e51609a6ecbfe7b6049b (patch) | |
| tree | b3b9890e83527d0d257c819a2c61981516945e21 /src/server | |
| parent | Merge pull request #1672 from Angristan/patch-1 (diff) | |
| parent | wip (diff) | |
| download | misskey-e25e1d88d60c4d427635e51609a6ecbfe7b6049b.tar.gz misskey-e25e1d88d60c4d427635e51609a6ecbfe7b6049b.tar.bz2 misskey-e25e1d88d60c4d427635e51609a6ecbfe7b6049b.zip | |
Merge pull request #1671 from syuilo/locked-account
Locked account
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/activitypub.ts | 19 | ||||
| -rw-r--r-- | src/server/api/endpoints.ts | 20 | ||||
| -rw-r--r-- | src/server/api/endpoints/following/create.ts | 4 | ||||
| -rw-r--r-- | src/server/api/endpoints/following/delete.ts | 4 | ||||
| -rw-r--r-- | src/server/api/endpoints/following/requests/accept.ts | 26 | ||||
| -rw-r--r-- | src/server/api/endpoints/following/requests/cancel.ts | 26 | ||||
| -rw-r--r-- | src/server/api/endpoints/following/requests/list.ts | 14 | ||||
| -rw-r--r-- | src/server/api/endpoints/following/requests/reject.ts | 26 | ||||
| -rw-r--r-- | src/server/api/endpoints/i/update.ts | 58 | ||||
| -rw-r--r-- | src/server/api/endpoints/users/recommendation.ts | 1 | ||||
| -rw-r--r-- | src/server/api/service/twitter.ts | 4 |
11 files changed, 163 insertions, 39 deletions
diff --git a/src/server/activitypub.ts b/src/server/activitypub.ts index 3c07a3e2f2..c846e28c07 100644 --- a/src/server/activitypub.ts +++ b/src/server/activitypub.ts @@ -7,7 +7,7 @@ const httpSignature = require('http-signature'); import { createHttp } from '../queue'; import pack from '../remote/activitypub/renderer'; import Note from '../models/note'; -import User, { isLocalUser } from '../models/user'; +import User, { isLocalUser, ILocalUser } from '../models/user'; import renderNote from '../remote/activitypub/renderer/note'; import renderKey from '../remote/activitypub/renderer/key'; import renderPerson from '../remote/activitypub/renderer/person'; @@ -69,7 +69,10 @@ router.get('/notes/:note', async (ctx, next) => { router.get('/users/:user/outbox', async ctx => { const userId = new mongo.ObjectID(ctx.params.user); - const user = await User.findOne({ _id: userId }); + const user = await User.findOne({ + _id: userId, + host: null + }); if (user === null) { ctx.status = 404; @@ -91,7 +94,10 @@ router.get('/users/:user/outbox', async ctx => { router.get('/users/:user/publickey', async ctx => { const userId = new mongo.ObjectID(ctx.params.user); - const user = await User.findOne({ _id: userId }); + const user = await User.findOne({ + _id: userId, + host: null + }); if (user === null) { ctx.status = 404; @@ -109,14 +115,17 @@ router.get('/users/:user/publickey', async ctx => { router.get('/users/:user', async ctx => { const userId = new mongo.ObjectID(ctx.params.user); - const user = await User.findOne({ _id: userId }); + const user = await User.findOne({ + _id: userId, + host: null + }); if (user === null) { ctx.status = 404; return; } - ctx.body = pack(renderPerson(user)); + ctx.body = pack(renderPerson(user as ILocalUser)); }); // follow form diff --git a/src/server/api/endpoints.ts b/src/server/api/endpoints.ts index 196f3adebc..e9392d236b 100644 --- a/src/server/api/endpoints.ts +++ b/src/server/api/endpoints.ts @@ -449,6 +449,26 @@ const endpoints: Endpoint[] = [ kind: 'following-write' }, { + name: 'following/requests/accept', + withCredential: true, + kind: 'following-write' + }, + { + name: 'following/requests/reject', + withCredential: true, + kind: 'following-write' + }, + { + name: 'following/requests/cancel', + withCredential: true, + kind: 'following-write' + }, + { + name: 'following/requests/list', + withCredential: true, + kind: 'following-read' + }, + { name: 'following/stalk', withCredential: true, limit: { diff --git a/src/server/api/endpoints/following/create.ts b/src/server/api/endpoints/following/create.ts index 766a8c03d0..48205232e6 100644 --- a/src/server/api/endpoints/following/create.ts +++ b/src/server/api/endpoints/following/create.ts @@ -2,7 +2,7 @@ * Module dependencies */ import $ from 'cafy'; import ID from '../../../../cafy-id'; -import User from '../../../../models/user'; +import User, { pack } from '../../../../models/user'; import Following from '../../../../models/following'; import create from '../../../../services/following/create'; @@ -49,5 +49,5 @@ module.exports = (params, user) => new Promise(async (res, rej) => { create(follower, followee); // Send response - res(); + res(await pack(followee, user)); }); diff --git a/src/server/api/endpoints/following/delete.ts b/src/server/api/endpoints/following/delete.ts index 396b19a6f6..f4030c247a 100644 --- a/src/server/api/endpoints/following/delete.ts +++ b/src/server/api/endpoints/following/delete.ts @@ -2,7 +2,7 @@ * Module dependencies */ import $ from 'cafy'; import ID from '../../../../cafy-id'; -import User from '../../../../models/user'; +import User, { pack } from '../../../../models/user'; import Following from '../../../../models/following'; import deleteFollowing from '../../../../services/following/delete'; @@ -49,5 +49,5 @@ module.exports = (params, user) => new Promise(async (res, rej) => { deleteFollowing(follower, followee); // Send response - res(); + res(await pack(followee, user)); }); diff --git a/src/server/api/endpoints/following/requests/accept.ts b/src/server/api/endpoints/following/requests/accept.ts new file mode 100644 index 0000000000..705d3b161a --- /dev/null +++ b/src/server/api/endpoints/following/requests/accept.ts @@ -0,0 +1,26 @@ +import $ from 'cafy'; import ID from '../../../../../cafy-id'; +import acceptFollowRequest from '../../../../../services/following/requests/accept'; +import User from '../../../../../models/user'; + +/** + * Accept a follow request + */ +module.exports = (params, user) => new Promise(async (res, rej) => { + // Get 'userId' parameter + const [followerId, followerIdErr] = $.type(ID).get(params.userId); + if (followerIdErr) return rej('invalid userId param'); + + // Fetch follower + const follower = await User.findOne({ + _id: followerId + }); + + if (follower === null) { + return rej('follower not found'); + } + + await acceptFollowRequest(user, follower); + + // Send response + res(); +}); diff --git a/src/server/api/endpoints/following/requests/cancel.ts b/src/server/api/endpoints/following/requests/cancel.ts new file mode 100644 index 0000000000..388a54890b --- /dev/null +++ b/src/server/api/endpoints/following/requests/cancel.ts @@ -0,0 +1,26 @@ +import $ from 'cafy'; import ID from '../../../../../cafy-id'; +import cancelFollowRequest from '../../../../../services/following/requests/cancel'; +import User, { pack } from '../../../../../models/user'; + +/** + * Cancel a follow request + */ +module.exports = (params, user) => new Promise(async (res, rej) => { + // Get 'userId' parameter + const [followeeId, followeeIdErr] = $.type(ID).get(params.userId); + if (followeeIdErr) return rej('invalid userId param'); + + // Fetch followee + const followee = await User.findOne({ + _id: followeeId + }); + + if (followee === null) { + return rej('followee not found'); + } + + await cancelFollowRequest(followee, user); + + // Send response + res(await pack(followee._id, user)); +}); diff --git a/src/server/api/endpoints/following/requests/list.ts b/src/server/api/endpoints/following/requests/list.ts new file mode 100644 index 0000000000..e8364335d1 --- /dev/null +++ b/src/server/api/endpoints/following/requests/list.ts @@ -0,0 +1,14 @@ +//import $ from 'cafy'; import ID from '../../../../../cafy-id'; +import FollowRequest, { pack } from '../../../../../models/follow-request'; + +/** + * Get all pending received follow requests + */ +module.exports = (params, user) => new Promise(async (res, rej) => { + const reqs = await FollowRequest.find({ + followeeId: user._id + }); + + // Send response + res(await Promise.all(reqs.map(req => pack(req)))); +}); diff --git a/src/server/api/endpoints/following/requests/reject.ts b/src/server/api/endpoints/following/requests/reject.ts new file mode 100644 index 0000000000..1cfb562b55 --- /dev/null +++ b/src/server/api/endpoints/following/requests/reject.ts @@ -0,0 +1,26 @@ +import $ from 'cafy'; import ID from '../../../../../cafy-id'; +import rejectFollowRequest from '../../../../../services/following/requests/reject'; +import User from '../../../../../models/user'; + +/** + * Reject a follow request + */ +module.exports = (params, user) => new Promise(async (res, rej) => { + // Get 'userId' parameter + const [followerId, followerIdErr] = $.type(ID).get(params.userId); + if (followerIdErr) return rej('invalid userId param'); + + // Fetch follower + const follower = await User.findOne({ + _id: followerId + }); + + if (follower === null) { + return rej('follower not found'); + } + + await rejectFollowRequest(user, follower); + + // Send response + res(); +}); diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts index 6e0c5b8515..b94f073d2c 100644 --- a/src/server/api/endpoints/i/update.ts +++ b/src/server/api/endpoints/i/update.ts @@ -5,6 +5,7 @@ import $ from 'cafy'; import ID from '../../../../cafy-id'; import User, { isValidName, isValidDescription, isValidLocation, isValidBirthday, pack } from '../../../../models/user'; import event from '../../../../publishers/stream'; import DriveFile from '../../../../models/drive-file'; +import acceptAllFollowRequests from '../../../../services/following/requests/accept-all'; /** * Update myself @@ -12,50 +13,57 @@ import DriveFile from '../../../../models/drive-file'; module.exports = async (params, user, app) => new Promise(async (res, rej) => { const isSecure = user != null && app == null; + const updates = {} as any; + // Get 'name' parameter const [name, nameErr] = $.str.optional().nullable().pipe(isValidName).get(params.name); if (nameErr) return rej('invalid name param'); - if (name) user.name = name; + if (name) updates.name = name; // Get 'description' parameter const [description, descriptionErr] = $.str.optional().nullable().pipe(isValidDescription).get(params.description); if (descriptionErr) return rej('invalid description param'); - if (description !== undefined) user.description = description; + if (description !== undefined) updates.description = description; // Get 'location' parameter const [location, locationErr] = $.str.optional().nullable().pipe(isValidLocation).get(params.location); if (locationErr) return rej('invalid location param'); - if (location !== undefined) user.profile.location = location; + if (location !== undefined) updates['profile.location'] = location; // Get 'birthday' parameter const [birthday, birthdayErr] = $.str.optional().nullable().pipe(isValidBirthday).get(params.birthday); if (birthdayErr) return rej('invalid birthday param'); - if (birthday !== undefined) user.profile.birthday = birthday; + if (birthday !== undefined) updates['profile.birthday'] = birthday; // Get 'avatarId' parameter - const [avatarId, avatarIdErr] = $.type(ID).optional().get(params.avatarId); + const [avatarId, avatarIdErr] = $.type(ID).optional().nullable().get(params.avatarId); if (avatarIdErr) return rej('invalid avatarId param'); - if (avatarId) user.avatarId = avatarId; + if (avatarId !== undefined) updates.avatarId = avatarId; // Get 'bannerId' parameter - const [bannerId, bannerIdErr] = $.type(ID).optional().get(params.bannerId); + const [bannerId, bannerIdErr] = $.type(ID).optional().nullable().get(params.bannerId); if (bannerIdErr) return rej('invalid bannerId param'); - if (bannerId) user.bannerId = bannerId; + if (bannerId !== undefined) updates.bannerId = bannerId; + + // Get 'isLocked' parameter + const [isLocked, isLockedErr] = $.bool.optional().get(params.isLocked); + if (isLockedErr) return rej('invalid isLocked param'); + if (isLocked != null) updates.isLocked = isLocked; // Get 'isBot' parameter const [isBot, isBotErr] = $.bool.optional().get(params.isBot); if (isBotErr) return rej('invalid isBot param'); - if (isBot != null) user.isBot = isBot; + if (isBot != null) updates.isBot = isBot; // Get 'isCat' parameter const [isCat, isCatErr] = $.bool.optional().get(params.isCat); if (isCatErr) return rej('invalid isCat param'); - if (isCat != null) user.isCat = isCat; + if (isCat != null) updates.isCat = isCat; // Get 'autoWatch' parameter const [autoWatch, autoWatchErr] = $.bool.optional().get(params.autoWatch); if (autoWatchErr) return rej('invalid autoWatch param'); - if (autoWatch != null) user.settings.autoWatch = autoWatch; + if (autoWatch != null) updates['settings.autoWatch'] = autoWatch; if (avatarId) { const avatar = await DriveFile.findOne({ @@ -63,7 +71,7 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => { }); if (avatar != null && avatar.metadata.properties.avgColor) { - user.avatarColor = avatar.metadata.properties.avgColor; + updates.avatarColor = avatar.metadata.properties.avgColor; } } @@ -73,27 +81,16 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => { }); if (banner != null && banner.metadata.properties.avgColor) { - user.bannerColor = banner.metadata.properties.avgColor; + updates.bannerColor = banner.metadata.properties.avgColor; } } await User.update(user._id, { - $set: { - name: user.name, - description: user.description, - avatarId: user.avatarId, - avatarColor: user.avatarColor, - bannerId: user.bannerId, - bannerColor: user.bannerColor, - profile: user.profile, - isBot: user.isBot, - isCat: user.isCat, - settings: user.settings - } + $set: updates }); // Serialize - const iObj = await pack(user, user, { + const iObj = await pack(user._id, user, { detail: true, includeSecrets: isSecure }); @@ -101,6 +98,11 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => { // Send response res(iObj); - // Publish i updated event - event(user._id, 'i_updated', iObj); + // Publish meUpdated event + event(user._id, 'meUpdated', iObj); + + // 鍵垢を解除したとき、溜まっていたフォローリクエストがあるならすべて承認 + if (user.isLocked && isLocked === false) { + acceptAllFollowRequests(user); + } }); diff --git a/src/server/api/endpoints/users/recommendation.ts b/src/server/api/endpoints/users/recommendation.ts index 620ae17ca2..23821a552f 100644 --- a/src/server/api/endpoints/users/recommendation.ts +++ b/src/server/api/endpoints/users/recommendation.ts @@ -36,6 +36,7 @@ module.exports = (params, me) => new Promise(async (res, rej) => { _id: { $nin: followingIds.concat(mutedUserIds) }, + isLocked: false, $or: [{ lastUsedAt: { $gte: new Date(Date.now() - ms('7days')) diff --git a/src/server/api/service/twitter.ts b/src/server/api/service/twitter.ts index 284ae7ee22..8c35509cce 100644 --- a/src/server/api/service/twitter.ts +++ b/src/server/api/service/twitter.ts @@ -49,7 +49,7 @@ router.get('/disconnect/twitter', async ctx => { ctx.body = `Twitterの連携を解除しました :v:`; // Publish i updated event - event(user._id, 'i_updated', await pack(user, user, { + event(user._id, 'meUpdated', await pack(user, user, { detail: true, includeSecrets: true })); @@ -174,7 +174,7 @@ if (config.twitter == null) { ctx.body = `Twitter: @${result.screenName} を、Misskey: @${user.username} に接続しました!`; // Publish i updated event - event(user._id, 'i_updated', await pack(user, user, { + event(user._id, 'meUpdated', await pack(user, user, { detail: true, includeSecrets: true })); |