From 562bdb7c90ee3f6421e8e6da45bdaf825b7e8991 Mon Sep 17 00:00:00 2001 From: Vojtech Kaiser Date: Tue, 29 Jul 2025 08:14:59 +0200 Subject: [PATCH 01/11] soft and hard username and actor regexes --- packages/consts/src/consts.ts | 11 +++++++++-- packages/consts/src/regexs.ts | 8 +++++++- packages/utilities/src/utilities.ts | 6 ++++-- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/packages/consts/src/consts.ts b/packages/consts/src/consts.ts index c4ffb64b3..40198b4a5 100644 --- a/packages/consts/src/consts.ts +++ b/packages/consts/src/consts.ts @@ -1,5 +1,5 @@ import type { ValueOf } from './helpers'; -import { DNS_SAFE_NAME_REGEX, EMAIL_REGEX } from './regexs'; +import { DNS_SAFE_NAME_REGEX, DNS_SAFE_NAME_REGEX_ADMIN, EMAIL_REGEX } from './regexs'; export const FREE_SUBSCRIPTION_PLAN_CODE = 'DEV'; @@ -117,7 +117,8 @@ export const USERNAME = { // Regex matching a potentially allowed username. The numbers must match MIN and MAX! // Note that username must also pass isForbiddenUser() test to be allowed! - REGEX: /^[a-zA-Z0-9_.-]{3,30}$/, + ADMIN_REGEX: /^[a-zA-Z0-9_.-]{3,30}$/, + REGEX: /^(?!.*[aA][pP][iI][fF][yY].*$)[a-zA-Z0-9_.-]{3,30}$/, }; export const EMAIL = { @@ -145,8 +146,14 @@ export const ACTOR_NAME = { MIN_LENGTH: 3, MAX_LENGTH: DNS_SAFE_NAME_MAX_LENGTH, // DNS-safe string length REGEX: DNS_SAFE_NAME_REGEX, + ADMIN_REGEX: DNS_SAFE_NAME_REGEX_ADMIN, }; +export const ACTOR_TITLE = { + REGEX: /^(?!.*[aA][pP][iI][fF][yY].*$).*$/, + ADMIN_REGEX: /^.*$/, +} + /** * Length of short crawler ID for nice public crawlers path. */ diff --git a/packages/consts/src/regexs.ts b/packages/consts/src/regexs.ts index 96f4dbffe..05e8044a5 100644 --- a/packages/consts/src/regexs.ts +++ b/packages/consts/src/regexs.ts @@ -42,7 +42,13 @@ export const GIT_REPO_REGEX = /^(?:git|ssh|https?|git@[-\w.]+):(\/\/)?(.*?)(\/?| /** * Matches a string that might be used in a hostname (e.g. "my-host-name") */ -export const DNS_SAFE_NAME_REGEX = /^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])$/; +export const DNS_SAFE_NAME_REGEX = /^((?!.*[aA][pP][iI][fF][yY].*$)[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])$/; + +/** + * Matches a string that might be used in a hostname (e.g. "my-host-name") + * Less strict than DNS_SAFE_NAME_REGEX + */ +export const DNS_SAFE_NAME_REGEX_ADMIN = /^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])$/, /** * Regular expression to validate Apify Proxy group name and session ID. diff --git a/packages/utilities/src/utilities.ts b/packages/utilities/src/utilities.ts index d641c440e..3084ecb8e 100644 --- a/packages/utilities/src/utilities.ts +++ b/packages/utilities/src/utilities.ts @@ -322,12 +322,14 @@ const FORBIDDEN_USERNAMES_REGEXPS = [ // Regex matching forbidden usernames. const FORBIDDEN_REGEXP = new RegExp(`^(${ANONYMOUS_USERNAME}|${FORBIDDEN_USERNAMES_REGEXPS.join('|')})$`, 'i'); +const FORBIDDEN_APIFY_KEYWORD = new RegExp('apify', 'i'); + /** * Checks whether username is listed in FORBIDDEN_USERNAMES * or matches any root route path. */ -export function isForbiddenUsername(username: string): boolean { - return !!username.match(APIFY_ID_REGEX) || !!username.match(FORBIDDEN_REGEXP); +export function isForbiddenUsername(username: string, options: { isAdmin: boolean } = { isAdmin: false }): boolean { + return !!username.match(APIFY_ID_REGEX) || !!username.match(FORBIDDEN_REGEXP) || (!options.isAdmin && !!username.match(FORBIDDEN_APIFY_KEYWORD)); } /** From 1689231657396cd861bff608f44a879c6406bee1 Mon Sep 17 00:00:00 2001 From: Vojtech Kaiser Date: Tue, 29 Jul 2025 08:33:14 +0200 Subject: [PATCH 02/11] chore(console, api): soft and hard username and actor regexes --- packages/consts/src/consts.ts | 2 +- packages/consts/src/regexs.ts | 2 +- packages/utilities/src/utilities.ts | 2 +- test/utilities.test.ts | 6 ++++-- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/consts/src/consts.ts b/packages/consts/src/consts.ts index 40198b4a5..cff942451 100644 --- a/packages/consts/src/consts.ts +++ b/packages/consts/src/consts.ts @@ -152,7 +152,7 @@ export const ACTOR_NAME = { export const ACTOR_TITLE = { REGEX: /^(?!.*[aA][pP][iI][fF][yY].*$).*$/, ADMIN_REGEX: /^.*$/, -} +}; /** * Length of short crawler ID for nice public crawlers path. diff --git a/packages/consts/src/regexs.ts b/packages/consts/src/regexs.ts index 05e8044a5..96b4d9054 100644 --- a/packages/consts/src/regexs.ts +++ b/packages/consts/src/regexs.ts @@ -48,7 +48,7 @@ export const DNS_SAFE_NAME_REGEX = /^((?!.*[aA][pP][iI][fF][yY].*$)[a-zA-Z0-9]|[ * Matches a string that might be used in a hostname (e.g. "my-host-name") * Less strict than DNS_SAFE_NAME_REGEX */ -export const DNS_SAFE_NAME_REGEX_ADMIN = /^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])$/, +export const DNS_SAFE_NAME_REGEX_ADMIN = /^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])$/; /** * Regular expression to validate Apify Proxy group name and session ID. diff --git a/packages/utilities/src/utilities.ts b/packages/utilities/src/utilities.ts index 3084ecb8e..cdb8e76c9 100644 --- a/packages/utilities/src/utilities.ts +++ b/packages/utilities/src/utilities.ts @@ -322,7 +322,7 @@ const FORBIDDEN_USERNAMES_REGEXPS = [ // Regex matching forbidden usernames. const FORBIDDEN_REGEXP = new RegExp(`^(${ANONYMOUS_USERNAME}|${FORBIDDEN_USERNAMES_REGEXPS.join('|')})$`, 'i'); -const FORBIDDEN_APIFY_KEYWORD = new RegExp('apify', 'i'); +const FORBIDDEN_APIFY_KEYWORD = /apify/i; /** * Checks whether username is listed in FORBIDDEN_USERNAMES diff --git a/test/utilities.test.ts b/test/utilities.test.ts index 4f4552e56..76382406d 100644 --- a/test/utilities.test.ts +++ b/test/utilities.test.ts @@ -105,8 +105,6 @@ describe('utilities', () => { expect(utils.isForbiddenUsername('karl__.yolo')).toBe(true); // Test valid usernames - expect(!utils.isForbiddenUsername('apify')).toBe(true); - expect(!utils.isForbiddenUsername('APIFY')).toBe(true); expect(!utils.isForbiddenUsername('jannovak')).toBe(true); expect(!utils.isForbiddenUsername('jan.novak')).toBe(true); expect(!utils.isForbiddenUsername('jan.novak.YOLO')).toBe(true); @@ -127,6 +125,10 @@ describe('utilities', () => { expect(utils.isForbiddenUsername('karel')).toBe(false); expect(utils.isForbiddenUsername('karel1234')).toBe(false); expect(utils.isForbiddenUsername('karel.novak')).toBe(false); + + // Regular user vs Admin + expect(utils.isForbiddenUsername('aPifY')).toBe(true); + expect(utils.isForbiddenUsername('aPifY', { isAdmin: true })).toBe(false); }); }); From 54addb2364ea6087c643ffb39df39af8914ea912 Mon Sep 17 00:00:00 2001 From: Vojtech Kaiser Date: Tue, 29 Jul 2025 16:51:10 +0200 Subject: [PATCH 03/11] chore(consts): actor names and titles cannot contain "apify" --- packages/consts/src/consts.ts | 6 +++--- packages/consts/src/regexs.ts | 8 +------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/packages/consts/src/consts.ts b/packages/consts/src/consts.ts index cff942451..18f7da0e6 100644 --- a/packages/consts/src/consts.ts +++ b/packages/consts/src/consts.ts @@ -1,5 +1,5 @@ import type { ValueOf } from './helpers'; -import { DNS_SAFE_NAME_REGEX, DNS_SAFE_NAME_REGEX_ADMIN, EMAIL_REGEX } from './regexs'; +import { DNS_SAFE_NAME_REGEX, EMAIL_REGEX } from './regexs'; export const FREE_SUBSCRIPTION_PLAN_CODE = 'DEV'; @@ -145,8 +145,8 @@ export const DNS_SAFE_NAME_MAX_LENGTH = 63; export const ACTOR_NAME = { MIN_LENGTH: 3, MAX_LENGTH: DNS_SAFE_NAME_MAX_LENGTH, // DNS-safe string length - REGEX: DNS_SAFE_NAME_REGEX, - ADMIN_REGEX: DNS_SAFE_NAME_REGEX_ADMIN, + REGEX: /(?!.*[aA][pP][iI][fF][yY].*$)^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])$/, + ADMIN_REGEX: DNS_SAFE_NAME_REGEX, }; export const ACTOR_TITLE = { diff --git a/packages/consts/src/regexs.ts b/packages/consts/src/regexs.ts index 96b4d9054..96f4dbffe 100644 --- a/packages/consts/src/regexs.ts +++ b/packages/consts/src/regexs.ts @@ -42,13 +42,7 @@ export const GIT_REPO_REGEX = /^(?:git|ssh|https?|git@[-\w.]+):(\/\/)?(.*?)(\/?| /** * Matches a string that might be used in a hostname (e.g. "my-host-name") */ -export const DNS_SAFE_NAME_REGEX = /^((?!.*[aA][pP][iI][fF][yY].*$)[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])$/; - -/** - * Matches a string that might be used in a hostname (e.g. "my-host-name") - * Less strict than DNS_SAFE_NAME_REGEX - */ -export const DNS_SAFE_NAME_REGEX_ADMIN = /^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])$/; +export const DNS_SAFE_NAME_REGEX = /^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])$/; /** * Regular expression to validate Apify Proxy group name and session ID. From 55b6787717691e870c351377c95e80bbaf6c0b12 Mon Sep 17 00:00:00 2001 From: Vojtech Kaiser Date: Wed, 30 Jul 2025 08:55:50 +0200 Subject: [PATCH 04/11] chore(consts): isApifier option in isForbiddenUsername --- packages/utilities/src/utilities.ts | 5 +++-- test/utilities.test.ts | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/utilities/src/utilities.ts b/packages/utilities/src/utilities.ts index cdb8e76c9..e6065e498 100644 --- a/packages/utilities/src/utilities.ts +++ b/packages/utilities/src/utilities.ts @@ -328,8 +328,9 @@ const FORBIDDEN_APIFY_KEYWORD = /apify/i; * Checks whether username is listed in FORBIDDEN_USERNAMES * or matches any root route path. */ -export function isForbiddenUsername(username: string, options: { isAdmin: boolean } = { isAdmin: false }): boolean { - return !!username.match(APIFY_ID_REGEX) || !!username.match(FORBIDDEN_REGEXP) || (!options.isAdmin && !!username.match(FORBIDDEN_APIFY_KEYWORD)); +export function isForbiddenUsername(username: string, options: { isAdmin?: boolean, isApifier?: boolean } = { isAdmin: false, isApifier: false }): boolean { + return !!username.match(APIFY_ID_REGEX) || !!username.match(FORBIDDEN_REGEXP) + || (!options.isAdmin && !options.isApifier && !!username.match(FORBIDDEN_APIFY_KEYWORD)); } /** diff --git a/test/utilities.test.ts b/test/utilities.test.ts index 76382406d..424f2637a 100644 --- a/test/utilities.test.ts +++ b/test/utilities.test.ts @@ -129,6 +129,7 @@ describe('utilities', () => { // Regular user vs Admin expect(utils.isForbiddenUsername('aPifY')).toBe(true); expect(utils.isForbiddenUsername('aPifY', { isAdmin: true })).toBe(false); + expect(utils.isForbiddenUsername('aPifY', { isApifier: true })).toBe(false); }); }); From 0f2d2318533abdb937d08ac4c0348102097bd67a Mon Sep 17 00:00:00 2001 From: Vojtech Kaiser Date: Wed, 30 Jul 2025 13:53:42 +0200 Subject: [PATCH 05/11] chore: simplified regexes, removed isApifier --- packages/consts/src/consts.ts | 10 ++++++---- packages/utilities/src/utilities.ts | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/consts/src/consts.ts b/packages/consts/src/consts.ts index 18f7da0e6..752baa630 100644 --- a/packages/consts/src/consts.ts +++ b/packages/consts/src/consts.ts @@ -117,8 +117,8 @@ export const USERNAME = { // Regex matching a potentially allowed username. The numbers must match MIN and MAX! // Note that username must also pass isForbiddenUser() test to be allowed! - ADMIN_REGEX: /^[a-zA-Z0-9_.-]{3,30}$/, - REGEX: /^(?!.*[aA][pP][iI][fF][yY].*$)[a-zA-Z0-9_.-]{3,30}$/, + ADMIN_REGEX: /^[a-z0-9_.-]{3,30}$/i, + REGEX: /^(?!.*apify)[a-z0-9_.-]{3,30}$/i, }; export const EMAIL = { @@ -145,12 +145,14 @@ export const DNS_SAFE_NAME_MAX_LENGTH = 63; export const ACTOR_NAME = { MIN_LENGTH: 3, MAX_LENGTH: DNS_SAFE_NAME_MAX_LENGTH, // DNS-safe string length - REGEX: /(?!.*[aA][pP][iI][fF][yY].*$)^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])$/, + REGEX: /^(?!.*apify)([a-z0-9]|[a-z0-9][a-z0-9-]*[a-z0-9])$/i, ADMIN_REGEX: DNS_SAFE_NAME_REGEX, }; export const ACTOR_TITLE = { - REGEX: /^(?!.*[aA][pP][iI][fF][yY].*$).*$/, + MIN_LENGTH: 3, + MAX_LENGTH: DNS_SAFE_NAME_MAX_LENGTH, + REGEX: /^(?!.*apify).*$/i, ADMIN_REGEX: /^.*$/, }; diff --git a/packages/utilities/src/utilities.ts b/packages/utilities/src/utilities.ts index e6065e498..2c97cb311 100644 --- a/packages/utilities/src/utilities.ts +++ b/packages/utilities/src/utilities.ts @@ -328,9 +328,9 @@ const FORBIDDEN_APIFY_KEYWORD = /apify/i; * Checks whether username is listed in FORBIDDEN_USERNAMES * or matches any root route path. */ -export function isForbiddenUsername(username: string, options: { isAdmin?: boolean, isApifier?: boolean } = { isAdmin: false, isApifier: false }): boolean { +export function isForbiddenUsername(username: string, options: { isAdmin?: boolean } = { isAdmin: false }): boolean { return !!username.match(APIFY_ID_REGEX) || !!username.match(FORBIDDEN_REGEXP) - || (!options.isAdmin && !options.isApifier && !!username.match(FORBIDDEN_APIFY_KEYWORD)); + || (!options.isAdmin && !!username.match(FORBIDDEN_APIFY_KEYWORD)); } /** From 14a4e8cfdd8f5ac61793afd21ccc4d2fb380cd47 Mon Sep 17 00:00:00 2001 From: Vojtech Kaiser Date: Wed, 30 Jul 2025 16:02:14 +0200 Subject: [PATCH 06/11] chore: test apify in the middle of a string --- test/utilities.test.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test/utilities.test.ts b/test/utilities.test.ts index 424f2637a..fc0d384ff 100644 --- a/test/utilities.test.ts +++ b/test/utilities.test.ts @@ -127,9 +127,8 @@ describe('utilities', () => { expect(utils.isForbiddenUsername('karel.novak')).toBe(false); // Regular user vs Admin - expect(utils.isForbiddenUsername('aPifY')).toBe(true); - expect(utils.isForbiddenUsername('aPifY', { isAdmin: true })).toBe(false); - expect(utils.isForbiddenUsername('aPifY', { isApifier: true })).toBe(false); + expect(utils.isForbiddenUsername('my-aPifY-actor')).toBe(true); + expect(utils.isForbiddenUsername('my-aPifY-actor', { isAdmin: true })).toBe(false); }); }); From bffc41331ea6c2bacc8e2aefc5ff40030a5531f8 Mon Sep 17 00:00:00 2001 From: Vojtech Kaiser Date: Wed, 30 Jul 2025 19:32:48 +0200 Subject: [PATCH 07/11] chore: non deceiving test username --- test/utilities.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/utilities.test.ts b/test/utilities.test.ts index fc0d384ff..f3df90d10 100644 --- a/test/utilities.test.ts +++ b/test/utilities.test.ts @@ -127,8 +127,8 @@ describe('utilities', () => { expect(utils.isForbiddenUsername('karel.novak')).toBe(false); // Regular user vs Admin - expect(utils.isForbiddenUsername('my-aPifY-actor')).toBe(true); - expect(utils.isForbiddenUsername('my-aPifY-actor', { isAdmin: true })).toBe(false); + expect(utils.isForbiddenUsername('my-aPifY-username')).toBe(true); + expect(utils.isForbiddenUsername('my-aPifY-username', { isAdmin: true })).toBe(false); }); }); From 04e7680fef668bece74d8c9a8c023acb90535c0b Mon Sep 17 00:00:00 2001 From: Vojtech Kaiser Date: Thu, 31 Jul 2025 09:15:50 +0200 Subject: [PATCH 08/11] chore: extended regexes, original kept --- packages/consts/src/consts.ts | 14 +++++++------- test/utilities.test.ts | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/consts/src/consts.ts b/packages/consts/src/consts.ts index 752baa630..3f93cc540 100644 --- a/packages/consts/src/consts.ts +++ b/packages/consts/src/consts.ts @@ -115,10 +115,10 @@ export const USERNAME = { MIN_LENGTH: 3, MAX_LENGTH: 30, - // Regex matching a potentially allowed username. The numbers must match MIN and MAX! + // Regexes matching a potentially allowed username. The numbers must match MIN and MAX! // Note that username must also pass isForbiddenUser() test to be allowed! - ADMIN_REGEX: /^[a-z0-9_.-]{3,30}$/i, - REGEX: /^(?!.*apify)[a-z0-9_.-]{3,30}$/i, + REGEX: /^[a-z0-9_.-]{3,30}$/i, + RESTRICTED_REGEX: /^(?!.*apify)[a-z0-9_.-]{3,30}$/i, }; export const EMAIL = { @@ -145,15 +145,15 @@ export const DNS_SAFE_NAME_MAX_LENGTH = 63; export const ACTOR_NAME = { MIN_LENGTH: 3, MAX_LENGTH: DNS_SAFE_NAME_MAX_LENGTH, // DNS-safe string length - REGEX: /^(?!.*apify)([a-z0-9]|[a-z0-9][a-z0-9-]*[a-z0-9])$/i, - ADMIN_REGEX: DNS_SAFE_NAME_REGEX, + REGEX: DNS_SAFE_NAME_REGEX, + RESTRICTED_REGEX: /^(?!.*apify)([a-z0-9]|[a-z0-9][a-z0-9-]*[a-z0-9])$/i, }; export const ACTOR_TITLE = { MIN_LENGTH: 3, MAX_LENGTH: DNS_SAFE_NAME_MAX_LENGTH, - REGEX: /^(?!.*apify).*$/i, - ADMIN_REGEX: /^.*$/, + REGEX: /^.*$/, + RESTRICTED_REGEX: /^(?!.*apify).*$/i, }; /** diff --git a/test/utilities.test.ts b/test/utilities.test.ts index f3df90d10..691b033a6 100644 --- a/test/utilities.test.ts +++ b/test/utilities.test.ts @@ -127,8 +127,8 @@ describe('utilities', () => { expect(utils.isForbiddenUsername('karel.novak')).toBe(false); // Regular user vs Admin - expect(utils.isForbiddenUsername('my-aPifY-username')).toBe(true); - expect(utils.isForbiddenUsername('my-aPifY-username', { isAdmin: true })).toBe(false); + expect(utils.isForbiddenUsername('my.aPifY.username')).toBe(true); + expect(utils.isForbiddenUsername('my.aPifY.username', { isAdmin: true })).toBe(false); }); }); From 2f0027ea35ffaaa89a290d2c11fa96b69f0f41d4 Mon Sep 17 00:00:00 2001 From: Vojtech Kaiser Date: Thu, 31 Jul 2025 11:52:40 +0200 Subject: [PATCH 09/11] chore: return to old actor regexes --- packages/consts/src/consts.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/packages/consts/src/consts.ts b/packages/consts/src/consts.ts index 3f93cc540..7a2bd9fee 100644 --- a/packages/consts/src/consts.ts +++ b/packages/consts/src/consts.ts @@ -146,14 +146,6 @@ export const ACTOR_NAME = { MIN_LENGTH: 3, MAX_LENGTH: DNS_SAFE_NAME_MAX_LENGTH, // DNS-safe string length REGEX: DNS_SAFE_NAME_REGEX, - RESTRICTED_REGEX: /^(?!.*apify)([a-z0-9]|[a-z0-9][a-z0-9-]*[a-z0-9])$/i, -}; - -export const ACTOR_TITLE = { - MIN_LENGTH: 3, - MAX_LENGTH: DNS_SAFE_NAME_MAX_LENGTH, - REGEX: /^.*$/, - RESTRICTED_REGEX: /^(?!.*apify).*$/i, }; /** From c44922aed6269ca5e7e1860cc40c9e279e3d6d7d Mon Sep 17 00:00:00 2001 From: Vojtech Kaiser Date: Fri, 1 Aug 2025 10:11:42 +0200 Subject: [PATCH 10/11] fix: changes reverted for isForbiddenUsername --- packages/utilities/src/utilities.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/utilities/src/utilities.ts b/packages/utilities/src/utilities.ts index 2c97cb311..d641c440e 100644 --- a/packages/utilities/src/utilities.ts +++ b/packages/utilities/src/utilities.ts @@ -322,15 +322,12 @@ const FORBIDDEN_USERNAMES_REGEXPS = [ // Regex matching forbidden usernames. const FORBIDDEN_REGEXP = new RegExp(`^(${ANONYMOUS_USERNAME}|${FORBIDDEN_USERNAMES_REGEXPS.join('|')})$`, 'i'); -const FORBIDDEN_APIFY_KEYWORD = /apify/i; - /** * Checks whether username is listed in FORBIDDEN_USERNAMES * or matches any root route path. */ -export function isForbiddenUsername(username: string, options: { isAdmin?: boolean } = { isAdmin: false }): boolean { - return !!username.match(APIFY_ID_REGEX) || !!username.match(FORBIDDEN_REGEXP) - || (!options.isAdmin && !!username.match(FORBIDDEN_APIFY_KEYWORD)); +export function isForbiddenUsername(username: string): boolean { + return !!username.match(APIFY_ID_REGEX) || !!username.match(FORBIDDEN_REGEXP); } /** From 9759601295797c7d3b239afde44f75006fcdf6f8 Mon Sep 17 00:00:00 2001 From: Vojtech Kaiser Date: Fri, 1 Aug 2025 10:20:08 +0200 Subject: [PATCH 11/11] fix: reverted isForbiddenUsername tests --- test/utilities.test.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/test/utilities.test.ts b/test/utilities.test.ts index 691b033a6..4f4552e56 100644 --- a/test/utilities.test.ts +++ b/test/utilities.test.ts @@ -105,6 +105,8 @@ describe('utilities', () => { expect(utils.isForbiddenUsername('karl__.yolo')).toBe(true); // Test valid usernames + expect(!utils.isForbiddenUsername('apify')).toBe(true); + expect(!utils.isForbiddenUsername('APIFY')).toBe(true); expect(!utils.isForbiddenUsername('jannovak')).toBe(true); expect(!utils.isForbiddenUsername('jan.novak')).toBe(true); expect(!utils.isForbiddenUsername('jan.novak.YOLO')).toBe(true); @@ -125,10 +127,6 @@ describe('utilities', () => { expect(utils.isForbiddenUsername('karel')).toBe(false); expect(utils.isForbiddenUsername('karel1234')).toBe(false); expect(utils.isForbiddenUsername('karel.novak')).toBe(false); - - // Regular user vs Admin - expect(utils.isForbiddenUsername('my.aPifY.username')).toBe(true); - expect(utils.isForbiddenUsername('my.aPifY.username', { isAdmin: true })).toBe(false); }); });