Use IpDataClient in places

This commit is contained in:
Rory&
2025-12-02 16:46:08 +01:00
parent 31c6896e8a
commit 8b10d85d29
5 changed files with 15 additions and 86 deletions
+3 -2
View File
@@ -16,7 +16,8 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import { IPAnalysis, getIpAdress, route } from "@spacebar/api";
import { getIpAdress, route } from "@spacebar/api";
import { IpDataClient } from "@spacebar/util";
import { Request, Response, Router } from "express";
const router = Router({ mergeParams: true });
@@ -32,7 +33,7 @@ router.get(
async (req: Request, res: Response) => {
//TODO
//Note: It's most likely related to legal. At the moment Discord hasn't finished this too
const country_code = (await IPAnalysis(getIpAdress(req))).country_code;
const country_code = (await IpDataClient.getIpInfo(getIpAdress(req)))?.country_code;
res.json({
consent_required: false,
country_code: country_code,
+3 -3
View File
@@ -17,9 +17,7 @@
*/
import {
IPAnalysis,
getIpAdress,
isProxy,
route,
verifyCaptcha,
} from "@spacebar/api";
@@ -30,6 +28,7 @@ import {
User,
ValidRegistrationToken,
generateToken,
IpDataClient
} from "@spacebar/util";
import bcrypt from "bcrypt";
import { Request, Response, Router } from "express";
@@ -148,7 +147,8 @@ router.post(
}
if (!regTokenUsed && register.blockProxies) {
if (isProxy(await IPAnalysis(ip))) {
const ipData = await IpDataClient.getIpInfo(ip);
if (ipData && IpDataClient.isProxy(ipData)) {
console.log(`proxy ${ip} blocked from registration`);
throw new HTTPError("Your IP is blocked from registration");
}
+5 -5
View File
@@ -16,8 +16,8 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import { Config } from "@spacebar/util";
import { distanceBetweenLocations, IPAnalysis } from "../utility/ipAddress";
import { Config, IpDataClient } from "@spacebar/util";
import { distanceBetweenLocations } from "../utility/ipAddress";
export async function getVoiceRegions(ipAddress: string, vip: boolean) {
const regions = Config.get().regions;
@@ -27,15 +27,15 @@ export async function getVoiceRegions(ipAddress: string, vip: boolean) {
let optimalId = regions.default;
if (!regions.useDefaultAsOptimal) {
const clientIpAnalysis = await IPAnalysis(ipAddress);
const clientIpAnalysis = await IpDataClient.getIpInfo(ipAddress);
let min = Number.POSITIVE_INFINITY;
for (const ar of availableRegions) {
//TODO the endpoint location should be saved in the database if not already present to prevent IPAnalysis call
const dist = distanceBetweenLocations(
clientIpAnalysis,
ar.location || (await IPAnalysis(ar.endpoint)),
clientIpAnalysis!,
ar.location || (await IpDataClient.getIpInfo(ar.endpoint))!,
);
if (dist < min) {
-76
View File
@@ -18,82 +18,6 @@
import { Config } from "@spacebar/util";
import { Request } from "express";
// use ipdata package instead of simple fetch because of integrated caching
const exampleData = {
ip: "",
is_eu: true,
city: "",
region: "",
region_code: "",
country_name: "",
country_code: "",
continent_name: "",
continent_code: "",
latitude: 0,
longitude: 0,
postal: "",
calling_code: "",
flag: "",
emoji_flag: "",
emoji_unicode: "",
asn: {
asn: "",
name: "",
domain: "",
route: "",
type: "isp",
},
languages: [
{
name: "",
native: "",
},
],
currency: {
name: "",
code: "",
symbol: "",
native: "",
plural: "",
},
time_zone: {
name: "",
abbr: "",
offset: "",
is_dst: true,
current_time: "",
},
threat: {
is_tor: false,
is_proxy: false,
is_anonymous: false,
is_known_attacker: false,
is_known_abuser: false,
is_threat: false,
is_bogon: false,
},
count: 0,
status: 200,
};
//TODO add function that support both ip and domain names
export async function IPAnalysis(ip: string): Promise<typeof exampleData> {
const { ipdataApiKey } = Config.get().security;
if (!ipdataApiKey) return { ...exampleData, ip };
return (
await fetch(`https://api.ipdata.co/${ip}?api-key=${ipdataApiKey}`)
).json() as Promise<typeof exampleData>;
}
export function isProxy(data: typeof exampleData) {
if (!data || !data.asn || !data.threat) return false;
if (data.asn.type !== "isp") return true;
if (Object.values(data.threat).some((x) => x)) return true;
return false;
}
export function getIpAdress(req: Request): string {
// TODO: express can do this (trustProxies: true)?
@@ -34,6 +34,10 @@ export class RegisterConfiguration {
allowNewRegistration: boolean = true;
allowMultipleAccounts: boolean = true;
blockProxies: boolean = true;
blockIpDataCoThreatTypes: string[] = ["tor", "icloud_relay", "proxy", "datacenter", "anonymous", "known_attacker", "known_abuser", "threat"]; // matching ipdata's threat.is_* fields as of 2025/11/30, minus bogon
blockAsnTypes: string[] = [""];
blockAsns: string[] = [""];
blockAbuseIpDbAboveScore: number = 0; // 0 to disable
incrementingDiscriminators: boolean = false; // random otherwise
defaultRights: string = "875069521787904"; // See `npm run generate:rights`
}