SslErrorHandler.java revision 4e9718d6ae3433a3f78fddf158a15701101ba781
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.webkit;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport junit.framework.Assert;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.http.SslError;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.LinkedList;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ListIterator;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * SslErrorHandler: class responsible for handling SSL errors. This class is
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * passed as a parameter to BrowserCallback.displaySslErrorDialog and is meant
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to receive the user's response.
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class SslErrorHandler extends Handler {
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* One problem here is that there may potentially be multiple SSL errors
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * coming from mutiple loaders. Therefore, we keep a queue of loaders
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that have SSL-related problems and process errors one by one in the
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * order they were received.
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String LOGTAG = "network";
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Queue of loaders that experience SSL-related problems.
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private LinkedList<LoadListener> mLoaderQueue;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * SSL error preference table.
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Bundle mSslPrefTable;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Message id for handling the response
550867e69176858e258b620a1b3acff2363c95b87dCary Clark    private static final int HANDLE_RESPONSE = 100;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void handleMessage(Message msg) {
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (msg.what) {
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case HANDLE_RESPONSE:
614e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott                LoadListener loader = (LoadListener) msg.obj;
624e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott                handleSslErrorResponse(loader, loader.sslError(),
634e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott                        msg.arg1 == 1);
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fastProcessQueuedSslErrors();
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates a new error handler with an empty loader queue.
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
72a589419c04f278a5d94811091a1100d284f3f2ecCary Clark    /* package */ SslErrorHandler() {
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLoaderQueue = new LinkedList<LoadListener>();
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSslPrefTable = new Bundle();
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Saves this handler's state into a map.
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True iff succeeds.
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
814e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott    /* package */ synchronized boolean saveState(Bundle outState) {
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean success = (outState != null);
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (success) {
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // TODO?
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outState.putBundle("ssl-error-handler", mSslPrefTable);
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return success;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Restores this handler's state from a map.
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True iff succeeds.
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
954e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott    /* package */ synchronized boolean restoreState(Bundle inState) {
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean success = (inState != null);
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (success) {
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            success = inState.containsKey("ssl-error-handler");
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (success) {
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSslPrefTable = inState.getBundle("ssl-error-handler");
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return success;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Clears SSL error preference table.
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* package */ synchronized void clear() {
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSslPrefTable.clear();
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Handles SSL error(s) on the way up to the user.
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* package */ synchronized void handleSslErrorRequest(LoadListener loader) {
1182e5c150e746647a1ce5c10e1708debbf06c45ea7Derek Sollenberger        if (DebugFlags.SSL_ERROR_HANDLER) {
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(LOGTAG, "SslErrorHandler.handleSslErrorRequest(): " +
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                  "url=" + loader.url());
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!loader.cancelled()) {
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoaderQueue.offer(loader);
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (loader == mLoaderQueue.peek()) {
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fastProcessQueuedSslErrors();
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1324e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott     * Check the preference table for a ssl error that has already been shown
1334e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott     * to the user.
1344e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott     */
1354e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott    /* package */ synchronized boolean checkSslPrefTable(LoadListener loader,
1364e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott            SslError error) {
1374e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott        final String host = loader.host();
1384e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott        final int primary = error.getPrimaryError();
1394e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott
1404e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott        if (DebugFlags.SSL_ERROR_HANDLER) {
1414e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott            Assert.assertTrue(host != null && primary != 0);
1424e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott        }
1434e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott
1444e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott        if (mSslPrefTable.containsKey(host)) {
1454e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott            if (primary <= mSslPrefTable.getInt(host)) {
1464e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott                handleSslErrorResponse(loader, error, true);
1474e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott                return true;
1484e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott            }
1494e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott        }
1504e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott        return false;
1514e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott    }
1524e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott
1534e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott    /**
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Processes queued SSL-error confirmation requests in
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a tight loop while there is no need to ask the user.
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* package */void fastProcessQueuedSslErrors() {
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (processNextLoader());
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Processes the next loader in the queue.
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True iff should proceed to processing the
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * following loader in the queue
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private synchronized boolean processNextLoader() {
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LoadListener loader = mLoaderQueue.peek();
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (loader != null) {
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // if this loader has been cancelled
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (loader.cancelled()) {
1714e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott                // go to the following loader in the queue. Make sure this
1724e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott                // loader has been removed from the queue.
1734e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott                mLoaderQueue.remove(loader);
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return true;
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SslError error = loader.sslError();
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1792e5c150e746647a1ce5c10e1708debbf06c45ea7Derek Sollenberger            if (DebugFlags.SSL_ERROR_HANDLER) {
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Assert.assertNotNull(error);
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1834e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott            // checkSslPrefTable will handle the ssl error response if the
1844e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott            // answer is available. It does not remove the loader from the
1854e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott            // queue.
1864e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott            if (checkSslPrefTable(loader, error)) {
1874e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott                mLoaderQueue.remove(loader);
1884e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott                return true;
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // if we do not have information on record, ask
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // the user (display a dialog)
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CallbackProxy proxy = loader.getFrame().getCallbackProxy();
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            proxy.onReceivedSslError(this, error);
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // the queue must be empty, stop
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Proceed with the SSL certificate.
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void proceed() {
2054e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott        sendMessage(obtainMessage(HANDLE_RESPONSE, 1, 0, mLoaderQueue.poll()));
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Cancel this request and all pending requests for the WebView that had
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the error.
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void cancel() {
2134e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott        sendMessage(obtainMessage(HANDLE_RESPONSE, 0, 0, mLoaderQueue.poll()));
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Handles SSL error(s) on the way down from the user.
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2194e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott    /* package */ synchronized void handleSslErrorResponse(LoadListener loader,
2204e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott            SslError error, boolean proceed) {
2212e5c150e746647a1ce5c10e1708debbf06c45ea7Derek Sollenberger        if (DebugFlags.SSL_ERROR_HANDLER) {
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertNotNull(loader);
2234e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott            Assert.assertNotNull(error);
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2262e5c150e746647a1ce5c10e1708debbf06c45ea7Derek Sollenberger        if (DebugFlags.SSL_ERROR_HANDLER) {
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(LOGTAG, "SslErrorHandler.handleSslErrorResponse():"
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                  + " proceed: " + proceed
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                  + " url:" + loader.url());
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!loader.cancelled()) {
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (proceed) {
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // update the user's SSL error preference table
2354e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott                int primary = error.getPrimaryError();
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String host = loader.host();
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2382e5c150e746647a1ce5c10e1708debbf06c45ea7Derek Sollenberger                if (DebugFlags.SSL_ERROR_HANDLER) {
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Assert.assertTrue(host != null && primary != 0);
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean hasKey = mSslPrefTable.containsKey(host);
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!hasKey ||
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    primary > mSslPrefTable.getInt(host)) {
244d96bdb145d51105dc783ba75df2fb42dbb3a96b6Mike Reed                    mSslPrefTable.putInt(host, primary);
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
247105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            loader.handleSslErrorResponse(proceed);
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
251