src/de/duenndns/ssl/MemorizingTrustManager.java
author Nikita Kozlov <nikita@elyzion.net>
Mon, 23 Jan 2012 17:35:22 +0100
changeset 953 59d7b3e9580f
parent 898 ff346f5bc36f
child 975 d8305c375b10
permissions -rw-r--r--
Bug #386: fix it !
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";
898
ff346f5bc36f MemorizingTrustManager: Allow an application to intercept the SSL notification
Da Risk <da_risk@beem-project.com>
parents: 897
diff changeset
    70
	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: 897
diff changeset
    71
	public final static String INTERCEPT_DECISION_INTENT_LAUNCH = INTERCEPT_DECISION_INTENT + ".launch_intent";
897
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    72
	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
    73
	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
    74
	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
    75
	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
    76
	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
    77
	private final static int NOTIFICATION_ID = 100509;
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
	static String KEYSTORE_DIR = "KeyStore";
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    80
	static String KEYSTORE_FILE = "KeyStore.bks";
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    81
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    82
	Context master;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    83
	NotificationManager notificationManager;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    84
	private static int decisionId = 0;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    85
	private static HashMap<Integer,MTMDecision> openDecisions = new HashMap();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    86
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    87
	Handler masterHandler;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    88
	private File keyStoreFile;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    89
	private KeyStore appKeyStore;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    90
	private X509TrustManager defaultTrustManager;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    91
	private X509TrustManager appTrustManager;
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
	/** Creates an instance of the MemorizingTrustManager class.
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
	 * @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
    96
	 */
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    97
	private MemorizingTrustManager(Context m) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    98
		master = m;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    99
		masterHandler = new Handler();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   100
		notificationManager = (NotificationManager)master.getSystemService(Context.NOTIFICATION_SERVICE);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   101
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   102
		Application app;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   103
		if (m instanceof Service) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   104
			app = ((Service)m).getApplication();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   105
		} else if (m instanceof Activity) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   106
			app = ((Activity)m).getApplication();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   107
		} 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
   108
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   109
		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
   110
		keyStoreFile = new File(dir + File.separator + KEYSTORE_FILE);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   111
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   112
		appKeyStore = loadAppKeyStore();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   113
		defaultTrustManager = getTrustManager(null);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   114
		appTrustManager = getTrustManager(appKeyStore);
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
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   117
	/**
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   118
	 * 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
   119
	 * TrustManagerFactory.
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   120
	 *
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   121
	 * 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
   122
	 * as follows to integrate TrustManagerFactory for HTTPS sockets:
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
	 * <pre>
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   125
	 *     SSLContext sc = SSLContext.getInstance("TLS");
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   126
	 *     sc.init(null, MemorizingTrustManager.getInstanceList(this),
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   127
	 *         new java.security.SecureRandom());
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   128
	 *     HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   129
	 * </pre>
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   130
	 * @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
   131
	 */
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   132
	public static X509TrustManager[] getInstanceList(Context c) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   133
		return new X509TrustManager[] { new MemorizingTrustManager(c) };
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
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
	 * Changes the path for the KeyStore file.
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   138
	 *
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   139
	 * 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
   140
	 * <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
   141
	 *
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   142
	 * @param dirname directory to store the KeyStore.
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   143
	 * @param filename file name for the KeyStore.
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   144
	 */
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   145
	public static void setKeyStoreFile(String dirname, String filename) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   146
		KEYSTORE_DIR = dirname;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   147
		KEYSTORE_FILE = filename;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   148
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   149
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   150
	X509TrustManager getTrustManager(KeyStore ks) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   151
		try {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   152
			TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   153
			tmf.init(ks);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   154
			for (TrustManager t : tmf.getTrustManagers()) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   155
				if (t instanceof X509TrustManager) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   156
					return (X509TrustManager)t;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   157
				}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   158
			}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   159
		} catch (Exception e) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   160
			// 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
   161
			// 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
   162
			// embedding app knows something went wrong.
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   163
			Log.e(TAG, "getTrustManager(" + ks + ")", e);
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
		return null;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   166
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   167
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   168
	KeyStore loadAppKeyStore() {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   169
		KeyStore ks;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   170
		try {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   171
			ks = KeyStore.getInstance(KeyStore.getDefaultType());
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   172
		} catch (KeyStoreException e) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   173
			Log.e(TAG, "getAppKeyStore()", e);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   174
			return null;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   175
		}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   176
		try {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   177
			ks.load(null, null);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   178
			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
   179
		} catch (java.io.FileNotFoundException e) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   180
			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
   181
		} catch (Exception e) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   182
			Log.e(TAG, "getAppKeyStore(" + keyStoreFile + ")", e);
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
		return ks;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   185
	}
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
	void storeCert(X509Certificate[] chain) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   188
		// add all certs from chain to appKeyStore
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
			for (X509Certificate c : chain)
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   191
				appKeyStore.setCertificateEntry(c.getSubjectDN().toString(), c);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   192
		} catch (KeyStoreException e) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   193
			Log.e(TAG, "storeCert(" + chain + ")", e);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   194
			return;
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
		// reload appTrustManager
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   198
		appTrustManager = getTrustManager(appKeyStore);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   199
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   200
		// store KeyStore to file
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   201
		try {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   202
			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
   203
			appKeyStore.store(fos, "MTM".toCharArray());
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   204
			fos.close();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   205
		} catch (Exception e) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   206
			Log.e(TAG, "storeCert(" + keyStoreFile + ")", e);
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
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   209
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   210
	private boolean isExpiredException(Throwable e) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   211
		do {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   212
			if (e instanceof CertificateExpiredException)
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   213
				return true;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   214
			e = e.getCause();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   215
		} while (e != null);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   216
		return false;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   217
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   218
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   219
	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
   220
		throws CertificateException
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
		Log.d(TAG, "checkCertTrusted(" + chain + ", " + authType + ", " + isServer + ")");
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   223
		try {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   224
			Log.d(TAG, "checkCertTrusted: trying appTrustManager");
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   225
			if (isServer)
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   226
				appTrustManager.checkServerTrusted(chain, authType);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   227
			else
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   228
				appTrustManager.checkClientTrusted(chain, authType);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   229
		} catch (CertificateException ae) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   230
			// 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
   231
			ae.printStackTrace();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   232
			if (isExpiredException(ae)) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   233
				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
   234
				return;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   235
			}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   236
			try {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   237
				Log.d(TAG, "checkCertTrusted: trying defaultTrustManager");
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   238
				if (isServer)
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   239
					defaultTrustManager.checkServerTrusted(chain, authType);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   240
				else
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   241
					defaultTrustManager.checkClientTrusted(chain, authType);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   242
			} catch (CertificateException e) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   243
				e.printStackTrace();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   244
				interact(chain, authType, 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
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   248
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   249
	public void checkClientTrusted(X509Certificate[] chain, String authType)
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   250
		throws CertificateException
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
		checkCertTrusted(chain, authType, false);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   253
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   254
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   255
	public void checkServerTrusted(X509Certificate[] chain, String authType)
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   256
		throws CertificateException
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
		checkCertTrusted(chain, authType, true);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   259
	}
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
	public X509Certificate[] getAcceptedIssuers()
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   262
	{
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   263
		Log.d(TAG, "getAcceptedIssuers()");
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   264
		return defaultTrustManager.getAcceptedIssuers();
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
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   267
	private int createDecisionId(MTMDecision d) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   268
		int myId;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   269
		synchronized(openDecisions) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   270
			myId = decisionId;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   271
			openDecisions.put(myId, d);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   272
			decisionId += 1;
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
		return myId;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   275
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   276
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   277
	private String certChainMessage(final X509Certificate[] chain, CertificateException cause) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   278
		Throwable e = cause;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   279
		Log.d(TAG, "certChainMessage for " + e);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   280
		StringBuffer si = new StringBuffer();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   281
		if (e.getCause() != null) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   282
			e = e.getCause();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   283
			si.append(e.getLocalizedMessage());
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   284
			si.append("\n");
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   285
		}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   286
		for (X509Certificate c : chain) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   287
			si.append("\n");
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   288
			si.append(c.getSubjectDN().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
			si.append(c.getIssuerDN().toString());
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   291
			si.append(")");
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
		return si.toString();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   294
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   295
898
ff346f5bc36f MemorizingTrustManager: Allow an application to intercept the SSL notification
Da Risk <da_risk@beem-project.com>
parents: 897
diff changeset
   296
	void startActivityNotification(PendingIntent intent, String certName) {
897
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   297
		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
   298
				master.getString(R.string.mtm_notification),
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   299
				System.currentTimeMillis());
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   300
		n.setLatestEventInfo(master.getApplicationContext(),
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   301
				master.getString(R.string.mtm_notification),
898
ff346f5bc36f MemorizingTrustManager: Allow an application to intercept the SSL notification
Da Risk <da_risk@beem-project.com>
parents: 897
diff changeset
   302
				certName, intent);
897
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   303
		n.flags |= Notification.FLAG_AUTO_CANCEL;
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
		notificationManager.notify(NOTIFICATION_ID, n);
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
898
ff346f5bc36f MemorizingTrustManager: Allow an application to intercept the SSL notification
Da Risk <da_risk@beem-project.com>
parents: 897
diff changeset
   308
	void launchServiceMode(Intent activityIntent, final String certMessage) {
ff346f5bc36f MemorizingTrustManager: Allow an application to intercept the SSL notification
Da Risk <da_risk@beem-project.com>
parents: 897
diff changeset
   309
		BroadcastReceiver launchNotifReceiver= new BroadcastReceiver() {
ff346f5bc36f MemorizingTrustManager: Allow an application to intercept the SSL notification
Da Risk <da_risk@beem-project.com>
parents: 897
diff changeset
   310
		    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: 897
diff changeset
   311
			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: 897
diff changeset
   312
			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: 897
diff changeset
   313
			startActivityNotification(pi, certMessage);
ff346f5bc36f MemorizingTrustManager: Allow an application to intercept the SSL notification
Da Risk <da_risk@beem-project.com>
parents: 897
diff changeset
   314
		    }
ff346f5bc36f MemorizingTrustManager: Allow an application to intercept the SSL notification
Da Risk <da_risk@beem-project.com>
parents: 897
diff changeset
   315
		};
ff346f5bc36f MemorizingTrustManager: Allow an application to intercept the SSL notification
Da Risk <da_risk@beem-project.com>
parents: 897
diff changeset
   316
		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: 897
diff changeset
   317
		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: 897
diff changeset
   318
		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: 897
diff changeset
   319
		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: 897
diff changeset
   320
		master.sendOrderedBroadcast(ni, null);
ff346f5bc36f MemorizingTrustManager: Allow an application to intercept the SSL notification
Da Risk <da_risk@beem-project.com>
parents: 897
diff changeset
   321
ff346f5bc36f MemorizingTrustManager: Allow an application to intercept the SSL notification
Da Risk <da_risk@beem-project.com>
parents: 897
diff changeset
   322
	}
ff346f5bc36f MemorizingTrustManager: Allow an application to intercept the SSL notification
Da Risk <da_risk@beem-project.com>
parents: 897
diff changeset
   323
897
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   324
	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
   325
		throws CertificateException
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
		/* prepare the MTMDecision blocker object */
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   328
		MTMDecision choice = new MTMDecision();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   329
		final int myId = createDecisionId(choice);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   330
		final String certTitle = chain[0].getSubjectDN().toString();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   331
		final String certMessage = certChainMessage(chain, cause);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   332
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   333
		BroadcastReceiver decisionReceiver = new BroadcastReceiver() {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   334
			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
   335
		};
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   336
		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
   337
		masterHandler.post(new Runnable() {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   338
			public void run() {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   339
				Intent ni = new Intent(master, MemorizingActivity.class);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   340
				ni.setData(Uri.parse(MemorizingTrustManager.class.getName() + "/" + myId));
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   341
				ni.putExtra(DECISION_INTENT_APP, master.getPackageName());
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   342
				ni.putExtra(DECISION_INTENT_ID, myId);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   343
				ni.putExtra(DECISION_INTENT_CERT, certMessage);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   344
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   345
				try {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   346
					master.startActivity(ni);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   347
				} catch (Exception e) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   348
					Log.e(TAG, "startActivity: " + e);
898
ff346f5bc36f MemorizingTrustManager: Allow an application to intercept the SSL notification
Da Risk <da_risk@beem-project.com>
parents: 897
diff changeset
   349
					launchServiceMode(ni, certMessage);
897
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   350
				}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   351
			}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   352
		});
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
		Log.d(TAG, "openDecisions: " + openDecisions);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   355
		Log.d(TAG, "waiting on " + myId);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   356
		try {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   357
			synchronized(choice) { choice.wait(); }
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   358
		} catch (InterruptedException e) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   359
			e.printStackTrace();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   360
		}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   361
		master.unregisterReceiver(decisionReceiver);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   362
		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
   363
		switch (choice.state) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   364
		case MTMDecision.DECISION_ALWAYS:
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   365
			storeCert(chain);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   366
		case MTMDecision.DECISION_ONCE:
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   367
			break;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   368
		default:
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   369
			throw (cause);
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
	public static void interactResult(Intent i) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   374
		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
   375
		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
   376
		Log.d(TAG, "interactResult: " + decisionId + " chose " + choice);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   377
		Log.d(TAG, "openDecisions: " + openDecisions);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   378
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   379
		MTMDecision d;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   380
		synchronized(openDecisions) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   381
			 d = openDecisions.get(decisionId);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   382
			 openDecisions.remove(decisionId);
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   383
		}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   384
		synchronized(d) {
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   385
			d.state = choice;
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   386
			d.notify();
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   387
		}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   388
	}
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   389
84d62c76469e Add MemorizingTrustManager library in source.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   390
}