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:
@@ -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,
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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";
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user