SipService: handle cross-domain authentication error

and add new CROSS_DOMAIN_AUTHENTICATION error code and OUT_OF_NETWORK
DisconnectCause.

http://b/issue?id=3020185

Change-Id: Icc0a341599d5a72b7cb2d43675fbddc516544978
This commit is contained in:
Hung-ying Tyan
2010-09-25 23:21:23 +08:00
parent 4e9751f077
commit 00a22064ef
4 changed files with 28 additions and 1 deletions

View File

@@ -810,6 +810,12 @@ class SipSessionGroup implements SipListener {
}
}
private boolean crossDomainAuthenticationRequired(Response response) {
String realm = getRealmFromResponse(response);
if (realm == null) realm = "";
return !mLocalProfile.getSipDomain().trim().equals(realm.trim());
}
private AccountManager getAccountManager() {
return new AccountManager() {
public UserCredentials getCredentials(ClientTransaction
@@ -831,6 +837,15 @@ class SipSessionGroup implements SipListener {
};
}
private String getRealmFromResponse(Response response) {
WWWAuthenticate wwwAuth = (WWWAuthenticate)response.getHeader(
SIPHeaderNames.WWW_AUTHENTICATE);
if (wwwAuth != null) return wwwAuth.getRealm();
ProxyAuthenticate proxyAuth = (ProxyAuthenticate)response.getHeader(
SIPHeaderNames.PROXY_AUTHENTICATE);
return (proxyAuth == null) ? null : proxyAuth.getRealm();
}
private String getNonceFromResponse(Response response) {
WWWAuthenticate wwwAuth = (WWWAuthenticate)response.getHeader(
SIPHeaderNames.WWW_AUTHENTICATE);
@@ -937,7 +952,10 @@ class SipSessionGroup implements SipListener {
return true;
case Response.UNAUTHORIZED:
case Response.PROXY_AUTHENTICATION_REQUIRED:
if (handleAuthentication(event)) {
if (crossDomainAuthenticationRequired(response)) {
onError(SipErrorCode.CROSS_DOMAIN_AUTHENTICATION,
getRealmFromResponse(response));
} else if (handleAuthentication(event)) {
addSipSession(this);
} else if (mLastNonce == null) {
onError(SipErrorCode.SERVER_ERROR,

View File

@@ -41,6 +41,7 @@ public abstract class Connection {
INVALID_NUMBER, /* invalid dial string */
NUMBER_UNREACHABLE, /* cannot reach the peer */
INVALID_CREDENTIALS, /* invalid credentials */
OUT_OF_NETWORK, /* calling from out of network is not allowed */
TIMED_OUT, /* client timed out */
LOST_SIGNAL,
LIMIT_EXCEEDED, /* eg GSM ACM limit exceeded */

View File

@@ -870,6 +870,9 @@ public class SipPhone extends SipPhoneBase {
case SipErrorCode.INVALID_CREDENTIALS:
onError(Connection.DisconnectCause.INVALID_CREDENTIALS);
break;
case SipErrorCode.CROSS_DOMAIN_AUTHENTICATION:
onError(Connection.DisconnectCause.OUT_OF_NETWORK);
break;
case SipErrorCode.SOCKET_ERROR:
case SipErrorCode.SERVER_ERROR:
case SipErrorCode.CLIENT_ERROR:

View File

@@ -58,6 +58,9 @@ public class SipErrorCode {
/** When data connection is lost. */
public static final int DATA_CONNECTION_LOST = -10;
/** Cross-domain authentication required. */
public static final int CROSS_DOMAIN_AUTHENTICATION = -11;
public static String toString(int errorCode) {
switch (errorCode) {
case NO_ERROR:
@@ -82,6 +85,8 @@ public class SipErrorCode {
return "IN_PROGRESS";
case DATA_CONNECTION_LOST:
return "DATA_CONNECTION_LOST";
case CROSS_DOMAIN_AUTHENTICATION:
return "CROSS_DOMAIN_AUTHENTICATION";
default:
return "UNKNOWN";
}