From db4d7fd2ac7190ab66095eb6a9402da9065349c1 Mon Sep 17 00:00:00 2001 From: David Rousselie Date: Wed, 6 Jun 2007 17:31:49 +0200 Subject: [PATCH] Implement jabber:iq:gateway protocol jabber:iq:protocol translate legacy username into JID. darcs-hash:20070606153149-86b55-2d9efcea2c8271f57f561d33f4e95e100aa5256e.gz --- src/jcl/jabber/component.py | 32 ++++++++++++++++++++++ src/jcl/jabber/tests/component.py | 45 +++++++++++++++++++++++++++++++ src/jcl/lang.py | 6 +++++ src/jcl/tests/lang.py | 2 ++ 4 files changed, 85 insertions(+) diff --git a/src/jcl/jabber/component.py b/src/jcl/jabber/component.py index 3cb7579..b687370 100644 --- a/src/jcl/jabber/component.py +++ b/src/jcl/jabber/component.py @@ -186,6 +186,10 @@ class JCLComponent(Component, object): self.handle_get_register) self.stream.set_iq_set_handler("query", "jabber:iq:register", self.handle_set_register) + self.stream.set_iq_get_handler("query", "jabber:iq:gateway", + self.handle_get_gateway) + self.stream.set_iq_set_handler("query", "jabber:iq:gateway", + self.handle_set_gateway) self.stream.set_presence_handler("available", self.handle_presence_available) @@ -286,6 +290,34 @@ class JCLComponent(Component, object): self.send_stanzas(result) return result + def handle_get_gateway(self, info_query): + """Handle IQ-get "jabber:iq:gateway" requests. + Return prompt and description. + """ + self.__logger.debug("GET_GATEWAY") + info_query = info_query.make_result_response() + lang_class = self.lang.get_lang_class_from_node(info_query.get_node()) + query = info_query.new_query("jabber:iq:gateway") + query.newTextChild(query.ns(), "desc", lang_class.get_gateway_desc) + query.newTextChild(query.ns(), "prompt", lang_class.get_gateway_prompt) + self.stream.send(info_query) + return 1 + + def handle_set_gateway(self, info_query): + """Handle IQ-set "jabber:iq:gateway" requests. + Return well formed JID from legacy ID. + """ + self.__logger.debug("SET_GATEWAY") + prompt_nodes = info_query.xpath_eval("jig:query/jig:prompt", + {"jig" : "jabber:iq:gateway"}) + # TODO : Add malformed content error handling + jid = prompt_nodes[0].content.replace("@", "%") + "@" + unicode(self.jid) + info_query = info_query.make_result_response() + query = info_query.new_query("jabber:iq:gateway") + query.newTextChild(query.ns(), "jid", jid) + self.stream.send(info_query) + return 1 + def disco_get_info(self, node, info_query): """Discovery get info handler """ diff --git a/src/jcl/jabber/tests/component.py b/src/jcl/jabber/tests/component.py index 84713a4..26a5e07 100644 --- a/src/jcl/jabber/tests/component.py +++ b/src/jcl/jabber/tests/component.py @@ -77,6 +77,7 @@ class MockStream(object): raise Exception("IQ type unknown: " + iq_type) if not ns in ["jabber:iq:version", "jabber:iq:register", + "jabber:iq:gateway", "http://jabber.org/protocol/disco#items", "http://jabber.org/protocol/disco#info"]: raise Exception("Unknown namespace: " + ns) @@ -447,6 +448,50 @@ class JCLComponent_TestCase(unittest.TestCase): self.comp.signal_handler(42, None) self.assertFalse(self.comp.running) + ########################################################################### + # 'handle_get_gateway' tests + ########################################################################### + def test_handle_get_gateway(self): + self.comp.stream = MockStream() + self.comp.stream_class = MockStream + info_query = Iq(stanza_type = "get", + from_jid = "user1@test.com") + info_query.new_query("jabber:iq:gateway") + self.comp.handle_get_gateway(info_query) + self.assertEquals(len(self.comp.stream.sent), 1) + iq_sent = self.comp.stream.sent[0] + self.assertEquals(iq_sent.get_to(), "user1@test.com") + self.assertEquals(len(iq_sent.xpath_eval("*/*")), 2) + desc_nodes = iq_sent.xpath_eval("jig:query/jig:desc", + {"jig" : "jabber:iq:gateway"}) + self.assertEquals(len(desc_nodes), 1) + self.assertEquals(desc_nodes[0].content, Lang.en.get_gateway_desc) + prompt_nodes = iq_sent.xpath_eval("jig:query/jig:prompt", + {"jig" : "jabber:iq:gateway"}) + self.assertEquals(len(prompt_nodes), 1) + self.assertEquals(prompt_nodes[0].content, Lang.en.get_gateway_prompt) + + ########################################################################### + # 'handle_set_gateway' tests + ########################################################################### + def test_handle_set_gateway(self): + self.comp.stream = MockStream() + self.comp.stream_class = MockStream + info_query = Iq(stanza_type = "get", + from_jid = "user1@test.com") + query = info_query.new_query("jabber:iq:gateway") + prompt = query.newChild(None, "prompt", None) + prompt.addContent("user@test.com") + self.comp.handle_set_gateway(info_query) + self.assertEquals(len(self.comp.stream.sent), 1) + iq_sent = self.comp.stream.sent[0] + self.assertEquals(iq_sent.get_to(), "user1@test.com") + self.assertEquals(len(iq_sent.xpath_eval("*/*")), 1) + jid_nodes = iq_sent.xpath_eval("jig:query/jig:jid", + {"jig" : "jabber:iq:gateway"}) + self.assertEquals(len(jid_nodes), 1) + self.assertEquals(jid_nodes[0].content, "user%test.com@jcl.test.com") + ########################################################################### # 'disco_get_info' tests ########################################################################### diff --git a/src/jcl/lang.py b/src/jcl/lang.py index f691dbd..ebae75b 100644 --- a/src/jcl/lang.py +++ b/src/jcl/lang.py @@ -107,6 +107,9 @@ class Lang: error_subject = u"Error" error_body = u"An error has occured:\n\t%s" + get_gateway_desc = u"Please enter the email address of your contact" + get_gateway_prompt = u"Email address" + class fr: component_name = u"composant générique Jabber Component Library" register_title = u"Enregistrement d'une nouvelle connexion" @@ -145,6 +148,9 @@ class Lang: error_subject = u"Erreur" error_body = u"Une erreur est survenue :\n\t%s" + get_gateway_desc = u"Entrer l'adresse email de votre contact" + get_gateway_prompt = u"Adresse email" + class nl: # TODO: when finish, delete this line and uncomment in tests/lang.py the makeSuite(Language_nl_TestCase, 'test') line register_title = u"Registratie van verbindingen voor Jabber Mail" diff --git a/src/jcl/tests/lang.py b/src/jcl/tests/lang.py index f7b5df7..a5b8437 100644 --- a/src/jcl/tests/lang.py +++ b/src/jcl/tests/lang.py @@ -111,6 +111,8 @@ class Language_TestCase(unittest.TestCase): self.assertNotEquals(self.lang_class.error_subject, None) self.assertNotEquals(self.lang_class.error_body % (""), None) + self.assertNotEquals(self.lang_class.get_gateway_desc, None) + self.assertNotEquals(self.lang_class.get_gateway_prompt, None) class Language_fr_TestCase(Language_TestCase): def setUp(self):