Issue #2751 fixed leader transfer infinite loop, added event validation

added username to paths in http urls to prevent old events from being picked up with new leader
added simple check to prevent invalid leader change events from being processed


Former-commit-id: 58c826ec371f10295fa6f4e236ff85a52698719d
This commit is contained in:
Brian Clements 2014-02-24 13:17:01 -06:00
parent 70ae372303
commit 3f362519aa
3 changed files with 47 additions and 6 deletions

View file

@ -81,6 +81,7 @@ import com.raytheon.uf.viz.collaboration.comm.provider.user.VenueParticipant;
* Feb 13, 2014 2751 njensen Added changeLeader()
* Feb 18, 2014 2751 bclement implemented room and pubsub ownership transfer
* Feb 19, 2014 2751 bclement added isClosed()
* Feb 24, 2014 2751 bclement added validation for change leader event
*
* </pre>
*
@ -412,22 +413,35 @@ public class SharedDisplaySession extends VenueSession implements
if (payload instanceof SessionPayload) {
SessionPayload sp = (SessionPayload) payload;
Object obj = sp.getData();
boolean validEvent = true;
if (obj instanceof LeaderChangeEvent) {
handleLeaderChange((LeaderChangeEvent) obj);
validEvent = handleLeaderChange((LeaderChangeEvent) obj);
}
if (validEvent) {
postEvent(obj);
}
}
}
/**
* Apply leadership change event to session
*
* @param event
* @return true if the leader change event is valid
*/
private void handleLeaderChange(LeaderChangeEvent event) {
private boolean handleLeaderChange(LeaderChangeEvent event) {
VenueParticipant newLeader = event.getNewLeader();
boolean rval;
if (!isRoomOwner(newLeader)) {
log.info("Invalid leader change event: " + newLeader
+ " is not an owner of the room");
rval = false;
} else {
setCurrentDataProvider(newLeader);
setCurrentSessionLeader(newLeader);
rval = true;
}
return rval;
}
/**

View file

@ -35,6 +35,7 @@ import org.jivesoftware.smack.packet.XMPPError;
import org.jivesoftware.smackx.Form;
import org.jivesoftware.smackx.FormField;
import org.jivesoftware.smackx.ServiceDiscoveryManager;
import org.jivesoftware.smackx.muc.Affiliate;
import org.jivesoftware.smackx.muc.MultiUserChat;
import org.jivesoftware.smackx.muc.ParticipantStatusListener;
import org.jivesoftware.smackx.muc.UserStatusListener;
@ -98,6 +99,7 @@ import com.raytheon.uf.viz.collaboration.comm.provider.user.VenueParticipant;
* Feb 13, 2014 2751 bclement VenueParticipant refactor
* Feb 18, 2014 2751 bclement Fixed history message 'from' type
* Feb 18, 2014 2751 bclement log privilege changes instead of spamming chat window
* Feb 24, 2014 2751 bclement added isRoomOwner()
*
* </pre>
*
@ -861,4 +863,24 @@ public class VenueSession extends BaseSession implements IVenueSession {
getQualifiedHost(account.getHost()), handle, account);
}
/**
* @param p
* @return true if participant is an owner of the chat room
*/
protected boolean isRoomOwner(VenueParticipant p) {
boolean rval = false;
try {
for (Affiliate aff : muc.getOwners()) {
if (aff.getNick().equals(p.getHandle())) {
rval = true;
break;
}
}
} catch (XMPPException e) {
log.error("Problem verifying room ownership for participant: " + p,
e);
}
return rval;
}
}

View file

@ -50,6 +50,7 @@ import com.raytheon.uf.viz.collaboration.comm.compression.CompressionUtil;
import com.raytheon.uf.viz.collaboration.comm.identity.CollaborationException;
import com.raytheon.uf.viz.collaboration.comm.identity.ISharedDisplaySession;
import com.raytheon.uf.viz.collaboration.comm.provider.session.PeerToPeerCommHelper;
import com.raytheon.uf.viz.collaboration.comm.provider.user.VenueParticipant;
import com.raytheon.uf.viz.remote.graphics.Dispatcher;
import com.raytheon.uf.viz.remote.graphics.events.AbstractDispatchingObjectEvent;
import com.raytheon.uf.viz.remote.graphics.events.DisposeObjectEvent;
@ -68,6 +69,7 @@ import com.raytheon.uf.viz.remote.graphics.events.ICreationEvent;
* ------------ ---------- ----------- --------------------------
* Apr 20, 2012 mschenke Initial creation
* Feb 17, 2014 2756 bclement added xml parsing for HTTP directory listing
* Feb 24, 2014 2751 bclement added separate paths for each provider under session id
*
* </pre>
*
@ -118,8 +120,11 @@ public class CollaborationObjectEventStorage implements
int displayId) {
this.displayId = displayId;
this.client = HttpClient.getInstance();
VenueParticipant dataProvider = session.getCurrentDataProvider();
String providerPath = dataProvider.getUserid().getName();
this.sessionDataURL = PeerToPeerCommHelper.getCollaborationHttpServer();
this.sessionDataURL += session.getSessionId() + "/";
this.sessionDataURL += session.getSessionId() + "/" + providerPath
+ "/";
}
/*