From a2ceb3010bd221e432a6eee66781655b99d833ea Mon Sep 17 00:00:00 2001 From: TaprootFreak <142087526+TaprootFreak@users.noreply.github.com> Date: Thu, 19 Feb 2026 13:41:11 +0100 Subject: [PATCH 1/2] feat: add ipExempt flag to skip IP country check for specific users --- migration/1771431313000-AddIpExempt.js | 20 +++++++++++++++++++ src/shared/models/ip-log/ip-log.service.ts | 5 ++++- .../user-data/dto/update-user-data.dto.ts | 4 ++++ .../user/models/user-data/user-data.entity.ts | 4 ++++ 4 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 migration/1771431313000-AddIpExempt.js diff --git a/migration/1771431313000-AddIpExempt.js b/migration/1771431313000-AddIpExempt.js new file mode 100644 index 0000000000..97b54ac232 --- /dev/null +++ b/migration/1771431313000-AddIpExempt.js @@ -0,0 +1,20 @@ +/** + * @typedef {import('typeorm').MigrationInterface} MigrationInterface + */ + +/** + * @class + * @implements {MigrationInterface} + */ +module.exports = class AddIpExempt1771431313000 { + name = 'AddIpExempt1771431313000' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "user_data" ADD "ipExempt" bit NOT NULL CONSTRAINT "DF_UserData_ipExempt" DEFAULT 0`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "user_data" DROP CONSTRAINT "DF_UserData_ipExempt"`); + await queryRunner.query(`ALTER TABLE "user_data" DROP COLUMN "ipExempt"`); + } +} diff --git a/src/shared/models/ip-log/ip-log.service.ts b/src/shared/models/ip-log/ip-log.service.ts index 96aed1d9eb..11950e3561 100644 --- a/src/shared/models/ip-log/ip-log.service.ts +++ b/src/shared/models/ip-log/ip-log.service.ts @@ -38,7 +38,7 @@ export class IpLogService { walletType?: WalletType, userData?: UserData, ): Promise { - const { country, result, user } = await this.checkIpCountry(ip, address); + const { country, result, user } = await this.checkIpCountry(ip, address, userData); const ipLog = this.ipLogRepo.create({ ip, country, @@ -116,6 +116,7 @@ export class IpLogService { private async checkIpCountry( userIp: string, address: string, + userData?: UserData, ): Promise<{ country: string; result: boolean; user: User }> { if (Config.environment === Environment.LOC || userIp?.includes(Config.azureIpSubstring)) return { country: 'INTERN', result: true, user: undefined }; @@ -127,6 +128,8 @@ export class IpLogService { if (!countryObject || (user && user.role != UserRole.USER)) return { country, result: true, user }; + if (userData?.ipExempt) return { country, result: true, user }; + return { country, result: countryObject?.ipEnable, user }; } } diff --git a/src/subdomains/generic/user/models/user-data/dto/update-user-data.dto.ts b/src/subdomains/generic/user/models/user-data/dto/update-user-data.dto.ts index 5e605151c5..cd4b3c7697 100644 --- a/src/subdomains/generic/user/models/user-data/dto/update-user-data.dto.ts +++ b/src/subdomains/generic/user/models/user-data/dto/update-user-data.dto.ts @@ -281,6 +281,10 @@ export class UpdateUserDataDto { @IsBoolean() isTrustedReferrer?: boolean; + @IsOptional() + @IsBoolean() + ipExempt?: boolean; + @IsOptional() @IsString() postAmlCheck?: string; diff --git a/src/subdomains/generic/user/models/user-data/user-data.entity.ts b/src/subdomains/generic/user/models/user-data/user-data.entity.ts index d5430deb17..c1a2a2c40e 100644 --- a/src/subdomains/generic/user/models/user-data/user-data.entity.ts +++ b/src/subdomains/generic/user/models/user-data/user-data.entity.ts @@ -346,6 +346,10 @@ export class UserData extends IEntity { @Column({ default: false }) isTrustedReferrer: boolean; + // IP check + @Column({ default: false }) + ipExempt: boolean; + // References @ManyToOne(() => Wallet, { nullable: true }) wallet?: Wallet; From a1e398d673a488548b9f67ce033db7509d32bd90 Mon Sep 17 00:00:00 2001 From: TaprootFreak <142087526+TaprootFreak@users.noreply.github.com> Date: Thu, 19 Feb 2026 14:08:50 +0100 Subject: [PATCH 2/2] fix: check ipExempt on already-loaded user.userData for all flows --- src/shared/models/ip-log/ip-log.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/models/ip-log/ip-log.service.ts b/src/shared/models/ip-log/ip-log.service.ts index 11950e3561..6a41c2776c 100644 --- a/src/shared/models/ip-log/ip-log.service.ts +++ b/src/shared/models/ip-log/ip-log.service.ts @@ -128,7 +128,7 @@ export class IpLogService { if (!countryObject || (user && user.role != UserRole.USER)) return { country, result: true, user }; - if (userData?.ipExempt) return { country, result: true, user }; + if (userData?.ipExempt || user?.userData?.ipExempt) return { country, result: true, user }; return { country, result: countryObject?.ipEnable, user }; }