aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Lin <jamescflin@google.com>2021-06-08 02:33:36 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2021-06-08 02:33:36 +0000
commit77cfcbe9ae2f8ada3d612ec2cbea44f006d0ff85 (patch)
treed086f459ffad2107862024462d1276e4908d5a94
parent8bf836b510cefea075261ac8503bc1ec1ed2e528 (diff)
parent9b1d58ee558119b3f97f5f46b80f2c5a457aab8d (diff)
downloadims-77cfcbe9ae2f8ada3d612ec2cbea44f006d0ff85.tar.gz
Merge "Disallow send the PUBLISH request when the publish request result is authorized error" into sc-dev am: 9b1d58ee55
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/opt/net/ims/+/14845013 Change-Id: I67500ef9579bc295873057d1381d623c17f4277f
-rw-r--r--src/java/com/android/ims/rcs/uce/UceController.java32
-rw-r--r--src/java/com/android/ims/rcs/uce/UceDeviceState.java59
-rw-r--r--src/java/com/android/ims/rcs/uce/presence/publish/PublishControllerImpl.java8
-rw-r--r--src/java/com/android/ims/rcs/uce/presence/publish/PublishRequestResponse.java3
-rw-r--r--src/java/com/android/ims/rcs/uce/request/CapabilityRequestResponse.java4
-rw-r--r--src/java/com/android/ims/rcs/uce/request/UceRequestManager.java5
-rw-r--r--src/java/com/android/ims/rcs/uce/util/NetworkSipCode.java36
-rw-r--r--tests/src/com/android/ims/rcs/uce/request/UceRequestManagerTest.java3
8 files changed, 122 insertions, 28 deletions
diff --git a/src/java/com/android/ims/rcs/uce/UceController.java b/src/java/com/android/ims/rcs/uce/UceController.java
index 276f1fa2..c6099097 100644
--- a/src/java/com/android/ims/rcs/uce/UceController.java
+++ b/src/java/com/android/ims/rcs/uce/UceController.java
@@ -54,7 +54,9 @@ import com.android.internal.os.SomeArgs;
import java.io.PrintWriter;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.Optional;
import java.util.Set;
@@ -96,8 +98,9 @@ public class UceController {
* Refresh the device state. It is called when receive the UCE request response.
* @param sipCode The SIP code of the request response.
* @param reason The reason from the network response.
+ * @param type The type of the request
*/
- void refreshDeviceState(int sipCode, String reason);
+ void refreshDeviceState(int sipCode, String reason, @RequestType int type);
/**
* Reset the device state when then device disallowed state is expired.
@@ -255,6 +258,29 @@ public class UceController {
}
}
+ /**
+ * The request type is PUBLISH.
+ */
+ public static final int REQUEST_TYPE_PUBLISH = 1;
+
+ /**
+ * The request type is CAPABILITY.
+ */
+ public static final int REQUEST_TYPE_CAPABILITY = 2;
+
+ @IntDef(value = {
+ REQUEST_TYPE_PUBLISH,
+ REQUEST_TYPE_CAPABILITY,
+ }, prefix="REQUEST_TYPE_")
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface RequestType {}
+
+ public static final Map<Integer, String> REQUEST_TYPE_DESCRIPTION = new HashMap<>();
+ static {
+ REQUEST_TYPE_DESCRIPTION.put(REQUEST_TYPE_PUBLISH, "REQUEST_TYPE_PUBLISH");
+ REQUEST_TYPE_DESCRIPTION.put(REQUEST_TYPE_CAPABILITY, "REQUEST_TYPE_CAPABILITY");
+ }
+
/** The RCS state is disconnected */
private static final int RCS_STATE_DISCONNECTED = 0;
@@ -465,8 +491,8 @@ public class UceController {
}
@Override
- public void refreshDeviceState(int sipCode, String reason) {
- mDeviceState.refreshDeviceState(sipCode, reason);
+ public void refreshDeviceState(int sipCode, String reason, @RequestType int type) {
+ mDeviceState.refreshDeviceState(sipCode, reason, type);
}
@Override
diff --git a/src/java/com/android/ims/rcs/uce/UceDeviceState.java b/src/java/com/android/ims/rcs/uce/UceDeviceState.java
index 5621fdea..773726a6 100644
--- a/src/java/com/android/ims/rcs/uce/UceDeviceState.java
+++ b/src/java/com/android/ims/rcs/uce/UceDeviceState.java
@@ -21,6 +21,7 @@ import android.content.Context;
import android.telephony.ims.RcsUceAdapter.ErrorCode;
import android.util.Log;
+import com.android.ims.rcs.uce.UceController.RequestType;
import com.android.ims.rcs.uce.UceController.UceControllerCallback;
import com.android.ims.rcs.uce.util.NetworkSipCode;
import com.android.ims.rcs.uce.util.UceUtils;
@@ -29,6 +30,8 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
+import java.util.HashMap;
+import java.util.Map;
import java.util.Optional;
/**
@@ -50,19 +53,34 @@ public class UceDeviceState {
private static final int DEVICE_STATE_FORBIDDEN = 1;
/**
+ * The device will be in the PROVISION error state when the PUBLISH request fails and the
+ * SIP code is 404 NOT FOUND.
+ */
+ private static final int DEVICE_STATE_PROVISION_ERROR = 2;
+
+ /**
* When the network response SIP code is 489 and the carrier config also indicates that needs
* to handle the SIP code 489, the device will be in the BAD EVENT state.
*/
- private static final int DEVICE_STATE_BAD_EVENT = 2;
+ private static final int DEVICE_STATE_BAD_EVENT = 3;
@IntDef(value = {
DEVICE_STATE_OK,
DEVICE_STATE_FORBIDDEN,
+ DEVICE_STATE_PROVISION_ERROR,
DEVICE_STATE_BAD_EVENT,
}, prefix="DEVICE_STATE_")
@Retention(RetentionPolicy.SOURCE)
public @interface DeviceStateType {}
+ private static final Map<Integer, String> DEVICE_STATE_DESCRIPTION = new HashMap<>();
+ static {
+ DEVICE_STATE_DESCRIPTION.put(DEVICE_STATE_OK, "DEVICE_STATE_OK");
+ DEVICE_STATE_DESCRIPTION.put(DEVICE_STATE_FORBIDDEN, "DEVICE_STATE_FORBIDDEN");
+ DEVICE_STATE_DESCRIPTION.put(DEVICE_STATE_PROVISION_ERROR, "DEVICE_STATE_PROVISION_ERROR");
+ DEVICE_STATE_DESCRIPTION.put(DEVICE_STATE_BAD_EVENT, "DEVICE_STATE_BAD_EVENT");
+ }
+
/**
* The result of the current device state.
*/
@@ -86,6 +104,7 @@ public class UceDeviceState {
public boolean isRequestForbidden() {
switch(mDeviceState) {
case DEVICE_STATE_FORBIDDEN:
+ case DEVICE_STATE_PROVISION_ERROR:
case DEVICE_STATE_BAD_EVENT:
return true;
default:
@@ -133,7 +152,7 @@ public class UceDeviceState {
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
- builder.append("DeviceState=").append(getDeviceState())
+ builder.append("DeviceState=").append(DEVICE_STATE_DESCRIPTION.get(getDeviceState()))
.append(", ErrorCode=").append(getErrorCode())
.append(", RetryTime=").append(getRequestRetryTime())
.append(", retryAfterMillis=").append(getRequestRetryAfterMillis())
@@ -203,9 +222,12 @@ public class UceDeviceState {
* Update the device state to determine whether the device is allowed to send requests or not.
* @param sipCode The SIP CODE of the request result.
* @param reason The reason from the network response.
+ * @param requestType The type of the request.
*/
- public synchronized void refreshDeviceState(int sipCode, String reason) {
- logd("refreshDeviceState: sipCode=" + sipCode + ", reason=" + reason);
+ public synchronized void refreshDeviceState(int sipCode, String reason,
+ @RequestType int requestType) {
+ logd("refreshDeviceState: sipCode=" + sipCode + ", reason=" + reason +
+ ", requestResponseType=" + UceController.REQUEST_TYPE_DESCRIPTION.get(requestType));
// Get the current device status before updating the state.
DeviceStateResult previousState = getCurrentState();
@@ -213,18 +235,35 @@ public class UceDeviceState {
// Update the device state based on the given sip code.
switch (sipCode) {
case NetworkSipCode.SIP_CODE_FORBIDDEN: // sip 403
- setDeviceState(DEVICE_STATE_FORBIDDEN);
- updateErrorCode(sipCode, reason);
+ if (requestType == UceController.REQUEST_TYPE_PUBLISH) {
+ // Provisioning error for publish request.
+ setDeviceState(DEVICE_STATE_PROVISION_ERROR);
+ } else {
+ setDeviceState(DEVICE_STATE_FORBIDDEN);
+ }
+ updateErrorCode(sipCode, reason, requestType);
// There is no request retry time for SIP code 403
removeRequestRetryTime();
// No timer to exit the forbidden state.
removeExitStateTimer();
break;
+ case NetworkSipCode.SIP_CODE_NOT_FOUND: // sip 404
+ // DeviceState only handles 404 NOT FOUND error for PUBLISH request.
+ if (requestType == UceController.REQUEST_TYPE_PUBLISH) {
+ setDeviceState(DEVICE_STATE_PROVISION_ERROR);
+ updateErrorCode(sipCode, reason, requestType);
+ // There is no request retry time for SIP code 404
+ removeRequestRetryTime();
+ // No timer to exit this state.
+ removeExitStateTimer();
+ }
+ break;
+
case NetworkSipCode.SIP_CODE_BAD_EVENT: // sip 489
if (UceUtils.isRequestForbiddenBySip489(mContext, mSubId)) {
setDeviceState(DEVICE_STATE_BAD_EVENT);
- updateErrorCode(sipCode, reason);
+ updateErrorCode(sipCode, reason, requestType);
// Setup the request retry time.
setupRequestRetryTime();
// Setup the timer to exit the BAD EVENT state.
@@ -251,7 +290,7 @@ public class UceDeviceState {
saveDeviceStateToPreference(currentState);
}
- logd("refreshDeviceState: previous=" + previousState + ", current=" + currentState);
+ logd("refreshDeviceState: previous: " + previousState + ", current: " + currentState);
}
/**
@@ -285,9 +324,9 @@ public class UceDeviceState {
}
}
- private void updateErrorCode(int sipCode, String reason) {
+ private void updateErrorCode(int sipCode, String reason, @RequestType int requestType) {
Optional<Integer> newErrorCode = Optional.of(NetworkSipCode.getCapabilityErrorFromSipCode(
- sipCode, reason));
+ sipCode, reason, requestType));
if (!mErrorCode.equals(newErrorCode)) {
mErrorCode = newErrorCode;
}
diff --git a/src/java/com/android/ims/rcs/uce/presence/publish/PublishControllerImpl.java b/src/java/com/android/ims/rcs/uce/presence/publish/PublishControllerImpl.java
index e387ca9e..165c4367 100644
--- a/src/java/com/android/ims/rcs/uce/presence/publish/PublishControllerImpl.java
+++ b/src/java/com/android/ims/rcs/uce/presence/publish/PublishControllerImpl.java
@@ -40,7 +40,9 @@ import android.util.LocalLog;
import android.util.Log;
import com.android.ims.RcsFeatureManager;
+import com.android.ims.rcs.uce.UceController;
import com.android.ims.rcs.uce.UceController.UceControllerCallback;
+import com.android.ims.rcs.uce.UceDeviceState;
import com.android.ims.rcs.uce.UceDeviceState.DeviceStateResult;
import com.android.ims.rcs.uce.util.UceUtils;
import com.android.internal.annotations.VisibleForTesting;
@@ -387,7 +389,8 @@ public class PublishControllerImpl implements PublishController {
@Override
public void refreshDeviceState(int sipCode, String reason) {
- mUceCtrlCallback.refreshDeviceState(sipCode, reason);
+ mUceCtrlCallback.refreshDeviceState(sipCode, reason,
+ UceController.REQUEST_TYPE_PUBLISH);
}
};
@@ -1049,7 +1052,8 @@ public class PublishControllerImpl implements PublishController {
if (Build.IS_ENG) {
pw.println(mPidfXml);
} else if (Build.IS_DEBUGGABLE) {
- pw.println(PublishUtils.removeNumbersFromUris(mPidfXml));
+ String pidfXml = (mPidfXml == null) ? "null" : mPidfXml;
+ pw.println(PublishUtils.removeNumbersFromUris(pidfXml));
} else {
pw.println(mPidfXml != null ? "***" : "null");
}
diff --git a/src/java/com/android/ims/rcs/uce/presence/publish/PublishRequestResponse.java b/src/java/com/android/ims/rcs/uce/presence/publish/PublishRequestResponse.java
index 82969fc3..a05a8d35 100644
--- a/src/java/com/android/ims/rcs/uce/presence/publish/PublishRequestResponse.java
+++ b/src/java/com/android/ims/rcs/uce/presence/publish/PublishRequestResponse.java
@@ -312,6 +312,9 @@ public class PublishRequestResponse {
switch (respSipCode) {
case NetworkSipCode.SIP_CODE_OK:
return RcsUceAdapter.PUBLISH_STATE_OK;
+ case NetworkSipCode.SIP_CODE_FORBIDDEN:
+ case NetworkSipCode.SIP_CODE_NOT_FOUND:
+ return RcsUceAdapter.PUBLISH_STATE_RCS_PROVISION_ERROR;
case NetworkSipCode.SIP_CODE_REQUEST_TIMEOUT:
return RcsUceAdapter.PUBLISH_STATE_REQUEST_TIMEOUT;
default:
diff --git a/src/java/com/android/ims/rcs/uce/request/CapabilityRequestResponse.java b/src/java/com/android/ims/rcs/uce/request/CapabilityRequestResponse.java
index 817db461..cd4b6e21 100644
--- a/src/java/com/android/ims/rcs/uce/request/CapabilityRequestResponse.java
+++ b/src/java/com/android/ims/rcs/uce/request/CapabilityRequestResponse.java
@@ -25,6 +25,7 @@ import android.telephony.ims.stub.RcsCapabilityExchangeImplBase;
import android.telephony.ims.stub.RcsCapabilityExchangeImplBase.CommandCode;
import android.util.Log;
+import com.android.ims.rcs.uce.UceController;
import com.android.ims.rcs.uce.presence.pidfparser.PidfParserUtils;
import com.android.ims.rcs.uce.util.NetworkSipCode;
import com.android.ims.rcs.uce.util.UceUtils;
@@ -423,7 +424,8 @@ public class CapabilityRequestResponse {
sipError = response.getNetworkRespSipCode().orElse(-1);
respReason = response.getReasonPhrase().orElse("");
}
- return NetworkSipCode.getCapabilityErrorFromSipCode(sipError, respReason);
+ return NetworkSipCode.getCapabilityErrorFromSipCode(sipError, respReason,
+ UceController.REQUEST_TYPE_CAPABILITY);
}
@Override
diff --git a/src/java/com/android/ims/rcs/uce/request/UceRequestManager.java b/src/java/com/android/ims/rcs/uce/request/UceRequestManager.java
index 5e428e98..3e12ba30 100644
--- a/src/java/com/android/ims/rcs/uce/request/UceRequestManager.java
+++ b/src/java/com/android/ims/rcs/uce/request/UceRequestManager.java
@@ -30,7 +30,9 @@ import android.telephony.ims.aidl.IRcsUceControllerCallback;
import android.text.TextUtils;
import android.util.Log;
+import com.android.ims.rcs.uce.UceController;
import com.android.ims.rcs.uce.UceController.UceControllerCallback;
+import com.android.ims.rcs.uce.UceDeviceState;
import com.android.ims.rcs.uce.UceDeviceState.DeviceStateResult;
import com.android.ims.rcs.uce.eab.EabCapabilityResult;
import com.android.ims.rcs.uce.options.OptionsController;
@@ -274,7 +276,8 @@ public class UceRequestManager {
@Override
public void refreshDeviceState(int sipCode, String reason) {
- mControllerCallback.refreshDeviceState(sipCode, reason);
+ mControllerCallback.refreshDeviceState(sipCode, reason,
+ UceController.REQUEST_TYPE_CAPABILITY);
}
@Override
diff --git a/src/java/com/android/ims/rcs/uce/util/NetworkSipCode.java b/src/java/com/android/ims/rcs/uce/util/NetworkSipCode.java
index 931976a2..3789903f 100644
--- a/src/java/com/android/ims/rcs/uce/util/NetworkSipCode.java
+++ b/src/java/com/android/ims/rcs/uce/util/NetworkSipCode.java
@@ -18,6 +18,9 @@ package com.android.ims.rcs.uce.util;
import android.telephony.ims.RcsUceAdapter;
+import com.android.ims.rcs.uce.UceController;
+import com.android.ims.rcs.uce.UceController.RequestType;
+
/**
* Define the network sip code and the reason.
*/
@@ -51,26 +54,39 @@ public class NetworkSipCode {
* Convert the given SIP CODE to the Contact uce capabilities error.
* @param sipCode The SIP code of the request response.
* @param reason The reason of the request response.
+ * @param requestType The type of this request.
* @return The RCS contact UCE capabilities error which is defined in RcsUceAdapter.
*/
- public static int getCapabilityErrorFromSipCode(int sipCode, String reason) {
+ public static int getCapabilityErrorFromSipCode(int sipCode, String reason,
+ @RequestType int requestType) {
int uceError;
switch (sipCode) {
case NetworkSipCode.SIP_CODE_FORBIDDEN: // 403
- if (NetworkSipCode.SIP_NOT_REGISTERED.equalsIgnoreCase(reason)) {
- // Not registered with IMS. Device shall register to IMS.
- uceError = RcsUceAdapter.ERROR_NOT_REGISTERED;
- } else if (NetworkSipCode.SIP_NOT_AUTHORIZED_FOR_PRESENCE.equalsIgnoreCase(
- reason)) {
- // Not provisioned for EAB. Device shall not retry.
+ if(requestType == UceController.REQUEST_TYPE_PUBLISH) {
+ // Not provisioned for PUBLISH request.
uceError = RcsUceAdapter.ERROR_NOT_AUTHORIZED;
} else {
- // The network has responded SIP 403 error with no reason.
- uceError = RcsUceAdapter.ERROR_FORBIDDEN;
+ // Check the reason for CAPABILITY request
+ if (NetworkSipCode.SIP_NOT_REGISTERED.equalsIgnoreCase(reason)) {
+ // Not registered with IMS. Device shall register to IMS.
+ uceError = RcsUceAdapter.ERROR_NOT_REGISTERED;
+ } else if (NetworkSipCode.SIP_NOT_AUTHORIZED_FOR_PRESENCE.equalsIgnoreCase(
+ reason)) {
+ // Not provisioned for EAB. Device shall not retry.
+ uceError = RcsUceAdapter.ERROR_NOT_AUTHORIZED;
+ } else {
+ // The network has responded SIP 403 error with no reason.
+ uceError = RcsUceAdapter.ERROR_FORBIDDEN;
+ }
}
break;
case NetworkSipCode.SIP_CODE_NOT_FOUND: // 404
- uceError = RcsUceAdapter.ERROR_NOT_FOUND;
+ if(requestType == UceController.REQUEST_TYPE_PUBLISH) {
+ // Not provisioned for PUBLISH request.
+ uceError = RcsUceAdapter.ERROR_NOT_AUTHORIZED;
+ } else {
+ uceError = RcsUceAdapter.ERROR_NOT_FOUND;
+ }
break;
case NetworkSipCode.SIP_CODE_REQUEST_TIMEOUT: // 408
uceError = RcsUceAdapter.ERROR_REQUEST_TIMEOUT;
diff --git a/tests/src/com/android/ims/rcs/uce/request/UceRequestManagerTest.java b/tests/src/com/android/ims/rcs/uce/request/UceRequestManagerTest.java
index 607772eb..4a99dd19 100644
--- a/tests/src/com/android/ims/rcs/uce/request/UceRequestManagerTest.java
+++ b/tests/src/com/android/ims/rcs/uce/request/UceRequestManagerTest.java
@@ -47,6 +47,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
import com.android.ims.ImsTestBase;
+import com.android.ims.rcs.uce.UceController;
import com.android.ims.rcs.uce.UceController.UceControllerCallback;
import com.android.ims.rcs.uce.request.UceRequestManager.RequestManagerCallback;
import com.android.ims.rcs.uce.request.UceRequestManager.UceUtilsProxy;
@@ -164,7 +165,7 @@ public class UceRequestManagerTest extends ImsTestBase {
verify(mCallback).getDeviceState();
requestMgrCallback.refreshDeviceState(200, "OK");
- verify(mCallback).refreshDeviceState(200, "OK");
+ verify(mCallback).refreshDeviceState(200, "OK", UceController.REQUEST_TYPE_CAPABILITY);
requestMgrCallback.notifyRequestError(mCoordId, mTaskId);
waitForHandlerAction(handler, 400L);