utils.js 1.6 KB

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