Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop
This commit is contained in:
		
						commit
						88ac0de0e6
					
				
					 10 changed files with 255 additions and 78 deletions
				
			
		|  | @ -0,0 +1,64 @@ | |||
| const RE2 = require('re2'); | ||||
| const { MigrationInterface, QueryRunner } = require("typeorm"); | ||||
| 
 | ||||
| module.exports = class convertHardMutes1644010796173 { | ||||
|     name = 'convertHardMutes1644010796173' | ||||
| 
 | ||||
|     async up(queryRunner) { | ||||
|         let entries = await queryRunner.query(`SELECT "userId", "mutedWords" FROM "user_profile"`); | ||||
|         for(let i = 0; i < entries.length; i++) { | ||||
|             let words = entries[i].mutedWords | ||||
|                 .map(line => { | ||||
|                     const regexp = line.join(" ").match(/^\/(.+)\/(.*)$/); | ||||
|                     if (regexp) { | ||||
|                         // convert regexp's
 | ||||
|                         try { | ||||
|                             new RE2(regexp[1], regexp[2]); | ||||
|                             return `/${regexp[1]}/${regexp[2]}`; | ||||
|                         } catch (err) { | ||||
|                             // invalid regex, ignore it
 | ||||
|                             return []; | ||||
|                         } | ||||
|                     } else { | ||||
|                         // remove empty segments
 | ||||
|                         return line.filter(x => x !== ''); | ||||
|                     } | ||||
|                 }) | ||||
|                 // remove empty lines
 | ||||
|                 .filter(x => !(Array.isArray(x) && x.length === 0)); | ||||
| 
 | ||||
|             await queryRunner.connection.createQueryBuilder() | ||||
|                 .update('user_profile') | ||||
|                 .set({ | ||||
|                     mutedWords: words | ||||
|                 }) | ||||
|                 .where('userId = :id', { id: entries[i].userId }) | ||||
|                 .execute(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     async down(queryRunner) { | ||||
|         let entries = await queryRunner.query(`SELECT "userId", "mutedWords" FROM "user_profile"`); | ||||
|         for(let i = 0; i < entries.length; i++) { | ||||
|             let words = entries[i].mutedWords | ||||
|                 .map(line => { | ||||
|                     if (Array.isArray(line)) { | ||||
|                         return line; | ||||
|                     } else { | ||||
|                     	// do not split regex at spaces again
 | ||||
|                         return [line]; | ||||
|                     } | ||||
|                 }) | ||||
|                 // remove empty lines
 | ||||
|                 .filter(x => !(Array.isArray(x) && x.length === 0)); | ||||
| 
 | ||||
|             await queryRunner.connection.createQueryBuilder() | ||||
|                 .update('user_profile') | ||||
|                 .set({ | ||||
|                     mutedWords: words | ||||
|                 }) | ||||
|                 .where('userId = :id', { id: entries[i].userId }) | ||||
|                 .execute(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -123,7 +123,7 @@ | |||
| 		"ms": "3.0.0-canary.1", | ||||
| 		"multer": "1.4.4", | ||||
| 		"nested-property": "4.0.0", | ||||
| 		"node-fetch": "2.6.1", | ||||
| 		"node-fetch": "2.6.7", | ||||
| 		"nodemailer": "6.7.2", | ||||
| 		"os-utils": "0.0.14", | ||||
| 		"parse5": "6.0.1", | ||||
|  |  | |||
|  | @ -11,26 +11,31 @@ type UserLike = { | |||
| 	id: User['id']; | ||||
| }; | ||||
| 
 | ||||
| export async function checkWordMute(note: NoteLike, me: UserLike | null | undefined, mutedWords: string[][]): Promise<boolean> { | ||||
| export async function checkWordMute(note: NoteLike, me: UserLike | null | undefined, mutedWords: Array<string | string[]>): Promise<boolean> { | ||||
| 	// 自分自身
 | ||||
| 	if (me && (note.userId === me.id)) return false; | ||||
| 
 | ||||
| 	const words = mutedWords | ||||
| 		// Clean up
 | ||||
| 		.map(xs => xs.filter(x => x !== '')) | ||||
| 		.filter(xs => xs.length > 0); | ||||
| 
 | ||||
| 	if (words.length > 0) { | ||||
| 	if (mutedWords.length > 0) { | ||||
| 		if (note.text == null) return false; | ||||
| 
 | ||||
| 		const matched = words.some(and => | ||||
| 			and.every(keyword => { | ||||
| 				const regexp = keyword.match(/^\/(.+)\/(.*)$/); | ||||
| 				if (regexp) { | ||||
| 		const matched = mutedWords.some(filter => { | ||||
| 			if (Array.isArray(filter)) { | ||||
| 				return filter.every(keyword => note.text!.includes(keyword)); | ||||
| 			} else { | ||||
| 				// represents RegExp
 | ||||
| 				const regexp = filter.match(/^\/(.+)\/(.*)$/); | ||||
| 
 | ||||
| 				// This should never happen due to input sanitisation.
 | ||||
| 				if (!regexp) return false; | ||||
| 
 | ||||
| 				try { | ||||
| 					return new RE2(regexp[1], regexp[2]).test(note.text!); | ||||
| 				} catch (err) { | ||||
| 					// This should never happen due to input sanitisation.
 | ||||
| 					return false; | ||||
| 				} | ||||
| 				return note.text!.includes(keyword); | ||||
| 			})); | ||||
| 			} | ||||
| 		}); | ||||
| 
 | ||||
| 		if (matched) return true; | ||||
| 	} | ||||
|  |  | |||
|  | @ -1,3 +1,4 @@ | |||
| const RE2 = require('re2'); | ||||
| import $ from 'cafy'; | ||||
| import * as mfm from 'mfm-js'; | ||||
| import { ID } from '@/misc/cafy-id'; | ||||
|  | @ -117,7 +118,7 @@ export const meta = { | |||
| 		}, | ||||
| 
 | ||||
| 		mutedWords: { | ||||
| 			validator: $.optional.arr($.arr($.str)), | ||||
| 			validator: $.optional.arr($.either($.arr($.str.min(1)).min(1), $.str)), | ||||
| 		}, | ||||
| 
 | ||||
| 		mutedInstances: { | ||||
|  | @ -163,6 +164,12 @@ export const meta = { | |||
| 			code: 'NO_SUCH_PAGE', | ||||
| 			id: '8e01b590-7eb9-431b-a239-860e086c408e', | ||||
| 		}, | ||||
| 
 | ||||
| 		invalidRegexp: { | ||||
| 			message: 'Invalid Regular Expression.', | ||||
| 			code: 'INVALID_REGEXP', | ||||
| 			id: '0d786918-10df-41cd-8f33-8dec7d9a89a5', | ||||
| 		} | ||||
| 	}, | ||||
| 
 | ||||
| 	res: { | ||||
|  | @ -191,6 +198,18 @@ export default define(meta, async (ps, _user, token) => { | |||
| 	if (ps.avatarId !== undefined) updates.avatarId = ps.avatarId; | ||||
| 	if (ps.bannerId !== undefined) updates.bannerId = ps.bannerId; | ||||
| 	if (ps.mutedWords !== undefined) { | ||||
| 		// validate regular expression syntax
 | ||||
| 		ps.mutedWords.filter(x => !Array.isArray(x)).forEach(x => { | ||||
| 			const regexp = x.match(/^\/(.+)\/(.*)$/); | ||||
| 			if (!regexp) throw new ApiError(meta.errors.invalidRegexp); | ||||
| 
 | ||||
| 			try { | ||||
| 				new RE2(regexp[1], regexp[2]); | ||||
| 			} catch (err) { | ||||
| 				throw new ApiError(meta.errors.invalidRegexp); | ||||
| 			} | ||||
| 		}); | ||||
| 
 | ||||
| 		profileUpdates.mutedWords = ps.mutedWords; | ||||
| 		profileUpdates.enableWordMute = ps.mutedWords.length > 0; | ||||
| 	} | ||||
|  |  | |||
|  | @ -4882,10 +4882,12 @@ node-fetch@*: | |||
|     fetch-blob "^3.1.4" | ||||
|     formdata-polyfill "^4.0.10" | ||||
| 
 | ||||
| node-fetch@2.6.1, node-fetch@^2.6.1: | ||||
|   version "2.6.1" | ||||
|   resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" | ||||
|   integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== | ||||
| node-fetch@2.6.7, node-fetch@^2.6.1: | ||||
|   version "2.6.7" | ||||
|   resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" | ||||
|   integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== | ||||
|   dependencies: | ||||
|     whatwg-url "^5.0.0" | ||||
| 
 | ||||
| node-fetch@3.0.0-beta.9: | ||||
|   version "3.0.0-beta.9" | ||||
|  | @ -6169,20 +6171,11 @@ signal-exit@^3.0.5: | |||
|   integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== | ||||
| 
 | ||||
| simple-concat@^1.0.0: | ||||
|   version "1.0.0" | ||||
|   resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" | ||||
|   integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY= | ||||
|   version "1.0.1" | ||||
|   resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" | ||||
|   integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== | ||||
| 
 | ||||
| simple-get@^4.0.0: | ||||
|   version "4.0.0" | ||||
|   resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.0.tgz#73fa628278d21de83dadd5512d2cc1f4872bd675" | ||||
|   integrity sha512-ZalZGexYr3TA0SwySsr5HlgOOinS4Jsa8YB2GJ6lUNAazyAu4KG/VmzMTwAt2YVXzzVj8QmefmAonZIK2BSGcQ== | ||||
|   dependencies: | ||||
|     decompress-response "^6.0.0" | ||||
|     once "^1.3.1" | ||||
|     simple-concat "^1.0.0" | ||||
| 
 | ||||
| simple-get@^4.0.1: | ||||
| simple-get@^4.0.0, simple-get@^4.0.1: | ||||
|   version "4.0.1" | ||||
|   resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" | ||||
|   integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== | ||||
|  | @ -6653,6 +6646,11 @@ tr46@^3.0.0: | |||
|   dependencies: | ||||
|     punycode "^2.1.1" | ||||
| 
 | ||||
| tr46@~0.0.3: | ||||
|   version "0.0.3" | ||||
|   resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" | ||||
|   integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= | ||||
| 
 | ||||
| trace-redirect@1.0.6: | ||||
|   version "1.0.6" | ||||
|   resolved "https://registry.yarnpkg.com/trace-redirect/-/trace-redirect-1.0.6.tgz#ac629b5bf8247d30dde5a35fe9811b811075b504" | ||||
|  | @ -6998,6 +6996,11 @@ web-streams-polyfill@^3.0.3: | |||
|   resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz#a6b74026b38e4885869fb5c589e90b95ccfc7965" | ||||
|   integrity sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA== | ||||
| 
 | ||||
| webidl-conversions@^3.0.0: | ||||
|   version "3.0.1" | ||||
|   resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" | ||||
|   integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= | ||||
| 
 | ||||
| webidl-conversions@^7.0.0: | ||||
|   version "7.0.0" | ||||
|   resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" | ||||
|  | @ -7035,6 +7038,14 @@ whatwg-url@^10.0.0: | |||
|     tr46 "^3.0.0" | ||||
|     webidl-conversions "^7.0.0" | ||||
| 
 | ||||
| whatwg-url@^5.0.0: | ||||
|   version "5.0.0" | ||||
|   resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" | ||||
|   integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= | ||||
|   dependencies: | ||||
|     tr46 "~0.0.3" | ||||
|     webidl-conversions "^3.0.0" | ||||
| 
 | ||||
| which-boxed-primitive@^1.0.2: | ||||
|   version "1.0.2" | ||||
|   resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue