Implement suspend account

This commit is contained in:
syuilo 2018-04-19 18:54:34 +09:00
parent 38b9ed3f27
commit bd207b5012
8 changed files with 54 additions and 4 deletions

18
cli/suspend.js Normal file
View file

@ -0,0 +1,18 @@
const mongo = require('mongodb');
const User = require('../built/models/user').default;
const args = process.argv.slice(2);
const userId = new mongo.ObjectID(args[0]);
console.log(`Suspending ${userId}...`);
User.update({ _id: userId }, {
$set: {
isSuspended: true
}
}).then(() => {
console.log(`Suspended ${userId}`);
}, e => {
console.error(e);
});

View file

@ -406,6 +406,7 @@ desktop/views/pages/user/user.friends.vue:
no-users: "No users" no-users: "No users"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
is-suspended: "This account has been suspended."
is-remote: "This user is a remote user, so the information is not accurate. " is-remote: "This user is a remote user, so the information is not accurate. "
view-remote: "See accurate information" view-remote: "See accurate information"
@ -594,6 +595,7 @@ mobile/views/pages/user.vue:
overview: "Overview" overview: "Overview"
timeline: "Timeline" timeline: "Timeline"
media: "Media" media: "Media"
is-suspended: "This account has been suspended."
is-remote: "This user is a remote user, so the information is not accurate. " is-remote: "This user is a remote user, so the information is not accurate. "
view-remote: "See accurate information" view-remote: "See accurate information"

View file

@ -406,6 +406,7 @@ desktop/views/pages/user/user.friends.vue:
no-users: "Pas d'utilisateurs" no-users: "Pas d'utilisateurs"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
is-suspended: "This account has been suspended."
is-remote: "Cet utilisateur n'est pas un utilisateur de Misskey. Certaines informations peuvent être erronées " is-remote: "Cet utilisateur n'est pas un utilisateur de Misskey. Certaines informations peuvent être erronées "
view-remote: "Voir les informations détaillées" view-remote: "Voir les informations détaillées"
@ -594,6 +595,7 @@ mobile/views/pages/user.vue:
overview: "Aperçu" overview: "Aperçu"
timeline: "Fil d'actualité" timeline: "Fil d'actualité"
media: "Media" media: "Media"
is-suspended: "This account has been suspended."
is-remote: "Cet utilisateur n'est pas un utilisateur de Misskey. Certaines informations peuvent être erronées " is-remote: "Cet utilisateur n'est pas un utilisateur de Misskey. Certaines informations peuvent être erronées "
view-remote: "Voir les informations détaillées" view-remote: "Voir les informations détaillées"

View file

@ -406,6 +406,7 @@ desktop/views/pages/user/user.friends.vue:
no-users: "よく話すユーザーはいません" no-users: "よく話すユーザーはいません"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
is-suspended: "このユーザーは凍結されています。"
is-remote: "このユーザーはリモートユーザーです。" is-remote: "このユーザーはリモートユーザーです。"
view-remote: "正確な情報を見る" view-remote: "正確な情報を見る"
@ -594,6 +595,7 @@ mobile/views/pages/user.vue:
overview: "概要" overview: "概要"
timeline: "タイムライン" timeline: "タイムライン"
media: "メディア" media: "メディア"
is-suspended: "このユーザーは凍結されています。"
is-remote: "このユーザーはリモートユーザーです。" is-remote: "このユーザーはリモートユーザーです。"
view-remote: "正確な情報を見る" view-remote: "正確な情報を見る"

View file

@ -1,5 +1,6 @@
<template> <template>
<div class="header" :data-is-dark-background="user.bannerUrl != null"> <div class="header" :data-is-dark-background="user.bannerUrl != null">
<div class="is-suspended" v-if="user.isSuspended"><p>%fa:exclamation-triangle% %i18n:@is-suspended%</p></div>
<div class="is-remote" v-if="user.host != null"><p>%fa:exclamation-triangle% %i18n:@is-remote%<a :href="user.url || user.uri" target="_blank">%i18n:@view-remote%</a></p></div> <div class="is-remote" v-if="user.host != null"><p>%fa:exclamation-triangle% %i18n:@is-remote%<a :href="user.url || user.uri" target="_blank">%i18n:@view-remote%</a></p></div>
<div class="banner-container" :style="user.bannerUrl ? `background-image: url(${user.bannerUrl}?thumbnail&size=2048)` : ''"> <div class="banner-container" :style="user.bannerUrl ? `background-image: url(${user.bannerUrl}?thumbnail&size=2048)` : ''">
<div class="banner" ref="banner" :style="user.bannerUrl ? `background-image: url(${user.bannerUrl}?thumbnail&size=2048)` : ''" @click="onBannerClick"></div> <div class="banner" ref="banner" :style="user.bannerUrl ? `background-image: url(${user.bannerUrl}?thumbnail&size=2048)` : ''" @click="onBannerClick"></div>
@ -73,8 +74,15 @@ export default Vue.extend({
background #f7f7f7 background #f7f7f7
box-shadow 0 1px 1px rgba(0, 0, 0, 0.075) box-shadow 0 1px 1px rgba(0, 0, 0, 0.075)
> .is-suspended
> .is-remote > .is-remote
padding 16px padding 16px
&.is-suspended
color #570808
background #ffdbdb
&.is-remote
color #573c08 color #573c08
background #fff0db background #fff0db

View file

@ -2,6 +2,7 @@
<mk-ui> <mk-ui>
<span slot="header" v-if="!fetching">%fa:user% {{ user | userName }}</span> <span slot="header" v-if="!fetching">%fa:user% {{ user | userName }}</span>
<main v-if="!fetching"> <main v-if="!fetching">
<div class="is-suspended" v-if="user.isSuspended"><p>%fa:exclamation-triangle% %i18n:@is-suspended%</p></div>
<div class="is-remote" v-if="user.host != null"><p>%fa:exclamation-triangle% %i18n:@is-remote%<a :href="user.url || user.uri" target="_blank">%i18n:@view-remote%</a></p></div> <div class="is-remote" v-if="user.host != null"><p>%fa:exclamation-triangle% %i18n:@is-remote%<a :href="user.url || user.uri" target="_blank">%i18n:@view-remote%</a></p></div>
<header> <header>
<div class="banner" :style="user.bannerUrl ? `background-image: url(${user.bannerUrl}?thumbnail&size=1024)` : ''"></div> <div class="banner" :style="user.bannerUrl ? `background-image: url(${user.bannerUrl}?thumbnail&size=1024)` : ''"></div>
@ -110,8 +111,15 @@ export default Vue.extend({
@import '~const.styl' @import '~const.styl'
main main
> .is-suspended
> .is-remote > .is-remote
padding 16px padding 16px
&.is-suspended
color #570808
background #ffdbdb
&.is-remote
color #573c08 color #573c08
background #fff0db background #fff0db

View file

@ -11,6 +11,11 @@ const log = debug('misskey:activitypub');
* Imageを作成します * Imageを作成します
*/ */
export async function createImage(actor: IRemoteUser, value): Promise<IDriveFile> { export async function createImage(actor: IRemoteUser, value): Promise<IDriveFile> {
// 投稿者が凍結されていたらスキップ
if (actor.isSuspended) {
return null;
}
const image = await new Resolver().resolve(value); const image = await new Resolver().resolve(value);
if (image.url == null) { if (image.url == null) {

View file

@ -58,6 +58,11 @@ export async function createNote(value: any, resolver?: Resolver, silent = false
// 投稿者をフェッチ // 投稿者をフェッチ
const actor = await resolvePerson(note.attributedTo) as IRemoteUser; const actor = await resolvePerson(note.attributedTo) as IRemoteUser;
// 投稿者が凍結されていたらスキップ
if (actor.isSuspended) {
return null;
}
//#region Visibility //#region Visibility
let visibility = 'public'; let visibility = 'public';
if (!note.to.includes('https://www.w3.org/ns/activitystreams#Public')) visibility = 'unlisted'; if (!note.to.includes('https://www.w3.org/ns/activitystreams#Public')) visibility = 'unlisted';