From a70979f56964768464bb6e9bb5b9bc1465638019 Mon Sep 17 00:00:00 2001 From: David Rousselie Date: Tue, 4 Sep 2007 21:11:18 +0200 Subject: [PATCH] 'edit-admin' ad-hoc command implementation darcs-hash:20070904191118-86b55-cfe426468d12728578af12c535eafa69e38b381b.gz --- conf/jcl.conf | 3 +- src/jcl/jabber/command.py | 29 ++++++++- src/jcl/jabber/component.py | 13 ++++ src/jcl/jabber/tests/command.py | 98 ++++++++++++++++++++++++++++--- src/jcl/jabber/tests/component.py | 52 ++++++++++++++++ 5 files changed, 183 insertions(+), 12 deletions(-) diff --git a/conf/jcl.conf b/conf/jcl.conf index 58996e9..8457d9c 100644 --- a/conf/jcl.conf +++ b/conf/jcl.conf @@ -18,5 +18,6 @@ db_url: %(type)s://%(host)s%(name)s [component] pid_file: /var/run/jabber/jcl.pid #motd: "Message of the day" - +welcome_message: "Welcome to JCL" +admins: admin1@domain.com, admin2@domain.com diff --git a/src/jcl/jabber/command.py b/src/jcl/jabber/command.py index b8b103c..0d5cee4 100644 --- a/src/jcl/jabber/command.py +++ b/src/jcl/jabber/command.py @@ -228,7 +228,7 @@ class JCLCommandManager(CommandManager): def __init__(self, component=None, account_manager=None): """ JCLCommandManager constructor - Not implemented commands: + commands not implemented: 'http://jabber.org/protocol/admin#user-stats', 'http://jabber.org/protocol/admin#edit-blacklist', 'http://jabber.org/protocol/admin#add-to-blacklist-in', @@ -867,8 +867,31 @@ class JCLCommandManager(CommandManager): command_node.setProp("status", STATUS_COMPLETED) return (None, []) - def execute_edit_admin(self, info_query): - return [] + def execute_edit_admin_1(self, info_query, session_context, + command_node, lang_class): + self.add_actions(command_node, [ACTION_NEXT]) + result_form = Form(xmlnode_or_type="result", + title="TODO", + instructions="TODO") + result_form.add_field(field_type="hidden", + name="FORM_TYPE", + value="http://jabber.org/protocol/admin") + admins = self.component.get_admins() + result_form.add_field(name="adminjids", + field_type="jid-multi", + label="TODO", + values=admins, + required=True) + result_form.as_xml(command_node) + return (result_form, []) + + def execute_edit_admin_2(self, info_query, session_context, + command_node, lang_class): + self.__logger.debug("Executing command 'edit admin' step 2") + admins = session_context["adminjids"] + self.component.set_admins(admins) + command_node.setProp("status", STATUS_COMPLETED) + return (None, []) def execute_restart(self, info_query): return [] diff --git a/src/jcl/jabber/component.py b/src/jcl/jabber/component.py index cfd4e73..ff0b2ff 100644 --- a/src/jcl/jabber/component.py +++ b/src/jcl/jabber/component.py @@ -34,6 +34,7 @@ import logging import signal import re import traceback +import string from Queue import Queue @@ -589,6 +590,18 @@ class JCLComponent(Component, object): def del_motd(self): self.del_config_parameter("component", "motd") + def get_admins(self): + admins_str = self.get_config_parameter("component", + "admins") + if admins_str is not None: + return map(string.strip, + admins_str.split(',')) + else: + return None + + def set_admins(self, admins): + self.set_config_parameter("component", "admins", ",".join(admins)) + def get_welcome_message(self): return self.get_config_parameter("component", "welcome_message") diff --git a/src/jcl/jabber/tests/command.py b/src/jcl/jabber/tests/command.py index 9cb4386..ae55def 100644 --- a/src/jcl/jabber/tests/command.py +++ b/src/jcl/jabber/tests/command.py @@ -2638,14 +2638,96 @@ class JCLCommandManager_TestCase(JCLTestCase): "welcome_message")) os.unlink(config_file) -# def test_execute_edit_admin(self): -# #TODO : implement command -# info_query = Iq(stanza_type="set", -# from_jid="user1@test.com", -# to_jid="jcl.test.com") -# result = self.command_manager.execute_add_user(info_query) -# self.assertNotEquals(result, None) -# self.assertEquals(len(result), 1) + def test_execute_edit_admin(self): + self.comp.account_manager.account_classes = (ExampleAccount, + Example2Account) + config_file = tempfile.mktemp(".conf", "jcltest", jcl.tests.DB_DIR) + self.comp.config_file = config_file + self.comp.config = ConfigParser() + self.comp.set_admins(["admin1@test.com", "admin2@test.com"]) + model.db_connect() + user1 = User(jid="test1@test.com") + account11 = ExampleAccount(user=user1, + name="account11", + jid="account11@jcl.test.com") + account11.status = account.ONLINE + account12 = Example2Account(user=user1, + name="account12", + jid="account12@jcl.test.com") + account12.status = "away" + user2 = User(jid="test2@test.com") + account21 = ExampleAccount(user=user2, + name="account21", + jid="account21@jcl.test.com") + account21.status = account.OFFLINE + account22 = ExampleAccount(user=user2, + name="account11", + jid="account11@jcl.test.com") + account22.status = account.OFFLINE + model.db_disconnect() + info_query = Iq(stanza_type="set", + from_jid="user1@test.com", + to_jid="jcl.test.com") + command_node = info_query.set_new_content(command.COMMAND_NS, "command") + command_node.setProp("node", + "http://jabber.org/protocol/admin#edit-admin") + result = self.command_manager.apply_command_action(\ + info_query, + "http://jabber.org/protocol/admin#edit-admin", + "execute") + self.assertNotEquals(result, None) + self.assertEquals(len(result), 1) + xml_command = result[0].xpath_eval("c:command", + {"c": "http://jabber.org/protocol/commands"})[0] + self.assertEquals(xml_command.prop("status"), "executing") + self.assertNotEquals(xml_command.prop("sessionid"), None) + self.__check_actions(result[0], ["next"]) + fields = result[0].xpath_eval("c:command/data:x/data:field", + {"c": "http://jabber.org/protocol/commands", + "data": "jabber:x:data"}) + self.assertEquals(len(fields), 2) + self.assertEquals(fields[1].prop("var"), "adminjids") + self.assertEquals(fields[1].prop("type"), "jid-multi") + self.assertEquals(fields[1].children.name, "value") + self.assertEquals(fields[1].children.content, "admin1@test.com") + self.assertEquals(fields[1].children.next.name, "value") + self.assertEquals(fields[1].children.next.content, "admin2@test.com") + self.assertEquals(fields[1].children.next.next.name, "required") + + # Second step + info_query = Iq(stanza_type="set", + from_jid="user1@test.com", + to_jid="jcl.test.com") + command_node = info_query.set_new_content(command.COMMAND_NS, "command") + command_node.setProp("node", + "http://jabber.org/protocol/admin#edit-admin") + session_id = xml_command.prop("sessionid") + command_node.setProp("sessionid", session_id) + command_node.setProp("action", "next") + submit_form = Form(xmlnode_or_type="submit") + submit_form.add_field(field_type="jid-multi", + name="adminjids", + values=["admin3@test.com", "admin4@test.com"]) + submit_form.as_xml(command_node) + result = self.command_manager.apply_command_action(\ + info_query, + "http://jabber.org/protocol/admin#edit-admin", + "execute") + self.assertNotEquals(result, None) + self.assertEquals(len(result), 1) + xml_command = result[0].xpath_eval("c:command", + {"c": "http://jabber.org/protocol/commands"})[0] + self.assertEquals(xml_command.prop("status"), "completed") + self.assertEquals(xml_command.prop("sessionid"), session_id) + self.__check_actions(result[0]) + context_session = self.command_manager.sessions[session_id][1] + self.assertEquals(context_session["adminjids"], + ["admin3@test.com", "admin4@test.com"]) + self.comp.config.read(self.comp.config_file) + self.assertTrue(self.comp.config.has_option("component", "admins")) + self.assertEquals(self.comp.config.get("component", "admins"), + "admin3@test.com,admin4@test.com") + os.unlink(config_file) # def test_execute_restart(self): # #TODO : implement command diff --git a/src/jcl/jabber/tests/component.py b/src/jcl/jabber/tests/component.py index 2165e25..2f71582 100644 --- a/src/jcl/jabber/tests/component.py +++ b/src/jcl/jabber/tests/component.py @@ -2693,6 +2693,58 @@ class JCLComponent_TestCase(JCLTestCase): "welcome_message")) os.unlink(config_file) + def test_get_admins(self): + config_file = tempfile.mktemp(".conf", "jcltest", jcl.tests.DB_DIR) + self.comp.config_file = config_file + self.comp.config = ConfigParser() + self.comp.config.read(self.comp.config_file) + self.comp.config.add_section("component") + self.comp.config.set("component", "admins", "admin1@test.com, admin2@test.com") + self.comp.config.write(open(self.comp.config_file, "w")) + admins = self.comp.get_admins() + self.assertEquals(len(admins), 2) + self.assertEquals(admins[0], "admin1@test.com") + self.assertEquals(admins[1], "admin2@test.com") + os.unlink(config_file) + + def test_get_no_admins(self): + config_file = tempfile.mktemp(".conf", "jcltest", jcl.tests.DB_DIR) + self.comp.config_file = config_file + self.comp.config = ConfigParser() + self.comp.config.read(self.comp.config_file) + self.comp.config.write(open(self.comp.config_file, "w")) + admins = self.comp.get_admins() + self.assertEquals(admins, None) + os.unlink(config_file) + + def test_set_new_admins(self): + config_file = tempfile.mktemp(".conf", "jcltest", jcl.tests.DB_DIR) + self.comp.config_file = config_file + self.comp.config = ConfigParser() + self.comp.set_admins(["admin1@test.com", "admin2@test.com"]) + self.comp.config.read(self.comp.config_file) + self.assertTrue(self.comp.config.has_option("component", + "admins")) + self.assertEquals(self.comp.config.get("component", "admins"), + "admin1@test.com,admin2@test.com") + os.unlink(config_file) + + def test_set_admins(self): + config_file = tempfile.mktemp(".conf", "jcltest", jcl.tests.DB_DIR) + self.comp.config_file = config_file + self.comp.config = ConfigParser() + self.comp.config.add_section("component") + self.comp.config.set("component", "admins", + "admin1@test.com, admin2@test.com") + self.comp.config.write(open(self.comp.config_file, "w")) + self.comp.set_admins(["admin3@test.com", "admin4@test.com"]) + self.comp.config.read(self.comp.config_file) + self.assertTrue(self.comp.config.has_option("component", + "admins")) + self.assertEquals(self.comp.config.get("component", "admins"), + "admin3@test.com,admin4@test.com") + os.unlink(config_file) + ########################################################################### # 'handle_command' tests ###########################################################################