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:
parent
70ae372303
commit
3f362519aa
3 changed files with 47 additions and 6 deletions
|
@ -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,10 +413,13 @@ 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);
|
||||
}
|
||||
postEvent(obj);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -423,11 +427,21 @@ public class SharedDisplaySession extends VenueSession implements
|
|||
* 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();
|
||||
setCurrentDataProvider(newLeader);
|
||||
setCurrentSessionLeader(newLeader);
|
||||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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
|
||||
+ "/";
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Add table
Reference in a new issue