mirror of
https://github.com/spacebarchat/server.git
synced 2026-08-24 09:30:11 +00:00
Use IpDataClient in places
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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`
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user