From 8bfb8ba163d338f5b67ef2cfc516f4b1fea89a50 Mon Sep 17 00:00:00 2001 From: Kiwon Park Date: Fri, 25 Aug 2023 14:29:15 -0700 Subject: Fix crash when Build.MANUFACTURER is longer than 4 and cap terminal_model and terminal_sw_version according to GSMA RCC.14. Bug: 296681528 Test: atest service-entitlement-tests Change-Id: I59236bf8835a10d5f1b02cf9162034f3c79dda99 --- .../entitlement/ServiceEntitlementRequest.java | 2 +- .../libraries/entitlement/eapaka/EapAkaApi.java | 73 ++++++++++++++------- .../entitlement/eapaka/EapAkaApiTest.java | 74 +++++++++++++++++++++- 3 files changed, 124 insertions(+), 25 deletions(-) diff --git a/java/com/android/libraries/entitlement/ServiceEntitlementRequest.java b/java/com/android/libraries/entitlement/ServiceEntitlementRequest.java index 6398d4e..291384d 100644 --- a/java/com/android/libraries/entitlement/ServiceEntitlementRequest.java +++ b/java/com/android/libraries/entitlement/ServiceEntitlementRequest.java @@ -130,7 +130,7 @@ public abstract class ServiceEntitlementRequest { .setAuthenticationToken("") .setTemporaryToken("") .setTerminalId("") - .setTerminalVendor(Build.MANUFACTURER.substring(0, 4)) + .setTerminalVendor(Build.MANUFACTURER) .setTerminalModel(Build.MODEL) .setTerminalSoftwareVersion(VERSION.RELEASE) .setAppName("") diff --git a/java/com/android/libraries/entitlement/eapaka/EapAkaApi.java b/java/com/android/libraries/entitlement/eapaka/EapAkaApi.java index 24f7686..4590211 100644 --- a/java/com/android/libraries/entitlement/eapaka/EapAkaApi.java +++ b/java/com/android/libraries/entitlement/eapaka/EapAkaApi.java @@ -105,6 +105,11 @@ public class EapAkaApi { // at most three times. private static final int MAX_EAP_AKA_ATTEMPTS = 3; + // Max TERMINAL_* string length according to GSMA RCC.14 section 2.4 + private static final int MAX_TERMINAL_VENDOR_LENGTH = 4; + private static final int MAX_TERMINAL_MODEL_LENGTH = 10; + private static final int MAX_TERMINAL_SOFTWARE_VERSION_LENGTH = 20; + private final Context mContext; private final int mSimSubscriptionId; private final HttpClient mHttpClient; @@ -330,18 +335,13 @@ public class EapAkaApi { .addRequestProperty(HttpHeaders.COOKIE, cookies) .setTimeoutInSec(carrierConfig.timeoutInSec()) .setNetwork(carrierConfig.network()); - if (!TextUtils.isEmpty(carrierConfig.clientTs43()) - && !TextUtils.isEmpty(terminalVendor) - && !TextUtils.isEmpty(terminalModel) - && !TextUtils.isEmpty(terminalSoftwareVersion)) { String userAgent = - String.format( - "PRD-TS43 term-%s/%s %s/%s OS-Android/%s", + getUserAgent( + carrierConfig.clientTs43(), terminalVendor, terminalModel, - carrierConfig.clientTs43(), - mAppVersion, terminalSoftwareVersion); + if (!TextUtils.isEmpty(userAgent)) { builder.addRequestProperty(HttpHeaders.USER_AGENT, userAgent); } return mHttpClient.request(builder.build()); @@ -506,9 +506,17 @@ public class EapAkaApi { urlBuilder // Identity and Authentication parameters - .appendQueryParameter(TERMINAL_VENDOR, request.terminalVendor()) - .appendQueryParameter(TERMINAL_MODEL, request.terminalModel()) - .appendQueryParameter(TERMIAL_SW_VERSION, request.terminalSoftwareVersion()) + .appendQueryParameter( + TERMINAL_VENDOR, + trimString(request.terminalVendor(), MAX_TERMINAL_VENDOR_LENGTH)) + .appendQueryParameter( + TERMINAL_MODEL, + trimString(request.terminalModel(), MAX_TERMINAL_MODEL_LENGTH)) + .appendQueryParameter( + TERMIAL_SW_VERSION, + trimString( + request.terminalSoftwareVersion(), + MAX_TERMINAL_SOFTWARE_VERSION_LENGTH)) // General Service parameters .appendQueryParameter(VERS, Integer.toString(request.configurationVersion())) .appendQueryParameter(ENTITLEMENT_VERSION, request.entitlementVersion()); @@ -582,18 +590,13 @@ public class EapAkaApi { .addRequestProperty(HttpHeaders.ACCEPT, contentType) .setTimeoutInSec(carrierConfig.timeoutInSec()) .setNetwork(carrierConfig.network()); - if (!TextUtils.isEmpty(carrierConfig.clientTs43()) - && !TextUtils.isEmpty(terminalVendor) - && !TextUtils.isEmpty(terminalModel) - && !TextUtils.isEmpty(terminalSoftwareVersion)) { - String userAgent = - String.format( - "PRD-TS43 term-%s/%s %s/%s OS-Android/%s", - terminalVendor, - terminalModel, - carrierConfig.clientTs43(), - mAppVersion, - terminalSoftwareVersion); + String userAgent = + getUserAgent( + carrierConfig.clientTs43(), + terminalVendor, + terminalModel, + terminalSoftwareVersion); + if (!TextUtils.isEmpty(userAgent)) { builder.addRequestProperty(HttpHeaders.USER_AGENT, userAgent); } return mHttpClient.request(builder.build()); @@ -651,6 +654,30 @@ public class EapAkaApi { return ""; } + private String getUserAgent( + String clientTs43, + String terminalVendor, + String terminalModel, + String terminalSoftwareVersion) { + if (!TextUtils.isEmpty(clientTs43) + && !TextUtils.isEmpty(terminalVendor) + && !TextUtils.isEmpty(terminalModel) + && !TextUtils.isEmpty(terminalSoftwareVersion)) { + return String.format( + "PRD-TS43 term-%s/%s %s/%s OS-Android/%s", + trimString(terminalVendor, MAX_TERMINAL_VENDOR_LENGTH), + trimString(terminalModel, MAX_TERMINAL_MODEL_LENGTH), + clientTs43, + mAppVersion, + trimString(terminalSoftwareVersion, MAX_TERMINAL_SOFTWARE_VERSION_LENGTH)); + } + return ""; + } + + private String trimString(String s, int maxLength) { + return s.substring(0, Math.min(s.length(), maxLength)); + } + /** * Returns the IMSI EAP value. The resulting realm part of the Root NAI in 3GPP TS 23.003 clause * 19.3.2 will be in the form: diff --git a/tests/src/com/android/libraries/entitlement/eapaka/EapAkaApiTest.java b/tests/src/com/android/libraries/entitlement/eapaka/EapAkaApiTest.java index caddfb2..6dafef3 100644 --- a/tests/src/com/android/libraries/entitlement/eapaka/EapAkaApiTest.java +++ b/tests/src/com/android/libraries/entitlement/eapaka/EapAkaApiTest.java @@ -102,9 +102,15 @@ public class EapAkaApiTest { private static final String ACCEPT_CONTENT_TYPE_JSON_AND_XML = "application/vnd.gsma.eap-relay.v1.0+json, text/vnd.wap.connectivity-xml"; private static final String BYPASS_EAP_AKA_RESPONSE = "abc"; - private static final String VENDOR = "VENDOR"; + private static final String VENDOR = "VEND"; private static final String MODEL = "MODEL"; private static final String SW_VERSION = "SW_VERSION"; + private static final String LONG_VENDOR = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; + private static final String LONG_MODEL = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; + private static final String LONG_SW_VERSION = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; + private static final String LONG_VENDOR_TRIMMED = "aaaa"; + private static final String LONG_MODEL_TRIMMED = "aaaaaaaaaa"; + private static final String LONG_SW_VERSION_TRIMMED = "aaaaaaaaaaaaaaaaaaaa"; private static final String APP_VERSION = "APP_VERSION"; @Rule public final MockitoRule rule = MockitoJUnit.rule(); @@ -621,6 +627,36 @@ public class EapAkaApiTest { .containsExactly(ServiceEntitlementRequest.ACCEPT_CONTENT_TYPE_JSON_AND_XML); } + @Test + public void queryEntitlementStatus_terminalVendorModelSWVersionTrimmed() throws Exception { + CarrierConfig carrierConfig = + CarrierConfig.builder() + .setServerUrl(TEST_URL) + .setClientTs43(CarrierConfig.CLIENT_TS_43_IMS_ENTITLEMENT) + .build(); + ServiceEntitlementRequest request = + ServiceEntitlementRequest.builder() + .setAuthenticationToken(TOKEN) + .setTerminalVendor(LONG_VENDOR) + .setTerminalModel(LONG_MODEL) + .setTerminalSoftwareVersion(LONG_SW_VERSION) + .build(); + + mEapAkaApi.queryEntitlementStatus( + ImmutableList.of(ServiceEntitlement.APP_VOWIFI), carrierConfig, request); + + verify(mMockHttpClient).request(mHttpRequestCaptor.capture()); + String urlParams = + String.format( + "terminal_vendor=%s&terminal_model=%s&terminal_sw_version=%s", + LONG_VENDOR_TRIMMED, LONG_MODEL_TRIMMED, LONG_SW_VERSION_TRIMMED); + assertThat( + mHttpRequestCaptor + .getValue() + .url()) + .contains(urlParams); + } + @Test public void queryEntitlementStatus_userAgentSet() throws Exception { CarrierConfig carrierConfig = @@ -705,6 +741,42 @@ public class EapAkaApiTest { .isEqualTo(userAgent); } + @Test + public void queryEntitlementStatus_userAgentTrimmed() throws Exception { + CarrierConfig carrierConfig = + CarrierConfig.builder() + .setServerUrl(TEST_URL) + .setClientTs43(CarrierConfig.CLIENT_TS_43_IMS_ENTITLEMENT) + .build(); + ServiceEntitlementRequest request = + ServiceEntitlementRequest.builder() + .setAuthenticationToken(TOKEN) + .setTerminalVendor(LONG_VENDOR) + .setTerminalModel(LONG_MODEL) + .setTerminalSoftwareVersion(LONG_SW_VERSION) + .build(); + + mEapAkaApi.queryEntitlementStatus( + ImmutableList.of(ServiceEntitlement.APP_VOWIFI), carrierConfig, request); + + verify(mMockHttpClient).request(mHttpRequestCaptor.capture()); + String userAgent = + String.format( + "PRD-TS43 term-%s/%s %s/%s OS-Android/%s", + LONG_VENDOR_TRIMMED, + LONG_MODEL_TRIMMED, + carrierConfig.clientTs43(), + APP_VERSION, + LONG_SW_VERSION_TRIMMED); + assertThat( + mHttpRequestCaptor + .getValue() + .requestProperties() + .get(HttpHeaders.USER_AGENT) + .get(0)) + .isEqualTo(userAgent); + } + @Test public void performEsimOdsaOperation_noAuthenticationToken_returnsResult() throws Exception { when(mMockTelephonyManagerForSubId.getIccAuthentication( -- cgit v1.2.3