aboutsummaryrefslogtreecommitdiffstats
path: root/libs/MemorizingTrustManager/example/src/de/duenndns/mtmexample/MTMExample.java
blob: 0d16ae82fd63e41657d06945c05e8d13c7d9cca2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package de.duenndns.mtmexample;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.TextView;

import java.net.URL;
import java.security.KeyStoreException;
import java.util.ArrayList;
import java.util.Collections;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.X509TrustManager;

import de.duenndns.ssl.MemorizingTrustManager;

/**
 * Example to demonstrate the use of MemorizingTrustManager on HTTPS
 * sockets.
 */
public class MTMExample extends Activity implements OnClickListener
{
	MemorizingTrustManager mtm;
	
	TextView content;
	HostnameVerifier defaultverifier;
	EditText urlinput;
	String text;
	Handler hdlr;

	/** Creates the Activity and registers a MemorizingTrustManager. */
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		JULHandler.initialize();
		requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
		setContentView(R.layout.mtmexample);


		// set up gui elements
		findViewById(R.id.connect).setOnClickListener(this);
		content = (TextView)findViewById(R.id.content);
		urlinput = (EditText)findViewById(R.id.url);

		// register handler for background thread
		hdlr = new Handler();

		// Here, the MemorizingTrustManager is activated for HTTPS
		try {
			// set location of the keystore
			MemorizingTrustManager.setKeyStoreFile("private", "sslkeys.bks");

			// register MemorizingTrustManager for HTTPS
			SSLContext sc = SSLContext.getInstance("TLS");
			mtm = new MemorizingTrustManager(this);
			sc.init(null, new X509TrustManager[] { mtm },
					new java.security.SecureRandom());
			HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
			HttpsURLConnection.setDefaultHostnameVerifier(
					mtm.wrapHostnameVerifier(HttpsURLConnection.getDefaultHostnameVerifier()));

			// disable redirects to reduce possible confusion
			HttpsURLConnection.setFollowRedirects(false);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/** Updates the screen content from a background thread. */
	void setText(final String s, final boolean progress) {
		text = s;
		hdlr.post(new Runnable() {
			public void run() {
				content.setText(s);
				setProgressBarIndeterminateVisibility(progress);
			}
		});
	}

	/** Spawns a new thread connecting to the specified URL.
	 * The result of the request is displayed on the screen.
	 * @param urlString a HTTPS URL to connect to.
	 */
	void connect(final String urlString) {
		new Thread() {
			public void run() {
				try {
					URL u = new URL(urlString);
					HttpsURLConnection c = (HttpsURLConnection)u.openConnection();
					c.connect();
					setText("" + c.getResponseCode() + " "
							+ c.getResponseMessage(), false);
					c.disconnect();
				} catch (Exception e) {
					setText(e.toString(), false);
					e.printStackTrace();
				}
			}
		}.start();
	}

	/** Reacts on the connect Button press. */
	@Override
	public void onClick(View view) {
		String url = urlinput.getText().toString();
		setText("Loading " + url, true);
		setProgressBarIndeterminateVisibility(true);
		connect(url);
	}
	
	/** React on the "Manage Certificates" button press. */
	public void onManage(View view) {
		final ArrayList<String> aliases = Collections.list(mtm.getCertificates());
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.select_dialog_item, aliases);
		new AlertDialog.Builder(this).setTitle("Tap Certificate to Delete")
				.setNegativeButton(android.R.string.cancel, null)
				.setAdapter(adapter, new DialogInterface.OnClickListener() {
						@Override
						public void onClick(DialogInterface dialog, int which) {
							try {
								String alias = aliases.get(which);
								mtm.deleteCertificate(alias);
								setText("Deleted " + alias, false);
							} catch (KeyStoreException e) {
								e.printStackTrace();
								setText("Error: " + e.getLocalizedMessage(), false);
							}
						}
					})
				.create().show();
	}
}