Author: ngn
Date: Sat Jun 26 20:14:07 2010
New Revision: 958278
URL: http://svn.apache.org/viewvc?rev=958278&view=rev
Log:
Fully implemented moderator kicking an occupant (VYSPER-124)
Modified:
mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCHandlerHelper.java
mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCIqAdminHandler.java
mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandler.java
mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandler.java
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCHandlerTestCase.java
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ModeratorKickOccupantTestCase.java
Modified:
mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCHandlerHelper.java
URL:
http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCHandlerHelper.java?rev=958278&r1=958277&r2=958278&view=diff
==============================================================================
---
mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCHandlerHelper.java
(original)
+++
mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCHandlerHelper.java
Sat Jun 26 20:14:07 2010
@@ -33,6 +33,8 @@ import org.apache.vysper.xmpp.modules.ex
import org.apache.vysper.xmpp.protocol.NamespaceURIs;
import org.apache.vysper.xmpp.stanza.Stanza;
import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+import org.apache.vysper.xmpp.stanza.StanzaErrorCondition;
+import org.apache.vysper.xmpp.stanza.StanzaErrorType;
/**
*
@@ -60,7 +62,7 @@ public class MUCHandlerHelper {
}
}
- public static Stanza createErrorStanza(String stanzaName, Entity from,
Entity to, String id, String type, String errorName, List<XMLElement>
innerElements) {
+ public static Stanza createErrorStanza(String stanzaName, String
namespaceUri, Entity from, Entity to, String id, String type, String errorName,
List<XMLElement> innerElements) {
// <presence
// from='[email protected]'
// to='[email protected]/pda'
@@ -70,7 +72,7 @@ public class MUCHandlerHelper {
// </error>
// </presence>
- StanzaBuilder builder = new StanzaBuilder(stanzaName);
+ StanzaBuilder builder = new StanzaBuilder(stanzaName, namespaceUri);
builder.addAttribute("from", from.getFullQualifiedName());
builder.addAttribute("to", to.getFullQualifiedName());
if(id != null) builder.addAttribute("id", id);
@@ -88,6 +90,25 @@ public class MUCHandlerHelper {
return builder.build();
}
+
+ public static Stanza createErrorReply(Stanza originalStanza,
StanzaErrorType type, StanzaErrorCondition error) {
+ StanzaBuilder builder = new StanzaBuilder(originalStanza.getName(),
originalStanza.getNamespaceURI());
+ builder.addAttribute("from",
originalStanza.getTo().getFullQualifiedName());
+ builder.addAttribute("to",
originalStanza.getFrom().getFullQualifiedName());
+ builder.addAttribute("id", originalStanza.getAttributeValue("id"));
+ builder.addAttribute("type", "error");
+
+ for(XMLElement inner : originalStanza.getInnerElements()) {
+ builder.addPreparedElement(inner);
+ }
+
+
builder.startInnerElement("error",NamespaceURIs.JABBER_CLIENT).addAttribute("type",
type.value());
+ builder.startInnerElement(error.value(),
NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS).endInnerElement();
+ builder.endInnerElement();
+
+ return builder.build();
+ }
+
public static Stanza createInviteMessageStanza(Stanza original, String
password) throws EntityFormatException {
X orginalX = X.fromStanza(original);
Modified:
mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCIqAdminHandler.java
URL:
http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCIqAdminHandler.java?rev=958278&r1=958277&r2=958278&view=diff
==============================================================================
---
mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCIqAdminHandler.java
(original)
+++
mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCIqAdminHandler.java
Sat Jun 26 20:14:07 2010
@@ -91,35 +91,43 @@ public class MUCIqAdminHandler extends D
List<IqAdminItem> items =
IqAdminItem.extractItems(stanza);
for(IqAdminItem item : items) {
-
-
if(item.getRole().equals(Role.None)) {
// kicking a user
// find kicked users jid
- Occupant kicked = null;
+ Occupant toBeKicked = null;
if(item.getNick() != null) {
- kicked =
room.findOccupantByNick(item.getNick());
+ toBeKicked =
room.findOccupantByNick(item.getNick());
} else {
// TODO fix
}
+ // a moderator can not kick someone
with a higher affiliation
+ // and, you can not kick yourself
+
if(toBeKicked.getAffiliation().compareTo(moderator.getAffiliation()) < 0) {
+ return
MUCHandlerHelper.createErrorReply(stanza, StanzaErrorType.CANCEL,
StanzaErrorCondition.NOT_ALLOWED);
+ }
+
+
if(moderator.getJid().equals(toBeKicked.getJid())) {
+ return
MUCHandlerHelper.createErrorReply(stanza, StanzaErrorType.CANCEL,
StanzaErrorCondition.CONFLICT);
+ }
+
// remove user from room
- kicked.setRole(Role.None);
- room.removeOccupant(kicked.getJid());
- Entity kickedInRoom = roomAndNick(room,
kicked);
+ toBeKicked.setRole(Role.None);
+
room.removeOccupant(toBeKicked.getJid());
+ Entity kickedInRoom = roomAndNick(room,
toBeKicked);
Status kickedStatus = new
Status(StatusCode.BEEN_KICKED);
// notify user he got kicked
- Stanza presenceToKicked =
MUCStanzaBuilder.createPresenceStanza(kickedInRoom, kicked.getJid(),
+ Stanza presenceToKicked =
MUCStanzaBuilder.createPresenceStanza(kickedInRoom, toBeKicked.getJid(),
PresenceStanzaType.UNAVAILABLE, NamespaceURIs.XEP0045_MUC_USER,
new
MucUserPresenceItem(Affiliation.None, Role.None),
// TODO handle <actor>
// TODO handle <reason>
kickedStatus);
- relayStanza(kicked.getJid(),
presenceToKicked, serverRuntimeContext);
+ relayStanza(toBeKicked.getJid(),
presenceToKicked, serverRuntimeContext);
// notify remaining users that user got
kicked
for(Occupant remaining :
room.getOccupants()) {
Modified:
mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandler.java
URL:
http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandler.java?rev=958278&r1=958277&r2=958278&view=diff
==============================================================================
---
mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandler.java
(original)
+++
mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandler.java
Sat Jun 26 20:14:07 2010
@@ -37,6 +37,7 @@ import org.apache.vysper.xmpp.modules.ex
import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Room;
import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.RoomType;
import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.X;
+import org.apache.vysper.xmpp.protocol.NamespaceURIs;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
import org.apache.vysper.xmpp.server.SessionContext;
import org.apache.vysper.xmpp.stanza.MessageStanza;
@@ -77,7 +78,7 @@ public class MUCMessageHandler extends D
private Stanza createMessageErrorStanza(Entity from, Entity to, String id,
StanzaErrorType type,
StanzaErrorCondition errorCondition, Stanza stanza) {
- return MUCHandlerHelper.createErrorStanza("message", from, to, id,
type.value(), errorCondition.value(), stanza.getInnerElements());
+ return MUCHandlerHelper.createErrorStanza("message",
NamespaceURIs.JABBER_CLIENT, from, to, id, type.value(),
errorCondition.value(), stanza.getInnerElements());
}
@Override
Modified:
mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandler.java
URL:
http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandler.java?rev=958278&r1=958277&r2=958278&view=diff
==============================================================================
---
mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandler.java
(original)
+++
mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandler.java
Sat Jun 26 20:14:07 2010
@@ -82,7 +82,7 @@ public class MUCPresenceHandler extends
// the MUC child element (i.e., <x
xmlns='http://jabber.org/protocol/muc'/>) in the
// <presence/> stanza of type "error"."
- return MUCHandlerHelper.createErrorStanza("presence", from, to, id,
type, errorName, Arrays.asList((XMLElement)new X()));
+ return MUCHandlerHelper.createErrorStanza("presence",
NamespaceURIs.JABBER_CLIENT, from, to, id, type, errorName,
Arrays.asList((XMLElement)new X()));
}
@Override
Modified:
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCHandlerTestCase.java
URL:
http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCHandlerTestCase.java?rev=958278&r1=958277&r2=958278&view=diff
==============================================================================
---
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCHandlerTestCase.java
(original)
+++
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCHandlerTestCase.java
Sat Jun 26 20:14:07 2010
@@ -25,6 +25,7 @@ import java.util.List;
import junit.framework.TestCase;
+import org.apache.vysper.xml.fragment.Renderer;
import org.apache.vysper.xml.fragment.XMLElement;
import org.apache.vysper.xml.fragment.XMLSemanticError;
import org.apache.vysper.xmpp.addressing.Entity;
@@ -105,7 +106,7 @@ public abstract class AbstractMUCHandler
int index = 0;
if(expectedInnerElements != null) {
for(XMLElement expectedInnerElement : expectedInnerElements) {
- assertEquals(expectedInnerElement, innerElements.get(index));
+ assertEquals(new Renderer(expectedInnerElement).getComplete()
+ "\n" + new Renderer(innerElements.get(index)).getComplete(),
expectedInnerElement, innerElements.get(index));
index++;
}
}
Modified:
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ModeratorKickOccupantTestCase.java
URL:
http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ModeratorKickOccupantTestCase.java?rev=958278&r1=958277&r2=958278&view=diff
==============================================================================
---
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ModeratorKickOccupantTestCase.java
(original)
+++
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ModeratorKickOccupantTestCase.java
Sat Jun 26 20:14:07 2010
@@ -21,50 +21,112 @@ package org.apache.vysper.xmpp.modules.e
import static org.apache.vysper.xmpp.stanza.IQStanzaType.SET;
+import org.apache.vysper.xml.fragment.XMLElement;
+import org.apache.vysper.xml.fragment.XMLElementBuilder;
import org.apache.vysper.xmpp.addressing.EntityImpl;
import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Affiliation;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Occupant;
import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Role;
import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Room;
import
org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.IqAdminItem;
import
org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.MucUserPresenceItem;
import
org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.Status.StatusCode;
import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.protocol.ProtocolException;
import org.apache.vysper.xmpp.protocol.StanzaHandler;
import org.apache.vysper.xmpp.stanza.IQStanza;
-
/**
*/
public class ModeratorKickOccupantTestCase extends AbstractMUCHandlerTestCase {
- public void testChangeSubject() throws Exception {
+ public void testKickUser() throws Exception {
Room room = conference.findOrCreateRoom(ROOM2_JID, "Room 2");
room.addOccupant(OCCUPANT1_JID, "nick").setRole(Role.Moderator);
room.addOccupant(OCCUPANT2_JID, "Nick 2");
assertNotNull(room.findOccupantByNick("Nick 2"));
-
+
// send message to room
- IQStanza result = (IQStanza) IQStanza.getWrapper(sendIq(OCCUPANT1_JID,
ROOM2_JID, SET, "id1", NamespaceURIs.XEP0045_MUC_ADMIN, new IqAdminItem("Nick
2", Role.None)));
-
+ IQStanza result = (IQStanza) IQStanza.getWrapper(sendIq(OCCUPANT1_JID,
ROOM2_JID, SET, "id1",
+ NamespaceURIs.XEP0045_MUC_ADMIN, new IqAdminItem("Nick 2",
Role.None)));
+
assertIqResultStanza(ROOM2_JID, OCCUPANT1_JID, "id1", result);
-
+
assertNull(room.findOccupantByNick("Nick 2"));
// verify that kicked user got presence
- assertPresenceStanza(occupant2Queue.getNext(), new
EntityImpl(ROOM2_JID, "Nick 2"), OCCUPANT2_JID, "unavailable",
- new MucUserPresenceItem(null, null, Affiliation.None,
Role.None),
- StatusCode.BEEN_KICKED);
+ assertPresenceStanza(occupant2Queue.getNext(), new
EntityImpl(ROOM2_JID, "Nick 2"), OCCUPANT2_JID,
+ "unavailable", new MucUserPresenceItem(null, null,
Affiliation.None, Role.None), StatusCode.BEEN_KICKED);
// verify that remaining users got presence
- assertPresenceStanza(occupant1Queue.getNext(), new
EntityImpl(ROOM2_JID, "Nick 2"), OCCUPANT1_JID, "unavailable",
- new MucUserPresenceItem(null, null, Affiliation.None,
Role.None),
- StatusCode.BEEN_KICKED);
+ assertPresenceStanza(occupant1Queue.getNext(), new
EntityImpl(ROOM2_JID, "Nick 2"), OCCUPANT1_JID,
+ "unavailable", new MucUserPresenceItem(null, null,
Affiliation.None, Role.None), StatusCode.BEEN_KICKED);
+ }
+
+ public void testMemberAttemptKickAdmin() throws Exception {
+ Room room = conference.findOrCreateRoom(ROOM2_JID, "Room 2");
+ Occupant occupant1 = room.addOccupant(OCCUPANT1_JID, "nick");
+ occupant1.setAffiliation(Affiliation.Member);
+ occupant1.setRole(Role.Moderator);
+
+ room.addOccupant(OCCUPANT2_JID, "Nick
2").setAffiliation(Affiliation.Admin);
+
+ testKickNotAllowed(room, "Nick 2", "not-allowed");
+ }
+
+ public void testMemberAttemptKickOwner() throws Exception {
+ Room room = conference.findOrCreateRoom(ROOM2_JID, "Room 2");
+ Occupant occupant1 = room.addOccupant(OCCUPANT1_JID, "nick");
+ occupant1.setAffiliation(Affiliation.Member);
+ occupant1.setRole(Role.Moderator);
+
+ room.addOccupant(OCCUPANT2_JID, "Nick
2").setAffiliation(Affiliation.Owner);
+
+ testKickNotAllowed(room, "Nick 2", "not-allowed");
+ }
+
+ public void testAdminAttemptKickOwner() throws Exception {
+ Room room = conference.findOrCreateRoom(ROOM2_JID, "Room 2");
+ Occupant occupant1 = room.addOccupant(OCCUPANT1_JID, "nick");
+ occupant1.setAffiliation(Affiliation.Admin);
+ occupant1.setRole(Role.Moderator);
+
+ room.addOccupant(OCCUPANT2_JID, "Nick
2").setAffiliation(Affiliation.Owner);
+
+ testKickNotAllowed(room, "Nick 2", "not-allowed");
+ }
+
+ public void testToKickYourself() throws Exception {
+ Room room = conference.findOrCreateRoom(ROOM2_JID, "Room 2");
+ Occupant occupant1 = room.addOccupant(OCCUPANT1_JID, "nick");
+ occupant1.setAffiliation(Affiliation.Admin);
+ occupant1.setRole(Role.Moderator);
+
+ room.addOccupant(OCCUPANT2_JID, "Nick
2").setAffiliation(Affiliation.Owner);
+
+ testKickNotAllowed(room, "nick", "conflict");
}
- @Override
- protected StanzaHandler createHandler() {
- return new MUCIqAdminHandler(conference);
- }
+
+ private void testKickNotAllowed(Room room, String nickToKick, String
expectedError) throws ProtocolException {
+ // send message to room
+ IQStanza result = (IQStanza) IQStanza.getWrapper(sendIq(OCCUPANT1_JID,
ROOM2_JID, SET, "id1",
+ NamespaceURIs.XEP0045_MUC_ADMIN, new IqAdminItem(nickToKick,
Role.None)));
+
+ XMLElement expectedInner = new XMLElementBuilder("query",
NamespaceURIs.XEP0045_MUC_ADMIN).startInnerElement(
+ "item", NamespaceURIs.XEP0045_MUC_ADMIN).addAttribute("nick",
nickToKick).addAttribute("role", "none")
+ .endInnerElement().build();
+
+ assertErrorStanza(result, "iq", ROOM2_JID, OCCUPANT1_JID, "cancel",
expectedError, expectedInner);
+
+ assertNotNull(room.findOccupantByNick("nick"));
+ assertNotNull(room.findOccupantByNick("Nick 2"));
+ }
+
+ @Override
+ protected StanzaHandler createHandler() {
+ return new MUCIqAdminHandler(conference);
+ }
}