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