#245 require ban reason

This commit is contained in:
Avris 2021-08-12 12:14:34 +02:00
parent 4abddf3c64
commit bfca7fdc2a
18 changed files with 95 additions and 16 deletions

View File

@ -23,6 +23,17 @@
</a>
<div v-else>
<textarea v-model="user.bannedReason" class="form-control" rows="3" :placeholder="$t('ban.reason') + ' ' + $t('ban.visible')" :disabled="saving"></textarea>
<div class="form-group">
<p class="my-1"><label><strong><T>ban.terms</T>:</strong></label></p>
<div style="columns: 3" class="small">
<div class="form-check ps-0" v-for="term in forbidden">
<label>
<input type="checkbox" :value="term" v-model="user.bannedTerms"/>
{{ term }}
</label>
</div>
</div>
</div>
<button class="btn btn-danger d-block w-100 mt-2" :disabled="saving" @click="ban">
<Icon v="ban"/>
<T>ban.action</T>
@ -34,6 +45,7 @@
<script>
import ClientOnly from 'vue-client-only'
import forbidden from "../src/forbidden";
export default {
components: { ClientOnly },
@ -49,6 +61,8 @@
showBanForm: !!this.user.bannedReason,
saving: false,
forbidden,
}
},
methods: {
@ -58,6 +72,7 @@
try {
await this.$post(`/admin/ban/${encodeURIComponent(this.user.username)}`, {
reason: this.user.bannedReason,
terms: this.user.bannedTerms,
});
window.location.reload();
} finally {

View File

@ -91,9 +91,7 @@
<blockquote class="small">
It is forbidden to post on the Service any Content that might break the law or violate social norms,
including but not limited to:
propagation of totalitarian regimes, hate speech, racism, xenophobia, homophobia, transphobia, queerphobia,
misogyny, harassment, impersonation, child pornography, unlawful conduct, misinformation,
sharing of someone else's personal data, spam, advertisement, copyright or trademark violations.
<template v-for="(term, i) in forbidden"><span :class="[$user().bannedTerms.includes(term) ? 'fw-bold' : '']">{{term}}</span><template v-if="i !== forbidden.length - 1">, </template></template>.
</blockquote>
</div>
</div>
@ -112,6 +110,7 @@
<script>
import { mapState } from 'vuex'
import {DateTime} from "luxon";
import forbidden from "../src/forbidden";
export default {
data() {
@ -119,6 +118,7 @@
hamburgerActive: false,
hamburgerShown: false,
censusDismissed: false,
forbidden,
};
},
computed: {

View File

@ -537,6 +537,7 @@ mode:
ban:
reason: 'Grund der Sperrung'
visible: '(dies wird der*m Nutzer*in sichtbar sein)'
terms: 'Terms rules broken (required)' # TODO
action: 'Diese Person sperren'
confirm: 'Bist du sicher, die Person @%username% zu sperren?'
header: 'Du wurdest gesperrt. Dein Profil kann nicht mehr angesehen werden.'

View File

@ -622,6 +622,7 @@ mode:
ban:
reason: 'Ban reason'
visible: '(this will be visible to the user)'
terms: 'Terms rules broken (required)'
action: 'Ban this person'
confirm: 'Are you sure you want to ban @%username%?'
header: 'You''re banned. Your profile will not be shown to anyone.'

View File

@ -549,6 +549,7 @@ mode:
ban:
reason: 'Razón para banear'
visible: '(esto será visible para le usuario)'
terms: 'Terms rules broken (required)' # TODO
action: 'Banear esta persona'
confirm: '¿Estás segure que quieres banear a @%username%?'
header: 'Has sido baneado. Tu perfil no se mostrará a nadie.'

View File

@ -542,6 +542,7 @@ mode:
ban:
reason: 'Raison du bannissement'
visible: '(visible par lutilisateur)'
terms: 'Terms rules broken (required)' # TODO
action: 'Bannir lutilisateur'
confirm: 'Voulez-vous bannir @%username%?'
header: 'Vous êtes banni. Votre profil napparaîtra plus aux autres utilisateurs.'

View File

@ -534,6 +534,7 @@ mode:
ban:
reason: 'Ban reason'
visible: '(this will be visible to the user)'
terms: 'Terms rules broken (required)' # TODO
action: 'Ban this person'
confirm: 'Are you sure you want to ban @%username%?'
header: 'You''re banned. Your profile will not be shown to anyone.'

View File

@ -541,6 +541,7 @@ mode:
ban:
reason: 'Grunn til forbud'
visible: '(dette vil kunne bli sett av brukeren)'
terms: 'Terms rules broken (required)' # TODO
action: 'Forby denne personen'
confirm: 'Er du sikker på at du vil forby @%username%?'
header: 'Du er forbydd. Profilen din vil ikke bli vist til noen.'

View File

@ -1160,6 +1160,7 @@ mode:
ban:
reason: 'Powód blokady'
visible: '(to będzie widoczne dla osoby zbanowanej)'
terms: 'Złamane punkty regulaminu (wymagane)'
action: 'Zablokuj tę osobę'
confirm: 'Czy na pewno chcesz zbanować @%username%?'
header: 'Twoje konto jest zablokowane. Twoje profile nie są widoczne publicznie.'

View File

@ -548,6 +548,7 @@ mode:
ban:
reason: 'Razão de ban'
visible: '(isso vai ser visto para usuárie)'
terms: 'Terms rules broken (required)' # TODO
action: 'Ban essa pessoa'
confirm: 'Você está certe que quer banir @%username%?'
header: 'Você está banido. Seu perfil não mais aparecerá em nosso site.'

View File

@ -1108,6 +1108,7 @@ mode:
ban:
reason: 'Ban reason'
visible: '(this will be visible to the user)'
terms: 'Terms rules broken (required)' # TODO
action: 'Ban this person'
confirm: 'Are you sure you want to ban @%username%?'
header: 'You''re banned. Your profile will not be shown to anyone.'

View File

@ -552,6 +552,7 @@ mode:
ban:
reason: 'Ban reason'
visible: '(this will be visible to the user)'
terms: 'Terms rules broken (required)' # TODO
action: 'Ban this person'
confirm: 'Are you sure you want to ban @%username%?'
header: 'You''re banned. Your profile will not be shown to anyone.'

View File

@ -518,6 +518,7 @@ mode:
ban:
reason: '封禁原因'
visible: '(用戶可以看見這個)'
terms: 'Terms rules broken (required)' # TODO
action: '封禁用戶'
confirm: '您確定要封禁@%username%嗎'
header: '您被封禁了。你的資料不會對任何人顯示。'

View File

@ -0,0 +1,7 @@
-- Up
ALTER TABLE users ADD COLUMN bannedTerms TEXT NULL DEFAULT NULL;
ALTER TABLE users ADD COLUMN bannedBy TEXT NULL DEFAULT NULL;
-- Down

View File

@ -47,9 +47,8 @@
<p>
It is forbidden to post on the Service any Content that might break the law or violate social norms,
including but not limited to: propagation of totalitarian regimes, hate speech, racism, xenophobia,
homophobia, transphobia, queerphobia, misogyny, harassment, impersonation, child pornography, unlawful conduct, misinformation,
sharing of someone else's personal data, spam, advertisement, copyright or trademark violations.
including but not limited to:
{{ forbidden.join(', ') }}.
</p>
<p>
@ -100,3 +99,15 @@
</p>
</div>
</template>
<script>
import forbidden from "../src/forbidden";
export default {
data() {
return {
forbidden,
};
}
}
</script>

View File

@ -133,11 +133,24 @@ router.post('/admin/ban/:username', handleErrorAsync(async (req, res) => {
return res.status(400).json({error: 'No such user'});
}
if (req.body.reason) {
if (!req.body.terms.length) {
return res.status(400).json({error: 'Terms are required'});
}
await req.db.get(SQL`
UPDATE users
SET bannedReason = ${req.body.reason || null}
SET bannedReason = ${req.body.reason},
bannedTerms = ${req.body.terms.join(',')},
bannedBy = ${req.user.id}
WHERE id = ${user.id}
`);
} else {
await req.db.get(SQL`
UPDATE users
SET bannedReason = null
WHERE id = ${user.id}
`);
}
await req.db.get(SQL`
UPDATE reports

View File

@ -115,6 +115,7 @@ router.get('/profile/get/:username', handleErrorAsync(async (req, res) => {
users.email,
users.avatarSource,
users.bannedReason,
users.bannedTerms,
users.roles != '' AS team
FROM users
WHERE users.usernameNorm = ${normalise(req.params.username)}
@ -130,6 +131,8 @@ router.get('/profile/get/:username', handleErrorAsync(async (req, res) => {
delete user.email;
user.avatar = await avatar(req.db, user);
user.bannedTerms = user.bannedTerms ? user.bannedTerms.split(',') : [];
return res.json({
...user,
profiles: await fetchProfiles(req.db, req.params.username, isSelf),

19
src/forbidden.js Normal file
View File

@ -0,0 +1,19 @@
export default [
'propagation of totalitarian regimes',
'hate speech',
'racism',
'xenophobia',
'homophobia',
'transphobia',
'queerphobia',
'misogyny',
'harassment',
'impersonation',
'child pornography',
'unlawful conduct',
'misinformation',
'sharing of someone else\'s personal data',
'spam',
'advertisement',
'copyright or trademark violations',
];