view idavoll/idavoll.py @ 14:68e900b46d49

Send service-unavailable for unknown iq child namespaces
author Ralph Meijer <ralphm@ik.nu>
date Sat, 17 Jul 2004 22:03:37 +0000
parents d599da9179ab
children 0861c0f2e3b5
line wrap: on
line source

from twisted.protocols.jabber import component
from twisted.application import service
from twisted.python import components
import backend
import pubsub
import xmpp_error

import sys

NS_DISCO = 'http://jabber.org/protocol/disco'
NS_DISCO_INFO = NS_DISCO + '#info'
NS_DISCO_ITEMS = NS_DISCO + '#items'
NS_VERSION = 'jabber:iq:version'

IQ_GET = '/iq[@type="get"]'
IQ_SET = '/iq[@type="set"]'
VERSION = IQ_GET + '/query[@xmlns="' + NS_VERSION + '"]'
DISCO_INFO = IQ_GET + '/query[@xmlns="' + NS_DISCO_INFO + '"]'
DISCO_ITEMS = IQ_GET + '/query[@xmlns="' + NS_DISCO_ITEMS + '"]'

class IdavollService(component.Service):

	def componentConnected(self, xmlstream):
		self.xmlstream = xmlstream
		xmlstream.addObserver(VERSION, self.onVersion, 1)
		xmlstream.addObserver(DISCO_INFO, self.onDiscoInfo, 1)
		xmlstream.addObserver(DISCO_ITEMS, self.onDiscoItems, 1)
		xmlstream.addObserver(IQ_GET, self.iqFallback, -1)
		xmlstream.addObserver(IQ_SET, self.iqFallback, -1)

	def getFeatures(self, node):
		if not node:
			return [NS_DISCO_ITEMS, NS_VERSION]
	
	def onVersion(self, iq):
		iq.swapAttributeValues("to", "from")
		iq["type"] = "result"
		name = iq.addElement("name", None, 'Idavoll')
		version = iq.addElement("version", None, '0.1')
		self.send(iq)
		iq.handled = True

	def onDiscoInfo(self, iq):
		identities = []
		features = []
		node = iq.query.getAttribute("node")

		for c in self.parent:
			if components.implements(c, component.IService):
				if hasattr(c, "getIdentities"):
					identities.extend(c.getIdentities(node))
				if hasattr(c, "getFeatures"):
					features.extend(c.getFeatures(node))

		if not features and not identities and not node:
			xmpp_error.error_from_iq(iq, 'item-not-found')
		else:
			iq.swapAttributeValues("to", "from")
			iq["type"] = "result"
			for identity in identities:
				iq.query.addElement("identity", None)
				iq.query.identity.attributes = identity
			print features
			for feature in features:
				f = iq.query.addElement("feature", None)
				f["var"] = feature

		self.send(iq)
		iq.handled = True

	def onDiscoItems(self, iq):
		iq.swapAttributeValues("to", "from")
		iq["type"] = "result"
		iq.query.children = []
		self.send(iq)
	
	def iqFallback(self, iq):
		if iq.handled == True:
			return

		self.send(xmpp_error.error_from_iq(iq, 'service-unavailable'))

def makeService(config):
	serviceCollection = service.MultiService()

	pss = backend.MemoryBackendService()

	# set up Jabber Component
	c = component.buildServiceManager(config["jid"], config["secret"],
			("tcp:%s:%s" % (config["rhost"], config["rport"])))

	s = component.IService(pss)
	s.jid = config["jid"]
	s.setServiceParent(c)

	s = IdavollService()
	s.setServiceParent(c)

	c.setServiceParent(serviceCollection)

	# other stuff

	return c