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