From 147071ff643971b4d873ddbdb16e347e4e353652 Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Sat, 1 Jun 2024 00:06:56 +0200 Subject: [PATCH] [muc] Fix changeSubject() to throw XMPPErrorException on failures When Smack requests a subject change of a MUC, an error returned by the server (eg: 'forbidden') should be propagated (as suggested by the pre-existing javadoc). Reported-by: Guus der Kinderen --- .../org/jivesoftware/smackx/muc/MultiUserChat.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MultiUserChat.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MultiUserChat.java index 5c3f687c4..45d474749 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MultiUserChat.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MultiUserChat.java @@ -2248,17 +2248,20 @@ public class MultiUserChat { * @throws InterruptedException if the calling thread was interrupted. */ public void changeSubject(final String subject) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException { - MessageBuilder message = buildMessage(); - message.setSubject(subject); + Message message = buildMessage() + .setSubject(subject) + .build(); // Wait for an error or confirmation message back from the server. - StanzaFilter responseFilter = new AndFilter(fromRoomGroupchatFilter, new StanzaFilter() { + StanzaFilter successFilter = new AndFilter(fromRoomGroupchatFilter, new StanzaFilter() { @Override public boolean accept(Stanza packet) { Message msg = (Message) packet; return subject.equals(msg.getSubject()); } }); - StanzaCollector response = connection.createStanzaCollectorAndSend(responseFilter, message.build()); + StanzaFilter errorFilter = new AndFilter(fromRoomFilter, new StanzaIdFilter(message), MessageTypeFilter.ERROR); + StanzaFilter responseFilter = new OrFilter(successFilter, errorFilter); + StanzaCollector response = connection.createStanzaCollectorAndSend(responseFilter, message); // Wait up to a certain number of seconds for a reply. response.nextResultOrThrow(); }