PageRenderTime 39ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 0ms

/vsroom/common/sanitizer.py

https://bitbucket.org/clarifiednetworks/vsroom/
Python | 146 lines | 116 code | 30 blank | 0 comment | 34 complexity | 2ba6618c8b176da097db011cc6fdaf7f MD5 | raw file
  1. import socket
  2. socket.setdefaulttimeout(20)
  3. import time as _time
  4. import httplib
  5. try:
  6. import json
  7. except ImportError:
  8. import simplejson as json
  9. from idiokit import threado
  10. from abusehelper.core import events, bot, taskfarm, services
  11. from abusehelper.core.config import load_module
  12. from decimal import Decimal, ROUND_HALF_UP, InvalidOperation
  13. placecache = dict()
  14. def getPlaceInfo(event):
  15. lat = event.value("latitude", None)
  16. lng = event.value("longitude", None)
  17. if not lat or not lng:
  18. return
  19. if (lat,lng) in placecache:
  20. return placecache[lat,lng]
  21. connection = httplib.HTTPConnection("ws.geonames.org")
  22. page = "/findNearbyPlaceNameJSON?lat=%s&lng=%s" % (lat, lng)
  23. connection.request("GET", page)
  24. response = connection.getresponse()
  25. if response.status != 200:
  26. return
  27. data = response.read()
  28. json_data = json.loads(data)
  29. if not json_data:
  30. return
  31. geonames = json_data.get("geonames", None)
  32. if not geonames:
  33. return
  34. info = dict()
  35. for key in geonames[0]:
  36. if key == "population":
  37. info["population"] = unicode(geonames[0][key])
  38. elif key.startswith("adminName"):
  39. info['county'] = unicode(geonames[0][key])
  40. if len(placecache) < 1000000:
  41. placecache[(lat,lng)] = info
  42. return info
  43. def format_time(time_tuple=None):
  44. if time_tuple is None:
  45. time_tuple = _time.gmtime()
  46. return _time.strftime("%Y-%m-%d %H:%M:%S UTC", time_tuple)
  47. def time(string, format="%Y-%m-%d %H:%M:%S"):
  48. try:
  49. parsed = _time.strptime(string, format)
  50. except ValueError:
  51. return None
  52. if _time.gmtime() < parsed:
  53. return None
  54. return format_time(parsed)
  55. def ip(string):
  56. try:
  57. socket.inet_pton(socket.AF_INET, string)
  58. except socket.error:
  59. try:
  60. socket.inet_pton(socket.AF_INET6, string)
  61. except socket.error:
  62. return None
  63. return string
  64. class Sanitizer(bot.ServiceBot):
  65. def __init__(self, **keys):
  66. bot.ServiceBot.__init__(self, **keys)
  67. self.rooms = taskfarm.TaskFarm(self.handle_room)
  68. self.srcs = taskfarm.Counter()
  69. @threado.stream
  70. def handle_room(inner, self, name):
  71. self.log.info("Joining room %r", name)
  72. room = yield inner.sub(self.xmpp.muc.join(name, self.bot_name))
  73. self.log.info("Joined room %r", name)
  74. try:
  75. yield inner.sub(events.events_to_elements()
  76. | room
  77. | events.stanzas_to_events()
  78. | self.distribute(name))
  79. finally:
  80. self.log.info("Left room %r", name)
  81. @threado.stream
  82. def distribute(inner, self, name):
  83. while True:
  84. event = yield inner
  85. rooms = set(map(self.rooms.get, self.srcs.get(name)))
  86. rooms.discard(None)
  87. if not rooms:
  88. continue
  89. for sanitized_event in self.sanitize(event):
  90. for common_sanitized_event in self.common_sanitize(sanitized_event):
  91. for room in rooms:
  92. room.send(common_sanitized_event)
  93. @threado.stream
  94. def session(inner, self, _, src_room, dst_room, **keys):
  95. self.srcs.inc(src_room, dst_room)
  96. try:
  97. yield inner.sub(self.rooms.inc(src_room) | self.rooms.inc(dst_room))
  98. except services.Stop:
  99. inner.finish()
  100. finally:
  101. self.srcs.dec(src_room, dst_room)
  102. def common_sanitize(self,event):
  103. info = False
  104. try:
  105. info = getPlaceInfo(event)
  106. except (socket.error, httplib.HTTPException), e:
  107. self.log.warning('Could not get location information ' +
  108. 'for lat=%s, long=%s from ws.geonames.org: %s' % (event.value('latitude','None'),
  109. event.value('longitude','None'),
  110. e))
  111. if info:
  112. for key in info:
  113. event.add(key, info[key])
  114. return [event]
  115. def sanitize(self, event):
  116. return [event]