Docker images / prepare-release (push) Successful in 9s
Docker images / backend-test (push) Successful in 2m34s
Docker images / frontend-image (push) Successful in 3m20s
Docker images / updater-image (push) Successful in 43s
Docker images / backend-image (push) Successful in 2m25s
Docker images / notify-webhook (push) Skipped
Docker images / publish-release (push) Successful in 13s
- Added support for Instagram in traffic flow resolution and classification, including new test cases to validate its behavior. - Introduced `INSTAGRAM` brand handling in the traffic flow logic, ensuring accurate service identification for Instagram-related traffic. - Updated existing tests to cover various scenarios involving Instagram, including IP resolution and service categorization. - Enhanced the service brand icon component to include an Instagram icon for better visual representation. Co-authored-by: Cursor <[email protected]>
208 lines
5.8 KiB
TypeScript
208 lines
5.8 KiB
TypeScript
import assert from "node:assert/strict"
|
|
import { applicationName } from "./traffic-flow-apps.js"
|
|
import { classifyFlowDst, disableCatalogFetchForTests, resetFlowCatalogForTests, seedFlowCatalogForTests } from "./traffic-flow-classify.js"
|
|
|
|
disableCatalogFetchForTests()
|
|
resetFlowCatalogForTests()
|
|
seedFlowCatalogForTests({
|
|
cidrs: [{ cidr: "192.0.2.0/24", purpose: "steam-gaming" }],
|
|
})
|
|
|
|
const hit = classifyFlowDst("192.0.2.10", 6, 443, 50000, null)
|
|
assert.equal(hit.category, "Игры")
|
|
assert.equal(hit.service, "steam-gaming")
|
|
|
|
const miss = classifyFlowDst("203.0.113.9", 17, 53, 53000, null)
|
|
assert.equal(miss.category, "DNS")
|
|
|
|
const cdn = classifyFlowDst("203.0.113.9", 6, 443, 1, { prefix: "203.0.113.0/24", asn: 13335, country: "US", lat: null, lng: null, holder: "CLOUDFLARENET", ok: true, fetchedAt: Date.now() })
|
|
assert.equal(cdn.category, "CDN")
|
|
assert.equal(cdn.service, "Cloudflare")
|
|
|
|
const amazonHolder = classifyFlowDst("203.0.113.50", 6, 443, 1, { prefix: "203.0.113.0/24", asn: 64500, country: "RU", lat: null, lng: null, holder: "AMAZON-AES - Amazon.com, Inc.", ok: true, fetchedAt: Date.now() })
|
|
assert.equal(amazonHolder.service, "Прочее")
|
|
assert.notEqual(amazonHolder.service, "AMAZON-AES - Amazon.com, Inc.")
|
|
|
|
const google = classifyFlowDst("173.194.160.163", 6, 443, 1, {
|
|
prefix: "173.194.0.0/16",
|
|
asn: 15169,
|
|
country: "US",
|
|
lat: null,
|
|
lng: null,
|
|
holder: "GOOGLE",
|
|
ok: true,
|
|
fetchedAt: Date.now(),
|
|
})
|
|
assert.equal(google.service, "YouTube")
|
|
assert.equal(google.category, "Видео / стриминг")
|
|
|
|
const googleCidr = classifyFlowDst("173.194.151.65", 6, 80, 50000, null)
|
|
assert.equal(googleCidr.service, "Google")
|
|
assert.equal(googleCidr.category, "Веб")
|
|
|
|
const youtube = classifyFlowDst("173.194.160.163", 6, 443, 1, {
|
|
prefix: "173.194.0.0/16",
|
|
asn: 15169,
|
|
country: "US",
|
|
lat: null,
|
|
lng: null,
|
|
holder: "YouTube LLC",
|
|
ok: true,
|
|
fetchedAt: Date.now(),
|
|
})
|
|
assert.equal(youtube.service, "YouTube")
|
|
assert.equal(youtube.category, "Видео / стриминг")
|
|
|
|
const valve = classifyFlowDst("203.0.113.40", 17, 27015, 50000, {
|
|
prefix: "203.0.113.0/24",
|
|
asn: 64501,
|
|
country: "US",
|
|
lat: null,
|
|
lng: null,
|
|
holder: "VALVE-CORPORATION",
|
|
ok: true,
|
|
fetchedAt: Date.now(),
|
|
})
|
|
assert.equal(valve.service, "Steam")
|
|
assert.equal(valve.category, "Игры")
|
|
|
|
const openaiHolder = classifyFlowDst("203.0.113.41", 6, 443, 1, {
|
|
prefix: "203.0.113.0/24",
|
|
asn: 64502,
|
|
country: "US",
|
|
lat: null,
|
|
lng: null,
|
|
holder: "OPENAI, US",
|
|
ok: true,
|
|
fetchedAt: Date.now(),
|
|
})
|
|
assert.equal(openaiHolder.service, "ChatGPT")
|
|
assert.equal(openaiHolder.category, "ИИ")
|
|
|
|
const cfNotSteam = classifyFlowDst("104.18.35.51", 6, 443, 1, {
|
|
prefix: "104.18.0.0/16",
|
|
asn: 32590,
|
|
country: "US",
|
|
lat: null,
|
|
lng: null,
|
|
holder: "VALVE-CORPORATION",
|
|
ok: true,
|
|
fetchedAt: Date.now(),
|
|
})
|
|
assert.equal(cfNotSteam.service, "Cloudflare")
|
|
assert.notEqual(cfNotSteam.service, "Steam")
|
|
|
|
const awsIeu = classifyFlowDst("203.0.113.42", 6, 443, 1, {
|
|
prefix: "203.0.113.0/24",
|
|
asn: 9059,
|
|
country: "IE",
|
|
lat: null,
|
|
lng: null,
|
|
holder: "AMAZON-02",
|
|
ok: true,
|
|
fetchedAt: Date.now(),
|
|
})
|
|
assert.equal(awsIeu.service, "AWS")
|
|
assert.equal(awsIeu.category, "CDN")
|
|
|
|
const googleCloud = classifyFlowDst("203.0.113.43", 6, 443, 1, {
|
|
prefix: "203.0.113.0/24",
|
|
asn: 396982,
|
|
country: "US",
|
|
lat: null,
|
|
lng: null,
|
|
holder: "GOOGLE-CLOUD",
|
|
ok: true,
|
|
fetchedAt: Date.now(),
|
|
})
|
|
assert.equal(googleCloud.service, "YouTube")
|
|
assert.equal(googleCloud.category, "Видео / стриминг")
|
|
|
|
const gre = classifyFlowDst("198.51.100.1", 47, 0, 0, null)
|
|
assert.equal(gre.service, "GRE")
|
|
assert.equal(gre.category, "Туннель")
|
|
const greIgnore = classifyFlowDst("8.8.8.8", 47, 0, 0, {
|
|
prefix: "8.8.8.0/24",
|
|
asn: 15169,
|
|
country: "US",
|
|
lat: null,
|
|
lng: null,
|
|
holder: "GOOGLE",
|
|
ok: true,
|
|
fetchedAt: Date.now(),
|
|
}, { ignoreTunnelProto: true })
|
|
assert.equal(greIgnore.service, "Google")
|
|
const dnsGoogle = classifyFlowDst("8.8.8.8", 17, 53, 53000, {
|
|
prefix: "8.8.8.0/24",
|
|
asn: 15169,
|
|
country: "US",
|
|
lat: null,
|
|
lng: null,
|
|
holder: "GOOGLE",
|
|
ok: true,
|
|
fetchedAt: Date.now(),
|
|
})
|
|
assert.equal(dnsGoogle.service, "Google")
|
|
assert.notEqual(dnsGoogle.service, "Прочее")
|
|
const ipv6Yt = classifyFlowDst("2001:4860:4860::8888", 17, 443, 50000, {
|
|
prefix: "2001:4860:4860::8888/128",
|
|
asn: 15169,
|
|
country: "US",
|
|
lat: null,
|
|
lng: null,
|
|
holder: "GOOGLE",
|
|
ok: true,
|
|
fetchedAt: Date.now(),
|
|
})
|
|
assert.equal(ipv6Yt.service, "YouTube")
|
|
|
|
const instagram = classifyFlowDst("157.240.12.52", 6, 443, 62598, {
|
|
prefix: "157.240.0.0/16",
|
|
asn: 32934,
|
|
country: "US",
|
|
lat: null,
|
|
lng: null,
|
|
holder: "FACEBOOK",
|
|
ok: true,
|
|
fetchedAt: Date.now(),
|
|
})
|
|
assert.equal(instagram.service, "Instagram")
|
|
assert.equal(instagram.category, "Видео / стриминг")
|
|
assert.notEqual(instagram.service, "Meta")
|
|
|
|
const metaHttp = classifyFlowDst("157.240.12.52", 6, 80, 50000, {
|
|
prefix: "157.240.0.0/16",
|
|
asn: 32934,
|
|
country: "US",
|
|
lat: null,
|
|
lng: null,
|
|
holder: "FACEBOOK",
|
|
ok: true,
|
|
fetchedAt: Date.now(),
|
|
})
|
|
assert.equal(metaHttp.service, "Meta")
|
|
assert.equal(metaHttp.category, "CDN")
|
|
|
|
const igHolder = classifyFlowDst("203.0.113.80", 6, 443, 1, {
|
|
prefix: "203.0.113.0/24",
|
|
asn: 64503,
|
|
country: "US",
|
|
lat: null,
|
|
lng: null,
|
|
holder: "Instagram LLC",
|
|
ok: true,
|
|
fetchedAt: Date.now(),
|
|
})
|
|
assert.equal(igHolder.service, "Instagram")
|
|
|
|
const igCidr = classifyFlowDst("57.144.22.192", 17, 443, 50000, null)
|
|
assert.equal(igCidr.service, "Instagram")
|
|
assert.equal(igCidr.category, "Видео / стриминг")
|
|
|
|
const esp = classifyFlowDst("198.51.100.1", 50, 0, 0, null)
|
|
assert.equal(esp.category, "Туннель")
|
|
assert.equal(applicationName(17, 443, 50000), "QUIC")
|
|
assert.equal(applicationName(17, 853, 50000), "DNS")
|
|
|
|
console.log("traffic-flow-classify.test.ts: ok")
|