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;
}