diff options
Diffstat (limited to 'libs/MemorizingTrustManager/example')
8 files changed, 314 insertions, 299 deletions
diff --git a/libs/MemorizingTrustManager/example/AndroidManifest.xml b/libs/MemorizingTrustManager/example/AndroidManifest.xml index cdc0450b3..ebc664d65 100644 --- a/libs/MemorizingTrustManager/example/AndroidManifest.xml +++ b/libs/MemorizingTrustManager/example/AndroidManifest.xml @@ -1,20 +1,22 @@ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="de.duenndns.mtmexample" - android:versionCode="1" - android:versionName="1.0"> - + package="de.duenndns.mtmexample" + android:versionCode="1" + android:versionName="1.0"> + <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="19" /> <uses-permission android:name="android.permission.INTERNET" /> - <application android:label="@string/app_name" android:icon="@android:drawable/ic_lock_lock"> + <application + android:label="@string/app_name" + android:icon="@android:drawable/ic_lock_lock"> <activity android:name=".MTMExample" android:configChanges="keyboardHidden|orientation|screenSize|screenLayout" - android:label="@string/app_name" > + android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> @@ -22,8 +24,9 @@ </intent-filter> </activity> - <!-- ADD THE FOLLOWING TO YOUR MANIFEST: --> - <activity android:name="de.duenndns.ssl.MemorizingActivity" - android:theme="@android:style/Theme.Translucent.NoTitleBar" /> + <!-- ADD THE FOLLOWING TO YOUR MANIFEST: --> + <activity + android:name="de.duenndns.ssl.MemorizingActivity" + android:theme="@android:style/Theme.Translucent.NoTitleBar" /> </application> </manifest> diff --git a/libs/MemorizingTrustManager/example/ant.properties b/libs/MemorizingTrustManager/example/ant.properties index 27fcaadd8..2f48b3655 100644 --- a/libs/MemorizingTrustManager/example/ant.properties +++ b/libs/MemorizingTrustManager/example/ant.properties @@ -2,17 +2,13 @@ # # This file must be checked in Version Control Systems, as it is # integral to the build system of your project. - # This file is only used by the Ant script. - # You can use this to override default values such as # 'source.dir' for the location of your java source folder and # 'out.dir' for the location of your output folder. - # You can also use it define how the release builds are signed by declaring # the following properties: # 'key.store' for the location of your keystore and # 'key.alias' for the name of the key to use. # The password will be asked during the build when you use the 'release' target. - application.package=de.duenndns.mtmexample diff --git a/libs/MemorizingTrustManager/example/build.gradle b/libs/MemorizingTrustManager/example/build.gradle index 00bfe99e2..a07fbe87b 100644 --- a/libs/MemorizingTrustManager/example/build.gradle +++ b/libs/MemorizingTrustManager/example/build.gradle @@ -1,23 +1,23 @@ apply plugin: 'android' dependencies { - compile rootProject + compile rootProject } android { - compileSdkVersion 19 - buildToolsVersion "19.1" - defaultConfig { - minSdkVersion 7 - targetSdkVersion 19 - } + compileSdkVersion 19 + buildToolsVersion "19.1" + defaultConfig { + minSdkVersion 7 + targetSdkVersion 19 + } - sourceSets { - main { - manifest.srcFile 'AndroidManifest.xml' - java.srcDirs = ['src'] - res.srcDirs = ['res'] - } - } + sourceSets { + main { + manifest.srcFile 'AndroidManifest.xml' + java.srcDirs = ['src'] + res.srcDirs = ['res'] + } + } } diff --git a/libs/MemorizingTrustManager/example/build.xml b/libs/MemorizingTrustManager/example/build.xml index cdc74917d..0c61a2917 100644 --- a/libs/MemorizingTrustManager/example/build.xml +++ b/libs/MemorizingTrustManager/example/build.xml @@ -50,9 +50,8 @@ <!-- quick check on sdk.dir --> <fail - message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable." - unless="sdk.dir" - /> + message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable." + unless="sdk.dir" /> <!-- Import per project custom build rules if present at the root of the project. diff --git a/libs/MemorizingTrustManager/example/project.properties b/libs/MemorizingTrustManager/example/project.properties index 3692949fd..be830d977 100644 --- a/libs/MemorizingTrustManager/example/project.properties +++ b/libs/MemorizingTrustManager/example/project.properties @@ -6,7 +6,6 @@ # To customize properties used by the Ant build system use, # "ant.properties", and override values to adapt the script to your # project structure. - android.library.reference.1=../ # Project target. target=android-19 diff --git a/libs/MemorizingTrustManager/example/res/layout/mtmexample.xml b/libs/MemorizingTrustManager/example/res/layout/mtmexample.xml index dfef58b6c..4a08b6899 100644 --- a/libs/MemorizingTrustManager/example/res/layout/mtmexample.xml +++ b/libs/MemorizingTrustManager/example/res/layout/mtmexample.xml @@ -1,36 +1,36 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:orientation="vertical" - android:layout_width="fill_parent" - android:layout_height="fill_parent" > - <EditText - android:id="@+id/url" - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:hint="HTTPS address" - android:text="https://op-co.de/mtm/" - android:singleLine="true" - /> - <Button - android:id="@+id/connect" - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:text="Connect" - /> - <TextView - android:id="@+id/content" - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:layout_weight="1" - android:text="Please enter a HTTPS URL and press 'Connect'!" - android:textSize="11pt" - /> - <Button - android:id="@+id/manage" - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:text="Clean up Certificates" - android:onClick="onManage" - /> + android:orientation="vertical" + android:layout_width="fill_parent" + android:layout_height="fill_parent"> + + <EditText + android:id="@+id/url" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:hint="HTTPS address" + android:text="https://op-co.de/mtm/" + android:singleLine="true" /> + + <Button + android:id="@+id/connect" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:text="Connect" /> + + <TextView + android:id="@+id/content" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_weight="1" + android:text="Please enter a HTTPS URL and press 'Connect'!" + android:textSize="11pt" /> + + <Button + android:id="@+id/manage" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:text="Clean up Certificates" + android:onClick="onManage" /> </LinearLayout> diff --git a/libs/MemorizingTrustManager/example/src/de/duenndns/mtmexample/JULHandler.java b/libs/MemorizingTrustManager/example/src/de/duenndns/mtmexample/JULHandler.java index 6d183eb60..2cd70d0c5 100644 --- a/libs/MemorizingTrustManager/example/src/de/duenndns/mtmexample/JULHandler.java +++ b/libs/MemorizingTrustManager/example/src/de/duenndns/mtmexample/JULHandler.java @@ -34,136 +34,146 @@ import java.util.logging.Logger; * If there are no {@code DebugLogSettings} configured, then all messages sent * to JUL will be logged. * </p> - * + * * @author Florian Schmaus - * */ @SuppressWarnings("deprecation") public class JULHandler extends Handler { - /** Implement this interface to toggle debug logging. - */ - public interface DebugLogSettings { - public boolean isDebugLogEnabled(); - } - - private static final String CLASS_NAME = JULHandler.class.getName(); - - /** - * The global LogManager configuration. - * <p> - * This configures: - * <ul> - * <li> JULHandler as the default handler for all log messages - * <li> A default log level FINEST (300). Meaning that log messages of a level 300 or higher a - * logged - * </ul> - * </p> - */ - private static final InputStream LOG_MANAGER_CONFIG = new StringBufferInputStream( + /** + * Implement this interface to toggle debug logging. + */ + public interface DebugLogSettings { + public boolean isDebugLogEnabled(); + } + + private static final String CLASS_NAME = JULHandler.class.getName(); + + /** + * The global LogManager configuration. + * <p> + * This configures: + * <ul> + * <li> JULHandler as the default handler for all log messages + * <li> A default log level FINEST (300). Meaning that log messages of a level 300 or higher a + * logged + * </ul> + * </p> + */ + private static final InputStream LOG_MANAGER_CONFIG = new StringBufferInputStream( // @formatter:off -"handlers = " + CLASS_NAME + '\n' + -".level = FINEST" -); + "handlers = " + CLASS_NAME + '\n' + + ".level = FINEST" + ); // @formatter:on - // Constants for Android vs. JUL debug level comparisons - private static final int FINE_INT = Level.FINE.intValue(); - private static final int INFO_INT = Level.INFO.intValue(); - private static final int WARN_INT = Level.WARNING.intValue(); - private static final int SEVE_INT = Level.SEVERE.intValue(); - - private static final Logger LOGGER = Logger.getLogger(CLASS_NAME); - - /** A formatter that creates output similar to Android's Log.x. */ - private static final Formatter FORMATTER = new Formatter() { - @Override - public String format(LogRecord logRecord) { - Throwable thrown = logRecord.getThrown(); - if (thrown != null) { - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw, false); - pw.write(logRecord.getMessage() + ' '); - thrown.printStackTrace(pw); - pw.flush(); - return sw.toString(); - } else { - return logRecord.getMessage(); - } - } - }; - - private static DebugLogSettings sDebugLogSettings; - private static boolean initialized = false; - - public static void initialize() { - try { - LogManager.getLogManager().readConfiguration(LOG_MANAGER_CONFIG); - initialized = true; - } catch (IOException e) { - Log.e("JULHandler", "Can not initialize configuration", e); - } - if (initialized) LOGGER.info("Initialzied java.util.logging logger"); - } - - public static void setDebugLogSettings(DebugLogSettings debugLogSettings) { - if (!isInitialized()) initialize(); - sDebugLogSettings = debugLogSettings; - } - - public static boolean isInitialized() { - return initialized; - } - - public JULHandler() { - setFormatter(FORMATTER); - } - - @Override - public void close() {} - - @Override - public void flush() {} - - @Override - public boolean isLoggable(LogRecord record) { - final boolean debugLog = sDebugLogSettings == null ? true : sDebugLogSettings - .isDebugLogEnabled(); - - if (record.getLevel().intValue() <= FINE_INT) { - return debugLog; - } - return true; - } - - /** JUL method that forwards log records to Android's LogCat. */ - @Override - public void publish(LogRecord record) { - if (!isLoggable(record)) return; - - final int priority = getAndroidPriority(record.getLevel()); - final String tag = substringAfterLastDot(record.getSourceClassName()); - final String msg = getFormatter().format(record); - - Log.println(priority, tag, msg); - } - - /** Helper to convert JUL verbosity levels to Android's Log. */ - private static int getAndroidPriority(Level level) { - int value = level.intValue(); - if (value >= SEVE_INT) { - return Log.ERROR; - } else if (value >= WARN_INT) { - return Log.WARN; - } else if (value >= INFO_INT) { - return Log.INFO; - } else { - return Log.DEBUG; - } - } - - /** Helper to extract short class names. */ - private static String substringAfterLastDot(String s) { - return s.substring(s.lastIndexOf('.') + 1).trim(); - } + // Constants for Android vs. JUL debug level comparisons + private static final int FINE_INT = Level.FINE.intValue(); + private static final int INFO_INT = Level.INFO.intValue(); + private static final int WARN_INT = Level.WARNING.intValue(); + private static final int SEVE_INT = Level.SEVERE.intValue(); + + private static final Logger LOGGER = Logger.getLogger(CLASS_NAME); + + /** + * A formatter that creates output similar to Android's Log.x. + */ + private static final Formatter FORMATTER = new Formatter() { + @Override + public String format(LogRecord logRecord) { + Throwable thrown = logRecord.getThrown(); + if (thrown != null) { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw, false); + pw.write(logRecord.getMessage() + ' '); + thrown.printStackTrace(pw); + pw.flush(); + return sw.toString(); + } else { + return logRecord.getMessage(); + } + } + }; + + private static DebugLogSettings sDebugLogSettings; + private static boolean initialized = false; + + public static void initialize() { + try { + LogManager.getLogManager().readConfiguration(LOG_MANAGER_CONFIG); + initialized = true; + } catch (IOException e) { + Log.e("JULHandler", "Can not initialize configuration", e); + } + if (initialized) LOGGER.info("Initialzied java.util.logging logger"); + } + + public static void setDebugLogSettings(DebugLogSettings debugLogSettings) { + if (!isInitialized()) initialize(); + sDebugLogSettings = debugLogSettings; + } + + public static boolean isInitialized() { + return initialized; + } + + public JULHandler() { + setFormatter(FORMATTER); + } + + @Override + public void close() { + } + + @Override + public void flush() { + } + + @Override + public boolean isLoggable(LogRecord record) { + final boolean debugLog = sDebugLogSettings == null ? true : sDebugLogSettings + .isDebugLogEnabled(); + + if (record.getLevel().intValue() <= FINE_INT) { + return debugLog; + } + return true; + } + + /** + * JUL method that forwards log records to Android's LogCat. + */ + @Override + public void publish(LogRecord record) { + if (!isLoggable(record)) return; + + final int priority = getAndroidPriority(record.getLevel()); + final String tag = substringAfterLastDot(record.getSourceClassName()); + final String msg = getFormatter().format(record); + + Log.println(priority, tag, msg); + } + + /** + * Helper to convert JUL verbosity levels to Android's Log. + */ + private static int getAndroidPriority(Level level) { + int value = level.intValue(); + if (value >= SEVE_INT) { + return Log.ERROR; + } else if (value >= WARN_INT) { + return Log.WARN; + } else if (value >= INFO_INT) { + return Log.INFO; + } else { + return Log.DEBUG; + } + } + + /** + * Helper to extract short class names. + */ + private static String substringAfterLastDot(String s) { + return s.substring(s.lastIndexOf('.') + 1).trim(); + } } diff --git a/libs/MemorizingTrustManager/example/src/de/duenndns/mtmexample/MTMExample.java b/libs/MemorizingTrustManager/example/src/de/duenndns/mtmexample/MTMExample.java index 52e20dff6..31e37bd00 100644 --- a/libs/MemorizingTrustManager/example/src/de/duenndns/mtmexample/MTMExample.java +++ b/libs/MemorizingTrustManager/example/src/de/duenndns/mtmexample/MTMExample.java @@ -28,116 +28,124 @@ 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(); - } +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(); + } } |