am 16c29bd7: Merge "SIP: Fix busy authentication loop." into gingerbread
Merge commit '16c29bd7f2ce147fd2f39f1f36df88d1b04a5387' into gingerbread-plus-aosp * commit '16c29bd7f2ce147fd2f39f1f36df88d1b04a5387': SIP: Fix busy authentication loop.
This commit is contained in:
@@ -825,11 +825,13 @@ public final class SipService extends ISipService.Stub {
|
||||
synchronized (SipService.this) {
|
||||
if (notCurrentSession(session)) return;
|
||||
|
||||
if (errorCode == SipErrorCode.INVALID_CREDENTIALS) {
|
||||
if (DEBUG) Log.d(TAG, " pause auto-registration");
|
||||
stop();
|
||||
} else {
|
||||
onError();
|
||||
switch (errorCode) {
|
||||
case SipErrorCode.INVALID_CREDENTIALS:
|
||||
case SipErrorCode.SERVER_UNREACHABLE:
|
||||
if (DEBUG) Log.d(TAG, " pause auto-registration");
|
||||
stop();
|
||||
default:
|
||||
restartLater();
|
||||
}
|
||||
|
||||
mErrorCode = errorCode;
|
||||
@@ -846,11 +848,11 @@ public final class SipService extends ISipService.Stub {
|
||||
|
||||
mErrorCode = SipErrorCode.TIME_OUT;
|
||||
mProxy.onRegistrationTimeout(session);
|
||||
onError();
|
||||
restartLater();
|
||||
}
|
||||
}
|
||||
|
||||
private void onError() {
|
||||
private void restartLater() {
|
||||
mRegistered = false;
|
||||
restart(backoffDuration());
|
||||
if (mKeepAliveProcess != null) {
|
||||
|
||||
@@ -96,8 +96,6 @@ class SipSessionGroup implements SipListener {
|
||||
|
||||
private SipStack mSipStack;
|
||||
private SipHelper mSipHelper;
|
||||
private String mLastNonce;
|
||||
private int mRPort;
|
||||
|
||||
// session that processes INVITE requests
|
||||
private SipSessionImpl mCallReceiverSession;
|
||||
@@ -150,7 +148,6 @@ class SipSessionGroup implements SipListener {
|
||||
Log.d(TAG, " start stack for " + myself.getUriString());
|
||||
stack.start();
|
||||
|
||||
mLastNonce = null;
|
||||
mCallReceiverSession = null;
|
||||
mSessionMap.clear();
|
||||
}
|
||||
@@ -366,8 +363,12 @@ class SipSessionGroup implements SipListener {
|
||||
ClientTransaction mClientTransaction;
|
||||
String mPeerSessionDescription;
|
||||
boolean mInCall;
|
||||
boolean mReRegisterFlag = false;
|
||||
SessionTimer mTimer;
|
||||
int mAuthenticationRetryCount;
|
||||
|
||||
// for registration
|
||||
boolean mReRegisterFlag = false;
|
||||
int mRPort;
|
||||
|
||||
// lightweight timer
|
||||
class SessionTimer {
|
||||
@@ -417,6 +418,8 @@ class SipSessionGroup implements SipListener {
|
||||
mState = SipSession.State.READY_TO_CALL;
|
||||
mInviteReceived = null;
|
||||
mPeerSessionDescription = null;
|
||||
mRPort = 0;
|
||||
mAuthenticationRetryCount = 0;
|
||||
|
||||
if (mDialog != null) mDialog.delete();
|
||||
mDialog = null;
|
||||
@@ -799,22 +802,10 @@ class SipSessionGroup implements SipListener {
|
||||
onRegistrationDone((state == SipSession.State.REGISTERING)
|
||||
? getExpiryTime(((ResponseEvent) evt).getResponse())
|
||||
: -1);
|
||||
mLastNonce = null;
|
||||
mRPort = 0;
|
||||
return true;
|
||||
case Response.UNAUTHORIZED:
|
||||
case Response.PROXY_AUTHENTICATION_REQUIRED:
|
||||
if (!handleAuthentication(event)) {
|
||||
if (mLastNonce == null) {
|
||||
onRegistrationFailed(SipErrorCode.SERVER_ERROR,
|
||||
"server does not provide challenge");
|
||||
} else {
|
||||
Log.v(TAG, "Incorrect username/password");
|
||||
onRegistrationFailed(
|
||||
SipErrorCode.INVALID_CREDENTIALS,
|
||||
"incorrect username or password");
|
||||
}
|
||||
}
|
||||
handleAuthentication(event);
|
||||
return true;
|
||||
default:
|
||||
if (statusCode >= 500) {
|
||||
@@ -830,16 +821,24 @@ class SipSessionGroup implements SipListener {
|
||||
throws SipException {
|
||||
Response response = event.getResponse();
|
||||
String nonce = getNonceFromResponse(response);
|
||||
if (((nonce != null) && nonce.equals(mLastNonce)) ||
|
||||
(nonce == null)) {
|
||||
mLastNonce = nonce;
|
||||
if (nonce == null) {
|
||||
onError(SipErrorCode.SERVER_ERROR,
|
||||
"server does not provide challenge");
|
||||
return false;
|
||||
} else {
|
||||
} else if (mAuthenticationRetryCount < 2) {
|
||||
mClientTransaction = mSipHelper.handleChallenge(
|
||||
event, getAccountManager());
|
||||
mDialog = mClientTransaction.getDialog();
|
||||
mLastNonce = nonce;
|
||||
mAuthenticationRetryCount++;
|
||||
if (isLoggable(this, event)) {
|
||||
Log.d(TAG, " authentication retry count="
|
||||
+ mAuthenticationRetryCount);
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
onError(SipErrorCode.INVALID_CREDENTIALS,
|
||||
"incorrect username or password");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -995,12 +994,6 @@ class SipSessionGroup implements SipListener {
|
||||
getRealmFromResponse(response));
|
||||
} else if (handleAuthentication(event)) {
|
||||
addSipSession(this);
|
||||
} else if (mLastNonce == null) {
|
||||
onError(SipErrorCode.SERVER_ERROR,
|
||||
"server does not provide challenge");
|
||||
} else {
|
||||
onError(SipErrorCode.INVALID_CREDENTIALS,
|
||||
"incorrect username or password");
|
||||
}
|
||||
return true;
|
||||
case Response.REQUEST_PENDING:
|
||||
|
||||
Reference in New Issue
Block a user