use more approriate reason when failing because of parse errors
This commit is contained in:
		
							parent
							
								
									ec6bcec849
								
							
						
					
					
						commit
						b95d406e61
					
				@ -266,7 +266,7 @@ public class JingleRtpConnection extends AbstractJingleConnection implements Web
 | 
				
			|||||||
            contentMap.requireDTLSFingerprint();
 | 
					            contentMap.requireDTLSFingerprint();
 | 
				
			||||||
        } catch (final IllegalArgumentException | IllegalStateException | NullPointerException e) {
 | 
					        } catch (final IllegalArgumentException | IllegalStateException | NullPointerException e) {
 | 
				
			||||||
            respondOk(jinglePacket);
 | 
					            respondOk(jinglePacket);
 | 
				
			||||||
            sendSessionTerminate(Reason.FAILED_APPLICATION, e.getMessage());
 | 
					            sendSessionTerminate(Reason.of(e), e.getMessage());
 | 
				
			||||||
            Log.d(Config.LOGTAG, id.account.getJid().asBareJid() + ": improperly formatted contents", e);
 | 
					            Log.d(Config.LOGTAG, id.account.getJid().asBareJid() + ": improperly formatted contents", e);
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -315,14 +315,22 @@ public class JingleRtpConnection extends AbstractJingleConnection implements Web
 | 
				
			|||||||
            contentMap = RtpContentMap.of(jinglePacket);
 | 
					            contentMap = RtpContentMap.of(jinglePacket);
 | 
				
			||||||
            contentMap.requireContentDescriptions();
 | 
					            contentMap.requireContentDescriptions();
 | 
				
			||||||
            contentMap.requireDTLSFingerprint();
 | 
					            contentMap.requireDTLSFingerprint();
 | 
				
			||||||
        } catch (IllegalArgumentException | IllegalStateException | NullPointerException e) {
 | 
					        } catch (final IllegalArgumentException | IllegalStateException | NullPointerException e) {
 | 
				
			||||||
            respondOk(jinglePacket);
 | 
					            respondOk(jinglePacket);
 | 
				
			||||||
            Log.d(Config.LOGTAG, id.account.getJid().asBareJid() + ": improperly formatted contents in session-accept", e);
 | 
					            Log.d(Config.LOGTAG, id.account.getJid().asBareJid() + ": improperly formatted contents in session-accept", e);
 | 
				
			||||||
            webRTCWrapper.close();
 | 
					            webRTCWrapper.close();
 | 
				
			||||||
            sendSessionTerminate(Reason.FAILED_APPLICATION, e.getMessage());
 | 
					            sendSessionTerminate(Reason.of(e), e.getMessage());
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        final Set<Media> initiatorMedia = this.initiatorRtpContentMap.getMedia();
 | 
				
			||||||
 | 
					        if (!initiatorMedia.equals(contentMap.getMedia())) {
 | 
				
			||||||
 | 
					            sendSessionTerminate(Reason.SECURITY_ERROR, String.format(
 | 
				
			||||||
 | 
					                    "Your session-included included media %s but our session-initiate was %s",
 | 
				
			||||||
 | 
					                    this.proposedMedia,
 | 
				
			||||||
 | 
					                    contentMap.getMedia()
 | 
				
			||||||
 | 
					            ));
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        //TODO check that session accept content media matched ours
 | 
					 | 
				
			||||||
        Log.d(Config.LOGTAG, "processing session-accept with " + contentMap.contents.size() + " contents");
 | 
					        Log.d(Config.LOGTAG, "processing session-accept with " + contentMap.contents.size() + " contents");
 | 
				
			||||||
        if (transition(State.SESSION_ACCEPTED)) {
 | 
					        if (transition(State.SESSION_ACCEPTED)) {
 | 
				
			||||||
            respondOk(jinglePacket);
 | 
					            respondOk(jinglePacket);
 | 
				
			||||||
@ -913,6 +921,9 @@ public class JingleRtpConnection extends AbstractJingleConnection implements Web
 | 
				
			|||||||
        if (newState == PeerConnection.PeerConnectionState.CONNECTED && this.rtpConnectionStarted == 0) {
 | 
					        if (newState == PeerConnection.PeerConnectionState.CONNECTED && this.rtpConnectionStarted == 0) {
 | 
				
			||||||
            this.rtpConnectionStarted = SystemClock.elapsedRealtime();
 | 
					            this.rtpConnectionStarted = SystemClock.elapsedRealtime();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        //TODO 'DISCONNECTED' might be an opportunity to renew the offer and send a transport-replace
 | 
				
			||||||
 | 
					        //TODO exact syntax is yet to be determined but transport-replace sounds like the most reasonable
 | 
				
			||||||
 | 
					        //as there is no content-replace
 | 
				
			||||||
        if (Arrays.asList(PeerConnection.PeerConnectionState.FAILED, PeerConnection.PeerConnectionState.DISCONNECTED).contains(newState)) {
 | 
					        if (Arrays.asList(PeerConnection.PeerConnectionState.FAILED, PeerConnection.PeerConnectionState.DISCONNECTED).contains(newState)) {
 | 
				
			||||||
            if (TERMINATED.contains(this.state)) {
 | 
					            if (TERMINATED.contains(this.state)) {
 | 
				
			||||||
                Log.d(Config.LOGTAG, id.account.getJid().asBareJid() + ": not sending session-terminate after connectivity error because session is already in state " + this.state);
 | 
					                Log.d(Config.LOGTAG, id.account.getJid().asBareJid() + ": not sending session-terminate after connectivity error because session is already in state " + this.state);
 | 
				
			||||||
 | 
				
			|||||||
@ -23,6 +23,7 @@ import eu.siacs.conversations.xmpp.jingle.stanzas.GenericTransportInfo;
 | 
				
			|||||||
import eu.siacs.conversations.xmpp.jingle.stanzas.Group;
 | 
					import eu.siacs.conversations.xmpp.jingle.stanzas.Group;
 | 
				
			||||||
import eu.siacs.conversations.xmpp.jingle.stanzas.IceUdpTransportInfo;
 | 
					import eu.siacs.conversations.xmpp.jingle.stanzas.IceUdpTransportInfo;
 | 
				
			||||||
import eu.siacs.conversations.xmpp.jingle.stanzas.JinglePacket;
 | 
					import eu.siacs.conversations.xmpp.jingle.stanzas.JinglePacket;
 | 
				
			||||||
 | 
					import eu.siacs.conversations.xmpp.jingle.stanzas.Reason;
 | 
				
			||||||
import eu.siacs.conversations.xmpp.jingle.stanzas.RtpDescription;
 | 
					import eu.siacs.conversations.xmpp.jingle.stanzas.RtpDescription;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class RtpContentMap {
 | 
					public class RtpContentMap {
 | 
				
			||||||
@ -130,14 +131,12 @@ public class RtpContentMap {
 | 
				
			|||||||
                rtpDescription = (RtpDescription) description;
 | 
					                rtpDescription = (RtpDescription) description;
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                Log.d(Config.LOGTAG, "description was " + description);
 | 
					                Log.d(Config.LOGTAG, "description was " + description);
 | 
				
			||||||
                //todo throw unsupported application
 | 
					                throw new UnsupportedApplicationException("Content does not contain rtp description");
 | 
				
			||||||
                throw new IllegalArgumentException("Content does not contain RtpDescription");
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (transportInfo instanceof IceUdpTransportInfo) {
 | 
					            if (transportInfo instanceof IceUdpTransportInfo) {
 | 
				
			||||||
                iceUdpTransportInfo = (IceUdpTransportInfo) transportInfo;
 | 
					                iceUdpTransportInfo = (IceUdpTransportInfo) transportInfo;
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                //TODO throw UNSUPPORTED_TRANSPORT exception
 | 
					                throw new UnsupportedTransportException("Content does not contain ICE-UDP transport");
 | 
				
			||||||
                throw new IllegalArgumentException("Content does not contain ICE-UDP transport");
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            return new DescriptionTransport(rtpDescription, iceUdpTransportInfo);
 | 
					            return new DescriptionTransport(rtpDescription, iceUdpTransportInfo);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -158,4 +157,16 @@ public class RtpContentMap {
 | 
				
			|||||||
            }));
 | 
					            }));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static class UnsupportedApplicationException extends IllegalArgumentException {
 | 
				
			||||||
 | 
					        UnsupportedApplicationException(String message) {
 | 
				
			||||||
 | 
					            super(message);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static class UnsupportedTransportException extends IllegalArgumentException {
 | 
				
			||||||
 | 
					        UnsupportedTransportException(String message) {
 | 
				
			||||||
 | 
					            super(message);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -4,6 +4,8 @@ import android.support.annotation.NonNull;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import com.google.common.base.CaseFormat;
 | 
					import com.google.common.base.CaseFormat;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import eu.siacs.conversations.xmpp.jingle.RtpContentMap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public enum Reason {
 | 
					public enum Reason {
 | 
				
			||||||
    ALTERNATIVE_SESSION,
 | 
					    ALTERNATIVE_SESSION,
 | 
				
			||||||
    BUSY,
 | 
					    BUSY,
 | 
				
			||||||
@ -37,4 +39,16 @@ public enum Reason {
 | 
				
			|||||||
    public String toString() {
 | 
					    public String toString() {
 | 
				
			||||||
        return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_HYPHEN, super.toString());
 | 
					        return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_HYPHEN, super.toString());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static Reason of(final RuntimeException e) {
 | 
				
			||||||
 | 
					        if (e instanceof SecurityException) {
 | 
				
			||||||
 | 
					            return SECURITY_ERROR;
 | 
				
			||||||
 | 
					        } else if (e instanceof RtpContentMap.UnsupportedTransportException) {
 | 
				
			||||||
 | 
					            return UNSUPPORTED_TRANSPORTS;
 | 
				
			||||||
 | 
					        } else if (e instanceof RtpContentMap.UnsupportedApplicationException) {
 | 
				
			||||||
 | 
					            return UNSUPPORTED_APPLICATIONS;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            return FAILED_APPLICATION;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user