viewgit/index.php:465 Only variables should be passed by reference [2048]

viewgit/index.php:466 Non-static method GeSHi::get_language_name_from_extension() should not be called statically [2048]

  1. #
  2. # -*- coding: utf-8 -*-
  3. #
  4. # Whois module for the pywhoisd server
  5.  
  6. import SocketServer, re, math, syslog
  7. from ipcalc import IP, Network
  8.  
  9. def FormatOutput(field, value):
  10. """
  11. Format a field, value pair for the output
  12. from the server.
  13. """
  14. output = (field + ":").ljust(24)
  15. output += value + "\n"
  16. return " "*4 + output
  17.  
  18. def FormatMessage(message):
  19. """
  20. Prepare a message to be written from the
  21. server.
  22. """
  23. output = "\n"
  24. for line in message.split("\n"):
  25. line = line.strip()
  26. output += """\n %% """ + line.ljust(65) + """ %%"""
  27. return output + "\n\n"
  28.  
  29.  
  30. class Logger():
  31. #
  32. # Logger class that allow pywhoisd to log
  33. # everything on syslog.
  34. def __init__(self, verbose = False):
  35. self.verbose = verbose
  36.  
  37. def Log(self, message):
  38. """Log a message to syslog"""
  39. syslog.syslog ("[pywhoisd] " + message)
  40. if self.verbose:
  41. print message
  42.  
  43. def __call__(self, message):
  44. self.Log (message)
  45.  
  46. class Config():
  47. #
  48. # Config class manage configuration contained
  49. # in the config file and acts like a dictionary
  50. # that provides data to other classes
  51. #
  52. def __init__(self, config_file):
  53. """
  54. Load config file and save data in memory
  55. """
  56. self.config = {}
  57. f = open(config_file, 'r')
  58. content = f.read()
  59. f.close()
  60. for (key, value) in re.findall(r"([^\s]+)\s*=\s*([^;]+)\s*;", content):
  61. self.config[key] = value
  62.  
  63. def __getitem__(self, key):
  64. if self.config.has_key(key):
  65. return self.config[key]
  66. else:
  67. return None
  68.  
  69. def has_key(self, key):
  70. return self.config.has_key(key)
  71.  
  72.  
  73. class WhoisRequestHandler(SocketServer.StreamRequestHandler):
  74. """
  75. This handler answers to the whois request
  76. """
  77.  
  78. def handle(self):
  79. # Come prima cosa salutiamo
  80. hello = self.server.config['welcome_message']
  81. if hello:
  82. response = FormatMessage(hello)
  83. else:
  84. response = ""
  85.  
  86. # Obtain the whois request
  87. request = self.rfile.readline().strip()
  88.  
  89. if re.search(r"\d+\.\d+\.\d+\.\d+", request.strip()):
  90. response += self.server.ResolveAddress(request.split("/")[0])
  91. else:
  92. response += self.server.ResolveDomain(request)
  93. response += FormatMessage("Bye")
  94.  
  95. self.request.send (response)
  96. return
  97.  
  98.  
  99. class WhoisServer(SocketServer.ThreadingTCPServer):
  100. #
  101. # The real server. We allow reusing of address
  102. # so we can stop and start in a moment.
  103. allow_reuse_address = True
  104. def __init__(self, (host, port), logger, config):
  105.  
  106. SocketServer.ThreadingTCPServer.__init__(self, (host, port),
  107. WhoisRequestHandler)
  108. self.logger = logger
  109. self.config = config
  110. self.ip_database = {}
  111. self.domain_database = {}
  112. self.LoadDatabase(config['database_file'])
  113.  
  114. def LoadDatabase(self, database_file):
  115. """
  116. Populate server database with the data in the database
  117. file
  118. """
  119. self.logger.Log ("Populating database with entry in %s" % database_file)
  120. try:
  121. f = open(database_file, 'r')
  122. database_data = f.read()
  123. except IOError:
  124. self.logger.Log ("Error while loading config file. exiting")
  125.  
  126. nets = re.findall (r"net\s+(\d+\.\d+\.\d+\.\d+[/\d]*)[\s|\n]+\{([^\}]+)\};",
  127. database_data)
  128. for net in nets:
  129. self.logger.Log ("Loading net %s" % net[0])
  130. fields = re.findall(r"(\w+)\s*=\s*([^;]+);", net[1])
  131. name, owner, ns = None, None, None
  132. data = {}
  133. for field, value in fields:
  134. if field.lower() == 'name':
  135. name = value.strip()
  136. elif field.lower() == 'owner':
  137. owner = value.strip()
  138. elif field.lower() == 'ns':
  139. ns = value.strip()
  140. else:
  141. data[field] = value
  142. self.ip_database[net[0]] = Net(name = name, owner = owner, ns = ns,
  143. data = data)
  144.  
  145. domains = re.findall(r"domain\s+([^\s]+)[\s|\n]+\{([^\}]+)\};",
  146. database_data)
  147. for domain in domains:
  148. self.logger.Log ("Loading domain %s" % domain[0])
  149. fields = re.findall(r"(\w+)\s*=\s*([^;]+);", domain[1])
  150. name, owner, ns = None, None, None
  151. data = {}
  152. for field, value in fields:
  153. if field.lower() == 'name':
  154. name = value.strip()
  155. elif field.lower() == 'owner':
  156. owner = value.strip()
  157. elif field.lower() == 'ns':
  158. ns = value.strip()
  159. else:
  160. data[field] = value
  161. self.domain_database[domain[0]] = Domain(name = name,
  162. owner = owner,
  163. ns = ns,
  164. data = data)
  165.  
  166. def ResolveDomain(self, domain):
  167. """
  168. Find domain data and return them ready for output
  169. for the server
  170. """
  171. domain = domain.strip(".")
  172. output = ""
  173. domains = self.GetParentDomains(domain)
  174. for d in domains:
  175. output += FormatMessage("GNet whoisd answering for domain %s" % d)
  176. output += FormatOutput ("Domain", d)
  177. domain = self.domain_database[d]
  178. if domain.name is not None:
  179. output += FormatOutput ("Name", domain.name)
  180. if domain.owner is not None:
  181. output += FormatOutput ("Owner", domain.owner)
  182. if domain.ns is not None:
  183. output += FormatOutput ("Nameserver", domain.ns)
  184. if len(domain.data.items()) > 0:
  185. output += FormatMessage("Additional data")
  186. for k, v in domain.data.items():
  187. output += FormatOutput (k.capitalize(),v)
  188. if len(domains) == 0:
  189. return FormatMessage("No domain found for %s" % domain)
  190. return output
  191.  
  192.  
  193. def GetParentDomains(self, domain):
  194. """
  195. Return a list of domains that contain the domain
  196. passed as argument
  197. """
  198. interesting_domains = []
  199. for domain_name, domain_data in self.domain_database.items():
  200. if domain.endswith(domain_name):
  201. interesting_domains.append (domain_name)
  202. return interesting_domains
  203.  
  204. def ResolveAddress(self, ip):
  205. """
  206. Resolve an ip: it searches all the data that match it
  207. (i.e. all the subnets that contain it) and return
  208. output text ready for the server response.
  209. """
  210. output = ""
  211. nets = self.GetParentNetworks(ip)
  212. for net in nets:
  213. output += FormatMessage("GNet whoisd answering for ip %s" % ip)
  214. output += FormatOutput ("Range", net)
  215. net = self.ip_database[net]
  216. if net.name is not None:
  217. output += FormatOutput ("Name", net.name)
  218. if net.owner is not None:
  219. output += FormatOutput ("Owner", net.owner)
  220. if net.ns is not None:
  221. output += FormatOutput ("Nameserver", net.ns)
  222. if len(net.data.items()) > 0:
  223. output += FormatMessage("Additional data")
  224. for k, v in net.data.items():
  225. output += FormatOutput (k.capitalize(),v)
  226. if len(nets) == 0:
  227. output = FormatMessage("Address %s not found\n" % ip)
  228. return output
  229.  
  230. def GetParentNetworks(self, ip):
  231. """
  232. Get network in which the given ip is
  233. """
  234. interesting_networks = []
  235. for (address, net) in self.ip_database.items():
  236. try:
  237. if IP(ip) in Network(address):
  238. interesting_networks.append (address)
  239. except:
  240. continue
  241. return interesting_networks
  242.  
  243. class Net():
  244. #
  245. # Net is a class representing the network
  246. # contained in the local database and the
  247. # net obtained from other whois server.
  248. #
  249. # It act as a C struct containing only the
  250. # data and no method.
  251. def __init__(self, name, owner, ns, data):
  252. self.name = name
  253. self.owner = owner
  254. self.ns = ns
  255. self.data = data
  256.  
  257. class Domain():
  258. #
  259. #
  260. #
  261. def __init__(self, name, owner, ns, data):
  262. self.name, self.owner, self.ns = name, owner, ns
  263. self.data = data