src/de/duenndns/ssl/MemorizingTrustManager.java
author Da Risk <da_risk@beem-project.com>
Mon, 07 May 2012 21:57:10 +0200
changeset 998 d8305c375b10
parent 920 ff346f5bc36f
permissions -rw-r--r--
Update to the latest version of MemorizingTrustManager Also fix the LeakedReceiver issue. Fix bug #384 close #408 Mitm commit: 11b37471c5403c0510619278d453ca393405f162
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
919
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
     1
/* MemorizingTrustManager - a TrustManager which asks the user about invalid
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
     2
 *  certificates and memorizes their decision.
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
     3
 *
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
     4
 * Copyright (c) 2010 Georg Lukas <georg@op-co.de>
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
     5
 *
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
     6
 * MemorizingTrustManager.java contains the actual trust manager and interface
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
     7
 * code to create a MemorizingActivity and obtain the results.
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
     8
 *
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
     9
 * Permission is hereby granted, free of charge, to any person obtaining a copy
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    10
 * of this software and associated documentation files (the "Software"), to deal
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    11
 * in the Software without restriction, including without limitation the rights
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    12
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    13
 * copies of the Software, and to permit persons to whom the Software is
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    14
 * furnished to do so, subject to the following conditions:
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    15
 *
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    16
 * The above copyright notice and this permission notice shall be included in
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    17
 * all copies or substantial portions of the Software.
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    18
 *
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    19
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    20
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    21
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    22
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    23
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    24
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    25
 * THE SOFTWARE.
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    26
 */
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    27
package de.duenndns.ssl;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    28
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    29
import android.app.Activity;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    30
import android.app.Application;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    31
import android.app.Notification;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    32
import android.app.NotificationManager;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    33
import android.app.Service;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    34
import android.app.PendingIntent;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    35
import android.content.BroadcastReceiver;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    36
import android.content.Context;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    37
import android.content.Intent;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    38
import android.content.IntentFilter;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    39
import android.net.Uri;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    40
import android.util.Log;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    41
import android.os.Handler;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    42
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    43
import java.io.File;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    44
import java.security.cert.*;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    45
import java.security.KeyStore;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    46
import java.security.KeyStoreException;
998
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
    47
import java.security.MessageDigest;
919
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    48
import java.util.HashMap;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    49
import javax.net.ssl.TrustManager;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    50
import javax.net.ssl.TrustManagerFactory;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    51
import javax.net.ssl.X509TrustManager;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    52
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    53
import com.beem.project.beem.R;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    54
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    55
/**
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    56
 * A X509 trust manager implementation which asks the user about invalid
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    57
 * certificates and memorizes their decision.
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    58
 * <p>
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    59
 * The certificate validity is checked using the system default X509
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    60
 * TrustManager, creating a query Dialog if the check fails.
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    61
 * <p>
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    62
 * <b>WARNING:</b> This only works if a dedicated thread is used for
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    63
 * opening sockets!
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    64
 */
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    65
public class MemorizingTrustManager implements X509TrustManager {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    66
	final static String TAG = "MemorizingTrustManager";
920
ff346f5bc36f MemorizingTrustManager: Allow an application to intercept the SSL notification
Da Risk <da_risk@beem-project.com>
parents: 919
diff changeset
    67
	public final static String INTERCEPT_DECISION_INTENT = "de.duenndns.ssl.INTERCEPT_DECISION";
ff346f5bc36f MemorizingTrustManager: Allow an application to intercept the SSL notification
Da Risk <da_risk@beem-project.com>
parents: 919
diff changeset
    68
	public final static String INTERCEPT_DECISION_INTENT_LAUNCH = INTERCEPT_DECISION_INTENT + ".launch_intent";
919
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    69
	final static String DECISION_INTENT = "de.duenndns.ssl.DECISION";
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    70
	final static String DECISION_INTENT_APP    = DECISION_INTENT + ".app";
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    71
	final static String DECISION_INTENT_ID     = DECISION_INTENT + ".decisionId";
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    72
	final static String DECISION_INTENT_CERT   = DECISION_INTENT + ".cert";
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    73
	final static String DECISION_INTENT_CHOICE = DECISION_INTENT + ".decisionChoice";
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    74
	private final static int NOTIFICATION_ID = 100509;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    75
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    76
	static String KEYSTORE_DIR = "KeyStore";
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    77
	static String KEYSTORE_FILE = "KeyStore.bks";
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    78
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    79
	Context master;
998
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
    80
	Activity foregroundAct;
919
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    81
	NotificationManager notificationManager;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    82
	private static int decisionId = 0;
998
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
    83
	private static HashMap<Integer, MTMDecision> openDecisions = new HashMap<Integer, MTMDecision>();
919
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    84
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    85
	Handler masterHandler;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    86
	private File keyStoreFile;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    87
	private KeyStore appKeyStore;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    88
	private X509TrustManager defaultTrustManager;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    89
	private X509TrustManager appTrustManager;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    90
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    91
	/** Creates an instance of the MemorizingTrustManager class.
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    92
	 *
998
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
    93
	 * You need to supply the application context. This has to be one of:
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
    94
	 *    - Application
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
    95
	 *    - Activity
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
    96
	 *    - Service
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
    97
	 *
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
    98
	 * The context is used for file management, to display the dialog /
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
    99
	 * notification and for obtaining translated strings.
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   100
	 *
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   101
	 * @param m Context for the application.
919
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   102
	 */
998
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   103
	public MemorizingTrustManager(Context m) {
919
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   104
		master = m;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   105
		masterHandler = new Handler();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   106
		notificationManager = (NotificationManager)master.getSystemService(Context.NOTIFICATION_SERVICE);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   107
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   108
		Application app;
998
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   109
		if (m instanceof Application) {
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   110
			app = (Application)m;
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   111
		} else if (m instanceof Service) {
919
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   112
			app = ((Service)m).getApplication();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   113
		} else if (m instanceof Activity) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   114
			app = ((Activity)m).getApplication();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   115
		} else throw new ClassCastException("MemorizingTrustManager context must be either Activity or Service!");
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   116
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   117
		File dir = app.getDir(KEYSTORE_DIR, Context.MODE_PRIVATE);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   118
		keyStoreFile = new File(dir + File.separator + KEYSTORE_FILE);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   119
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   120
		appKeyStore = loadAppKeyStore();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   121
		defaultTrustManager = getTrustManager(null);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   122
		appTrustManager = getTrustManager(appKeyStore);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   123
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   124
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   125
	/**
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   126
	 * Returns a X509TrustManager list containing a new instance of
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   127
	 * TrustManagerFactory.
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   128
	 *
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   129
	 * This function is meant for convenience only. You can use it
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   130
	 * as follows to integrate TrustManagerFactory for HTTPS sockets:
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   131
	 *
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   132
	 * <pre>
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   133
	 *     SSLContext sc = SSLContext.getInstance("TLS");
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   134
	 *     sc.init(null, MemorizingTrustManager.getInstanceList(this),
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   135
	 *         new java.security.SecureRandom());
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   136
	 *     HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   137
	 * </pre>
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   138
	 * @param c Activity or Service to show the Dialog / Notification
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   139
	 */
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   140
	public static X509TrustManager[] getInstanceList(Context c) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   141
		return new X509TrustManager[] { new MemorizingTrustManager(c) };
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   142
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   143
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   144
	/**
998
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   145
	 * Binds an Activity to the MTM for displaying the query dialog.
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   146
	 *
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   147
	 * This is useful if your connection is run from a service that is
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   148
	 * triggered by user interaction -- in such cases the activity is
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   149
	 * visible and the user tends to ignore the service notification.
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   150
	 *
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   151
	 * You should never have a hidden activity bound to MTM! Use this
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   152
	 * function in onResume() and @see unbindDisplayActivity in onPause().
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   153
	 *
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   154
	 * @param act Activity to be bound
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   155
	 */
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   156
	public void bindDisplayActivity(Activity act) {
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   157
		foregroundAct = act;
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   158
	}
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   159
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   160
	/**
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   161
	 * Removes an Activity from the MTM display stack.
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   162
	 *
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   163
	 * Always call this function when the Activity added with
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   164
	 * @see bindDisplayActivity is hidden.
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   165
	 *
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   166
	 * @param act Activity to be unbound
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   167
	 */
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   168
	public void unbindDisplayActivity(Activity act) {
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   169
		// do not remove if it was overridden by a different activity
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   170
		if (foregroundAct == act)
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   171
			foregroundAct = null;
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   172
	}
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   173
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   174
	/**
919
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   175
	 * Changes the path for the KeyStore file.
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   176
	 *
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   177
	 * The actual filename relative to the app's directory will be
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   178
	 * <code>app_<i>dirname</i>/<i>filename</i></code>.
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   179
	 *
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   180
	 * @param dirname directory to store the KeyStore.
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   181
	 * @param filename file name for the KeyStore.
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   182
	 */
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   183
	public static void setKeyStoreFile(String dirname, String filename) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   184
		KEYSTORE_DIR = dirname;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   185
		KEYSTORE_FILE = filename;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   186
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   187
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   188
	X509TrustManager getTrustManager(KeyStore ks) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   189
		try {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   190
			TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   191
			tmf.init(ks);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   192
			for (TrustManager t : tmf.getTrustManagers()) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   193
				if (t instanceof X509TrustManager) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   194
					return (X509TrustManager)t;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   195
				}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   196
			}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   197
		} catch (Exception e) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   198
			// Here, we are covering up errors. It might be more useful
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   199
			// however to throw them out of the constructor so the
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   200
			// embedding app knows something went wrong.
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   201
			Log.e(TAG, "getTrustManager(" + ks + ")", e);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   202
		}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   203
		return null;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   204
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   205
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   206
	KeyStore loadAppKeyStore() {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   207
		KeyStore ks;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   208
		try {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   209
			ks = KeyStore.getInstance(KeyStore.getDefaultType());
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   210
		} catch (KeyStoreException e) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   211
			Log.e(TAG, "getAppKeyStore()", e);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   212
			return null;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   213
		}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   214
		try {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   215
			ks.load(null, null);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   216
			ks.load(new java.io.FileInputStream(keyStoreFile), "MTM".toCharArray());
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   217
		} catch (java.io.FileNotFoundException e) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   218
			Log.i(TAG, "getAppKeyStore(" + keyStoreFile + ") - file does not exist");
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   219
		} catch (Exception e) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   220
			Log.e(TAG, "getAppKeyStore(" + keyStoreFile + ")", e);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   221
		}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   222
		return ks;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   223
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   224
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   225
	void storeCert(X509Certificate[] chain) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   226
		// add all certs from chain to appKeyStore
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   227
		try {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   228
			for (X509Certificate c : chain)
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   229
				appKeyStore.setCertificateEntry(c.getSubjectDN().toString(), c);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   230
		} catch (KeyStoreException e) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   231
			Log.e(TAG, "storeCert(" + chain + ")", e);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   232
			return;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   233
		}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   234
		
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   235
		// reload appTrustManager
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   236
		appTrustManager = getTrustManager(appKeyStore);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   237
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   238
		// store KeyStore to file
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   239
		try {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   240
			java.io.FileOutputStream fos = new java.io.FileOutputStream(keyStoreFile);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   241
			appKeyStore.store(fos, "MTM".toCharArray());
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   242
			fos.close();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   243
		} catch (Exception e) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   244
			Log.e(TAG, "storeCert(" + keyStoreFile + ")", e);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   245
		}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   246
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   247
998
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   248
	// if the certificate is stored in the app key store, it is considered "known"
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   249
	private boolean isCertKnown(X509Certificate cert) {
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   250
		try {
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   251
			return appKeyStore.getCertificateAlias(cert) != null;
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   252
		} catch (KeyStoreException e) {
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   253
			return false;
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   254
		}
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   255
	}
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   256
919
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   257
	private boolean isExpiredException(Throwable e) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   258
		do {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   259
			if (e instanceof CertificateExpiredException)
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   260
				return true;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   261
			e = e.getCause();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   262
		} while (e != null);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   263
		return false;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   264
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   265
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   266
	public void checkCertTrusted(X509Certificate[] chain, String authType, boolean isServer)
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   267
		throws CertificateException
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   268
	{
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   269
		Log.d(TAG, "checkCertTrusted(" + chain + ", " + authType + ", " + isServer + ")");
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   270
		try {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   271
			Log.d(TAG, "checkCertTrusted: trying appTrustManager");
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   272
			if (isServer)
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   273
				appTrustManager.checkServerTrusted(chain, authType);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   274
			else
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   275
				appTrustManager.checkClientTrusted(chain, authType);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   276
		} catch (CertificateException ae) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   277
			// if the cert is stored in our appTrustManager, we ignore expiredness
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   278
			ae.printStackTrace();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   279
			if (isExpiredException(ae)) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   280
				Log.i(TAG, "checkCertTrusted: accepting expired certificate from keystore");
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   281
				return;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   282
			}
998
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   283
			if (isCertKnown(chain[0])) {
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   284
				Log.i(TAG, "checkCertTrusted: accepting cert already stored in keystore");
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   285
				return;
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   286
			}
919
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   287
			try {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   288
				Log.d(TAG, "checkCertTrusted: trying defaultTrustManager");
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   289
				if (isServer)
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   290
					defaultTrustManager.checkServerTrusted(chain, authType);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   291
				else
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   292
					defaultTrustManager.checkClientTrusted(chain, authType);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   293
			} catch (CertificateException e) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   294
				e.printStackTrace();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   295
				interact(chain, authType, e);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   296
			}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   297
		}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   298
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   299
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   300
	public void checkClientTrusted(X509Certificate[] chain, String authType)
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   301
		throws CertificateException
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   302
	{
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   303
		checkCertTrusted(chain, authType, false);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   304
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   305
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   306
	public void checkServerTrusted(X509Certificate[] chain, String authType)
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   307
		throws CertificateException
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   308
	{
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   309
		checkCertTrusted(chain, authType, true);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   310
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   311
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   312
	public X509Certificate[] getAcceptedIssuers()
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   313
	{
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   314
		Log.d(TAG, "getAcceptedIssuers()");
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   315
		return defaultTrustManager.getAcceptedIssuers();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   316
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   317
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   318
	private int createDecisionId(MTMDecision d) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   319
		int myId;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   320
		synchronized(openDecisions) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   321
			myId = decisionId;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   322
			openDecisions.put(myId, d);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   323
			decisionId += 1;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   324
		}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   325
		return myId;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   326
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   327
998
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   328
	private static String hexString(byte[] data) {
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   329
		StringBuffer si = new StringBuffer();
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   330
		for (int i = 0; i < data.length; i++) {
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   331
			si.append(String.format("%02x", data[i]));
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   332
			if (i < data.length - 1)
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   333
				si.append(":");
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   334
		}
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   335
		return si.toString();
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   336
	}
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   337
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   338
	private static String certHash(final X509Certificate cert, String digest) {
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   339
		try {
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   340
			MessageDigest md = MessageDigest.getInstance(digest);
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   341
			md.update(cert.getEncoded());
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   342
			return hexString(md.digest());
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   343
		} catch (java.security.cert.CertificateEncodingException e) {
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   344
			return e.getMessage();
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   345
		} catch (java.security.NoSuchAlgorithmException e) {
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   346
			return e.getMessage();
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   347
		}
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   348
	}
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   349
919
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   350
	private String certChainMessage(final X509Certificate[] chain, CertificateException cause) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   351
		Throwable e = cause;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   352
		Log.d(TAG, "certChainMessage for " + e);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   353
		StringBuffer si = new StringBuffer();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   354
		if (e.getCause() != null) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   355
			e = e.getCause();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   356
			si.append(e.getLocalizedMessage());
998
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   357
			//si.append("\n");
919
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   358
		}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   359
		for (X509Certificate c : chain) {
998
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   360
			si.append("\n\n");
919
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   361
			si.append(c.getSubjectDN().toString());
998
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   362
			si.append("\nMD5: ");
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   363
			si.append(certHash(c, "MD5"));
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   364
			si.append("\nSHA1: ");
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   365
			si.append(certHash(c, "SHA-1"));
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   366
			si.append("\nSigned by: ");
919
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   367
			si.append(c.getIssuerDN().toString());
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   368
		}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   369
		return si.toString();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   370
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   371
920
ff346f5bc36f MemorizingTrustManager: Allow an application to intercept the SSL notification
Da Risk <da_risk@beem-project.com>
parents: 919
diff changeset
   372
	void startActivityNotification(PendingIntent intent, String certName) {
919
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   373
		Notification n = new Notification(android.R.drawable.ic_lock_lock,
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   374
				master.getString(R.string.mtm_notification),
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   375
				System.currentTimeMillis());
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   376
		n.setLatestEventInfo(master.getApplicationContext(),
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   377
				master.getString(R.string.mtm_notification),
920
ff346f5bc36f MemorizingTrustManager: Allow an application to intercept the SSL notification
Da Risk <da_risk@beem-project.com>
parents: 919
diff changeset
   378
				certName, intent);
919
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   379
		n.flags |= Notification.FLAG_AUTO_CANCEL;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   380
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   381
		notificationManager.notify(NOTIFICATION_ID, n);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   382
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   383
998
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   384
	/**
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   385
	 * Returns the top-most entry of the activity stack.
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   386
	 *
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   387
	 * @return the Context of the currently bound UI or the master context if none is bound
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   388
	 */
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   389
	Context getUI() {
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   390
		return (foregroundAct != null) ? foregroundAct : master;
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   391
	}
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   392
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   393
	BroadcastReceiver launchServiceMode(Intent activityIntent, final String certMessage) {
920
ff346f5bc36f MemorizingTrustManager: Allow an application to intercept the SSL notification
Da Risk <da_risk@beem-project.com>
parents: 919
diff changeset
   394
		BroadcastReceiver launchNotifReceiver= new BroadcastReceiver() {
ff346f5bc36f MemorizingTrustManager: Allow an application to intercept the SSL notification
Da Risk <da_risk@beem-project.com>
parents: 919
diff changeset
   395
		    public void onReceive(Context ctx, Intent i) {
ff346f5bc36f MemorizingTrustManager: Allow an application to intercept the SSL notification
Da Risk <da_risk@beem-project.com>
parents: 919
diff changeset
   396
			Log.i(TAG, "Interception not done by the application. Send notification");
ff346f5bc36f MemorizingTrustManager: Allow an application to intercept the SSL notification
Da Risk <da_risk@beem-project.com>
parents: 919
diff changeset
   397
			PendingIntent pi = i.getParcelableExtra(INTERCEPT_DECISION_INTENT_LAUNCH);
ff346f5bc36f MemorizingTrustManager: Allow an application to intercept the SSL notification
Da Risk <da_risk@beem-project.com>
parents: 919
diff changeset
   398
			startActivityNotification(pi, certMessage);
ff346f5bc36f MemorizingTrustManager: Allow an application to intercept the SSL notification
Da Risk <da_risk@beem-project.com>
parents: 919
diff changeset
   399
		    }
ff346f5bc36f MemorizingTrustManager: Allow an application to intercept the SSL notification
Da Risk <da_risk@beem-project.com>
parents: 919
diff changeset
   400
		};
ff346f5bc36f MemorizingTrustManager: Allow an application to intercept the SSL notification
Da Risk <da_risk@beem-project.com>
parents: 919
diff changeset
   401
		master.registerReceiver(launchNotifReceiver, new IntentFilter(INTERCEPT_DECISION_INTENT + "/" + master.getPackageName()));
ff346f5bc36f MemorizingTrustManager: Allow an application to intercept the SSL notification
Da Risk <da_risk@beem-project.com>
parents: 919
diff changeset
   402
		PendingIntent call = PendingIntent.getActivity(master, 0, activityIntent, 0);
ff346f5bc36f MemorizingTrustManager: Allow an application to intercept the SSL notification
Da Risk <da_risk@beem-project.com>
parents: 919
diff changeset
   403
		Intent ni = new Intent(INTERCEPT_DECISION_INTENT + "/" + master.getPackageName());
ff346f5bc36f MemorizingTrustManager: Allow an application to intercept the SSL notification
Da Risk <da_risk@beem-project.com>
parents: 919
diff changeset
   404
		ni.putExtra(INTERCEPT_DECISION_INTENT_LAUNCH, call);
ff346f5bc36f MemorizingTrustManager: Allow an application to intercept the SSL notification
Da Risk <da_risk@beem-project.com>
parents: 919
diff changeset
   405
		master.sendOrderedBroadcast(ni, null);
998
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   406
		return launchNotifReceiver;
920
ff346f5bc36f MemorizingTrustManager: Allow an application to intercept the SSL notification
Da Risk <da_risk@beem-project.com>
parents: 919
diff changeset
   407
	}
ff346f5bc36f MemorizingTrustManager: Allow an application to intercept the SSL notification
Da Risk <da_risk@beem-project.com>
parents: 919
diff changeset
   408
919
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   409
	void interact(final X509Certificate[] chain, String authType, CertificateException cause)
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   410
		throws CertificateException
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   411
	{
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   412
		/* prepare the MTMDecision blocker object */
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   413
		MTMDecision choice = new MTMDecision();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   414
		final int myId = createDecisionId(choice);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   415
		final String certMessage = certChainMessage(chain, cause);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   416
		BroadcastReceiver decisionReceiver = new BroadcastReceiver() {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   417
			public void onReceive(Context ctx, Intent i) { interactResult(i); }
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   418
		};
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   419
		master.registerReceiver(decisionReceiver, new IntentFilter(DECISION_INTENT + "/" + master.getPackageName()));
998
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   420
		LaunchRunnable lr = new LaunchRunnable(myId, certMessage);
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   421
		masterHandler.post(lr);
919
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   422
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   423
		Log.d(TAG, "openDecisions: " + openDecisions);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   424
		Log.d(TAG, "waiting on " + myId);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   425
		try {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   426
			synchronized(choice) { choice.wait(); }
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   427
		} catch (InterruptedException e) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   428
			e.printStackTrace();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   429
		}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   430
		master.unregisterReceiver(decisionReceiver);
998
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   431
		if (lr.launchNotifReceiver != null)
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   432
			master.unregisterReceiver(lr.launchNotifReceiver);
919
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   433
		Log.d(TAG, "finished wait on " + myId + ": " + choice.state);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   434
		switch (choice.state) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   435
		case MTMDecision.DECISION_ALWAYS:
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   436
			storeCert(chain);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   437
		case MTMDecision.DECISION_ONCE:
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   438
			break;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   439
		default:
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   440
			throw (cause);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   441
		}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   442
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   443
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   444
	public static void interactResult(Intent i) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   445
		int decisionId = i.getIntExtra(DECISION_INTENT_ID, MTMDecision.DECISION_INVALID);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   446
		int choice = i.getIntExtra(DECISION_INTENT_CHOICE, MTMDecision.DECISION_INVALID);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   447
		Log.d(TAG, "interactResult: " + decisionId + " chose " + choice);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   448
		Log.d(TAG, "openDecisions: " + openDecisions);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   449
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   450
		MTMDecision d;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   451
		synchronized(openDecisions) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   452
			 d = openDecisions.get(decisionId);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   453
			 openDecisions.remove(decisionId);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   454
		}
998
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   455
		if (d == null) {
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   456
			Log.e(TAG, "interactResult: aborting due to stale decision reference!");
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   457
			return;
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   458
		}
919
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   459
		synchronized(d) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   460
			d.state = choice;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   461
			d.notify();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   462
		}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   463
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   464
998
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   465
	private class LaunchRunnable implements Runnable {
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   466
		private int myId;
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   467
		private String certMessage;
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   468
		BroadcastReceiver launchNotifReceiver;
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   469
		
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   470
		public LaunchRunnable(final int id, final String certMsg) {
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   471
			myId = id;
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   472
			certMessage = certMsg;
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   473
		}
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   474
		
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   475
		public void run() {
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   476
			Intent ni = new Intent(master, MemorizingActivity.class);
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   477
			ni.setData(Uri.parse(MemorizingTrustManager.class.getName() + "/" + myId));
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   478
			ni.putExtra(DECISION_INTENT_APP, master.getPackageName());
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   479
			ni.putExtra(DECISION_INTENT_ID, myId);
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   480
			ni.putExtra(DECISION_INTENT_CERT, certMessage);
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   481
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   482
			// we try to directly start the activity and fall back to
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   483
			// making a notification
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   484
			try {
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   485
				getUI().startActivity(ni);
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   486
			} catch (Exception e) {
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   487
				Log.e(TAG, "startActivity: " + e);
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   488
				launchNotifReceiver = launchServiceMode(ni, certMessage);
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   489
			}
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   490
		}
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   491
	}
d8305c375b10 Update to the latest version of MemorizingTrustManager
Da Risk <da_risk@beem-project.com>
parents: 920
diff changeset
   492
	
919
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   493
}