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);
+    }
 
 }


Reply via email to