diff --git a/src/jcl/jabber/command.py b/src/jcl/jabber/command.py index c135953..70ab598 100644 --- a/src/jcl/jabber/command.py +++ b/src/jcl/jabber/command.py @@ -202,11 +202,12 @@ class CommandManager(object): step_method = "execute_" + short_node + "_" + str(step) self.parse_form(info_query, session_id) if hasattr(self, step_method): - return [response] + getattr(self, step_method)(\ + (form, result) = getattr(self, step_method)(\ info_query, self.sessions[session_id][1], command_node, lang_class) + return [response] + result else: return [info_query.make_error_response(\ "feature-not-implemented")] @@ -272,7 +273,7 @@ class JCLCommandManager(CommandManager): field_type="jid-multi", label=lang_class.field_user_jid) result_form.as_xml(command_node) - return [] + return result_form def add_form_select_user_jid(self, command_node, lang_class): result_form = Form(xmlnode_or_type="result", @@ -281,7 +282,7 @@ class JCLCommandManager(CommandManager): field_type="jid-single", label=lang_class.field_user_jid) result_form.as_xml(command_node) - return [] + return result_form def __add_accounts_to_field(self, user_jids, field, lang_class): for (account_type, type_label) in \ @@ -308,7 +309,7 @@ class JCLCommandManager(CommandManager): self.__add_accounts_to_field(session_context["user_jids"], field, lang_class) result_form.as_xml(command_node) - return [] + return result_form def add_form_select_account(self, session_context, command_node, lang_class): @@ -324,33 +325,35 @@ class JCLCommandManager(CommandManager): self.__add_accounts_to_field([session_context["user_jid"]], field, lang_class) result_form.as_xml(command_node) - return [] + return result_form def select_user_jids_step_1(self, info_query, session_context, command_node, lang_class): self.__logger.debug("Executing select_user_jids step 1") self.add_actions(command_node, [ACTION_NEXT]) - return self.add_form_select_user_jids(command_node, lang_class) + return (self.add_form_select_user_jids(command_node, lang_class), []) def select_user_jid_step_1(self, info_query, session_context, command_node, lang_class): self.__logger.debug("Executing select_user_jid step 1") self.add_actions(command_node, [ACTION_NEXT]) - return self.add_form_select_user_jid(command_node, lang_class) + return (self.add_form_select_user_jid(command_node, lang_class), []) def select_accounts_step_2(self, info_query, session_context, command_node, lang_class): self.__logger.debug("Executing select_accounts step 2") self.add_actions(command_node, [ACTION_PREVIOUS, ACTION_COMPLETE], 1) - return self.add_form_select_accounts(session_context, command_node, - lang_class) + return (self.add_form_select_accounts(session_context, command_node, + lang_class), + []) def select_account_step_2(self, info_query, session_context, command_node, lang_class): self.__logger.debug("Executing select_account step 2") self.add_actions(command_node, [ACTION_PREVIOUS, ACTION_COMPLETE], 1) - return self.add_form_select_account(session_context, command_node, - lang_class) + return (self.add_form_select_account(session_context, command_node, + lang_class), + []) def execute_list_1(self, info_query, session_context, command_node, lang_class): @@ -367,7 +370,7 @@ class JCLCommandManager(CommandManager): result_form.add_item(fields) result_form.as_xml(command_node) command_node.setProp("status", STATUS_COMPLETED) - return [] + return (result_form, []) def execute_add_user_1(self, info_query, session_context, command_node, lang_class): @@ -386,7 +389,7 @@ class JCLCommandManager(CommandManager): field_type="jid-single", label=lang_class.field_user_jid) result_form.as_xml(command_node) - return [] + return (result_form, []) def execute_add_user_2(self, info_query, session_context, command_node, lang_class): @@ -399,7 +402,7 @@ class JCLCommandManager(CommandManager): account_class, user_jid) result_form.as_xml(command_node) - return [] + return (result_form, []) def execute_add_user_3(self, info_query, session_context, command_node, lang_class): @@ -415,7 +418,7 @@ class JCLCommandManager(CommandManager): lang_class=lang_class, x_data=x_data) command_node.setProp("status", STATUS_COMPLETED) - return to_send + return (None, to_send) execute_delete_user_1 = select_user_jids_step_1 execute_delete_user_2 = select_accounts_step_2 @@ -429,7 +432,7 @@ class JCLCommandManager(CommandManager): result += self.account_manager.remove_account_from_name(user_jid, name) command_node.setProp("status", STATUS_COMPLETED) - return result + return (None, result) execute_disable_user_1 = select_user_jids_step_1 execute_disable_user_2 = select_accounts_step_2 @@ -443,7 +446,7 @@ class JCLCommandManager(CommandManager): _account = account.get_account(user_jid, name) _account.enabled = False command_node.setProp("status", STATUS_COMPLETED) - return result + return (None, result) execute_reenable_user_1 = select_user_jids_step_1 execute_reenable_user_2 = select_accounts_step_2 @@ -457,7 +460,7 @@ class JCLCommandManager(CommandManager): _account = account.get_account(user_jid, name) _account.enabled = True command_node.setProp("status", STATUS_COMPLETED) - return result + return (None, result) execute_end_user_session_1 = select_user_jids_step_1 execute_end_user_session_2 = select_accounts_step_2 @@ -472,7 +475,7 @@ class JCLCommandManager(CommandManager): result += self.component.account_manager.send_presence_unavailable( _account) command_node.setProp("status", STATUS_COMPLETED) - return result + return (None, result) execute_get_user_password_1 = select_user_jid_step_1 execute_get_user_password_2 = select_account_step_2 @@ -492,10 +495,30 @@ class JCLCommandManager(CommandManager): value=_account.password)) result_form.as_xml(command_node) command_node.setProp("status", STATUS_COMPLETED) - return [] + return (result_form, []) - def execute_change_user_password(self, info_query): - return [] + execute_change_user_password_1 = select_user_jid_step_1 + + def execute_change_user_password_2(self, info_query, session_context, + command_node, lang_class): + self.__logger.debug("Executing command 'change-user-password' step 2") + (result_form, result) = self.select_account_step_2(info_query, + session_context, + command_node, + lang_class) + result_form.add_field(field_type="text-private", + name="password", + label=lang_class.field_password) + return (result_form, result) + + def execute_change_user_password_3(self, info_query, session_context, + command_node, lang_class): + self.__logger.debug("Executing command 'change-user-password' step 2") + _account = account.get_account(session_context["user_jid"], + session_context["account_name"]) + _account.password = session_context["password"] + command_node.setProp("status", STATUS_COMPLETED) + return (None, []) def execute_get_user_roster(self, info_query): return [] diff --git a/src/jcl/jabber/tests/command.py b/src/jcl/jabber/tests/command.py index 45d0769..03996cd 100644 --- a/src/jcl/jabber/tests/command.py +++ b/src/jcl/jabber/tests/command.py @@ -1163,14 +1163,97 @@ class JCLCommandManager_TestCase(unittest.TestCase): self.assertEquals(fields[2].children.content, "pass1") -# def test_execute_change_user_password(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_change_user_password(self): + self.comp.account_manager.account_classes = (ExampleAccount, + Example2Account) + model.db_connect() + account11 = ExampleAccount(user_jid="test1@test.com", + name="account11", + jid="account11@jcl.test.com") + account11.password = "pass1" + account12 = Example2Account(user_jid="test1@test.com", + name="account12", + jid="account12@jcl.test.com") + account21 = ExampleAccount(user_jid="test2@test.com", + name="account21", + jid="account21@jcl.test.com") + account22 = ExampleAccount(user_jid="test2@test.com", + name="account11", + jid="account11@jcl.test.com") + 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#change-user-password") + result = self.command_manager.apply_command_action(info_query, + "http://jabber.org/protocol/admin#change-user-password", + "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"]) + + # 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#change-user-password") + 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-single", + name="user_jid", + value="test1@test.com") + submit_form.as_xml(command_node) + result = self.command_manager.apply_command_action(info_query, + "http://jabber.org/protocol/admin#change-user-password", + "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.assertEquals(xml_command.prop("sessionid"), session_id) + self.__check_actions(result[0], ["prev", "complete"], 1) + context_session = self.command_manager.sessions[session_id][1] + self.assertEquals(context_session["user_jid"], + "test1@test.com") + + # Third 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#change-user-password") + command_node.setProp("sessionid", session_id) + command_node.setProp("action", "complete") + submit_form = Form(xmlnode_or_type="submit") + submit_form.add_field(field_type="list-single", + name="account_name", + value="account11") + submit_form.add_field(field_type="text-private", + name="password", + value="pass2") + submit_form.as_xml(command_node) + result = self.command_manager.apply_command_action(info_query, + "http://jabber.org/protocol/admin#change-user-password", + "execute") + 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]) + self.assertEquals(context_session["account_name"], + "account11") + self.assertEquals(context_session["password"], + "pass2") + self.assertEquals(account11.password, "pass2") # def test_execute_get_user_roster(self): # #TODO : implement command diff --git a/src/jcl/lang.py b/src/jcl/lang.py index 7c0413a..d5d0a04 100644 --- a/src/jcl/lang.py +++ b/src/jcl/lang.py @@ -105,6 +105,7 @@ class Lang: field_offline_action_0 = field_action_0 field_user_jid = u"User JID" + field_password = u"Password" error_subject = u"Error" error_body = u"An error has occured:\n\t%s" @@ -152,6 +153,7 @@ class Lang: field_offline_action_0 = field_action_0 field_user_jid = u"JID utilisateur" + field_password = u"Mot de passe" error_subject = u"Erreur" error_body = u"Une erreur est survenue :\n\t%s" diff --git a/src/jcl/tests/lang.py b/src/jcl/tests/lang.py index 1f5e726..1f028ae 100644 --- a/src/jcl/tests/lang.py +++ b/src/jcl/tests/lang.py @@ -109,6 +109,7 @@ class Language_TestCase(unittest.TestCase): self.assertNotEquals(self.lang_class.field_offline_action_0, None) self.assertNotEquals(self.lang_class.field_user_jid, None) + self.assertNotEquals(self.lang_class.field_password, None) self.assertNotEquals(self.lang_class.error_subject, None) self.assertNotEquals(self.lang_class.error_body % (""), None)