Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 16c29bd7 authored by Hung-ying Tyan's avatar Hung-ying Tyan Committed by Android (Google) Code Review
Browse files

Merge "SIP: Fix busy authentication loop." into gingerbread

parents 9d6824cd ee8a884f
Loading
Loading
Loading
Loading
+9 −7
Original line number Diff line number Diff line
@@ -825,11 +825,13 @@ public final class SipService extends ISipService.Stub {
            synchronized (SipService.this) {
                if (notCurrentSession(session)) return;

                if (errorCode == SipErrorCode.INVALID_CREDENTIALS) {
                switch (errorCode) {
                    case SipErrorCode.INVALID_CREDENTIALS:
                    case SipErrorCode.SERVER_UNREACHABLE:
                        if (DEBUG) Log.d(TAG, "   pause auto-registration");
                        stop();
                } else {
                    onError();
                    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) {
+21 −28
Original line number Diff line number Diff line
@@ -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: