bibliogram/src/lib/quota/get_identifier.js

54 lines
1.7 KiB
JavaScript

const {request} = require("../utils/request")
const {log} = require("pinski/util/common")
const constants = require("../constants.js")
const {createChecker} = require("is-in-subnet")
let addresses = []
let addressSet = new Set()
let subnets = []
let checker = createChecker([])
function getList(url, description) {
return request(url).text().then(text => {
// this is decently fast, but if you have ideas for optimisation, please go for it
let d = Date.now()
const lines = text.split("\n").filter(l => l && l[0] !== "#")
subnets = subnets.concat(lines.filter(l => l.includes("/")))
addresses = addresses.concat(lines.filter(l => !l.includes("/")))
log(`Loaded ${description} (entries: ${lines.length}) (${Date.now()-d} ms)`, "spam")
})
}
if (constants.quota.enabled) {
Promise.all([
getList("https://check.torproject.org/torbulkexitlist", "Tor exit node list"),
getList("https://meta.bibliogram.art/quota-list/vpn-ipv4.txt", "VPN IPv4 list"),
getList("https://meta.bibliogram.art/quota-list/applied-privacy.txt", "applied-privacy.net subnets")
]).then(() => {
let d = Date.now()
checker = createChecker(subnets)
addressSet = new Set(addresses.values())
log(`Created subnet checker (${Date.now()-d} ms)`, "spam")
})
}
function getIdentifier(address) {
let d = Date.now()
const result = (() => {
try {
if (address == undefined) return "missing"
else if (checker(address)) return "proxy"
else if (addressSet.has(address)) return "proxy"
else return address
} catch (e) {
// not a valid IP address, or some error like that
console.error(e)
throw e
}
})()
console.log(`identified ${address} -> ${result} in ${Date.now()-d} ms`)
return result
}
module.exports.getIdentifier = getIdentifier