src/de/duenndns/ssl/MemorizingTrustManager.java
author Da Risk <da_risk@beem-project.com>
Mon, 22 Aug 2011 22:35:57 +0200
changeset 897 84d62c76469e
child 898 ff346f5bc36f
permissions -rw-r--r--
Add MemorizingTrustManager library in source.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
897
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.AlertDialog;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    35
import android.app.PendingIntent;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    36
import android.content.BroadcastReceiver;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    37
import android.content.Context;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    38
import android.content.DialogInterface;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    39
import android.content.DialogInterface.OnClickListener;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    40
import android.content.Intent;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    41
import android.content.IntentFilter;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    42
import android.net.Uri;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    43
import android.util.Log;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    44
import android.os.Handler;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    45
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    46
import java.io.File;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    47
import java.security.cert.*;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    48
import java.security.KeyStore;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    49
import java.security.KeyStoreException;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    50
import java.util.concurrent.atomic.AtomicInteger;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    51
import java.util.HashMap;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    52
import javax.net.ssl.TrustManager;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    53
import javax.net.ssl.TrustManagerFactory;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    54
import javax.net.ssl.X509TrustManager;
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
import com.beem.project.beem.R;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    57
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    58
/**
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    59
 * 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
    60
 * certificates and memorizes their decision.
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
 * 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
    63
 * 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
    64
 * <p>
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    65
 * <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
    66
 * opening sockets!
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    67
 */
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    68
public class MemorizingTrustManager implements X509TrustManager {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    69
	final static String TAG = "MemorizingTrustManager";
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    70
	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
    71
	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
    72
	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
    73
	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
    74
	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
    75
	private final static int NOTIFICATION_ID = 100509;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    76
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    77
	static String KEYSTORE_DIR = "KeyStore";
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    78
	static String KEYSTORE_FILE = "KeyStore.bks";
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    79
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    80
	Context master;
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;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    83
	private static HashMap<Integer,MTMDecision> openDecisions = new HashMap();
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
	 *
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    93
	 * @param m Activity or Service to show the Dialog / Notification
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    94
	 */
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    95
	private MemorizingTrustManager(Context m) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    96
		master = m;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    97
		masterHandler = new Handler();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    98
		notificationManager = (NotificationManager)master.getSystemService(Context.NOTIFICATION_SERVICE);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    99
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   100
		Application app;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   101
		if (m instanceof Service) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   102
			app = ((Service)m).getApplication();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   103
		} else if (m instanceof Activity) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   104
			app = ((Activity)m).getApplication();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   105
		} 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
   106
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   107
		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
   108
		keyStoreFile = new File(dir + File.separator + KEYSTORE_FILE);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   109
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   110
		appKeyStore = loadAppKeyStore();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   111
		defaultTrustManager = getTrustManager(null);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   112
		appTrustManager = getTrustManager(appKeyStore);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   113
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   114
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   115
	/**
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   116
	 * 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
   117
	 * TrustManagerFactory.
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   118
	 *
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   119
	 * 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
   120
	 * as follows to integrate TrustManagerFactory for HTTPS sockets:
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   121
	 *
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   122
	 * <pre>
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   123
	 *     SSLContext sc = SSLContext.getInstance("TLS");
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   124
	 *     sc.init(null, MemorizingTrustManager.getInstanceList(this),
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   125
	 *         new java.security.SecureRandom());
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   126
	 *     HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   127
	 * </pre>
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   128
	 * @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
   129
	 */
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   130
	public static X509TrustManager[] getInstanceList(Context c) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   131
		return new X509TrustManager[] { new MemorizingTrustManager(c) };
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   132
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   133
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   134
	/**
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   135
	 * Changes the path for the KeyStore file.
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   136
	 *
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   137
	 * 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
   138
	 * <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
   139
	 *
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   140
	 * @param dirname directory to store the KeyStore.
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   141
	 * @param filename file name for the KeyStore.
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
	public static void setKeyStoreFile(String dirname, String filename) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   144
		KEYSTORE_DIR = dirname;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   145
		KEYSTORE_FILE = filename;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   146
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   147
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   148
	X509TrustManager getTrustManager(KeyStore ks) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   149
		try {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   150
			TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   151
			tmf.init(ks);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   152
			for (TrustManager t : tmf.getTrustManagers()) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   153
				if (t instanceof X509TrustManager) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   154
					return (X509TrustManager)t;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   155
				}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   156
			}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   157
		} catch (Exception e) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   158
			// 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
   159
			// 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
   160
			// embedding app knows something went wrong.
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   161
			Log.e(TAG, "getTrustManager(" + ks + ")", e);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   162
		}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   163
		return null;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   164
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   165
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   166
	KeyStore loadAppKeyStore() {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   167
		KeyStore ks;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   168
		try {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   169
			ks = KeyStore.getInstance(KeyStore.getDefaultType());
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   170
		} catch (KeyStoreException e) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   171
			Log.e(TAG, "getAppKeyStore()", e);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   172
			return null;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   173
		}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   174
		try {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   175
			ks.load(null, null);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   176
			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
   177
		} catch (java.io.FileNotFoundException e) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   178
			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
   179
		} catch (Exception e) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   180
			Log.e(TAG, "getAppKeyStore(" + keyStoreFile + ")", e);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   181
		}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   182
		return ks;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   183
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   184
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   185
	void storeCert(X509Certificate[] chain) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   186
		// add all certs from chain to appKeyStore
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   187
		try {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   188
			for (X509Certificate c : chain)
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   189
				appKeyStore.setCertificateEntry(c.getSubjectDN().toString(), c);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   190
		} catch (KeyStoreException e) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   191
			Log.e(TAG, "storeCert(" + chain + ")", e);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   192
			return;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   193
		}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   194
		
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   195
		// reload appTrustManager
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   196
		appTrustManager = getTrustManager(appKeyStore);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   197
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   198
		// store KeyStore to file
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   199
		try {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   200
			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
   201
			appKeyStore.store(fos, "MTM".toCharArray());
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   202
			fos.close();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   203
		} catch (Exception e) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   204
			Log.e(TAG, "storeCert(" + keyStoreFile + ")", e);
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
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   207
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   208
	private boolean isExpiredException(Throwable e) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   209
		do {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   210
			if (e instanceof CertificateExpiredException)
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   211
				return true;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   212
			e = e.getCause();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   213
		} while (e != null);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   214
		return false;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   215
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   216
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   217
	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
   218
		throws CertificateException
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   219
	{
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   220
		Log.d(TAG, "checkCertTrusted(" + chain + ", " + authType + ", " + isServer + ")");
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   221
		try {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   222
			Log.d(TAG, "checkCertTrusted: trying appTrustManager");
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   223
			if (isServer)
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   224
				appTrustManager.checkServerTrusted(chain, authType);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   225
			else
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   226
				appTrustManager.checkClientTrusted(chain, authType);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   227
		} catch (CertificateException ae) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   228
			// 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
   229
			ae.printStackTrace();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   230
			if (isExpiredException(ae)) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   231
				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
   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
			try {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   235
				Log.d(TAG, "checkCertTrusted: trying defaultTrustManager");
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   236
				if (isServer)
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   237
					defaultTrustManager.checkServerTrusted(chain, authType);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   238
				else
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   239
					defaultTrustManager.checkClientTrusted(chain, authType);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   240
			} catch (CertificateException e) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   241
				e.printStackTrace();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   242
				interact(chain, authType, e);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   243
			}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   244
		}
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
	public void checkClientTrusted(X509Certificate[] chain, String authType)
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   248
		throws CertificateException
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   249
	{
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   250
		checkCertTrusted(chain, authType, false);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   251
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   252
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   253
	public void checkServerTrusted(X509Certificate[] chain, String authType)
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   254
		throws CertificateException
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   255
	{
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   256
		checkCertTrusted(chain, authType, true);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   257
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   258
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   259
	public X509Certificate[] getAcceptedIssuers()
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   260
	{
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   261
		Log.d(TAG, "getAcceptedIssuers()");
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   262
		return defaultTrustManager.getAcceptedIssuers();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   263
	}
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
	private int createDecisionId(MTMDecision d) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   266
		int myId;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   267
		synchronized(openDecisions) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   268
			myId = decisionId;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   269
			openDecisions.put(myId, d);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   270
			decisionId += 1;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   271
		}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   272
		return myId;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   273
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   274
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   275
	private String certChainMessage(final X509Certificate[] chain, CertificateException cause) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   276
		Throwable e = cause;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   277
		Log.d(TAG, "certChainMessage for " + e);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   278
		StringBuffer si = new StringBuffer();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   279
		if (e.getCause() != null) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   280
			e = e.getCause();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   281
			si.append(e.getLocalizedMessage());
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   282
			si.append("\n");
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   283
		}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   284
		for (X509Certificate c : chain) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   285
			si.append("\n");
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   286
			si.append(c.getSubjectDN().toString());
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   287
			si.append(" (");
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   288
			si.append(c.getIssuerDN().toString());
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   289
			si.append(")");
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   290
		}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   291
		return si.toString();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   292
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   293
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   294
	void startActivityNotification(Intent intent, String certName) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   295
		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
   296
				master.getString(R.string.mtm_notification),
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   297
				System.currentTimeMillis());
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   298
		PendingIntent call = PendingIntent.getActivity(master, 0, intent, 0);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   299
		n.setLatestEventInfo(master.getApplicationContext(),
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   300
				master.getString(R.string.mtm_notification),
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   301
				certName, call);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   302
		n.flags |= Notification.FLAG_AUTO_CANCEL;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   303
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   304
		notificationManager.notify(NOTIFICATION_ID, n);
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
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   307
	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
   308
		throws CertificateException
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   309
	{
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   310
		/* prepare the MTMDecision blocker object */
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   311
		MTMDecision choice = new MTMDecision();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   312
		final int myId = createDecisionId(choice);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   313
		final String certTitle = chain[0].getSubjectDN().toString();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   314
		final String certMessage = certChainMessage(chain, cause);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   315
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   316
		BroadcastReceiver decisionReceiver = new BroadcastReceiver() {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   317
			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
   318
		};
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   319
		master.registerReceiver(decisionReceiver, new IntentFilter(DECISION_INTENT + "/" + master.getPackageName()));
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   320
		masterHandler.post(new Runnable() {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   321
			public void run() {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   322
				Intent ni = new Intent(master, MemorizingActivity.class);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   323
				ni.setData(Uri.parse(MemorizingTrustManager.class.getName() + "/" + myId));
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   324
				ni.putExtra(DECISION_INTENT_APP, master.getPackageName());
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   325
				ni.putExtra(DECISION_INTENT_ID, myId);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   326
				ni.putExtra(DECISION_INTENT_CERT, certMessage);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   327
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   328
				try {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   329
					master.startActivity(ni);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   330
				} catch (Exception e) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   331
					Log.e(TAG, "startActivity: " + e);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   332
					startActivityNotification(ni, certMessage);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   333
				}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   334
			}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   335
		});
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   336
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   337
		Log.d(TAG, "openDecisions: " + openDecisions);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   338
		Log.d(TAG, "waiting on " + myId);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   339
		try {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   340
			synchronized(choice) { choice.wait(); }
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   341
		} catch (InterruptedException e) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   342
			e.printStackTrace();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   343
		}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   344
		master.unregisterReceiver(decisionReceiver);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   345
		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
   346
		switch (choice.state) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   347
		case MTMDecision.DECISION_ALWAYS:
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   348
			storeCert(chain);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   349
		case MTMDecision.DECISION_ONCE:
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   350
			break;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   351
		default:
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   352
			throw (cause);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   353
		}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   354
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   355
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   356
	public static void interactResult(Intent i) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   357
		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
   358
		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
   359
		Log.d(TAG, "interactResult: " + decisionId + " chose " + choice);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   360
		Log.d(TAG, "openDecisions: " + openDecisions);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   361
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   362
		MTMDecision d;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   363
		synchronized(openDecisions) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   364
			 d = openDecisions.get(decisionId);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   365
			 openDecisions.remove(decisionId);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   366
		}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   367
		synchronized(d) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   368
			d.state = choice;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   369
			d.notify();
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
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   372
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   373
}