diff --git a/lib/installer-exclude/jain-sdp.jar b/lib/installer-exclude/jain-sdp.jar index 60eb51197..7275bb25b 100644 Binary files a/lib/installer-exclude/jain-sdp.jar and b/lib/installer-exclude/jain-sdp.jar differ diff --git a/lib/installer-exclude/jain-sip-ri.jar b/lib/installer-exclude/jain-sip-ri.jar index 1011fd54c..16e093a85 100644 Binary files a/lib/installer-exclude/jain-sip-ri.jar and b/lib/installer-exclude/jain-sip-ri.jar differ diff --git a/src/net/java/sip/communicator/impl/protocol/sip/ProtocolProviderServiceSipImpl.java b/src/net/java/sip/communicator/impl/protocol/sip/ProtocolProviderServiceSipImpl.java index 001f28614..c724dca79 100644 --- a/src/net/java/sip/communicator/impl/protocol/sip/ProtocolProviderServiceSipImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/sip/ProtocolProviderServiceSipImpl.java @@ -904,6 +904,15 @@ public void processRequest(RequestEvent requestEvent) { Request request = requestEvent.getRequest(); + if(getRegistrarConnection() != null + && !getRegistrarConnection().isRegistrarless() + && !getRegistrarConnection().isRequestFromSameConnection(request)) + { + logger.warn("Received request not from our proxy, ignoring it! " + + "Request:" + request); + return; + } + // test if an Event header is present and known EventHeader eventHeader = (EventHeader) request.getHeader(EventHeader.NAME); diff --git a/src/net/java/sip/communicator/impl/protocol/sip/SipRegistrarConnection.java b/src/net/java/sip/communicator/impl/protocol/sip/SipRegistrarConnection.java index 771c4457c..6b9d3a84d 100644 --- a/src/net/java/sip/communicator/impl/protocol/sip/SipRegistrarConnection.java +++ b/src/net/java/sip/communicator/impl/protocol/sip/SipRegistrarConnection.java @@ -15,6 +15,7 @@ import javax.sip.header.*; import javax.sip.message.*; +import gov.nist.javax.sip.message.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.event.*; import net.java.sip.communicator.util.*; @@ -136,6 +137,20 @@ public class SipRegistrarConnection */ private String registrationTransport = null; + /** + * We remember the last received address that REGISTER OK is coming from. + * For security reasons if we are registered this is the address + * that all messages must come from. + */ + private InetAddress lastRegisterAddressReceived = null; + + /** + * We remember the last received port that REGISTER OK is coming from. + * For security reasons if we are registered this is the port + * that all messages must come from. + */ + private int lastRegisterPortReceived = -1; + /** * Creates a new instance of this class. * @@ -458,6 +473,11 @@ public void processOK(ClientTransaction clientTransatcion, } } + // remember the address and port from which we received this + // message + lastRegisterAddressReceived = + ((SIPMessage)response).getRemoteAddress(); + lastRegisterPortReceived = ((SIPMessage)response).getRemotePort(); //schedule a reregistration. scheduleReRegistration(scheduleTime); @@ -482,6 +502,28 @@ && getRegistrationState().equals(RegistrationState.REGISTERING)) } } + /** + * Checks a particular request is it coming from the same proxy we are + * currently using. A check for security reasons, preventing injection + * of other messages in the PP. + * @param request the request to check. + * @return false if the request doesn't belong to our register + * or if we cannot decide we keep the old behaviour. + */ + public boolean isRequestFromSameConnection(Request request) + { + SIPMessage msg = (SIPMessage)request; + + if(msg.getRemoteAddress() != null + && lastRegisterAddressReceived != null) + { + if(!msg.getRemoteAddress().equals(lastRegisterAddressReceived) + || msg.getRemotePort() != lastRegisterPortReceived) + return false; + } + return true; + } + /** * Sends a unregistered request to the registrar thus ending our * registration. diff --git a/src/net/java/sip/communicator/impl/protocol/sip/SipStackSharing.java b/src/net/java/sip/communicator/impl/protocol/sip/SipStackSharing.java index 0636df2a0..79abd67ca 100644 --- a/src/net/java/sip/communicator/impl/protocol/sip/SipStackSharing.java +++ b/src/net/java/sip/communicator/impl/protocol/sip/SipStackSharing.java @@ -880,6 +880,25 @@ private ProtocolProviderServiceSipImpl findTargetFor(Request request) } } + // Let narrow candidates by checking addresses and ports + Iterator iterPP = + candidates.iterator(); + while(iterPP.hasNext()) + { + ProtocolProviderServiceSipImpl candidate = iterPP.next(); + + if(!candidate.getRegistrarConnection().isRegistrarless() + && !candidate.getRegistrarConnection() + .isRequestFromSameConnection(request)) + iterPP.remove(); + } + + if(candidates.size() == 0) + { + logger.error("no listeners, or message not fo us"); + return null; + } + // Past this point, our guess is not reliable. We try to find // the "least worst" match based on parameters like the To field