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() { private AccountManager getAccountManager() {
return new AccountManager() { return new AccountManager() {
public UserCredentials getCredentials(ClientTransaction 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) { private String getNonceFromResponse(Response response) {
WWWAuthenticate wwwAuth = (WWWAuthenticate)response.getHeader( WWWAuthenticate wwwAuth = (WWWAuthenticate)response.getHeader(
SIPHeaderNames.WWW_AUTHENTICATE); SIPHeaderNames.WWW_AUTHENTICATE);
@@ -937,7 +952,10 @@ class SipSessionGroup implements SipListener {
return true; return true;
case Response.UNAUTHORIZED: case Response.UNAUTHORIZED:
case Response.PROXY_AUTHENTICATION_REQUIRED: case Response.PROXY_AUTHENTICATION_REQUIRED:
if (handleAuthentication(event)) { if (crossDomainAuthenticationRequired(response)) {
onError(SipErrorCode.CROSS_DOMAIN_AUTHENTICATION,
getRealmFromResponse(response));
} else if (handleAuthentication(event)) {
addSipSession(this); addSipSession(this);
} else if (mLastNonce == null) { } else if (mLastNonce == null) {
onError(SipErrorCode.SERVER_ERROR, onError(SipErrorCode.SERVER_ERROR,

View File

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

View File

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

View File

@@ -58,6 +58,9 @@ public class SipErrorCode {
/** When data connection is lost. */ /** When data connection is lost. */
public static final int DATA_CONNECTION_LOST = -10; 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) { public static String toString(int errorCode) {
switch (errorCode) { switch (errorCode) {
case NO_ERROR: case NO_ERROR:
@@ -82,6 +85,8 @@ public class SipErrorCode {
return "IN_PROGRESS"; return "IN_PROGRESS";
case DATA_CONNECTION_LOST: case DATA_CONNECTION_LOST:
return "DATA_CONNECTION_LOST"; return "DATA_CONNECTION_LOST";
case CROSS_DOMAIN_AUTHENTICATION:
return "CROSS_DOMAIN_AUTHENTICATION";
default: default:
return "UNKNOWN"; return "UNKNOWN";
} }