/* ** ** Copyright 2013, Jules White ** ** */ package org.magnum.soda.server.wamp; import org.magnum.soda.msg.Msg; import org.magnum.soda.msg.Protocol; import org.magnum.soda.server.wamp.messages.PublishMessage; import org.magnum.soda.server.wamp.messages.SubscribeMessage; import org.magnum.soda.server.wamp.messages.UnsubscribeMessage; import org.magnum.soda.transport.MsgContainer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; public class SourceHonestyFilter implements WampServerListener, PubSubFilter { private static final Logger Log = LoggerFactory .getLogger(SourceHonestyFilter.class); private BiMap<ClientId, String> clientIdMap_ = HashBiMap.create(); private Protocol protocol_; public SourceHonestyFilter(Protocol protocol) { super(); protocol_ = protocol; } @Override public PublishMessage filterPublish(ClientId from, PublishMessage msg) { PublishMessage rslt = null; MsgContainer cont = msg.getPayload(MsgContainer.class); String msgjson = cont.getMsg(); try { Msg msgobj = protocol_.inbound(msgjson); String realsrc = clientIdMap_.get(from); if (!("" + realsrc).equals(msgobj.getSource())) { Log.error( "Warning, dropping a msg with a fradulent source, which was actually from: [{}] msg:[{}]", realsrc, msgjson); } else { rslt = msg; } } catch (Exception e) { Log.error("Unexpected error checking the source of msg: [{}]", msgjson); Log.error("Reason:", e); } return rslt; } @Override public void clientConnected(ClientId client) { } @Override public void clientDisconnected(ClientId client) { } @Override public void clientSubscribedToTopic(ClientId id, String topic) { if(!clientIdMap_.containsKey(id)){ clientIdMap_.put(id, topic); } } @Override public void clientUnSubscribedFromTopic(ClientId id, String topic) { clientIdMap_.remove(id); } @Override public SubscribeMessage filterSubscribe(ClientId id, SubscribeMessage sub) { SubscribeMessage rslt = null; String topic = sub.topicUri; ClientId existing = clientIdMap_.inverse().get(topic); if (existing != null && existing != id) { String correct = clientIdMap_.get(id); Log.error( "An attempt is being made to snoop on another client's messages by: " + id + "(" + correct + ") [attempting to snoop on:" + existing + " (" + topic + ")"); } else { rslt = sub; clientIdMap_.put(id, topic); } return rslt; } @Override public UnsubscribeMessage filterUnsubscribe(ClientId id, UnsubscribeMessage topic) { return topic; } }