Author: ngn
Date: Fri Jul 30 21:43:30 2010
New Revision: 980976
URL: http://svn.apache.org/viewvc?rev=980976&view=rev
Log:
Implemented role changing use cases (VYSPER-125, VYSPER-126, VYSPER-135,
VYSPER-136)
Added:
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/GrantModeratorTestCase.java
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/GrantVoiceTestCase.java
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/RevokeModeratorTestCase.java
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/RevokeVoiceTestCase.java
Modified:
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/MUCPresenceHandler.java
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCHandlerTestCase.java
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=980976&r1=980975&r2=980976&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
Fri Jul 30 21:43:30 2010
@@ -19,8 +19,7 @@
*/
package org.apache.vysper.xmpp.modules.extension.xep0045_muc.handler;
-import java.util.List;
-
+import org.apache.vysper.xml.fragment.XMLElement;
import org.apache.vysper.xml.fragment.XMLSemanticError;
import org.apache.vysper.xmpp.addressing.Entity;
import org.apache.vysper.xmpp.addressing.EntityImpl;
@@ -78,77 +77,128 @@ public class MUCIqAdminHandler extends D
@Override
protected Stanza handleSet(IQStanza stanza, ServerRuntimeContext
serverRuntimeContext, SessionContext sessionContext) {
-
Room room = conference.findRoom(stanza.getTo());
Occupant moderator = room.findOccupantByJID(stanza.getFrom());
- // TODO add check if moderator or admin
+ // check if moderator
+ if (moderator.getRole() != Role.Moderator) {
+ // only moderators are allowed to continue
+ return MUCHandlerHelper.createErrorReply(stanza,
StanzaErrorType.AUTH, StanzaErrorCondition.FORBIDDEN);
+ }
try {
- List<IqAdminItem> items = IqAdminItem.extractItems(stanza);
+ XMLElement query = stanza.getSingleInnerElementsNamed("query",
NamespaceURIs.XEP0045_MUC_ADMIN);
+ XMLElement itemElement = query.getSingleInnerElementsNamed("item",
NamespaceURIs.XEP0045_MUC_ADMIN);
- for (IqAdminItem item : items) {
- if (item.getRole().equals(Role.None)) {
- // kicking a user
-
- // find kicked users jid
- Occupant toBeKicked = null;
- if (item.getNick() != null) {
- 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
- 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, toBeKicked.getJid(),
- PresenceStanzaType.UNAVAILABLE,
NamespaceURIs.XEP0045_MUC_USER, new MucUserPresenceItem(
- Affiliation.None, Role.None),
- // TODO handle <actor>
- // TODO handle <reason>
- kickedStatus);
-
- relayStanza(toBeKicked.getJid(), presenceToKicked,
serverRuntimeContext);
-
- // notify remaining users that user got kicked
- for (Occupant remaining : room.getOccupants()) {
- Stanza presenceToRemaining =
MUCStanzaBuilder.createPresenceStanza(kickedInRoom, remaining
- .getJid(), PresenceStanzaType.UNAVAILABLE,
NamespaceURIs.XEP0045_MUC_USER,
- new MucUserPresenceItem(Affiliation.None,
Role.None), kickedStatus);
+ IqAdminItem item = IqAdminItem.getWrapper(itemElement);
- relayStanza(remaining.getJid(), presenceToRemaining,
serverRuntimeContext);
- }
- }
+ Occupant target = null;
+ if (item.getNick() != null) {
+ target = room.findOccupantByNick(item.getNick());
+ } else {
+ return createBadRequestError(stanza, serverRuntimeContext,
sessionContext, "Missing nick for item");
}
- return StanzaBuilder.createIQStanza(stanza.getTo(),
stanza.getFrom(), IQStanzaType.RESULT, stanza.getID())
- .build();
+ if (item.getRole() != null) {
+ return changeRole(stanza, serverRuntimeContext,
sessionContext, item, room, moderator, target);
+ } else {
+ return createBadRequestError(stanza, serverRuntimeContext,
sessionContext, "Unknown IQ stanza");
+ }
} catch (XMLSemanticError e) {
- return
ServerErrorResponses.getInstance().getStanzaError(StanzaErrorCondition.BAD_REQUEST,
stanza,
- StanzaErrorType.MODIFY, "iq stanza of type set requires
exactly one query element",
- getErrorLanguage(serverRuntimeContext, sessionContext),
null);
+ return createBadRequestError(stanza, serverRuntimeContext,
sessionContext,
+ "iq stanza of type set requires exactly one query
element");
+ }
+
+ }
+
+ private Stanza createBadRequestError(IQStanza stanza, ServerRuntimeContext
serverRuntimeContext,
+ SessionContext sessionContext, String message) {
+ return
ServerErrorResponses.getInstance().getStanzaError(StanzaErrorCondition.BAD_REQUEST,
stanza,
+ StanzaErrorType.MODIFY, "iq stanza of type set requires
exactly one query element",
+ getErrorLanguage(serverRuntimeContext, sessionContext), null);
+ }
+
+ private Stanza changeRole(IQStanza stanza, ServerRuntimeContext
serverRuntimeContext,
+ SessionContext sessionContext, IqAdminItem item, Room room,
Occupant moderator, Occupant target) {
+ Role newRole = item.getRole();
+
+ // you can not change yourself
+ if (moderator.getJid().equals(target.getJid())) {
+ return MUCHandlerHelper.createErrorReply(stanza,
StanzaErrorType.CANCEL, StanzaErrorCondition.CONFLICT);
+ }
+
+ // verify change
+ if (newRole == Role.None) {
+ // a moderator can not kick someone with a higher affiliation
+ if (target.getAffiliation().compareTo(moderator.getAffiliation())
< 0) {
+ return MUCHandlerHelper.createErrorReply(stanza,
StanzaErrorType.CANCEL,
+ StanzaErrorCondition.NOT_ALLOWED);
+ }
+ } else if (newRole == Role.Visitor) {
+ // moderator, admin and owner can not have their voice revoked
+ if (target.getAffiliation() == Affiliation.Admin ||
target.getAffiliation() == Affiliation.Owner) {
+ return MUCHandlerHelper.createErrorReply(stanza,
StanzaErrorType.CANCEL,
+ StanzaErrorCondition.NOT_ALLOWED);
+ }
+ } else if (newRole == Role.Participant) {
+ if (target.getRole() == Role.Moderator) {
+ // only admin and owner might revoke moderator
+ if (moderator.getAffiliation() != Affiliation.Admin &&
moderator.getAffiliation() != Affiliation.Owner) {
+ return MUCHandlerHelper.createErrorReply(stanza,
StanzaErrorType.CANCEL,
+ StanzaErrorCondition.NOT_ALLOWED);
+ }
+ // admin and owners can not be revoked
+ if (target.getAffiliation() == Affiliation.Admin ||
target.getAffiliation() == Affiliation.Owner) {
+ return MUCHandlerHelper.createErrorReply(stanza,
StanzaErrorType.CANCEL,
+ StanzaErrorCondition.NOT_ALLOWED);
+ }
+ }
+ } else if (newRole == Role.Moderator) {
+ // only admin and owner might grant moderator
+ if (moderator.getAffiliation() != Affiliation.Admin &&
moderator.getAffiliation() != Affiliation.Owner) {
+ return MUCHandlerHelper.createErrorReply(stanza,
StanzaErrorType.CANCEL,
+ StanzaErrorCondition.NOT_ALLOWED);
+ }
+ }
+
+ target.setRole(newRole);
+ if (newRole == Role.None) {
+ // remove user from room
+ room.removeOccupant(target.getJid());
+ }
+
+ Entity targetInRoom = roomAndNick(room, target);
+
+ Status status = null;
+ if (newRole == Role.None) {
+ status = new Status(StatusCode.BEEN_KICKED);
+
+ // notify user he got kicked
+ Stanza presenceToKicked =
MUCStanzaBuilder.createPresenceStanza(targetInRoom, target.getJid(),
+ PresenceStanzaType.UNAVAILABLE,
NamespaceURIs.XEP0045_MUC_USER, new MucUserPresenceItem(
+ Affiliation.None, Role.None),
+ // TODO handle <actor>
+ // TODO handle <reason>
+ status);
+
+ relayStanza(target.getJid(), presenceToKicked,
serverRuntimeContext);
+ }
+
+ PresenceStanzaType availType = (newRole == Role.None) ?
PresenceStanzaType.UNAVAILABLE : null;
+
+ // notify remaining users that user got role updated
+ MucUserPresenceItem presenceItem = new
MucUserPresenceItem(target.getAffiliation(), newRole);
+ for (Occupant occupant : room.getOccupants()) {
+ Stanza presenceToRemaining =
MUCStanzaBuilder.createPresenceStanza(targetInRoom, occupant.getJid(),
+ availType, NamespaceURIs.XEP0045_MUC_USER, presenceItem,
status);
+
+ relayStanza(occupant.getJid(), presenceToRemaining,
serverRuntimeContext);
}
+ return StanzaBuilder.createIQStanza(stanza.getTo(), stanza.getFrom(),
IQStanzaType.RESULT, stanza.getID())
+ .build();
}
protected void relayStanza(Entity receiver, Stanza stanza,
ServerRuntimeContext serverRuntimeContext) {
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=980976&r1=980975&r2=980976&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
Fri Jul 30 21:43:30 2010
@@ -103,7 +103,6 @@ public class MUCPresenceHandler extends
}
String type = stanza.getType();
- System.out.println("11111" + stanza);
if (type == null) {
return available(stanza, roomJid, occupantJid, nick,
serverRuntimeContext);
} else if (type.equals("unavailable")) {
@@ -132,7 +131,6 @@ public class MUCPresenceHandler extends
// TODO what to use for the room name?
Room room = conference.findOrCreateRoom(roomJid, roomJid.getNode());
- System.out.println(room);
if (room.isInRoom(newOccupantJid)) {
// user is already in room, change nick
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=980976&r1=980975&r2=980976&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
Fri Jul 30 21:43:30 2010
@@ -192,7 +192,7 @@ public abstract class AbstractMUCHandler
protected void assertPresenceStanza(Stanza stanza, Entity expectedFrom,
Entity expectedTo, String expectedType,
MucUserPresenceItem expectedItem, StatusCode expectedStatus)
throws Exception {
List<MucUserPresenceItem> expectedItems = Arrays.asList(expectedItem);
- List<StatusCode> expectedStatuses = Arrays.asList(expectedStatus);
+ List<StatusCode> expectedStatuses = expectedStatus == null ? null :
Arrays.asList(expectedStatus);
assertPresenceStanza(stanza, expectedFrom, expectedTo, expectedType,
expectedItems, expectedStatuses);
}
@@ -221,7 +221,6 @@ public abstract class AbstractMUCHandler
assertEquals(expectedItem.getAffiliation().toString(),
itemElm.getAttributeValue("affiliation"));
assertEquals(expectedItem.getRole().toString(),
itemElm.getAttributeValue("role"));
}
-
if (expectedStatuses != null) {
for (StatusCode status : expectedStatuses) {
XMLElement statusElm = innerElements.next();
Added:
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/GrantModeratorTestCase.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/GrantModeratorTestCase.java?rev=980976&view=auto
==============================================================================
---
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/GrantModeratorTestCase.java
(added)
+++
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/GrantModeratorTestCase.java
Fri Jul 30 21:43:30 2010
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.vysper.xmpp.modules.extension.xep0045_muc.handler;
+
+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.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 GrantModeratorTestCase extends AbstractMUCHandlerTestCase {
+
+ public void testGrantVoice() throws Exception {
+ Room room = conference.findOrCreateRoom(ROOM2_JID, "Room 2");
+ Occupant occ1 = room.addOccupant(OCCUPANT1_JID, "nick");
+ occ1.setRole(Role.Moderator);
+ occ1.setAffiliation(Affiliation.Admin);
+
+ Occupant occ2 = room.addOccupant(OCCUPANT2_JID, "Nick 2");
+ occ2.setRole(Role.Participant);
+
+ // 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.Moderator)));
+
+ assertIqResultStanza(ROOM2_JID, OCCUPANT1_JID, "id1", result);
+
+ assertEquals(Role.Moderator, room.findOccupantByNick("Nick
2").getRole());
+
+ // verify that remaining users got presence
+ assertPresenceStanza(occupant2Queue.getNext(), new
EntityImpl(ROOM2_JID, "Nick 2"), OCCUPANT2_JID,
+ null, new MucUserPresenceItem(null, null, Affiliation.None,
Role.Moderator), null);
+ assertPresenceStanza(occupant1Queue.getNext(), new
EntityImpl(ROOM2_JID, "Nick 2"), OCCUPANT1_JID,
+ null, new MucUserPresenceItem(null, null, Affiliation.None,
Role.Moderator), null);
+ }
+
+ public void testMemberAttemptGrantModerator() 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");
+
+ testGrantNotAllowed(room, "Nick 2", "not-allowed");
+ }
+
+
+ private void testGrantNotAllowed(Room room, String nickToRevoke, 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(nickToRevoke,
Role.Moderator)));
+
+ XMLElement expectedInner = new XMLElementBuilder("query",
NamespaceURIs.XEP0045_MUC_ADMIN).startInnerElement(
+ "item", NamespaceURIs.XEP0045_MUC_ADMIN).addAttribute("nick",
nickToRevoke).addAttribute("role", "moderator")
+ .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);
+ }
+
+}
Added:
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/GrantVoiceTestCase.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/GrantVoiceTestCase.java?rev=980976&view=auto
==============================================================================
---
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/GrantVoiceTestCase.java
(added)
+++
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/GrantVoiceTestCase.java
Fri Jul 30 21:43:30 2010
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.vysper.xmpp.modules.extension.xep0045_muc.handler;
+
+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.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 GrantVoiceTestCase extends AbstractMUCHandlerTestCase {
+
+ public void testGrantVoice() throws Exception {
+ Room room = conference.findOrCreateRoom(ROOM2_JID, "Room 2");
+ Occupant occ1 = room.addOccupant(OCCUPANT1_JID, "nick");
+ occ1.setRole(Role.Moderator);
+ occ1.setAffiliation(Affiliation.Member);
+
+ Occupant occ2 = room.addOccupant(OCCUPANT2_JID, "Nick 2");
+ occ2.setRole(Role.Visitor);
+
+ // 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.Participant)));
+
+ assertIqResultStanza(ROOM2_JID, OCCUPANT1_JID, "id1", result);
+
+ assertEquals(Role.Participant, room.findOccupantByNick("Nick
2").getRole());
+
+ // verify that remaining users got presence
+ assertPresenceStanza(occupant2Queue.getNext(), new
EntityImpl(ROOM2_JID, "Nick 2"), OCCUPANT2_JID,
+ null, new MucUserPresenceItem(null, null, Affiliation.None,
Role.Participant), null);
+ assertPresenceStanza(occupant1Queue.getNext(), new
EntityImpl(ROOM2_JID, "Nick 2"), OCCUPANT1_JID,
+ null, new MucUserPresenceItem(null, null, Affiliation.None,
Role.Participant), null);
+ }
+
+ @Override
+ protected StanzaHandler createHandler() {
+ return new MUCIqAdminHandler(conference);
+ }
+
+}
Added:
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/RevokeModeratorTestCase.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/RevokeModeratorTestCase.java?rev=980976&view=auto
==============================================================================
---
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/RevokeModeratorTestCase.java
(added)
+++
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/RevokeModeratorTestCase.java
Fri Jul 30 21:43:30 2010
@@ -0,0 +1,134 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.vysper.xmpp.modules.extension.xep0045_muc.handler;
+
+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.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 RevokeModeratorTestCase extends AbstractMUCHandlerTestCase {
+
+ public void testRevokeModerator() throws Exception {
+ Room room = conference.findOrCreateRoom(ROOM2_JID, "Room 2");
+ Occupant occ1 = room.addOccupant(OCCUPANT1_JID, "nick");
+ occ1.setRole(Role.Moderator);
+ occ1.setAffiliation(Affiliation.Admin);
+
+ Occupant occ2 = room.addOccupant(OCCUPANT2_JID, "Nick 2");
+ occ2.setRole(Role.Moderator);
+ occ2.setAffiliation(Affiliation.Member);
+
+ // 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.Participant)));
+ assertIqResultStanza(ROOM2_JID, OCCUPANT1_JID, "id1", result);
+
+ assertEquals(Role.Participant, room.findOccupantByNick("Nick
2").getRole());
+
+ // verify that remaining users got presence
+ assertPresenceStanza(occupant2Queue.getNext(), new
EntityImpl(ROOM2_JID, "Nick 2"), OCCUPANT2_JID,
+ null, new MucUserPresenceItem(null, null, Affiliation.Member,
Role.Participant), null);
+ assertPresenceStanza(occupant1Queue.getNext(), new
EntityImpl(ROOM2_JID, "Nick 2"), OCCUPANT1_JID,
+ null, new MucUserPresenceItem(null, null, Affiliation.Member,
Role.Participant), null);
+ }
+
+ public void testMemberAttemptRevokeModerator() 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").setRole(Role.Moderator);
+
+ testRevokeNotAllowed(room, "Nick 2", "not-allowed");
+ }
+
+ public void testAttemptRevokeOwnerModerator() throws Exception {
+ Room room = conference.findOrCreateRoom(ROOM2_JID, "Room 2");
+ Occupant occupant1 = room.addOccupant(OCCUPANT1_JID, "nick");
+ occupant1.setAffiliation(Affiliation.Owner);
+ occupant1.setRole(Role.Moderator);
+
+ Occupant occupant2 = room.addOccupant(OCCUPANT2_JID, "Nick 2");
+ occupant2.setAffiliation(Affiliation.Owner);
+ occupant2.setRole(Role.Moderator);
+
+ testRevokeNotAllowed(room, "Nick 2", "not-allowed");
+ }
+
+ public void testAttemptRevokeAdminModerator() 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);
+
+ Occupant occupant2 = room.addOccupant(OCCUPANT2_JID, "Nick 2");
+ occupant2.setAffiliation(Affiliation.Owner);
+ occupant2.setRole(Role.Moderator);
+
+ testRevokeNotAllowed(room, "Nick 2", "not-allowed");
+ }
+
+ public void testToRevokeYourself() throws Exception {
+ Room room = conference.findOrCreateRoom(ROOM2_JID, "Room 2");
+ Occupant occupant1 = room.addOccupant(OCCUPANT1_JID, "nick");
+ occupant1.setRole(Role.Moderator);
+
+ // added only for presence check later
+ room.addOccupant(OCCUPANT2_JID, "Nick
2").setAffiliation(Affiliation.Owner);
+
+ testRevokeNotAllowed(room, "nick", "conflict");
+ }
+
+ private void testRevokeNotAllowed(Room room, String nickToRevoke, 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(nickToRevoke,
Role.Participant)));
+
+ XMLElement expectedInner = new XMLElementBuilder("query",
NamespaceURIs.XEP0045_MUC_ADMIN).startInnerElement(
+ "item", NamespaceURIs.XEP0045_MUC_ADMIN).addAttribute("nick",
nickToRevoke).addAttribute("role", "participant")
+ .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);
+ }
+
+}
Added:
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/RevokeVoiceTestCase.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/RevokeVoiceTestCase.java?rev=980976&view=auto
==============================================================================
---
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/RevokeVoiceTestCase.java
(added)
+++
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/RevokeVoiceTestCase.java
Fri Jul 30 21:43:30 2010
@@ -0,0 +1,131 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.vysper.xmpp.modules.extension.xep0045_muc.handler;
+
+import static org.apache.vysper.xmpp.stanza.IQStanzaType.SET;
+
+import org.apache.vysper.xml.fragment.Renderer;
+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.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 RevokeVoiceTestCase extends AbstractMUCHandlerTestCase {
+
+ public void testRevokeVoice() throws Exception {
+ Room room = conference.findOrCreateRoom(ROOM2_JID, "Room 2");
+ Occupant occ1 = room.addOccupant(OCCUPANT1_JID, "nick");
+ occ1.setRole(Role.Moderator);
+ occ1.setAffiliation(Affiliation.Member);
+
+ Occupant occ2 = room.addOccupant(OCCUPANT2_JID, "Nick 2");
+ occ2.setRole(Role.Participant);
+ occ2.setAffiliation(Affiliation.Member);
+
+ // 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.Visitor)));
+ assertIqResultStanza(ROOM2_JID, OCCUPANT1_JID, "id1", result);
+
+ assertEquals(Role.Visitor, room.findOccupantByNick("Nick
2").getRole());
+
+ // verify that remaining users got presence
+ assertPresenceStanza(occupant2Queue.getNext(), new
EntityImpl(ROOM2_JID, "Nick 2"), OCCUPANT2_JID,
+ null, new MucUserPresenceItem(null, null, Affiliation.Member,
Role.Visitor), null);
+ assertPresenceStanza(occupant1Queue.getNext(), new
EntityImpl(ROOM2_JID, "Nick 2"), OCCUPANT1_JID,
+ null, new MucUserPresenceItem(null, null, Affiliation.Member,
Role.Visitor), null);
+ }
+
+ public void testMemberAttemptRevokeAdmin() 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);
+
+ testRevokeNotAllowed(room, "Nick 2", "not-allowed");
+ }
+
+ public void testMemberAttemptRevokeOwner() 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);
+
+ testRevokeNotAllowed(room, "Nick 2", "not-allowed");
+ }
+
+ public void testAdminAttemptRevokeOwner() 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);
+
+ testRevokeNotAllowed(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.setRole(Role.Moderator);
+
+ // added only for presence check later
+ room.addOccupant(OCCUPANT2_JID, "Nick
2").setAffiliation(Affiliation.Owner);
+
+ testRevokeNotAllowed(room, "nick", "conflict");
+ }
+
+ private void testRevokeNotAllowed(Room room, String nickToRevoke, 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(nickToRevoke,
Role.Visitor)));
+
+ XMLElement expectedInner = new XMLElementBuilder("query",
NamespaceURIs.XEP0045_MUC_ADMIN).startInnerElement(
+ "item", NamespaceURIs.XEP0045_MUC_ADMIN).addAttribute("nick",
nickToRevoke).addAttribute("role", "visitor")
+ .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);
+ }
+
+}