From 3bcb344ecb4940529c02226b16dde2b6d32f0bcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Acid=20Chicken=20=28=E7=A1=AB=E9=85=B8=E9=B6=8F=29?= Date: Mon, 17 Dec 2018 19:11:38 +0900 Subject: [PATCH] Re: #3457 (#3614) * Update parser.ts * Update user.ts * Update search.ts * Update parser.ts * Update parser.ts * Update parser.ts * Update parser.ts * Update parser.ts * Update parser.ts * Update mfm.ts * Update parser.ts * Merge branch 'develop' into 3440-mk2 * Fix typo * Update parser.ts * Update mfm.ts * Update mfm.ts --- src/mfm/parser.ts | 2 +- src/models/user.ts | 2 +- src/server/api/endpoints/users/search.ts | 2 +- test/mfm.ts | 16 ++++++++++++++++ 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/mfm/parser.ts b/src/mfm/parser.ts index ae2ae7246..6980b36ea 100644 --- a/src/mfm/parser.ts +++ b/src/mfm/parser.ts @@ -275,7 +275,7 @@ const mfm = P.createLanguage({ mention: r => P((input, i) => { const text = input.substr(i); - const match = text.match(/^@[a-z0-9_]+(?:@[a-z0-9\.\-]+[a-z0-9])?/i); + const match = text.match(/^@\w([\w-]*\w)?(?:@[\w\.\-]+\w)?/); if (!match) return P.makeFailure(i, 'not a mention'); if (input[i - 1] != null && input[i - 1].match(/[a-z0-9]/i)) return P.makeFailure(i, 'not a mention'); return P.makeSuccess(i + match[0].length, match[0]); diff --git a/src/models/user.ts b/src/models/user.ts index 0b19ffa7b..19291a2cb 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -155,7 +155,7 @@ export const isRemoteUser = (user: any): user is IRemoteUser => //#region Validators export function validateUsername(username: string, remote?: boolean): boolean { - return typeof username == 'string' && (remote ? /^\w+([\w\.-]+\w+)?$/ : /^[a-zA-Z0-9_]{1,20}$/).test(username); + return typeof username == 'string' && (remote ? /^\w([\w-]*\w)?$/ : /^\w{1,20}$/).test(username); } export function validatePassword(password: string): boolean { diff --git a/src/server/api/endpoints/users/search.ts b/src/server/api/endpoints/users/search.ts index f7f179496..86b16dcbb 100644 --- a/src/server/api/endpoints/users/search.ts +++ b/src/server/api/endpoints/users/search.ts @@ -53,7 +53,7 @@ export const meta = { }; export default define(meta, (ps, me) => new Promise(async (res, rej) => { - const isUsername = validateUsername(ps.query.replace('@', ''), true); + const isUsername = validateUsername(ps.query.replace('@', ''), !ps.localOnly); let users: IUser[] = []; diff --git a/test/mfm.ts b/test/mfm.ts index 061107647..dee1bb2ae 100644 --- a/test/mfm.ts +++ b/test/mfm.ts @@ -168,6 +168,22 @@ describe('Text', () => { ]), node('mention', { acct: '@a', canonical: '@a', username: 'a', host: null }) ], tokens3); + + const tokens4 = analyze('@\n@v\n@veryverylongusername' /* \n@toolongtobeasamention */ ); + assert.deepEqual([ + text('@\n'), + node('mention', { acct: '@v', canonical: '@v', username: 'v', host: null }), + text('\n'), + node('mention', { acct: '@veryverylongusername', canonical: '@veryverylongusername', username: 'veryverylongusername', host: null }), + // text('\n@toolongtobeasamention') + ], tokens4); + /* + const tokens5 = analyze('@domain_is@valid.example.com\n@domain_is@.invalid\n@domain_is@invali.d\n@domain_is@invali.d\n@domain_is@-invalid.com\n@domain_is@invalid-.com'); + assert.deepEqual([ + node('mention', { acct: '@domain_is@valid.example.com', canonical: '@domain_is@valid.example.com', username: 'domain_is', host: 'valid.example.com' }), + text('\n@domain_is@.invalid\n@domain_is@invali.d\n@domain_is@invali.d\n@domain_is@-invalid.com\n@domain_is@invalid-.com') + ], tokens5); + */ }); });