utils.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. const { promisify } = require('util')
  2. const dns = require('dns')
  3. const lookup = promisify(dns.lookup)
  4. const request = require('request')
  5. const { DEV, SERVER_IP } = require('../config')
  6. // https://www.torproject.org/projects/tordnsel.html.en
  7. // check if request comes from tor
  8. const fromTor = async (req, res, next) => {
  9. if (DEV) {
  10. req.fromTor = req.query.fromTor || false
  11. return next()
  12. }
  13. const sourceIp = req.headers['x-forwarded-for'] || req.connection.remoteAddress
  14. const ip = sourceIp.split('.').reverse().join('.')
  15. const reversedServerIp = SERVER_IP.split('.').reverse().join('.')
  16. const domain = `${ip}.80.${reversedServerIp}.ip-port.exitlist.torproject.org`
  17. try {
  18. const ret = await lookup(domain, {})
  19. req.fromTor = (ret.address === '127.0.0.2')
  20. } catch(e) {
  21. req.fromTor = false
  22. }
  23. next()
  24. }
  25. // check if request comes from proxy/VPN/tor
  26. const fromVpn = async (req, res, next) => {
  27. if (DEV) {
  28. req.fromVpn = req.query.fromVpn || false
  29. return next()
  30. }
  31. const sourceIp = req.headers['x-forwarded-for'] || req.connection.remoteAddress
  32. const baseUrl = 'https://check.getipintel.net/check.php?ip='
  33. const url = `${baseUrl}${sourceIp}&contact=anna@fugadalcontrollo.org`
  34. request(url,
  35. (err, res, body) => {
  36. if (!err && res.statusCode === 200) {
  37. req.fromVpn = parseFloat(body)>0.5
  38. } else {
  39. req.fromVpn = false
  40. }
  41. next()
  42. })
  43. }
  44. const checkCountry = (req, res, next) => {
  45. if (DEV) {
  46. return next()
  47. }
  48. const sourceIp = req.headers['x-forwarded-for'] || req.connection.remoteAddress
  49. request(`http://ip-api.com/json/${sourceIp}`, (err, res, body) => {
  50. if (!err && res.statusCode === 200) {
  51. try {
  52. req.geoinfo = JSON.parse(body)
  53. } catch (e) {}
  54. }
  55. next()
  56. })
  57. }
  58. module.exports = { fromTor, fromVpn, checkCountry }