センシティブワードを正規表現、CWにも適用するように (#10688)
* cwにセンシティブが効いてない * CWが無いときにTextを見るように * 比較演算子間違えた * とりあえずチェック * 正規表現対応 * /test/giにも対応 * matchでしなくてもいいのでは感 * レビュー修正 * Update packages/backend/src/core/NoteCreateService.ts Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> * Update packages/backend/src/core/NoteCreateService.ts Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> * 修正 * wipかも * wordsでスペース区切りのものできたかも * なんか動いたかも * test作成 * 文言の修正 * 修正 * note参照 --------- Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com>
This commit is contained in:
		| @@ -3,6 +3,7 @@ import * as mfm from 'mfm-js'; | ||||
| import { In, DataSource } from 'typeorm'; | ||||
| import * as Redis from 'ioredis'; | ||||
| import { Inject, Injectable, OnApplicationShutdown } from '@nestjs/common'; | ||||
| import RE2 from 're2'; | ||||
| import { extractMentions } from '@/misc/extract-mentions.js'; | ||||
| import { extractCustomEmojisFromMfm } from '@/misc/extract-custom-emojis-from-mfm.js'; | ||||
| import { extractHashtags } from '@/misc/extract-hashtags.js'; | ||||
| @@ -238,7 +239,8 @@ export class NoteCreateService implements OnApplicationShutdown { | ||||
| 		if (data.channel != null) data.localOnly = true; | ||||
|  | ||||
| 		if (data.visibility === 'public' && data.channel == null) { | ||||
| 			if ((data.text != null) && (await this.metaService.fetch()).sensitiveWords.some(w => data.text!.includes(w))) { | ||||
| 			const sensitiveWords = (await this.metaService.fetch()).sensitiveWords; | ||||
| 			if (this.isSensitive(data, sensitiveWords)) { | ||||
| 				data.visibility = 'home'; | ||||
| 			} else if ((await this.roleService.getUserPolicies(user.id)).canPublicNote === false) { | ||||
| 				data.visibility = 'home'; | ||||
| @@ -670,6 +672,31 @@ export class NoteCreateService implements OnApplicationShutdown { | ||||
| 		// Register to search database | ||||
| 		this.index(note); | ||||
| 	} | ||||
| 	 | ||||
| 	@bindThis | ||||
| 	private isSensitive(note: Option, sensitiveWord: string[]): boolean { | ||||
| 		if (sensitiveWord.length > 0) { | ||||
| 			const text = note.cw ?? note.text ?? ''; | ||||
| 			if (text === '') return false; | ||||
| 			const matched = sensitiveWord.some(filter => { | ||||
| 				// represents RegExp | ||||
| 				const regexp = filter.match(/^\/(.+)\/(.*)$/); | ||||
| 				// This should never happen due to input sanitisation. | ||||
| 				if (!regexp) { | ||||
| 					const words = filter.split(' '); | ||||
| 					return words.every(keyword => text.includes(keyword)); | ||||
| 				} | ||||
| 				try { | ||||
| 					return new RE2(regexp[1], regexp[2]).test(text); | ||||
| 				} catch (err) { | ||||
| 					// This should never happen due to input sanitisation. | ||||
| 					return false; | ||||
| 				} | ||||
| 			}); | ||||
| 			if (matched) return true; | ||||
| 		} | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	@bindThis | ||||
| 	private incRenoteCount(renote: Note) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 nenohi
					nenohi