From 3cccf87d807b87be0a178644e91e29394fd2e524 Mon Sep 17 00:00:00 2001 From: Brad Ebinger Date: Tue, 6 Apr 2021 18:55:27 +0000 Subject: [PATCH] Expose parsing util methods for telephony validation Bug: 173828358 Test: atest TeleServiceTests Change-Id: I271a36bcecb332c30f04e7fb22c45098384bc634 --- .../telephony/SipMessageParsingUtils.java | 18 ++++++++++++++++-- .../telephony/ims/SipDelegateManager.java | 9 +++++++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/telephony/common/com/android/internal/telephony/SipMessageParsingUtils.java b/telephony/common/com/android/internal/telephony/SipMessageParsingUtils.java index 179248dd2cf98..33b0bbd230867 100644 --- a/telephony/common/com/android/internal/telephony/SipMessageParsingUtils.java +++ b/telephony/common/com/android/internal/telephony/SipMessageParsingUtils.java @@ -80,6 +80,15 @@ public class SipMessageParsingUtils { return verifySipRequest(splitLine); } + /** + * @return true if the SIP message start line is considered a response. + */ + public static boolean isSipResponse(String startLine) { + String[] splitLine = splitStartLineAndVerify(startLine); + if (splitLine == null) return false; + return verifySipResponse(splitLine); + } + /** * Return the via branch parameter, which is used to identify the transaction ID (request and * response pair) in a SIP transaction. @@ -140,7 +149,12 @@ public class SipMessageParsingUtils { return !headers.isEmpty() ? headers.get(0).second : null; } - private static String[] splitStartLineAndVerify(String startLine) { + /** + * Validate that the start line is correct and split into its three segments. + * @param startLine The start line to verify and split. + * @return The split start line, which will always have three segments. + */ + public static String[] splitStartLineAndVerify(String startLine) { String[] splitLine = startLine.split(" "); if (isStartLineMalformed(splitLine)) return null; return splitLine; @@ -184,7 +198,7 @@ public class SipMessageParsingUtils { * (This is internally an equalsIgnoreMatch comparison). * @return the matched header keys and values. */ - private static List> parseHeaders(String headerString, + public static List> parseHeaders(String headerString, boolean stopAtFirstMatch, String... matchingHeaderKeys) { // Ensure there is no leading whitespace headerString = removeLeadingWhitespace(headerString); diff --git a/telephony/java/android/telephony/ims/SipDelegateManager.java b/telephony/java/android/telephony/ims/SipDelegateManager.java index 625364b1bbb0d..9258e4445d882 100644 --- a/telephony/java/android/telephony/ims/SipDelegateManager.java +++ b/telephony/java/android/telephony/ims/SipDelegateManager.java @@ -80,13 +80,18 @@ public class SipDelegateManager { public static final int MESSAGE_FAILURE_REASON_DELEGATE_CLOSED = 2; /** - * The SIP message has an invalid start line and the message can not be sent. + * The SIP message has an invalid start line and the message can not be sent or the start line + * failed validation due to the request containing a restricted SIP request method. + * {@link SipDelegateConnection}s can not send SIP requests for the methods: REGISTER, PUBLISH, + * or OPTIONS. */ public static final int MESSAGE_FAILURE_REASON_INVALID_START_LINE = 3; /** * One or more of the header fields in the header section of the outgoing SIP message is invalid - * and the SIP message can not be sent. + * or contains a restricted header value and the SIP message can not be sent. + * {@link SipDelegateConnection}s can not send SIP SUBSCRIBE requests for the "Event" header + * value of "presence". */ public static final int MESSAGE_FAILURE_REASON_INVALID_HEADER_FIELDS = 4;