Merge "[RCS] Populate parameters relavent to Digest auth" am: 8c525329a2 am: 33807d3318 am: c33a80f7e4

Original change: https://android-review.googlesource.com/c/platform/packages/services/Telephony/+/1671565

Change-Id: Ib7fe44ceedebd5ec100bd5da5edf3b278d97bf91
diff --git a/testapps/TestRcsApp/TestApp/Android.bp b/testapps/TestRcsApp/TestApp/Android.bp
index 4496a8e..cda7d17 100644
--- a/testapps/TestRcsApp/TestApp/Android.bp
+++ b/testapps/TestRcsApp/TestApp/Android.bp
@@ -21,6 +21,8 @@
         "libphonenumber-platform"
     ],
 
+    libs: ["org.apache.http.legacy"],
+
     certificate: "platform",
     privileged: true,
     product_specific: true,
diff --git a/testapps/TestRcsApp/TestApp/AndroidManifest.xml b/testapps/TestRcsApp/TestApp/AndroidManifest.xml
index 460a1ce..7538df7 100644
--- a/testapps/TestRcsApp/TestApp/AndroidManifest.xml
+++ b/testapps/TestRcsApp/TestApp/AndroidManifest.xml
@@ -19,8 +19,8 @@
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.google.android.sample.rcsclient"
-    android:versionCode="12"
-    android:versionName="1.0.11">
+    android:versionCode="13"
+    android:versionName="1.0.12">
 
     <uses-sdk
         android:minSdkVersion="30"
diff --git a/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/FileUploadActivity.java b/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/FileUploadActivity.java
index 3bc1c24..b9078f8 100644
--- a/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/FileUploadActivity.java
+++ b/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/FileUploadActivity.java
@@ -156,6 +156,7 @@
                     Log.i(TAG, "FileTransferController null");
                     return;
                 }
+                mUploadResult.setText("");
                 Futures.addCallback(
                         fileTransferController.uploadFile(UUID.randomUUID().toString(),
                                 mFile),
diff --git a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/filetransfer/FileUploadController.java b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/filetransfer/FileUploadController.java
index d8e38e0..0d45828 100644
--- a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/filetransfer/FileUploadController.java
+++ b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/filetransfer/FileUploadController.java
@@ -34,10 +34,11 @@
 import com.google.common.util.concurrent.MoreExecutors;
 
 import org.apache.http.Header;
-import org.apache.http.HeaderElement;
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpResponse;
 import org.apache.http.auth.AUTH;
+import org.apache.http.auth.AuthScheme;
+import org.apache.http.auth.MalformedChallengeException;
 import org.apache.http.client.HttpClient;
 import org.apache.http.client.methods.HttpPost;
 import org.apache.http.client.params.AuthPolicy;
@@ -96,7 +97,7 @@
         ListenableFuture<HttpResponse> initialResponseFuture = sendEmptyPost(httpClient);
 
         BasicHttpContext httpContext = new BasicHttpContext();
-        ListenableFuture<Void> prepareAuthFuture =
+        ListenableFuture<AuthScheme> prepareAuthFuture =
                 Futures.transform(
                         initialResponseFuture,
                         initialResponse -> {
@@ -117,17 +118,16 @@
                             // Override nonce and realm in the HTTP context.
                             RFC2617Scheme authScheme = createAuthScheme(initialResponse);
                             httpContext.setAttribute(ATTRIBUTE_PREEMPTIVE_AUTH, authScheme);
-
-                            return null;
+                            return authScheme;
                         },
                         executor);
 
         // Executing the post with credentials.
         return Futures.transformAsync(
                 prepareAuthFuture,
-                unused ->
+                authScheme ->
                         executeAuthenticatedPost(
-                                httpClient, httpContext, transactionId, file),
+                                httpClient, httpContext, authScheme, transactionId, file),
                 executor);
     }
 
@@ -141,27 +141,12 @@
         String scheme = authHeader.getValue();
 
         if (scheme.contains(AuthPolicy.DIGEST)) {
-            HeaderElement[] elements = authHeader.getElements();
-
-            if (elements == null || elements.length == 0) {
-                throw new IllegalArgumentException(
-                        "Unable to find header elements. Cannot perform Digest authentication.");
-            }
-
             DigestScheme digestScheme = new DigestScheme();
-            for (HeaderElement element : elements) {
-                // TODO(b/180601658): Add checks for the realm, which should start with
-                //  3GPP-bootstrapping@.
-                if (element.getName().contains(PARAM_REALM)) {
-                    digestScheme.overrideParamter(PARAM_REALM, element.getValue());
-                    Log.i(TAG, "Realm: " + element.getValue());
-                }
-                if (element.getName().contains(PARAM_NONCE)) {
-                    digestScheme.overrideParamter(PARAM_NONCE, element.getValue());
-                    Log.i(TAG, "Nonce: " + element.getValue());
-                }
+            try {
+                digestScheme.processChallenge(authHeader);
+            } catch (MalformedChallengeException e) {
+                throw new IllegalArgumentException(e);
             }
-
             return digestScheme;
         } else {
             throw new IllegalArgumentException("Unable to create authentication scheme " + scheme);
@@ -195,13 +180,14 @@
     private ListenableFuture<String> executeAuthenticatedPost(
             DefaultHttpClient httpClient,
             HttpContext context,
+            AuthScheme authScheme,
             String transactionId,
             File file)
             throws IOException {
 
         Part[] parts = {
                 new StringPart(TRANSFER_ID_PART_NAME, transactionId),
-                new FilePart(file.getName(), file)
+                new FilePart(FILE_PART_NAME, file)
         };
         MultipartEntity entity = new MultipartEntity(parts);
 
@@ -211,7 +197,8 @@
         Log.i(TAG, "Created file upload POST:" + contentServerUri);
 
         ListenableFuture<HttpResponse> responseFuture =
-                requestExecutor.executeAuthenticatedRequest(httpClient, context, postRequest);
+                requestExecutor.executeAuthenticatedRequest(httpClient, context, postRequest,
+                        authScheme);
 
         Futures.addCallback(
                 responseFuture,
@@ -227,7 +214,7 @@
 
                     @Override
                     public void onFailure(Throwable t) {
-                        Log.i(TAG, "onFailure");
+                        Log.e(TAG, "onFailure", t);
                         throw new IllegalArgumentException(t);
                     }
                 },
diff --git a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/filetransfer/requestexecutor/GbaAuthenticationProvider.java b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/filetransfer/requestexecutor/GbaAuthenticationProvider.java
index 0bfa4cb..008fb76 100644
--- a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/filetransfer/requestexecutor/GbaAuthenticationProvider.java
+++ b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/filetransfer/requestexecutor/GbaAuthenticationProvider.java
@@ -64,11 +64,12 @@
             Log.i(TAG, "organization:" + organization + ", protocol:" + protocol + ", cipherSuite:"
                     + cipherSuite + ", contentServerUrl:" + contentServerUrl);
 
-            builder.setOrg(UaSecurityProtocolIdentifier.ORG_3GPP)
-                    .setProtocol(
-                            UaSecurityProtocolIdentifier.UA_SECURITY_PROTOCOL_3GPP_TLS_DEFAULT);
+            builder.setOrg(organization)
+                    .setProtocol(protocol);
             if (cipherSuite == TlsParams.TLS_NULL_WITH_NULL_NULL) {
                 builder.setTlsCipherSuite(TlsParams.TLS_RSA_WITH_AES_128_CBC_SHA);
+            } else {
+                builder.setTlsCipherSuite(cipherSuite);
             }
         } catch (IllegalArgumentException e) {
             Log.e(TAG, e.getMessage());
diff --git a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/filetransfer/requestexecutor/GbaRequestExecutor.java b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/filetransfer/requestexecutor/GbaRequestExecutor.java
index 856fec1..83d5a8a 100644
--- a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/filetransfer/requestexecutor/GbaRequestExecutor.java
+++ b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/filetransfer/requestexecutor/GbaRequestExecutor.java
@@ -24,9 +24,12 @@
 import com.google.common.util.concurrent.MoreExecutors;
 
 import org.apache.http.HttpResponse;
+import org.apache.http.auth.AuthScheme;
 import org.apache.http.auth.AuthScope;
+import org.apache.http.auth.AuthState;
 import org.apache.http.auth.Credentials;
 import org.apache.http.client.methods.HttpRequestBase;
+import org.apache.http.client.protocol.ClientContext;
 import org.apache.http.impl.client.DefaultHttpClient;
 import org.apache.http.protocol.HttpContext;
 
@@ -48,7 +51,8 @@
     @Override
     @SuppressWarnings("CheckReturnValue")
     public ListenableFuture<HttpResponse> executeAuthenticatedRequest(
-            DefaultHttpClient httpClient, HttpContext context, HttpRequestBase request) {
+            DefaultHttpClient httpClient, HttpContext context, HttpRequestBase request,
+            AuthScheme authScheme) {
 
         // Set authentication for the client.
         ListenableFuture<Credentials> credentialsFuture =
@@ -61,8 +65,13 @@
                             Log.i(TAG,
                                     "Obtained credentialsFuture, making the POST with credentials"
                                             + ".");
-                            httpClient.getCredentialsProvider().setCredentials(AuthScope.ANY,
-                                    credentials);
+                            httpClient.addRequestInterceptor((req, ctx) -> {
+                                AuthState authState = (AuthState) context.getAttribute(
+                                        ClientContext.TARGET_AUTH_STATE);
+                                authState.setAuthScope(AuthScope.ANY);
+                                authState.setAuthScheme(authScheme);
+                                authState.setCredentials(credentials);
+                            }, /* index= */ 0);
 
                             // Make the first request.
                             return executor.submit(() -> httpClient.execute(request, context));
diff --git a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/filetransfer/requestexecutor/HttpRequestExecutor.java b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/filetransfer/requestexecutor/HttpRequestExecutor.java
index 59a3aa9..0026790 100644
--- a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/filetransfer/requestexecutor/HttpRequestExecutor.java
+++ b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/filetransfer/requestexecutor/HttpRequestExecutor.java
@@ -19,6 +19,7 @@
 import com.google.common.util.concurrent.ListenableFuture;
 
 import org.apache.http.HttpResponse;
+import org.apache.http.auth.AuthScheme;
 import org.apache.http.client.methods.HttpRequestBase;
 import org.apache.http.impl.client.DefaultHttpClient;
 import org.apache.http.protocol.HttpContext;
@@ -29,6 +30,7 @@
 public interface HttpRequestExecutor {
 
     ListenableFuture<HttpResponse> executeAuthenticatedRequest(
-            DefaultHttpClient httpClient, HttpContext context, HttpRequestBase request)
+            DefaultHttpClient httpClient, HttpContext context, HttpRequestBase request,
+            AuthScheme authScheme)
             throws IOException;
 }