добавление модерации в имени и описании
This commit is contained in:
parent
05636e666b
commit
fc3ff065aa
@ -1,6 +1,7 @@
|
||||
// Контроллер аутентификации
|
||||
const User = require('../models/User');
|
||||
const jwt = require('jsonwebtoken');
|
||||
const profanityFilter = require('../utils/profanityFilter');
|
||||
|
||||
// Вспомогательная функция для генерации JWT
|
||||
const generateToken = (id) => {
|
||||
@ -29,6 +30,12 @@ const registerUser = async (req, res, next) => {
|
||||
throw new Error('Пожалуйста, выберите город.');
|
||||
}
|
||||
|
||||
// Проверка имени на наличие запрещенных слов
|
||||
if (profanityFilter.hasProfanity(name)) {
|
||||
res.status(400);
|
||||
throw new Error('Имя содержит запрещённые слова. Пожалуйста, используйте другое имя.');
|
||||
}
|
||||
|
||||
// Проверка возраста (минимум 14 лет)
|
||||
const birthDate = new Date(dateOfBirth);
|
||||
const today = new Date();
|
||||
|
@ -2,6 +2,7 @@ const User = require('../models/User');
|
||||
const cloudinary = require('../config/cloudinaryConfig'); // Импортируем настроенный Cloudinary SDK
|
||||
const path = require('path'); // Может понадобиться для получения расширения файла
|
||||
const ProfileView = require('../models/ProfileView');
|
||||
const profanityFilter = require('../utils/profanityFilter'); // Импортируем фильтр запрещённых слов
|
||||
|
||||
// @desc Обновить профиль пользователя
|
||||
// @route PUT /api/users/profile
|
||||
@ -15,6 +16,14 @@ const updateUserProfile = async (req, res, next) => {
|
||||
const user = await User.findById(req.user._id);
|
||||
|
||||
if (user) {
|
||||
// Проверяем имя на запрещённые слова, если оно было изменено
|
||||
if (req.body.name && req.body.name !== user.name) {
|
||||
if (profanityFilter.hasProfanity(req.body.name)) {
|
||||
res.status(400);
|
||||
throw new Error('Имя содержит запрещённые слова. Пожалуйста, используйте другое имя.');
|
||||
}
|
||||
}
|
||||
|
||||
// Обновляем только те поля, которые пользователь может изменять
|
||||
user.name = req.body.name || user.name;
|
||||
|
||||
@ -31,11 +40,13 @@ const updateUserProfile = async (req, res, next) => {
|
||||
user.gender = req.body.gender;
|
||||
}
|
||||
|
||||
// Обрабатываем bio, учитывая null и пустые строки
|
||||
if (req.body.bio === null) {
|
||||
user.bio = ''; // Устанавливаем пустую строку, если null
|
||||
} else {
|
||||
user.bio = req.body.bio || user.bio;
|
||||
// Проверяем bio на запрещённые слова перед установкой
|
||||
if (req.body.bio !== undefined && req.body.bio !== null) {
|
||||
if (req.body.bio !== '' && profanityFilter.hasProfanity(req.body.bio)) {
|
||||
res.status(400);
|
||||
throw new Error('Ваша биография содержит запрещённые слова. Пожалуйста, отредактируйте текст.');
|
||||
}
|
||||
user.bio = req.body.bio;
|
||||
}
|
||||
|
||||
// Обновление местоположения (если передано)
|
||||
|
19
backend/package-lock.json
generated
19
backend/package-lock.json
generated
@ -9,6 +9,7 @@
|
||||
"version": "1.0.0",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"bad-words": "^4.0.0",
|
||||
"bcryptjs": "^3.0.2",
|
||||
"cloudinary": "^2.0.1",
|
||||
"cors": "^2.8.5",
|
||||
@ -110,6 +111,24 @@
|
||||
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/bad-words": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/bad-words/-/bad-words-4.0.0.tgz",
|
||||
"integrity": "sha512-fLjG/I0N3I7xhurqGnGitSRD10UeEE63a7hyXtutQDpxo4+Eal+i7veWeZxZJPNtsl6X1mUIoWPwt8gQ7NMQUw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"badwords-list": "^2.0.1-4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/badwords-list": {
|
||||
"version": "2.0.1-4",
|
||||
"resolved": "https://registry.npmjs.org/badwords-list/-/badwords-list-2.0.1-4.tgz",
|
||||
"integrity": "sha512-FxfZUp7B9yCnesNtFQS9v6PvZdxTYa14Q60JR6vhjdQdWI4naTjJIyx22JzoER8ooeT8SAAKoHLjKfCV7XgYUQ==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/balanced-match": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
|
||||
|
@ -12,6 +12,7 @@
|
||||
"license": "ISC",
|
||||
"description": "",
|
||||
"dependencies": {
|
||||
"bad-words": "^4.0.0",
|
||||
"bcryptjs": "^3.0.2",
|
||||
"cloudinary": "^2.0.1",
|
||||
"cors": "^2.8.5",
|
||||
|
377
backend/utils/en.txt
Normal file
377
backend/utils/en.txt
Normal file
@ -0,0 +1,377 @@
|
||||
2g1c
|
||||
2 girls 1 cup
|
||||
acrotomophilia
|
||||
alabama hot pocket
|
||||
alaskan pipeline
|
||||
anal
|
||||
anilingus
|
||||
anus
|
||||
apeshit
|
||||
arsehole
|
||||
ass
|
||||
asshole
|
||||
assmunch
|
||||
auto erotic
|
||||
autoerotic
|
||||
babeland
|
||||
baby batter
|
||||
baby juice
|
||||
ball gag
|
||||
ball gravy
|
||||
ball kicking
|
||||
ball licking
|
||||
ball sack
|
||||
ball sucking
|
||||
bangbros
|
||||
bareback
|
||||
barely legal
|
||||
barenaked
|
||||
bastard
|
||||
bastardo
|
||||
bastinado
|
||||
bbw
|
||||
bdsm
|
||||
beaner
|
||||
beaners
|
||||
beaver cleaver
|
||||
beaver lips
|
||||
bestiality
|
||||
big black
|
||||
big breasts
|
||||
big knockers
|
||||
big tits
|
||||
bimbos
|
||||
birdlock
|
||||
bitch
|
||||
bitches
|
||||
black cock
|
||||
blonde action
|
||||
blonde on blonde action
|
||||
blowjob
|
||||
blow job
|
||||
blow your load
|
||||
blue waffle
|
||||
blumpkin
|
||||
bollocks
|
||||
bondage
|
||||
boner
|
||||
boob
|
||||
boobs
|
||||
booty call
|
||||
brown showers
|
||||
brunette action
|
||||
bukkake
|
||||
bulldyke
|
||||
bullet vibe
|
||||
bullshit
|
||||
bung hole
|
||||
bunghole
|
||||
busty
|
||||
butt
|
||||
buttcheeks
|
||||
butthole
|
||||
camel toe
|
||||
camgirl
|
||||
camslut
|
||||
camwhore
|
||||
carpet muncher
|
||||
carpetmuncher
|
||||
chocolate rosebuds
|
||||
circlejerk
|
||||
cleveland steamer
|
||||
clit
|
||||
clitoris
|
||||
clover clamps
|
||||
clusterfuck
|
||||
cock
|
||||
cocks
|
||||
coprolagnia
|
||||
coprophilia
|
||||
cornhole
|
||||
coon
|
||||
coons
|
||||
creampie
|
||||
cum
|
||||
cumming
|
||||
cunnilingus
|
||||
cunt
|
||||
darkie
|
||||
date rape
|
||||
daterape
|
||||
deep throat
|
||||
deepthroat
|
||||
dendrophilia
|
||||
dick
|
||||
dildo
|
||||
dingleberry
|
||||
dingleberries
|
||||
dirty pillows
|
||||
dirty sanchez
|
||||
doggie style
|
||||
doggiestyle
|
||||
doggy style
|
||||
doggystyle
|
||||
dog style
|
||||
dolcett
|
||||
domination
|
||||
dominatrix
|
||||
dommes
|
||||
donkey punch
|
||||
double dong
|
||||
double penetration
|
||||
dp action
|
||||
dry hump
|
||||
dvda
|
||||
eat my ass
|
||||
ecchi
|
||||
ejaculation
|
||||
erotic
|
||||
erotism
|
||||
escort
|
||||
eunuch
|
||||
faggot
|
||||
fecal
|
||||
felch
|
||||
fellatio
|
||||
feltch
|
||||
female squirting
|
||||
femdom
|
||||
figging
|
||||
fingerbang
|
||||
fingering
|
||||
fisting
|
||||
foot fetish
|
||||
footjob
|
||||
frotting
|
||||
fuck
|
||||
fuck buttons
|
||||
fuckin
|
||||
fucking
|
||||
fucktards
|
||||
fudge packer
|
||||
fudgepacker
|
||||
futanari
|
||||
gang bang
|
||||
gay sex
|
||||
genitals
|
||||
giant cock
|
||||
girl on
|
||||
girl on top
|
||||
girls gone wild
|
||||
goatcx
|
||||
goatse
|
||||
god damn
|
||||
gokkun
|
||||
golden shower
|
||||
goodpoop
|
||||
goo girl
|
||||
goregasm
|
||||
grope
|
||||
group sex
|
||||
g-spot
|
||||
guro
|
||||
hand job
|
||||
handjob
|
||||
hard core
|
||||
hardcore
|
||||
hentai
|
||||
homoerotic
|
||||
honkey
|
||||
hooker
|
||||
hot carl
|
||||
hot chick
|
||||
how to kill
|
||||
how to murder
|
||||
huge fat
|
||||
humping
|
||||
incest
|
||||
intercourse
|
||||
jack off
|
||||
jail bait
|
||||
jailbait
|
||||
jelly donut
|
||||
jerk off
|
||||
jigaboo
|
||||
jiggaboo
|
||||
jiggerboo
|
||||
jizz
|
||||
juggs
|
||||
kike
|
||||
kinbaku
|
||||
kinkster
|
||||
kinky
|
||||
knobbing
|
||||
leather restraint
|
||||
leather straight jacket
|
||||
lemon party
|
||||
lolita
|
||||
lovemaking
|
||||
make me come
|
||||
male squirting
|
||||
masturbate
|
||||
menage a trois
|
||||
milf
|
||||
missionary position
|
||||
motherfucker
|
||||
mound of venus
|
||||
mr hands
|
||||
muff diver
|
||||
muffdiving
|
||||
nambla
|
||||
nawashi
|
||||
negro
|
||||
neonazi
|
||||
nigga
|
||||
nigger
|
||||
nig nog
|
||||
nimphomania
|
||||
nipple
|
||||
nipples
|
||||
nsfw images
|
||||
nude
|
||||
nudity
|
||||
nympho
|
||||
nymphomania
|
||||
octopussy
|
||||
omorashi
|
||||
one cup two girls
|
||||
one guy one jar
|
||||
orgasm
|
||||
orgy
|
||||
paedophile
|
||||
paki
|
||||
panties
|
||||
panty
|
||||
pedobear
|
||||
pedophile
|
||||
pegging
|
||||
penis
|
||||
phone sex
|
||||
piece of shit
|
||||
pissing
|
||||
piss pig
|
||||
pisspig
|
||||
playboy
|
||||
pleasure chest
|
||||
pole smoker
|
||||
ponyplay
|
||||
poof
|
||||
poon
|
||||
poontang
|
||||
punany
|
||||
poop chute
|
||||
poopchute
|
||||
porn
|
||||
porno
|
||||
pornography
|
||||
prince albert piercing
|
||||
pthc
|
||||
pubes
|
||||
pussy
|
||||
queaf
|
||||
queef
|
||||
quim
|
||||
raghead
|
||||
raging boner
|
||||
rape
|
||||
raping
|
||||
rapist
|
||||
rectum
|
||||
reverse cowgirl
|
||||
rimjob
|
||||
rimming
|
||||
rosy palm
|
||||
rosy palm and her 5 sisters
|
||||
rusty trombone
|
||||
sadism
|
||||
santorum
|
||||
scat
|
||||
schlong
|
||||
scissoring
|
||||
semen
|
||||
sex
|
||||
sexo
|
||||
sexy
|
||||
shaved beaver
|
||||
shaved pussy
|
||||
shemale
|
||||
shibari
|
||||
shit
|
||||
shitblimp
|
||||
shitty
|
||||
shota
|
||||
shrimping
|
||||
skeet
|
||||
slanteye
|
||||
slut
|
||||
s&m
|
||||
smut
|
||||
snatch
|
||||
snowballing
|
||||
sodomize
|
||||
sodomy
|
||||
spic
|
||||
splooge
|
||||
splooge moose
|
||||
spooge
|
||||
spread legs
|
||||
spunk
|
||||
strap on
|
||||
strapon
|
||||
strappado
|
||||
strip club
|
||||
style doggy
|
||||
suck
|
||||
sucks
|
||||
suicide girls
|
||||
sultry women
|
||||
swastika
|
||||
swinger
|
||||
tainted love
|
||||
taste my
|
||||
tea bagging
|
||||
threesome
|
||||
throating
|
||||
tied up
|
||||
tight white
|
||||
tit
|
||||
tits
|
||||
titties
|
||||
titty
|
||||
tongue in a
|
||||
topless
|
||||
tosser
|
||||
towelhead
|
||||
tranny
|
||||
tribadism
|
||||
tub girl
|
||||
tubgirl
|
||||
tushy
|
||||
twat
|
||||
twink
|
||||
twinkie
|
||||
two girls one cup
|
||||
undressing
|
||||
upskirt
|
||||
urethra play
|
||||
urophilia
|
||||
vagina
|
||||
venus mound
|
||||
vibrator
|
||||
violet wand
|
||||
vorarephilia
|
||||
voyeur
|
||||
vulva
|
||||
wank
|
||||
wetback
|
||||
wet dream
|
||||
white power
|
||||
wrapping men
|
||||
wrinkled starfish
|
||||
xx
|
||||
xxx
|
||||
yaoi
|
||||
yellow showers
|
||||
yiffy
|
||||
zoophilia
|
||||
🖕
|
154
backend/utils/profanityFilter.js
Normal file
154
backend/utils/profanityFilter.js
Normal file
@ -0,0 +1,154 @@
|
||||
// Утилита для фильтрации нежелательного контента
|
||||
const Filter = require('bad-words');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
// Список русских нецензурных слов и других запрещенных слов
|
||||
const russianBadWords = [
|
||||
'блядь', 'хуй', 'пизда', 'ебать', 'ебал', 'ебло', 'хуесос', 'пидор', 'пидорас',
|
||||
'мудак', 'говно', 'залупа', 'хер', 'манда', 'спермоед', 'шлюха', 'соска', 'шалава',
|
||||
'дебил', 'дрочить', 'дрочка', 'ебанутый', 'выродок', 'шмара', 'сука', 'членосос',
|
||||
'гандон', 'гондон', 'гнида', 'вагина', 'хуи', 'жопа', 'шлюхи', 'проститутка'
|
||||
];
|
||||
|
||||
// Список запрещенных слов и фраз для дейтинг-приложения
|
||||
const datingAppBadWords = [
|
||||
'проститутка', 'интим', 'секс за деньги', 'эскорт', 'интим услуги',
|
||||
'заплачу', 'заплати', 'минет', 'массаж с интимом'
|
||||
];
|
||||
|
||||
/**
|
||||
* Загружает список запрещенных слов из файла
|
||||
* @param {string} filePath - Путь к файлу со списком запрещенных слов
|
||||
* @return {Array<string>} - Массив запрещенных слов
|
||||
*/
|
||||
function loadBadWordsFromFile(filePath) {
|
||||
try {
|
||||
if (fs.existsSync(filePath)) {
|
||||
const content = fs.readFileSync(filePath, 'utf8');
|
||||
const words = content.split('\n')
|
||||
.map(word => word.trim())
|
||||
.filter(word => word && !word.startsWith('//') && word.length >= 3);
|
||||
console.log(`Загружено ${words.length} запрещенных слов из файла ${filePath}`);
|
||||
return words;
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`Ошибка при загрузке слов из файла ${filePath}:`, error.message);
|
||||
}
|
||||
return [];
|
||||
}
|
||||
|
||||
class ProfanityFilter {
|
||||
constructor() {
|
||||
// Создаем экземпляр фильтра с английскими словами по умолчанию
|
||||
this.filter = new Filter({ placeHolder: '*' });
|
||||
|
||||
// Загружаем слова из файлов
|
||||
const russianFileWords = loadBadWordsFromFile(path.join(__dirname, 'words.txt'));
|
||||
const englishFileWords = loadBadWordsFromFile(path.join(__dirname, 'en.txt'));
|
||||
|
||||
// Объединяем все источники запрещенных слов
|
||||
const allBadWords = [
|
||||
...russianBadWords,
|
||||
...datingAppBadWords,
|
||||
...russianFileWords,
|
||||
...englishFileWords
|
||||
];
|
||||
|
||||
// Добавляем все слова в фильтр
|
||||
this.filter.addWords(...allBadWords);
|
||||
|
||||
// Создаем регулярные выражения для проверки производных слов
|
||||
this.generateWordPatterns(allBadWords);
|
||||
|
||||
console.log(`Всего загружено ${allBadWords.length} запрещенных слов`);
|
||||
}
|
||||
|
||||
/**
|
||||
* Создает регулярные выражения для проверки производных слов
|
||||
* @param {Array<string>} words - Список базовых запрещённых слов
|
||||
*/
|
||||
generateWordPatterns(words) {
|
||||
this.wordPatterns = words
|
||||
.filter(word => word && word.length >= 4) // Берем только слова длиннее 3 символов для производных
|
||||
.map(word => {
|
||||
// Создаем шаблон для каждого слова: допускает изменение окончаний и вставку символов
|
||||
const baseWord = word.replace(/[еёо]/g, '[еёо]'); // Учитываем замену е/ё/о
|
||||
return new RegExp(`\\b${baseWord}[а-яёa-z]*\\b`, 'i');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Проверяет, содержит ли текст запрещенные слова или их производные
|
||||
* @param {string} text - Текст для проверки
|
||||
* @return {boolean} - true, если текст содержит запрещенные слова, иначе false
|
||||
*/
|
||||
hasProfanity(text) {
|
||||
if (!text) return false;
|
||||
|
||||
// Проверяем сначала стандартным методом библиотеки bad-words
|
||||
if (this.filter.isProfane(text.toLowerCase())) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Дополнительная проверка на производные слова через регулярные выражения
|
||||
const normalizedText = text.toLowerCase();
|
||||
return this.wordPatterns.some(pattern => pattern.test(normalizedText));
|
||||
}
|
||||
|
||||
/**
|
||||
* Проверяет, содержит ли объект запрещенные слова в указанных полях
|
||||
* @param {Object} obj - Объект для проверки
|
||||
* @param {Array<string>} fields - Массив имен полей для проверки
|
||||
* @return {Object} - Объект с результатами проверки { isProfane: boolean, field: string|null }
|
||||
*/
|
||||
validateObject(obj, fields) {
|
||||
for (const field of fields) {
|
||||
if (obj[field] && this.hasProfanity(obj[field])) {
|
||||
return { isProfane: true, field };
|
||||
}
|
||||
}
|
||||
return { isProfane: false, field: null };
|
||||
}
|
||||
|
||||
/**
|
||||
* Заменяет запрещенные слова в тексте на звездочки
|
||||
* @param {string} text - Исходный текст
|
||||
* @return {string} - Очищенный текст
|
||||
*/
|
||||
clean(text) {
|
||||
if (!text) return '';
|
||||
|
||||
// Сначала используем стандартный метод библиотеки
|
||||
let cleanedText = this.filter.clean(text);
|
||||
|
||||
// Затем проверяем на производные слова и заменяем их
|
||||
this.wordPatterns.forEach(pattern => {
|
||||
cleanedText = cleanedText.replace(pattern, match => '*'.repeat(match.length));
|
||||
});
|
||||
|
||||
return cleanedText;
|
||||
}
|
||||
|
||||
/**
|
||||
* Добавляет новое запрещенное слово в фильтр
|
||||
* @param {string|Array<string>} words - Слово или массив слов для добавления
|
||||
*/
|
||||
addWords(words) {
|
||||
// Добавляем слова в стандартный фильтр
|
||||
this.filter.addWords(words);
|
||||
|
||||
// Если слова переданы как массив
|
||||
if (Array.isArray(words)) {
|
||||
this.generateWordPatterns(words);
|
||||
} else {
|
||||
// Если передано одно слово
|
||||
this.generateWordPatterns([words]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Экспортируем экземпляр фильтра для использования в приложении
|
||||
const profanityFilter = new ProfanityFilter();
|
||||
|
||||
module.exports = profanityFilter;
|
1317
backend/utils/words.txt
Normal file
1317
backend/utils/words.txt
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user