From a6f9803b51175ab0f519174e04efc8aea452826a Mon Sep 17 00:00:00 2001 From: Georg Lukas Date: Thu, 4 Apr 2013 23:24:31 +0200 Subject: [PATCH] ssl: implement import of .bks files --- AndroidManifest.xml | 11 ++++++ res/values/strings.xml | 6 ++++ src/KeyfileImportActivity.scala | 61 +++++++++++++++++++++++++++++++++ src/backend/TcpUploader.scala | 2 +- 4 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 src/KeyfileImportActivity.scala diff --git a/AndroidManifest.xml b/AndroidManifest.xml index b7bcd11..39b3eca 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -68,6 +68,17 @@ + + + + + + + + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 443a4e1..a4215c1 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -350,4 +350,10 @@ KISS TCP server to contact Enter the KISS server hostname + + +Import keyfile into APRSdroid +No keyfile for %s! Using plaintext. +Imported keyfile for %s. +Error importing keyfile: %s! diff --git a/src/KeyfileImportActivity.scala b/src/KeyfileImportActivity.scala new file mode 100644 index 0000000..287d321 --- /dev/null +++ b/src/KeyfileImportActivity.scala @@ -0,0 +1,61 @@ +package org.aprsdroid.app + +import _root_.android.app.Activity +import _root_.android.content.Context +import _root_.android.os.Bundle +import _root_.android.preference.PreferenceManager +import _root_.android.util.Log +import _root_.android.widget.Toast + +import _root_.java.io.File +import _root_.java.io.FileOutputStream +import _root_.java.security.KeyStore +import _root_.java.security.cert.X509Certificate + +import scala.collection.JavaConversions._ // for enumeration of keystore aliases + +class KeyfileImportActivity extends Activity { + val TAG = "APRSdroid.KeyImport" + val KEYSTORE_PASS = "APRS-IS".toCharArray() + val KEYSTORE_DIR = "keystore" + + val CALL_RE = ".*CALLSIGN=([0-9A-Za-z]+).*".r + + override def onCreate(savedInstanceState: Bundle) { + super.onCreate(savedInstanceState) + Log.d(TAG, "created: " + getIntent()) + try { + val ks = KeyStore.getInstance("BKS") + ks.load(getContentResolver().openInputStream(getIntent.getData()), KEYSTORE_PASS) + var callsign : String = null + for (alias <- ks.aliases()) { + if (ks.isKeyEntry(alias)) { + val c = ks.getCertificate(alias).asInstanceOf[X509Certificate] + // work around missing X500Principal.getName(String, Map callsign = call + case _ => + } + } + } + if (callsign != null) { + val dir = getApplicationContext().getDir(KEYSTORE_DIR, Context.MODE_PRIVATE) + val keyStoreFile = new File(dir + File.separator + callsign + ".bks") + ks.store(new FileOutputStream(keyStoreFile), KEYSTORE_PASS) + + PreferenceManager.getDefaultSharedPreferences(this) + .edit().putString("callsign", callsign).commit() + + Toast.makeText(this, getString(R.string.ssl_import_ok, callsign), Toast.LENGTH_SHORT).show() + } + } catch { + case e : Exception => + Toast.makeText(this, getString(R.string.ssl_import_error, e.getMessage()), Toast.LENGTH_SHORT).show() + e.printStackTrace() + } + finish() + } +} diff --git a/src/backend/TcpUploader.scala b/src/backend/TcpUploader.scala index a3710d9..c7a5d5d 100644 --- a/src/backend/TcpUploader.scala +++ b/src/backend/TcpUploader.scala @@ -100,7 +100,7 @@ class TcpUploader(service : AprsService, prefs : PrefsWrapper) extends AprsBacke } catch { case e : java.io.FileNotFoundException => service.postAddPost(StorageDatabase.Post.TYPE_INFO, R.string.post_info, - "No keyfile for '%s'! Using plaintext.".format(prefs.getCallsign())) + service.getString(R.string.ssl_no_keyfile, prefs.getCallsign())) return null case e : Exception => e.printStackTrace()