Author: ngn
Date: Mon Aug 10 15:17:58 2009
New Revision: 802822

URL: http://svn.apache.org/viewvc?rev=802822&view=rev
Log:
Add support for entering password protected room (VYSPER-109)

Modified:
    
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCEnterRoomHandler.java
    
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/Room.java
    
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCEnterRoomHandlerTestCase.java

Modified: 
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCEnterRoomHandler.java
URL: 
http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCEnterRoomHandler.java?rev=802822&r1=802821&r2=802822&view=diff
==============================================================================
--- 
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCEnterRoomHandler.java
 (original)
+++ 
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCEnterRoomHandler.java
 Mon Aug 10 15:17:58 2009
@@ -37,6 +37,8 @@
 import org.apache.vysper.xmpp.stanza.PresenceStanzaType;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+import org.apache.vysper.xmpp.xmlfragment.XMLElement;
+import org.apache.vysper.xmpp.xmlfragment.XMLSemanticError;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -62,7 +64,7 @@
         return verifyInnerNamespace(stanza, NamespaceURIs.XEP0045_MUC);
     }
 
-    private Stanza sendError(Entity roomJid, Entity occupantJid, String error) 
{
+    private Stanza sendError(Entity roomJid, Entity occupantJid, String type, 
String error) {
         //        <presence
         //        from='[email protected]'
         //        to='[email protected]/pda'
@@ -79,7 +81,7 @@
         // the MUC child element (i.e., <x 
xmlns='http://jabber.org/protocol/muc'/>) in the 
         // <presence/> stanza of type "error"."
         builder.startInnerElement("x", 
NamespaceURIs.XEP0045_MUC).endInnerElement();
-        builder.startInnerElement("error").addAttribute("type", "modify");
+        builder.startInnerElement("error").addAttribute("type", type);
         builder.startInnerElement(error, 
NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS).endInnerElement();
         builder.endInnerElement();
         
@@ -99,12 +101,35 @@
         
         // user did not send nick name
         if(nick == null) {
-            return sendError(roomJid, newOccupantJid, "jid-malformed");
+            return sendError(roomJid, newOccupantJid, "modify", 
"jid-malformed");
         }
         
         // TODO what to use for the room name?
         Room room = conference.findOrCreateRoom(roomJid, roomJid.getNode());
         
+        // check password if password protected
+        if(room.isRoomType(RoomType.PasswordProtected)) {
+            // TODO room constructor for password
+            
+            String password = null;
+            try {
+                XMLElement xElement = stanza.getSingleInnerElementsNamed("x");
+                if(xElement != null) {
+                    XMLElement passwordElement = 
xElement.getSingleInnerElementsNamed("password");
+                    if(passwordElement != null) {
+                        password = passwordElement.getInnerText().getText();
+                    }
+                }
+            } catch (XMLSemanticError e) {
+                password = null;
+            }
+            
+            if(password == null || !password.equals(room.getPassword())) {
+                // password missing or not matching
+                return sendError(roomJid, newOccupantJid, "auth", 
"not-authorized");
+            }
+        }
+        
         Occupant newOccupant = room.addOccupant(newOccupantJid, nick);
         
         // relay presence of all existing room occupants to the now joined 
occupant

Modified: 
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/Room.java
URL: 
http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/Room.java?rev=802822&r1=802821&r2=802822&view=diff
==============================================================================
--- 
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/Room.java
 (original)
+++ 
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/Room.java
 Mon Aug 10 15:17:58 2009
@@ -52,6 +52,7 @@
 
     private Entity jid;
     private String name;
+    private String password;
     
     // keep in a map to allow for quick access
     private Map<Entity, Occupant> occupants = new ConcurrentHashMap<Entity, 
Occupant>();
@@ -94,6 +95,10 @@
     public EnumSet<RoomType> getRoomTypes() {
         return roomTypes.clone();
     }
+    
+    public boolean isRoomType(RoomType type) {
+        return roomTypes.contains(type);
+    }
 
     public Occupant addOccupant(Entity occupantJid, String name) {
         // TODO uses a default Affiliation.None, later to be looked up based 
on the user
@@ -112,7 +117,6 @@
     
     public Set<Occupant> getOccupants() {
         Set<Occupant> set = new HashSet<Occupant>();
-        
         for(Occupant occupant : occupants.values()) {
             set.add(occupant);
         }
@@ -138,5 +142,13 @@
         // TODO Auto-generated method stub
         return null;
     }
+
+    public String getPassword() {
+        return password;
+    }
+    
+    public void setPassword(String password) {
+        this.password = password;
+    }
     
 }

Modified: 
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCEnterRoomHandlerTestCase.java
URL: 
http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCEnterRoomHandlerTestCase.java?rev=802822&r1=802821&r2=802822&view=diff
==============================================================================
--- 
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCEnterRoomHandlerTestCase.java
 (original)
+++ 
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCEnterRoomHandlerTestCase.java
 Mon Aug 10 15:17:58 2009
@@ -13,6 +13,7 @@
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Conference;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Occupant;
 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.protocol.NamespaceURIs;
 import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.server.TestSessionContext;
@@ -63,9 +64,17 @@
     }
 
     private Stanza enterRoom(Entity occupantJid, Entity roomJid) {
+        return enterRoom(occupantJid, roomJid, null);
+    }
+    
+    private Stanza enterRoom(Entity occupantJid, Entity roomJid, String 
password) {
         StanzaBuilder stanzaBuilder = 
StanzaBuilder.createPresenceStanza(occupantJid, roomJid, null, null, null, 
null);
-        
stanzaBuilder.startInnerElement("x").addNamespaceAttribute(NamespaceURIs.XEP0045_MUC).endInnerElement();
-
+        
stanzaBuilder.startInnerElement("x").addNamespaceAttribute(NamespaceURIs.XEP0045_MUC);
+        if(password != null) {
+            
stanzaBuilder.startInnerElement("password").addText(password).endInnerElement();
+        }
+        
+        stanzaBuilder.endInnerElement();
         Stanza presenceStanza = stanzaBuilder.getFinalStanza();
         ResponseStanzaContainer container = handler.execute(presenceStanza, 
sessionContext.getServerRuntimeContext(), true, sessionContext, null);
         if(container != null) {
@@ -107,10 +116,33 @@
         // try entering without a nick
         PresenceStanza response = (PresenceStanza) enterRoom(occupant1Jid, 
room1Jid);
 
+        assertErrorStanza(response, room1Jid, occupant1Jid, "modify", 
"jid-malformed");
+    }
+    
+    public void testEnterWithPassword() {
+        Room room = conference.createRoom(room2Jid, "Room 1", 
RoomType.PasswordProtected);
+        room.setPassword("secret");
+
+        // no error should be returned
+        assertNull(enterRoom(occupant1Jid, room2JidWithNick, "secret"));
+        assertEquals(1, room.getOccupants().size());
+    }
+    
+    public void testEnterWithoutPassword() {
+        Room room = conference.createRoom(room2Jid, "Room 1", 
RoomType.PasswordProtected);
+        room.setPassword("secret");
+
+        // try entering without a password
+        PresenceStanza response = (PresenceStanza) enterRoom(occupant1Jid, 
room2JidWithNick);
+        
+        assertErrorStanza(response, room2Jid, occupant1Jid, "auth", 
"not-authorized");
+    }
+
+    private void assertErrorStanza(PresenceStanza response, Entity from, 
Entity to, String type, String errorName) {
         assertNotNull(response);
         assertEquals("presence", response.getName());
-        assertEquals(occupant1Jid, response.getTo());
-        assertEquals(room1Jid, response.getFrom());
+        assertEquals(to, response.getTo());
+        assertEquals(from, response.getFrom());
         assertEquals("error", response.getType());
         
         List<XMLElement> innerElements = response.getInnerElements();
@@ -121,12 +153,11 @@
 
         XMLElement errorElement = innerElements.get(1);
         assertEquals("error", errorElement.getName());
-        assertEquals("modify", errorElement.getAttributeValue("type"));
+        assertEquals(type, errorElement.getAttributeValue("type"));
         
         XMLElement jidMalformedElement = errorElement.getFirstInnerElement();
-        assertEquals("jid-malformed", jidMalformedElement.getName());
+        assertEquals(errorName, jidMalformedElement.getName());
         assertEquals(NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS, 
jidMalformedElement.getNamespaceURI());
-        
     }
     
     public void testEnterRoomWithRelays() throws Exception {
@@ -139,14 +170,6 @@
         // now, let user 2 enter room
         enterRoom(occupant2Jid, room1JidWithNick);
 
-//        <presence
-//        from='[email protected]/firstwitch'
-//        to='[email protected]/pda'>
-//      <x xmlns='http://jabber.org/protocol/muc#user'>
-//        <item affiliation='owner' role='moderator'/>
-//      </x>
-//    </presence>
-
         // verify stanzas to existing occupants on the new user
         Stanza user2JoinedStanza = occupant1Queue.getNext();
         // should be from room + nick name


Reply via email to