From 2df4ccafb5cab2963bde1f2d54293b6c3579d0f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Thu, 3 Apr 2014 15:02:55 +0200 Subject: [PATCH 01/11] Implement ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN --- .../service/KeychainIntentService.java | 13 -- .../keychain/ui/DecryptFragment.java | 9 +- .../keychain/ui/DrawerActivity.java | 16 +- .../ui/EncryptAsymmetricFragment.java | 5 +- .../keychain/ui/ImportKeysActivity.java | 166 ++++++++---------- .../keychain/ui/ImportKeysServerFragment.java | 5 + .../keychain/ui/ViewKeyActivity.java | 31 +++- .../adapter/ImportKeysListServerLoader.java | 28 ++- .../res/layout/decrypt_signature_include.xml | 27 ++- .../src/main/res/values/strings.xml | 2 +- 10 files changed, 155 insertions(+), 147 deletions(-) diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java index e9c949246..59f2db46b 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java @@ -112,7 +112,6 @@ public class KeychainIntentService extends IntentService // possible targets: public static final int TARGET_BYTES = 1; public static final int TARGET_URI = 2; - public static final int TARGET_STREAM = 3; // encrypt public static final String ENCRYPT_SIGNATURE_KEY_ID = "secret_key_id"; @@ -122,7 +121,6 @@ public class KeychainIntentService extends IntentService public static final String ENCRYPT_MESSAGE_BYTES = "message_bytes"; public static final String ENCRYPT_INPUT_FILE = "input_file"; public static final String ENCRYPT_OUTPUT_FILE = "output_file"; - public static final String ENCRYPT_PROVIDER_URI = "provider_uri"; public static final String ENCRYPT_SYMMETRIC_PASSPHRASE = "passphrase"; // decrypt/verify @@ -173,11 +171,7 @@ public class KeychainIntentService extends IntentService public static final String RESULT_KEY_USAGES = "new_key_usages"; // encrypt - public static final String RESULT_SIGNATURE_BYTES = "signature_data"; - public static final String RESULT_SIGNATURE_STRING = "signature_text"; - public static final String RESULT_ENCRYPTED_STRING = "encrypted_message"; public static final String RESULT_BYTES = "encrypted_data"; - public static final String RESULT_URI = "result_uri"; // decrypt/verify public static final String RESULT_DECRYPTED_BYTES = "decrypted_data"; @@ -191,10 +185,6 @@ public class KeychainIntentService extends IntentService // export public static final String RESULT_EXPORT = "exported"; - // query - public static final String RESULT_QUERY_KEY_DATA = "query_key_data"; - public static final String RESULT_QUERY_KEY_SEARCH_RESULT = "query_key_search_result"; - Messenger mMessenger; private boolean mIsCanceled; @@ -738,9 +728,6 @@ public class KeychainIntentService extends IntentService ArrayList entries = data.getParcelableArrayList(DOWNLOAD_KEY_LIST); String keyServer = data.getString(DOWNLOAD_KEY_SERVER); - // TODO: add extra which requires fingerprint suport and force verification! - // only supported by newer sks keyserver versions - // this downloads the keys and places them into the ImportKeysListEntry entries HkpKeyServer server = new HkpKeyServer(keyServer); diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java index fd7aef353..e7596534c 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java @@ -38,6 +38,8 @@ import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.pgp.PgpKeyHelper; import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException; +import org.sufficientlysecure.keychain.provider.KeychainContract; +import org.sufficientlysecure.keychain.provider.ProviderHelper; import org.sufficientlysecure.keychain.ui.dialog.PassphraseDialogFragment; import org.sufficientlysecure.keychain.util.Log; @@ -88,13 +90,9 @@ public class DecryptFragment extends Fragment { public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { - // this request is returned after LookupUnknownKeyDialogFragment started - // ImportKeysActivity and user looked uo key case RESULT_CODE_LOOKUP_KEY: { - Log.d(Constants.TAG, "Returning from Lookup Key..."); if (resultCode == Activity.RESULT_OK) { - // decrypt again -// decryptStart(); + // TODO: generate new OpenPgpSignatureResult and display it } return; } @@ -189,6 +187,7 @@ public class DecryptFragment extends Fragment { /** * Should be overridden by MessageFragment and FileFragment to start actual decryption + * * @param passphrase */ protected void decryptStart(String passphrase) { diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/DrawerActivity.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/DrawerActivity.java index 463c99948..f81224380 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/DrawerActivity.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/DrawerActivity.java @@ -151,6 +151,10 @@ public class DrawerActivity extends ActionBarActivity { @Override public boolean onCreateOptionsMenu(Menu menu) { + if (mDrawerToggle == null) { + return super.onCreateOptionsMenu(menu); + } + menu.add(42, MENU_ID_PREFERENCE, 100, R.string.menu_preferences); menu.add(42, MENU_ID_HELP, 101, R.string.menu_help); @@ -159,6 +163,10 @@ public class DrawerActivity extends ActionBarActivity { @Override public boolean onOptionsItemSelected(MenuItem item) { + if (mDrawerToggle == null) { + return super.onOptionsItemSelected(item); + } + // The action bar home/up action should open or close the drawer. // ActionBarDrawerToggle will take care of this. if (mDrawerToggle.onOptionsItemSelected(item)) { @@ -216,14 +224,18 @@ public class DrawerActivity extends ActionBarActivity { protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); // Sync the toggle state after onRestoreInstanceState has occurred. - mDrawerToggle.syncState(); + if (mDrawerToggle != null) { + mDrawerToggle.syncState(); + } } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // Pass any configuration change to the drawer toggles - mDrawerToggle.onConfigurationChanged(newConfig); + if (mDrawerToggle != null) { + mDrawerToggle.onConfigurationChanged(newConfig); + } } private class NavItem { diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptAsymmetricFragment.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptAsymmetricFragment.java index 4387f3d53..ca97e2867 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptAsymmetricFragment.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptAsymmetricFragment.java @@ -252,7 +252,6 @@ public class EncryptAsymmetricFragment extends Fragment { @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { - case RESULT_CODE_PUBLIC_KEYS: { if (resultCode == Activity.RESULT_OK) { Bundle bundle = data.getExtras(); @@ -273,11 +272,11 @@ public class EncryptAsymmetricFragment extends Fragment { } default: { + super.onActivityResult(requestCode, resultCode, data); + break; } } - - super.onActivityResult(requestCode, resultCode, data); } } diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java index b09fa4a4d..14726863a 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java @@ -18,6 +18,7 @@ package org.sufficientlysecure.keychain.ui; import android.annotation.SuppressLint; +import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; @@ -34,8 +35,10 @@ import android.support.v7.app.ActionBar; import android.view.View; import android.view.View.OnClickListener; import android.widget.ArrayAdapter; + import com.beardedhen.androidbootstrap.BootstrapButton; import com.devspark.appmsg.AppMsg; + import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.pgp.PgpKeyHelper; @@ -54,7 +57,6 @@ public class ImportKeysActivity extends DrawerActivity implements ActionBar.OnNa + "IMPORT_KEY_FROM_QR_CODE"; public static final String ACTION_IMPORT_KEY_FROM_KEYSERVER = Constants.INTENT_PREFIX + "IMPORT_KEY_FROM_KEYSERVER"; - // TODO: implement: public static final String ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN = Constants.INTENT_PREFIX + "IMPORT_KEY_FROM_KEY_SERVER_AND_RETURN"; @@ -86,7 +88,7 @@ public class ImportKeysActivity extends DrawerActivity implements ActionBar.OnNa ImportKeysNFCFragment.class }; - private int mCurrentNavPostition = -1; + private int mCurrentNavPosition = -1; @Override protected void onCreate(Bundle savedInstanceState) { @@ -104,15 +106,20 @@ public class ImportKeysActivity extends DrawerActivity implements ActionBar.OnNa getSupportActionBar().setDisplayShowTitleEnabled(false); - setupDrawerNavigation(savedInstanceState); - - // set drop down navigation mNavigationStrings = getResources().getStringArray(R.array.import_action_list); - Context context = getSupportActionBar().getThemedContext(); - ArrayAdapter navigationAdapter = ArrayAdapter.createFromResource(context, - R.array.import_action_list, android.R.layout.simple_spinner_dropdown_item); - getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); - getSupportActionBar().setListNavigationCallbacks(navigationAdapter, this); + + if (ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN.equals(getIntent().getAction())) { + getSupportActionBar().setTitle(R.string.nav_import); + } else { + setupDrawerNavigation(savedInstanceState); + + // set drop down navigation + Context context = getSupportActionBar().getThemedContext(); + ArrayAdapter navigationAdapter = ArrayAdapter.createFromResource(context, + R.array.import_action_list, android.R.layout.simple_spinner_dropdown_item); + getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); + getSupportActionBar().setListNavigationCallbacks(navigationAdapter, this); + } handleActions(savedInstanceState, getIntent()); } @@ -152,34 +159,47 @@ public class ImportKeysActivity extends DrawerActivity implements ActionBar.OnNa // action: directly load data startListFragment(savedInstanceState, importData, null, null); } - } else if (ACTION_IMPORT_KEY_FROM_KEYSERVER.equals(action)) { - String query = null; - if (extras.containsKey(EXTRA_QUERY)) { - query = extras.getString(EXTRA_QUERY); - } else if (extras.containsKey(EXTRA_KEY_ID)) { - long keyId = intent.getLongExtra(EXTRA_KEY_ID, 0); - if (keyId != 0) { - query = PgpKeyHelper.convertKeyIdToHex(keyId); + } else if (ACTION_IMPORT_KEY_FROM_KEYSERVER.equals(action) + || ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN.equals(action)) { + if (extras.containsKey(EXTRA_QUERY) || extras.containsKey(EXTRA_KEY_ID)) { + /* simple search based on query or key id */ + + String query = null; + if (extras.containsKey(EXTRA_QUERY)) { + query = extras.getString(EXTRA_QUERY); + } else if (extras.containsKey(EXTRA_KEY_ID)) { + long keyId = intent.getLongExtra(EXTRA_KEY_ID, 0); + if (keyId != 0) { + query = PgpKeyHelper.convertKeyIdToHex(keyId); + } + } + + if (query != null && query.length() > 0) { + // display keyserver fragment with query + Bundle args = new Bundle(); + args.putString(ImportKeysServerFragment.ARG_QUERY, query); + loadNavFragment(0, args); + + // action: search immediately + startListFragment(savedInstanceState, null, null, query); + } else { + Log.e(Constants.TAG, "Query is empty!"); + return; } } else if (extras.containsKey(EXTRA_FINGERPRINT)) { + /* + * search based on fingerprint, here we can enforce a check in the end + * if the right key has been downloaded + */ + String fingerprint = intent.getStringExtra(EXTRA_FINGERPRINT); - if (fingerprint != null) { - query = "0x" + fingerprint; - } + loadFromFingerprint(savedInstanceState, fingerprint); } else { Log.e(Constants.TAG, - "IMPORT_KEY_FROM_KEYSERVER action needs to contain the 'query', 'key_id', or " + - "'fingerprint' extra!"); + "IMPORT_KEY_FROM_KEYSERVER action needs to contain the 'query', 'key_id', or " + + "'fingerprint' extra!"); return; } - - // display keyserver fragment with query - Bundle args = new Bundle(); - args.putString(ImportKeysServerFragment.ARG_QUERY, query); - loadNavFragment(0, args); - - // action: search immediately - startListFragment(savedInstanceState, null, null, query); } else if (ACTION_IMPORT_KEY_FROM_FILE.equals(action)) { // NOTE: this only displays the appropriate fragment, no actions are taken @@ -234,14 +254,14 @@ public class ImportKeysActivity extends DrawerActivity implements ActionBar.OnNa * onNavigationItemSelected() should check whether the Fragment is already in existence * inside your Activity." *

- * from http://bit.ly/1dBYThO + * from http://stackoverflow.com/a/14295474 *

* In our case, if we start ImportKeysActivity with parameters to directly search using a fingerprint, * the fragment would be loaded twice resulting in the query being empty after the second load. *

* Our solution: * To prevent that a fragment will be loaded again even if it was already loaded loadNavFragment - * checks against mCurrentNavPostition. + * checks against mCurrentNavPosition. * * @param itemPosition * @param itemId @@ -257,10 +277,12 @@ public class ImportKeysActivity extends DrawerActivity implements ActionBar.OnNa } private void loadNavFragment(int itemPosition, Bundle args) { - if (mCurrentNavPostition != itemPosition) { - getSupportActionBar().setSelectedNavigationItem(itemPosition); + if (mCurrentNavPosition != itemPosition) { + if (ActionBar.NAVIGATION_MODE_LIST == getSupportActionBar().getNavigationMode()) { + getSupportActionBar().setSelectedNavigationItem(itemPosition); + } loadFragment(NAVIGATION_CLASSES[itemPosition], args, mNavigationStrings[itemPosition]); - mCurrentNavPostition = itemPosition; + mCurrentNavPosition = itemPosition; } } @@ -280,7 +302,11 @@ public class ImportKeysActivity extends DrawerActivity implements ActionBar.OnNa Log.d(Constants.TAG, "fingerprint: " + fingerprint); - if (fingerprint.length() < 16) { + loadFromFingerprint(savedInstanceState, fingerprint); + } + + public void loadFromFingerprint(Bundle savedInstanceState, String fingerprint) { + if (fingerprint == null || fingerprint.length() < 40) { AppMsg.makeText(this, R.string.import_qr_code_too_short_fingerprint, AppMsg.STYLE_ALERT).show(); return; @@ -291,6 +317,7 @@ public class ImportKeysActivity extends DrawerActivity implements ActionBar.OnNa // display keyserver fragment with query Bundle args = new Bundle(); args.putString(ImportKeysServerFragment.ARG_QUERY, query); + args.putBoolean(ImportKeysServerFragment.ARG_DISABLE_QUERY_EDIT, true); loadNavFragment(0, args); // action: search directly @@ -301,66 +328,6 @@ public class ImportKeysActivity extends DrawerActivity implements ActionBar.OnNa mListFragment.loadNew(importData, dataUri, serverQuery, keyServer); } - // private void importAndSignOld(final long keyId, final String expectedFingerprint) { - // if (expectedFingerprint != null && expectedFingerprint.length() > 0) { - // - // Thread t = new Thread() { - // @Override - // public void run() { - // try { - // // TODO: display some sort of spinner here while the user waits - // - // // TODO: there should be only 1 - // HkpKeyServer server = new HkpKeyServer(mPreferences.getKeyServers()[0]); - // String encodedKey = server.get(keyId); - // - // PGPKeyRing keyring = PGPHelper.decodeKeyRing(new ByteArrayInputStream( - // encodedKey.getBytes())); - // if (keyring != null && keyring instanceof PGPPublicKeyRing) { - // PGPPublicKeyRing publicKeyRing = (PGPPublicKeyRing) keyring; - // - // // make sure the fingerprints match before we cache this thing - // String actualFingerprint = PGPHelper.convertFingerprintToHex(publicKeyRing - // .getPublicKey().getFingerprint()); - // if (expectedFingerprint.equals(actualFingerprint)) { - // // store the signed key in our local cache - // int retval = PGPMain.storeKeyRingInCache(publicKeyRing); - // if (retval != Id.return_value.ok - // && retval != Id.return_value.updated) { - // status.putString(EXTRA_ERROR, - // "Failed to store signed key in local cache"); - // } else { - // Intent intent = new Intent(ImportFromQRCodeActivity.this, - // SignKeyActivity.class); - // intent.putExtra(EXTRA_KEY_ID, keyId); - // startActivityForResult(intent, Id.request.sign_key); - // } - // } else { - // status.putString( - // EXTRA_ERROR, - // "Scanned fingerprint does NOT match the fingerprint of the received key. " + - // "You shouldnt trust this key."); - // } - // } - // } catch (QueryException e) { - // Log.e(TAG, "Failed to query KeyServer", e); - // status.putString(EXTRA_ERROR, "Failed to query KeyServer"); - // status.putInt(Constants.extras.STATUS, Id.message.done); - // } catch (IOException e) { - // Log.e(TAG, "Failed to query KeyServer", e); - // status.putString(EXTRA_ERROR, "Failed to query KeyServer"); - // status.putInt(Constants.extras.STATUS, Id.message.done); - // } - // } - // }; - // - // t.setName("KeyExchange Download Thread"); - // t.setDaemon(true); - // t.start(); - // } - // } - - /** * Import keys with mImportData */ @@ -405,6 +372,11 @@ public class ImportKeysActivity extends DrawerActivity implements ActionBar.OnNa BadImportKeyDialogFragment.newInstance(bad); badImportKeyDialogFragment.show(getSupportFragmentManager(), "badKeyDialog"); } + + if (ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN.equals(getIntent().getAction())) { + ImportKeysActivity.this.setResult(Activity.RESULT_OK); + finish(); + } } } }; diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysServerFragment.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysServerFragment.java index 0b2fff64e..3eb463dac 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysServerFragment.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysServerFragment.java @@ -40,6 +40,7 @@ import org.sufficientlysecure.keychain.util.Log; public class ImportKeysServerFragment extends Fragment { public static final String ARG_QUERY = "query"; public static final String ARG_KEY_SERVER = "key_server"; + public static final String ARG_DISABLE_QUERY_EDIT = "disable_query_edit"; private ImportKeysActivity mImportActivity; @@ -140,6 +141,10 @@ public class ImportKeysServerFragment extends Fragment { Log.d(Constants.TAG, "keyServer: " + keyServer); } + + if (getArguments().getBoolean(ARG_DISABLE_QUERY_EDIT, false)) { + mQueryEditText.setEnabled(false); + } } } diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java index b8b2e271f..e16ffcfdb 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java @@ -18,6 +18,7 @@ package org.sufficientlysecure.keychain.ui; +import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; @@ -163,18 +164,13 @@ public class ViewKeyActivity extends ActionBarActivity { } private void updateFromKeyserver(Uri dataUri) { - long updateKeyId = ProviderHelper.getMasterKeyId(ViewKeyActivity.this, dataUri); - - if (updateKeyId == 0) { - Log.e(Constants.TAG, "this shouldn't happen. KeyId == 0!"); - return; - } + byte[] fingerprintBlob = ProviderHelper.getFingerprint(this, dataUri); + String fingerprint = PgpKeyHelper.convertFingerprintToHex(fingerprintBlob); Intent queryIntent = new Intent(this, ImportKeysActivity.class); - queryIntent.setAction(ImportKeysActivity.ACTION_IMPORT_KEY_FROM_KEYSERVER); - queryIntent.putExtra(ImportKeysActivity.EXTRA_KEY_ID, updateKeyId); + queryIntent.setAction(ImportKeysActivity.ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN); + queryIntent.putExtra(ImportKeysActivity.EXTRA_FINGERPRINT, fingerprint); - // TODO: lookup with onactivityresult! startActivityForResult(queryIntent, RESULT_CODE_LOOKUP_KEY); } @@ -245,4 +241,21 @@ public class ViewKeyActivity extends ActionBarActivity { mExportHelper.deleteKey(dataUri, returnHandler); } + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + switch (requestCode) { + case RESULT_CODE_LOOKUP_KEY: { + if (resultCode == Activity.RESULT_OK) { + // TODO: reload key??? move this into fragment? + } + break; + } + + default: { + super.onActivityResult(requestCode, resultCode, data); + + break; + } + } + } } diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListServerLoader.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListServerLoader.java index a4dd06e40..259e14319 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListServerLoader.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListServerLoader.java @@ -19,6 +19,7 @@ package org.sufficientlysecure.keychain.ui.adapter; import android.content.Context; import android.support.v4.content.AsyncTaskLoader; + import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.util.HkpKeyServer; import org.sufficientlysecure.keychain.util.KeyServer; @@ -53,7 +54,12 @@ public class ImportKeysListServerLoader return mEntryListWrapper; } - queryServer(mServerQuery, mKeyServer); + if (mServerQuery.startsWith("0x") && mServerQuery.length() == 42) { + Log.d(Constants.TAG, "This search is based on a unique fingerprint. Enforce a fingerprint check!"); + queryServer(mServerQuery, mKeyServer, true); + } else { + queryServer(mServerQuery, mKeyServer, false); + } return mEntryListWrapper; } @@ -84,14 +90,30 @@ public class ImportKeysListServerLoader /** * Query keyserver */ - private void queryServer(String query, String keyServer) { + private void queryServer(String query, String keyServer, boolean enforceFingerprint) { HkpKeyServer server = new HkpKeyServer(keyServer); try { ArrayList searchResult = server.search(query); mEntryList.clear(); // add result to data - mEntryList.addAll(searchResult); + if (enforceFingerprint) { + String fingerprint = query.substring(2); + Log.d(Constants.TAG, "fingerprint: " + fingerprint); + // query must return only one result! + if (searchResult.size() > 0) { + ImportKeysListEntry uniqueEntry = searchResult.get(0); + /* + * set fingerprint explicitly after query + * to enforce a check when the key is imported by KeychainIntentService + */ + uniqueEntry.setFingerPrintHex(fingerprint); + uniqueEntry.setSelected(true); + mEntryList.add(uniqueEntry); + } + } else { + mEntryList.addAll(searchResult); + } mEntryListWrapper = new AsyncTaskResultWrapper>(mEntryList, null); } catch (KeyServer.InsufficientQuery e) { Log.e(Constants.TAG, "InsufficientQuery", e); diff --git a/OpenPGP-Keychain/src/main/res/layout/decrypt_signature_include.xml b/OpenPGP-Keychain/src/main/res/layout/decrypt_signature_include.xml index 16234762c..3e0d35c9b 100644 --- a/OpenPGP-Keychain/src/main/res/layout/decrypt_signature_include.xml +++ b/OpenPGP-Keychain/src/main/res/layout/decrypt_signature_include.xml @@ -28,20 +28,6 @@ android:src="@drawable/overlay_error" /> - - + + \ No newline at end of file diff --git a/OpenPGP-Keychain/src/main/res/values/strings.xml b/OpenPGP-Keychain/src/main/res/values/strings.xml index 54db372ab..b9df68cb3 100644 --- a/OpenPGP-Keychain/src/main/res/values/strings.xml +++ b/OpenPGP-Keychain/src/main/res/values/strings.xml @@ -406,7 +406,7 @@ Please start with QR Code with ID 1 QR Code malformed! Please try again! QR Code scanning finished! - Fingerprint contained in this QR Code is too short (< 16 characters) + Fingerprint is too short (< 16 characters) Scan QR Code with \'Barcode Scanner\' To receive keys via NFC, the device needs to be unlocked. Help From 09411a62fab849c345033a5d14d1e629855209df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Thu, 3 Apr 2014 15:16:13 +0200 Subject: [PATCH 02/11] Key lookup for API --- .../keychain/remote/OpenPgpService.java | 10 +++++----- .../keychain/ui/ImportKeysActivity.java | 13 +++++++++++-- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java index 18bb92552..9cdd16e23 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java @@ -39,6 +39,7 @@ import org.sufficientlysecure.keychain.provider.KeychainContract; import org.sufficientlysecure.keychain.provider.ProviderHelper; import org.sufficientlysecure.keychain.remote.ui.RemoteServiceActivity; import org.sufficientlysecure.keychain.service.PassphraseCacheService; +import org.sufficientlysecure.keychain.ui.ImportKeysActivity; import org.sufficientlysecure.keychain.util.InputData; import org.sufficientlysecure.keychain.util.Log; @@ -315,11 +316,10 @@ public class OpenPgpService extends RemoteService { if (signatureResult.getStatus() == OpenPgpSignatureResult.SIGNATURE_UNKNOWN_PUB_KEY) { // If signature is unknown we return an _additional_ PendingIntent // to retrieve the missing key - // TODO!!! - Intent intent = new Intent(getBaseContext(), RemoteServiceActivity.class); - intent.setAction(RemoteServiceActivity.ACTION_ERROR_MESSAGE); - intent.putExtra(RemoteServiceActivity.EXTRA_ERROR_MESSAGE, "todo"); - intent.putExtra(RemoteServiceActivity.EXTRA_DATA, data); + Intent intent = new Intent(getBaseContext(), ImportKeysActivity.class); + intent.setAction(ImportKeysActivity.ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN); + intent.putExtra(ImportKeysActivity.EXTRA_KEY_ID, signatureResult.getKeyId()); + intent.putExtra(ImportKeysActivity.EXTRA_PENDING_INTENT_DATA, data); PendingIntent pi = PendingIntent.getActivity(getBaseContext(), 0, intent, diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java index 14726863a..6839d5a6e 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java @@ -74,6 +74,10 @@ public class ImportKeysActivity extends DrawerActivity implements ActionBar.OnNa public static final String EXTRA_KEY_ID = "key_id"; public static final String EXTRA_FINGERPRINT = "fingerprint"; + // only used by ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN when used from OpenPgpService + public static final String EXTRA_PENDING_INTENT_DATA = "data"; + private Intent mPendingIntentData; + // view private ImportKeysListFragment mListFragment; private String[] mNavigationStrings; @@ -109,7 +113,7 @@ public class ImportKeysActivity extends DrawerActivity implements ActionBar.OnNa mNavigationStrings = getResources().getStringArray(R.array.import_action_list); if (ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN.equals(getIntent().getAction())) { - getSupportActionBar().setTitle(R.string.nav_import); + setTitle(R.string.nav_import); } else { setupDrawerNavigation(savedInstanceState); @@ -161,6 +165,11 @@ public class ImportKeysActivity extends DrawerActivity implements ActionBar.OnNa } } else if (ACTION_IMPORT_KEY_FROM_KEYSERVER.equals(action) || ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN.equals(action)) { + + // only used for OpenPgpService + if (extras.containsKey(EXTRA_PENDING_INTENT_DATA)) { + mPendingIntentData = extras.getParcelable(EXTRA_PENDING_INTENT_DATA); + } if (extras.containsKey(EXTRA_QUERY) || extras.containsKey(EXTRA_KEY_ID)) { /* simple search based on query or key id */ @@ -374,7 +383,7 @@ public class ImportKeysActivity extends DrawerActivity implements ActionBar.OnNa } if (ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN.equals(getIntent().getAction())) { - ImportKeysActivity.this.setResult(Activity.RESULT_OK); + ImportKeysActivity.this.setResult(Activity.RESULT_OK, mPendingIntentData); finish(); } } From 04b0425d45574cdf86219898ea25ce15c33341a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Thu, 3 Apr 2014 15:18:05 +0200 Subject: [PATCH 03/11] Key lookup for API --- .../keychain/remote/OpenPgpService.java | 12 +++++++----- .../src/main/res/raw/help_changelog.html | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java index 9cdd16e23..dc19bc5bb 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java @@ -356,11 +356,10 @@ public class OpenPgpService extends RemoteService { // If keys are not in db we return an additional PendingIntent // to retrieve the missing key - // TODO!!! - Intent intent = new Intent(getBaseContext(), RemoteServiceActivity.class); - intent.setAction(RemoteServiceActivity.ACTION_ERROR_MESSAGE); - intent.putExtra(RemoteServiceActivity.EXTRA_ERROR_MESSAGE, "todo"); - intent.putExtra(RemoteServiceActivity.EXTRA_DATA, data); + Intent intent = new Intent(getBaseContext(), ImportKeysActivity.class); + intent.setAction(ImportKeysActivity.ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN); + intent.putExtra(ImportKeysActivity.EXTRA_KEY_ID, keyId); + intent.putExtra(ImportKeysActivity.EXTRA_PENDING_INTENT_DATA, data); PendingIntent pi = PendingIntent.getActivity(getBaseContext(), 0, intent, @@ -372,6 +371,9 @@ public class OpenPgpService extends RemoteService { } else { Intent result = new Intent(); result.putExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_SUCCESS); + + // TODO: also return PendingIntent that opens the key view activity + return result; } } catch (Exception e) { diff --git a/OpenPGP-Keychain/src/main/res/raw/help_changelog.html b/OpenPGP-Keychain/src/main/res/raw/help_changelog.html index 8138fd0bd..221705579 100644 --- a/OpenPGP-Keychain/src/main/res/raw/help_changelog.html +++ b/OpenPGP-Keychain/src/main/res/raw/help_changelog.html @@ -9,7 +9,7 @@ And don't add newlines before or after p tags because of transifex -->

  • fix decryption of symmetric pgp messages/files
  • refactored edit key screen (thanks to Ash Hughes)
  • -
  • OpenPGP API version 3 (multiple api accounts, internal fixes)
  • +
  • OpenPGP API version 3 (multiple api accounts, internal fixes, key lookup)
  • new modern design for encrypt/decrypt screens
From c3091c2b5dbe350d7f7ed122f13ee5770efe2c33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Thu, 3 Apr 2014 15:19:49 +0200 Subject: [PATCH 04/11] Changelog --- CHANGELOG | 6 ++++++ .../sufficientlysecure/keychain/remote/OpenPgpService.java | 2 +- OpenPGP-Keychain/src/main/res/raw/help_changelog.html | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index e7f4c567a..45ad2e98c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,9 @@ +2.5 +* fix decryption of symmetric pgp messages/files +* refactored edit key screen (thanks to Ash Hughes) +* new modern design for encrypt/decrypt screens +* OpenPGP API version 3 (multiple api accounts, internal fixes, key lookup) + 2.4 Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free! Besides several small patches, a notable number of patches are made by the following people (in alphabetical order): diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java index dc19bc5bb..fa673f695 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java @@ -373,7 +373,7 @@ public class OpenPgpService extends RemoteService { result.putExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_SUCCESS); // TODO: also return PendingIntent that opens the key view activity - + return result; } } catch (Exception e) { diff --git a/OpenPGP-Keychain/src/main/res/raw/help_changelog.html b/OpenPGP-Keychain/src/main/res/raw/help_changelog.html index 221705579..64a91e5f1 100644 --- a/OpenPGP-Keychain/src/main/res/raw/help_changelog.html +++ b/OpenPGP-Keychain/src/main/res/raw/help_changelog.html @@ -9,8 +9,8 @@ And don't add newlines before or after p tags because of transifex -->
  • fix decryption of symmetric pgp messages/files
  • refactored edit key screen (thanks to Ash Hughes)
  • -
  • OpenPGP API version 3 (multiple api accounts, internal fixes, key lookup)
  • new modern design for encrypt/decrypt screens
  • +
  • OpenPGP API version 3 (multiple api accounts, internal fixes, key lookup)

2.4

From 3b91147b49f877b6d2e796ef31f6bd836b115fba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Thu, 3 Apr 2014 15:21:14 +0200 Subject: [PATCH 05/11] Update from transifex --- .../main/res/raw-cs-rCZ/help_changelog.html | 7 ++++++ .../src/main/res/raw-de/help_changelog.html | 7 ++++++ .../src/main/res/raw-el/help_changelog.html | 7 ++++++ .../main/res/raw-es-rCO/help_changelog.html | 7 ++++++ .../src/main/res/raw-es/help_changelog.html | 7 ++++++ .../src/main/res/raw-et/help_changelog.html | 7 ++++++ .../main/res/raw-fa-rIR/help_changelog.html | 7 ++++++ .../src/main/res/raw-fr/help_changelog.html | 7 ++++++ .../main/res/raw-it-rIT/help_changelog.html | 7 ++++++ .../src/main/res/raw-ja/help_changelog.html | 7 ++++++ .../main/res/raw-nl-rNL/help_changelog.html | 7 ++++++ .../src/main/res/raw-pl/help_changelog.html | 7 ++++++ .../main/res/raw-pt-rBR/help_changelog.html | 7 ++++++ .../src/main/res/raw-ru/help_changelog.html | 7 ++++++ .../main/res/raw-sl-rSI/help_changelog.html | 7 ++++++ .../src/main/res/raw-tr/help_changelog.html | 7 ++++++ .../src/main/res/raw-uk/help_changelog.html | 7 ++++++ .../main/res/raw-zh-rTW/help_changelog.html | 7 ++++++ .../src/main/res/raw-zh/help_changelog.html | 7 ++++++ .../src/main/res/values-es/strings.xml | 14 +++++++++++ .../src/main/res/values-fr/strings.xml | 13 +++++++++++ .../src/main/res/values-ja/strings.xml | 15 +++++++++++- .../src/main/res/values-pl/strings.xml | 23 +++++++++++++++++++ .../src/main/res/values-ru/strings.xml | 11 +++++++++ .../src/main/res/values-uk/strings.xml | 13 +++++++++++ 25 files changed, 221 insertions(+), 1 deletion(-) diff --git a/OpenPGP-Keychain/src/main/res/raw-cs-rCZ/help_changelog.html b/OpenPGP-Keychain/src/main/res/raw-cs-rCZ/help_changelog.html index 1136deba6..db65b65f6 100644 --- a/OpenPGP-Keychain/src/main/res/raw-cs-rCZ/help_changelog.html +++ b/OpenPGP-Keychain/src/main/res/raw-cs-rCZ/help_changelog.html @@ -1,6 +1,13 @@ +

2.5

+
    +
  • fix decryption of symmetric pgp messages/files
  • +
  • refactored edit key screen (thanks to Ash Hughes)
  • +
  • OpenPGP API version 3 (multiple api accounts, internal fixes)
  • +
  • new modern design for encrypt/decrypt screens
  • +

2.4

Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free! Besides several small patches, a notable number of patches are made by the following people (in alphabetical order): diff --git a/OpenPGP-Keychain/src/main/res/raw-de/help_changelog.html b/OpenPGP-Keychain/src/main/res/raw-de/help_changelog.html index 13b210fcd..dbf7afe76 100644 --- a/OpenPGP-Keychain/src/main/res/raw-de/help_changelog.html +++ b/OpenPGP-Keychain/src/main/res/raw-de/help_changelog.html @@ -1,6 +1,13 @@ +

2.5

+
    +
  • fix decryption of symmetric pgp messages/files
  • +
  • refactored edit key screen (thanks to Ash Hughes)
  • +
  • OpenPGP API version 3 (multiple api accounts, internal fixes)
  • +
  • new modern design for encrypt/decrypt screens
  • +

2.4

Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free! Besides several small patches, a notable number of patches are made by the following people (in alphabetical order): diff --git a/OpenPGP-Keychain/src/main/res/raw-el/help_changelog.html b/OpenPGP-Keychain/src/main/res/raw-el/help_changelog.html index 1136deba6..db65b65f6 100644 --- a/OpenPGP-Keychain/src/main/res/raw-el/help_changelog.html +++ b/OpenPGP-Keychain/src/main/res/raw-el/help_changelog.html @@ -1,6 +1,13 @@ +

2.5

+
    +
  • fix decryption of symmetric pgp messages/files
  • +
  • refactored edit key screen (thanks to Ash Hughes)
  • +
  • OpenPGP API version 3 (multiple api accounts, internal fixes)
  • +
  • new modern design for encrypt/decrypt screens
  • +

2.4

Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free! Besides several small patches, a notable number of patches are made by the following people (in alphabetical order): diff --git a/OpenPGP-Keychain/src/main/res/raw-es-rCO/help_changelog.html b/OpenPGP-Keychain/src/main/res/raw-es-rCO/help_changelog.html index 1136deba6..db65b65f6 100644 --- a/OpenPGP-Keychain/src/main/res/raw-es-rCO/help_changelog.html +++ b/OpenPGP-Keychain/src/main/res/raw-es-rCO/help_changelog.html @@ -1,6 +1,13 @@ +

2.5

+
    +
  • fix decryption of symmetric pgp messages/files
  • +
  • refactored edit key screen (thanks to Ash Hughes)
  • +
  • OpenPGP API version 3 (multiple api accounts, internal fixes)
  • +
  • new modern design for encrypt/decrypt screens
  • +

2.4

Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free! Besides several small patches, a notable number of patches are made by the following people (in alphabetical order): diff --git a/OpenPGP-Keychain/src/main/res/raw-es/help_changelog.html b/OpenPGP-Keychain/src/main/res/raw-es/help_changelog.html index ebbc8a4de..0b3db3a30 100644 --- a/OpenPGP-Keychain/src/main/res/raw-es/help_changelog.html +++ b/OpenPGP-Keychain/src/main/res/raw-es/help_changelog.html @@ -1,6 +1,13 @@ +

2.5

+
    +
  • corregido descifrado de mensajes/ficheros con pgp simétrico
  • +
  • rediseñada la pantalla de edición de claves (gracias a Ash Hughes)
  • +
  • API OpenPGP versión 3 (multiples cuentas api, correcciones internas)
  • +
  • diseño más moderno para las pantallas de cifrado/descifrado
  • +

2.4

¡Gracias a todos los solicitantes de Google Summer of Code 2014, por hacer esta aplicación productiva y libre de errores! Además de varios parches pequeños, un notable número de correcciones fueron hechas por las siguientes personas (en orden alfabético): diff --git a/OpenPGP-Keychain/src/main/res/raw-et/help_changelog.html b/OpenPGP-Keychain/src/main/res/raw-et/help_changelog.html index 1136deba6..db65b65f6 100644 --- a/OpenPGP-Keychain/src/main/res/raw-et/help_changelog.html +++ b/OpenPGP-Keychain/src/main/res/raw-et/help_changelog.html @@ -1,6 +1,13 @@ +

2.5

+
    +
  • fix decryption of symmetric pgp messages/files
  • +
  • refactored edit key screen (thanks to Ash Hughes)
  • +
  • OpenPGP API version 3 (multiple api accounts, internal fixes)
  • +
  • new modern design for encrypt/decrypt screens
  • +

2.4

Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free! Besides several small patches, a notable number of patches are made by the following people (in alphabetical order): diff --git a/OpenPGP-Keychain/src/main/res/raw-fa-rIR/help_changelog.html b/OpenPGP-Keychain/src/main/res/raw-fa-rIR/help_changelog.html index 1136deba6..db65b65f6 100644 --- a/OpenPGP-Keychain/src/main/res/raw-fa-rIR/help_changelog.html +++ b/OpenPGP-Keychain/src/main/res/raw-fa-rIR/help_changelog.html @@ -1,6 +1,13 @@ +

2.5

+
    +
  • fix decryption of symmetric pgp messages/files
  • +
  • refactored edit key screen (thanks to Ash Hughes)
  • +
  • OpenPGP API version 3 (multiple api accounts, internal fixes)
  • +
  • new modern design for encrypt/decrypt screens
  • +

2.4

Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free! Besides several small patches, a notable number of patches are made by the following people (in alphabetical order): diff --git a/OpenPGP-Keychain/src/main/res/raw-fr/help_changelog.html b/OpenPGP-Keychain/src/main/res/raw-fr/help_changelog.html index 4c9daca93..08a84c5fb 100644 --- a/OpenPGP-Keychain/src/main/res/raw-fr/help_changelog.html +++ b/OpenPGP-Keychain/src/main/res/raw-fr/help_changelog.html @@ -1,6 +1,13 @@ +

2.5

+
    +
  • fix decryption of symmetric pgp messages/files
  • +
  • refactored edit key screen (thanks to Ash Hughes)
  • +
  • OpenPGP API version 3 (multiple api accounts, internal fixes)
  • +
  • new modern design for encrypt/decrypt screens
  • +

2.4

Merci à tous les participants de « Google Summer of Code 2014 » qui ont rendu cette version riche en fonctions et sans bogue ! À part plusieurs petits correctifs, un nombre notable de correctifs ont été apportés par les personnes suivantes (par ordre alphabétique) : diff --git a/OpenPGP-Keychain/src/main/res/raw-it-rIT/help_changelog.html b/OpenPGP-Keychain/src/main/res/raw-it-rIT/help_changelog.html index b3e5170eb..abe268523 100644 --- a/OpenPGP-Keychain/src/main/res/raw-it-rIT/help_changelog.html +++ b/OpenPGP-Keychain/src/main/res/raw-it-rIT/help_changelog.html @@ -1,6 +1,13 @@ +

2.5

+
    +
  • fix decryption of symmetric pgp messages/files
  • +
  • refactored edit key screen (thanks to Ash Hughes)
  • +
  • OpenPGP API version 3 (multiple api accounts, internal fixes)
  • +
  • new modern design for encrypt/decrypt screens
  • +

2.4

Grazie a tutti i partecipanti di Google Summer of Code 2014 che hanno reso questo rilascio ricco di caratteristiche e privo di bug! Oltre a numerose piccole correzioni, un notevole numero di patch sono fatte dalle seguenti persone (in ordine alfabetico): diff --git a/OpenPGP-Keychain/src/main/res/raw-ja/help_changelog.html b/OpenPGP-Keychain/src/main/res/raw-ja/help_changelog.html index 1eeedb4b0..f99656c1d 100644 --- a/OpenPGP-Keychain/src/main/res/raw-ja/help_changelog.html +++ b/OpenPGP-Keychain/src/main/res/raw-ja/help_changelog.html @@ -1,6 +1,13 @@ +

2.5

+
    +
  • fix decryption of symmetric pgp messages/files
  • +
  • refactored edit key screen (thanks to Ash Hughes)
  • +
  • OpenPGP API version 3 (multiple api accounts, internal fixes)
  • +
  • new modern design for encrypt/decrypt screens
  • +

2.4

このリリースにおいて適用したリッチでバグのない機能を作ってくれたGoogle Summer of Code 2014の参加者たちに感謝を! また、以下の人達(アルファベット順)の作ってくれたいくつもののさなパッチや相当数のパッチにも: diff --git a/OpenPGP-Keychain/src/main/res/raw-nl-rNL/help_changelog.html b/OpenPGP-Keychain/src/main/res/raw-nl-rNL/help_changelog.html index 1136deba6..db65b65f6 100644 --- a/OpenPGP-Keychain/src/main/res/raw-nl-rNL/help_changelog.html +++ b/OpenPGP-Keychain/src/main/res/raw-nl-rNL/help_changelog.html @@ -1,6 +1,13 @@ +

2.5

+
    +
  • fix decryption of symmetric pgp messages/files
  • +
  • refactored edit key screen (thanks to Ash Hughes)
  • +
  • OpenPGP API version 3 (multiple api accounts, internal fixes)
  • +
  • new modern design for encrypt/decrypt screens
  • +

2.4

Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free! Besides several small patches, a notable number of patches are made by the following people (in alphabetical order): diff --git a/OpenPGP-Keychain/src/main/res/raw-pl/help_changelog.html b/OpenPGP-Keychain/src/main/res/raw-pl/help_changelog.html index 7561c77bf..9d77a3e05 100644 --- a/OpenPGP-Keychain/src/main/res/raw-pl/help_changelog.html +++ b/OpenPGP-Keychain/src/main/res/raw-pl/help_changelog.html @@ -1,6 +1,13 @@ +

2.5

+
    +
  • fix decryption of symmetric pgp messages/files
  • +
  • refactored edit key screen (thanks to Ash Hughes)
  • +
  • OpenPGP API version 3 (multiple api accounts, internal fixes)
  • +
  • new modern design for encrypt/decrypt screens
  • +

2.4

Podziękowania dla wszystkich kandydatów do Google Summer of Code 2014 którzy uczynili to wydanie bogatym w nowe funkcje i pozbawione błedów! Poza kilkoma małymi poprawkami, znaczna ilość aktualizacji została wykonana przez poniższe osoby (w kolejności alfabetycznej): diff --git a/OpenPGP-Keychain/src/main/res/raw-pt-rBR/help_changelog.html b/OpenPGP-Keychain/src/main/res/raw-pt-rBR/help_changelog.html index 1136deba6..db65b65f6 100644 --- a/OpenPGP-Keychain/src/main/res/raw-pt-rBR/help_changelog.html +++ b/OpenPGP-Keychain/src/main/res/raw-pt-rBR/help_changelog.html @@ -1,6 +1,13 @@ +

2.5

+
    +
  • fix decryption of symmetric pgp messages/files
  • +
  • refactored edit key screen (thanks to Ash Hughes)
  • +
  • OpenPGP API version 3 (multiple api accounts, internal fixes)
  • +
  • new modern design for encrypt/decrypt screens
  • +

2.4

Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free! Besides several small patches, a notable number of patches are made by the following people (in alphabetical order): diff --git a/OpenPGP-Keychain/src/main/res/raw-ru/help_changelog.html b/OpenPGP-Keychain/src/main/res/raw-ru/help_changelog.html index 349d85d22..0646e7dda 100644 --- a/OpenPGP-Keychain/src/main/res/raw-ru/help_changelog.html +++ b/OpenPGP-Keychain/src/main/res/raw-ru/help_changelog.html @@ -1,6 +1,13 @@ +

2.5

+
    +
  • fix decryption of symmetric pgp messages/files
  • +
  • refactored edit key screen (thanks to Ash Hughes)
  • +
  • OpenPGP API version 3 (multiple api accounts, internal fixes)
  • +
  • new modern design for encrypt/decrypt screens
  • +

2.4

Спасибо всем участникам Google Summer of Code 2014, которые помогли сделать этот выпуск, добавив функции и исправив ошибки! Из общего числа патчей, особенный вклад внесли следующие люди (в алфавитном порядке): diff --git a/OpenPGP-Keychain/src/main/res/raw-sl-rSI/help_changelog.html b/OpenPGP-Keychain/src/main/res/raw-sl-rSI/help_changelog.html index 1136deba6..db65b65f6 100644 --- a/OpenPGP-Keychain/src/main/res/raw-sl-rSI/help_changelog.html +++ b/OpenPGP-Keychain/src/main/res/raw-sl-rSI/help_changelog.html @@ -1,6 +1,13 @@ +

2.5

+
    +
  • fix decryption of symmetric pgp messages/files
  • +
  • refactored edit key screen (thanks to Ash Hughes)
  • +
  • OpenPGP API version 3 (multiple api accounts, internal fixes)
  • +
  • new modern design for encrypt/decrypt screens
  • +

2.4

Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free! Besides several small patches, a notable number of patches are made by the following people (in alphabetical order): diff --git a/OpenPGP-Keychain/src/main/res/raw-tr/help_changelog.html b/OpenPGP-Keychain/src/main/res/raw-tr/help_changelog.html index 1136deba6..db65b65f6 100644 --- a/OpenPGP-Keychain/src/main/res/raw-tr/help_changelog.html +++ b/OpenPGP-Keychain/src/main/res/raw-tr/help_changelog.html @@ -1,6 +1,13 @@ +

2.5

+
    +
  • fix decryption of symmetric pgp messages/files
  • +
  • refactored edit key screen (thanks to Ash Hughes)
  • +
  • OpenPGP API version 3 (multiple api accounts, internal fixes)
  • +
  • new modern design for encrypt/decrypt screens
  • +

2.4

Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free! Besides several small patches, a notable number of patches are made by the following people (in alphabetical order): diff --git a/OpenPGP-Keychain/src/main/res/raw-uk/help_changelog.html b/OpenPGP-Keychain/src/main/res/raw-uk/help_changelog.html index f8b68c32a..77e39d434 100644 --- a/OpenPGP-Keychain/src/main/res/raw-uk/help_changelog.html +++ b/OpenPGP-Keychain/src/main/res/raw-uk/help_changelog.html @@ -1,6 +1,13 @@ +

2.5

+
    +
  • виправлено опис симетричних повідомлень/файлів pgp
  • +
  • перероблено екран редагування ключа (завдяки Ash Hughes)
  • +
  • OpenPGP API версія 3 (підтримка кількох профілів, внутрішні зміни)
  • +
  • новий сучасний дизайн для екранів шифрування/розшифрування
  • +

2.4

Дякуємо усім заявникам Google Summer of Code 2014, які зробили цю версію багатшу на функції та вільну від помилок! Крім окремих незначних латок, значне число латок зробили наступні люди (у алфавітному порядку): diff --git a/OpenPGP-Keychain/src/main/res/raw-zh-rTW/help_changelog.html b/OpenPGP-Keychain/src/main/res/raw-zh-rTW/help_changelog.html index 1136deba6..db65b65f6 100644 --- a/OpenPGP-Keychain/src/main/res/raw-zh-rTW/help_changelog.html +++ b/OpenPGP-Keychain/src/main/res/raw-zh-rTW/help_changelog.html @@ -1,6 +1,13 @@ +

2.5

+
    +
  • fix decryption of symmetric pgp messages/files
  • +
  • refactored edit key screen (thanks to Ash Hughes)
  • +
  • OpenPGP API version 3 (multiple api accounts, internal fixes)
  • +
  • new modern design for encrypt/decrypt screens
  • +

2.4

Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free! Besides several small patches, a notable number of patches are made by the following people (in alphabetical order): diff --git a/OpenPGP-Keychain/src/main/res/raw-zh/help_changelog.html b/OpenPGP-Keychain/src/main/res/raw-zh/help_changelog.html index 1136deba6..db65b65f6 100644 --- a/OpenPGP-Keychain/src/main/res/raw-zh/help_changelog.html +++ b/OpenPGP-Keychain/src/main/res/raw-zh/help_changelog.html @@ -1,6 +1,13 @@ +

2.5

+
    +
  • fix decryption of symmetric pgp messages/files
  • +
  • refactored edit key screen (thanks to Ash Hughes)
  • +
  • OpenPGP API version 3 (multiple api accounts, internal fixes)
  • +
  • new modern design for encrypt/decrypt screens
  • +

2.4

Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free! Besides several small patches, a notable number of patches are made by the following people (in alphabetical order): diff --git a/OpenPGP-Keychain/src/main/res/values-es/strings.xml b/OpenPGP-Keychain/src/main/res/values-es/strings.xml index f8ee3c812..55136642c 100644 --- a/OpenPGP-Keychain/src/main/res/values-es/strings.xml +++ b/OpenPGP-Keychain/src/main/res/values-es/strings.xml @@ -74,6 +74,7 @@ Importar desde código QR Importar Importar desde NFC + Exportar todas las claves públicas Exportar todas las claves secretas Exportar hacia archivo Borrar clave @@ -98,6 +99,8 @@ Cancelar Cifrar hacia... Seleccionar todo + Añadir claves + Exportar claves Firmar Mensaje @@ -189,11 +192,15 @@ Establece una frase de contraseña antes. No hay un gestor de archivos compatible instalado. Las frases de contraseña no coinciden. + Por favor, introduce una frase de contraseña. Cifrado simétrico. Introducir la frase de contraseña para \'%s\' ¿Estás seguro de que quieres borrar\n%s? Borrado satisfactoriamente. Selecciona un archivo antes. + Descifrado y/o verificado satisfactoriamente. + Firmado y/o cifrado satisfactoriamente. + Firmado y/o cifrado al portapapeles satisfactoriamente. Introduce la frase de contraseña dos veces. Selecciona al menos una clave de cifrado. Selecciona al menos una clave de cifrado o de firma. @@ -205,6 +212,7 @@ ¿Quieres realmente borrar todas las claves seleccionadas?\n¡No podrás deshacerlo! ¿Quieres realmente borrar la clave SECRETA \'%s\'?\n¡No podrás deshacerlo! Has hecho cambios en el almacén de claves, ¿quieres guardarlos? + Has añadido una ID de usuario vacía, ¿Estás seguro que quieres continuar? ¿Quieres realmente borrar la clave PÚBLICA \'%s\'?\n¡No podrás deshacerlo! ¿Borrar claves secretas? ¿Exportar también las claves secretas? @@ -298,6 +306,7 @@ parte del archivo cargado es un objeto OpenPGP válido pero no una clave OpenPGP partes del archivo cargado son objetos OpenPGP válidos pero no claves OpenPGP + Debes hacer cambios en el almacén de claves antes de que puedas guardarlo Hecho. Cancelar @@ -423,6 +432,9 @@ Información Certificaciones + Claves + Firmar y cifrar + Descifrar y verificar Importar claves Mis claves Aplicaciones registradas @@ -436,4 +448,6 @@ IDs de usuario para firmar Nueva aplicación de certificados + Escribe aquí el mensaje que quieras cifrar y/o firmar... + Introduce aquí el texto cifrado para descifrarlo y/o verificarlo... diff --git a/OpenPGP-Keychain/src/main/res/values-fr/strings.xml b/OpenPGP-Keychain/src/main/res/values-fr/strings.xml index 6df2988cb..e7d8b0b7f 100644 --- a/OpenPGP-Keychain/src/main/res/values-fr/strings.xml +++ b/OpenPGP-Keychain/src/main/res/values-fr/strings.xml @@ -74,6 +74,7 @@ Importer depuis un code QR Importer Importer avec NFC + Exporter toutes les clefs publiques Exporter toutes les clefs secrètes Exporter vers un fichier Supprimer la clef @@ -98,6 +99,8 @@ Annuler Chiffrer vers... Tout sélectionner + Ajouter des clefs + Exporter des clefs Signer Message @@ -189,11 +192,15 @@ Définir d\'abord une phrase de passe. Aucun gestionnaire de fichiers compatible installé. Les phrases de passe ne correspondent pas. + Veuillez saisir une phrase de passe Chriffrement symétrique. Saisir une phrase de passe pour « %s » Êtes-vous sûr de vouloir supprimer\n%s ? Supprimé avec succès. Choisir d\'abord un fichier. + Déchiffré et/ou vérifié avec succès + Signé et/ou chiffré avec succès + Signé et/ou chiffré vers le presse-papiers avec succès Saisir la phrase de passe deux fois. Choisir au moins une clef de chiffrement. Choisir au moins une clef de chiffrement ou de signature. @@ -205,6 +212,7 @@ Voulez-vous vraiment supprimer toutes les clefs choisies ?\nCeci est irréversible ! Voulez-vous vraiment supprimer la clef SECRÈTE %s ?\nVous ne pourrez pas la restituer ! Vous avez apporté des changements au trousseau, voulez-vous l\'enregistrer ? + Vous avez ajouté un ID utilisateur vide, êtes-vous certain de vouloir continuer? Voulez-vous vraiment supprimer la clef PUBLIQUE « %s » ?\nVous ne pourrez pas la restituer ! Supprimer les clefs privées ? Exporter aussi les clefs secrètes? @@ -424,6 +432,9 @@ Infos Certifications + Clefs + Signer et chiffrer + Déchiffrer et vérifier Importer les clefs Mes clefs Applis enregistrées @@ -437,4 +448,6 @@ ID utilisateur pour signer Nouvel application des certificats + Écrire ici le message à chiffrer et/ou signer... + Saisir le cryptogramme à déchiffrer et/ou à vérifier ici... diff --git a/OpenPGP-Keychain/src/main/res/values-ja/strings.xml b/OpenPGP-Keychain/src/main/res/values-ja/strings.xml index d501d0b9b..eceefb8a3 100644 --- a/OpenPGP-Keychain/src/main/res/values-ja/strings.xml +++ b/OpenPGP-Keychain/src/main/res/values-ja/strings.xml @@ -41,7 +41,7 @@ あなたの鍵を証明に利用します 鍵のアップロード 鍵サーバ - 暗号化と/もしくは署名 + 暗号化/署名 復号化と検証 署名 @@ -74,6 +74,7 @@ QRコードからインポート インポート NFCからインポート + すべての公開鍵のエクスポート すべての秘密鍵のエクスポート ファイルへのエクスポート 鍵の削除 @@ -98,6 +99,8 @@ キャンセル 暗号化... すべて選択 + 鍵の追加 + 複数鍵のエクスポート 署名 メッセージ @@ -186,11 +189,15 @@ 最初にパスフレーズを設定してください。 互換性のないファイルマネージャがインストールされています。 パスフレーズが一致しません。 + パスフレーズを入れてください。 対称暗号。 \'%s\' にパスフレーズを入れてください。 %s を削除してもかまいませんか? 削除に成功しました。 最初にファイルを選択してください。 + 復号化/検証に成功しました。 + 署名/暗号化に成功しました。 + クリップボードの中身の署名/暗号化に成功しました。 もう一度パスフレーズを入れてください。 少なくとも1つの暗号化鍵を選択して下さい。 少なくとも1つの暗号化鍵か署名鍵を選択して下さい。 @@ -202,6 +209,7 @@ 選択したすべての鍵を本当に削除してよいですか?\nこれは元に戻せません。 秘密鍵\'%s\'を本当に削除してもよいですか?\nこれは元に戻せません! あなたは鍵輪に変更を加えました、これを保存しますか? + あなたは空のユーザーIDを追加しました、このまま続けますか? 公開鍵\'%s\'を本当に削除してもよいですか?\nこれは元に戻せません! 秘密鍵を削除しますか? 秘密鍵もエクスポートしますか? @@ -409,6 +417,9 @@ 情報 証明 + + 署名と暗号化 + 復号化と検証 鍵のインポート 自分の鍵 登録済みのアプリ @@ -422,4 +433,6 @@ 署名に使うユーザーID 検証を再適用する + ここに書いたメッセージを暗号化/署名.. + ここに入力された暗号化テキストを復号化/検証... diff --git a/OpenPGP-Keychain/src/main/res/values-pl/strings.xml b/OpenPGP-Keychain/src/main/res/values-pl/strings.xml index 428ca203e..336f0bff7 100644 --- a/OpenPGP-Keychain/src/main/res/values-pl/strings.xml +++ b/OpenPGP-Keychain/src/main/res/values-pl/strings.xml @@ -48,6 +48,7 @@ Certyfikuj Odszyfruj Deszyfruj i weryfikuj + Ze schowka Wybierz odbiorców Zaszyfruj plik Zapisz @@ -55,6 +56,8 @@ Usuń Żaden Ok + Zmień nowe hasło + Ustaw nowe hasło Wyszukaj Wyślij do serwera kluczy Dalej @@ -71,6 +74,7 @@ Zaimportuj z kodu QR Import Zaimportuj przy użyciu NFC + Eksportuj wszystkie klucze publiczne Eksportuj wszystkie prywatne klucze Eksportuj do pliku Usuń klucz @@ -95,6 +99,8 @@ Anuluj Zaszyfruj do... Wybierz wszystko + Dodaj klucze + Eksportuj klucze Podpis Wiadomość @@ -179,17 +185,25 @@ Błąd Błąd: %s + Certyfikuj + Podpisz + Zaszyfruj + Autentykuj Nieprawidłowe hasło. Użycie zawartości schowka. Najpierw ustaw hasło. Nie zainstalowano żadnego kompatybilnego menadżera plików. Hasła nie pasują do siebie + Podaj hasło. Szyfrowanie symetryczne. Podaj hasło dla \'%s\' Czy jesteś pewien że chcesz usunąć\n%s? Usunięto pomyślnie. Najpierw wskaż plik. + Pomyślnie deszyfrowano i/lub zweryfikowano. + Pomyślnie podpisano i/lub zaszyfrowano. + Pomyslnie podpisano i/lub zaszyfrowano do schowka. Podaj hasło dwukrotnie. Wybierz co najmniej jeden klucz szyfrujący. Wybierz co najmniej jeden klucz szyfrujący lub klucz podpisujący. @@ -200,6 +214,8 @@ Czy na pewno chcesz usunąć klucz \'%s\'?\nNie można cofnąć tej operacji! Czy na pewno chcesz usunąć wszystkie zaznaczone klucze?\nTej operacji nie można cofnąć! Czy na pewno chcesz usunąć klucz prywatny \'%s\'?\nNie można cofnąć tej operacji! + Zostały dokonane zmiany w pęku kluczy, czy chcesz je zachować? + Dodałeś pusty identyfikator użytkownika, czy na pewno chcesz kontynuować? Czy na pewno chcesz usunąć klucz publiczny \'%s\'?\nNie można cofnąć tej operacji! Usunąć klucze prywatne? Czy wyeksportować również klucze prywatne? @@ -283,6 +299,7 @@ NCF jest niedostępne na twoim urządzeniu Nie ma nic do zaimportowania! data wygaśnięcia musi być późniejsza niż data stworzenia + zapisz najpierw pęk kluczy nie możesz usunąć tego kontaktu, ponieważ należy do ciebie. nie możesz usunąć tych kontaktów, ponieważ należą do ciebie:\n%s Niewystarczające zapytanie do serwera @@ -300,6 +317,7 @@ Część wczytanego pliku to poprawne obiekty OpenPGP, ale nie są kluczami OpenPGP Część wczytanego pliku to poprawne obiekty OpenPGP, ale nie są kluczami OpenPGP + Musisz dokonać zmian w pęku kluczy zanim będziesz mógł go zachować Gotowe. Anuluj @@ -429,6 +447,9 @@ Informacje Certyfikaty + Klucze + Podpisz i zaszyfruj + Deszyfruj i weryfikuj Importuj klucze Moje klucze Zarejestrowane aplikacje @@ -442,4 +463,6 @@ Identyfikator użytkownika do podpisu Ponowne stosowanie certyfikatów + Wpisz tutaj wiadomość do zaszyfrowania i/lub podpisania... + Wpisz tutaj tekst do zaszyfrowania i/lub zweryfikowania... diff --git a/OpenPGP-Keychain/src/main/res/values-ru/strings.xml b/OpenPGP-Keychain/src/main/res/values-ru/strings.xml index 26ef948ba..8ee6d95ca 100644 --- a/OpenPGP-Keychain/src/main/res/values-ru/strings.xml +++ b/OpenPGP-Keychain/src/main/res/values-ru/strings.xml @@ -74,6 +74,7 @@ Импорт из QR кода Импорт Импорт из NFC + Экспорт всех открытых ключей Экспорт всех секретных ключей Экспорт в файл Удалить ключ @@ -98,6 +99,8 @@ Отмена Зашифровать.... Выбрать все + Добавить ключи + Экспорт ключей Подписать Сообщение @@ -191,11 +194,15 @@ Сначала задайте пароль Нет совместимого менеджера файлов. Пароли не совпадают. + Пожалуйста, введите пароль. Симметричное шифрование. Введите пароль для\n\'%s\' Вы уверены, что хотите удалить\n%s ? Удалено. Сначала выберите файл. + Расшифровано и/или проверено. + Подписано и/или зашифровано. + Подписано и/или зашифровано в буфер обмена. Дважды введите пароль. Укажите хотя бы один ключ. Выберите хотя бы один ключ для шифрования или подписи. @@ -430,6 +437,9 @@ Информация Сертификация + Ключи + Подписать и зашифровать + Расшифровать и проверить Импорт ключей Мои ключи Связанные приложения @@ -442,4 +452,5 @@ не доступен Подписываемые ID пользователя + Напишите сообщение здесь, что бы зашифровать и/или подписать... diff --git a/OpenPGP-Keychain/src/main/res/values-uk/strings.xml b/OpenPGP-Keychain/src/main/res/values-uk/strings.xml index 6329439d3..da9509822 100644 --- a/OpenPGP-Keychain/src/main/res/values-uk/strings.xml +++ b/OpenPGP-Keychain/src/main/res/values-uk/strings.xml @@ -74,6 +74,7 @@ Імпорт з штрих-коду Імпорт Імпорт з NFC + Експортувати усі публічні ключі Експортувати усі секретні ключі Експорт до файлу Вилучити ключ @@ -98,6 +99,8 @@ Скасувати Зашифрувати… Вибрати усе + Додати ключі + Експортувати ключі Підпис Повідомлення @@ -192,11 +195,15 @@ Спершу задайте парольну фразу. Нема встановленого сумісного менеджера файлів. Парольні фрази не збігаються. + Будь ласка, введіть парольну фразу. Симетричне шифрування. Введіть парольну фразу для \'%s\' Ви справді хочете вилучити\n%s? Успішно вилучено. Виберіть спершу файл. + Успішно розшифровано та/або перевірено. + Успішно підписано та/або перевірено. + Успішно підписано та/або зашифровано до буфера обміну. Введіть двічі парольну фразу. Виберіть принаймні один ключ шифрування. Виберіть принаймні один ключ шифрування або ключ підпису. @@ -208,6 +215,7 @@ Ви справді хочете вилучити усі вибрані ключі?\nВи не зможете це відмінити! Ви справді хочете вилучити секретний ключ \'%s\'?\nВи не зможете це відмінити! Ви внесли зміни до в\'язки ключів, ви б хотіли. Волієте їх зберегти? + Ви вже додали порожній ідентифікатор користувача. Справді хочете продовжити? Справді волієте вилучити ВІДКРИТИЙ ключ \'%s\'?\nВи е зможете відмінити цю дію! Видалити секретні ключі? Також експортувати секретні ключі? @@ -439,6 +447,9 @@ Інформація Сертифікати + Ключі + Підписати і зашифрувати + Розшифрувати і Перевірити Імпортувати ключі Мої ключі Зареєстровані програми @@ -452,4 +463,6 @@ ІД користувача для реєстрації Перезастосування сертифікатів + Напишіть повідомлення для шифрування та/або підпису… + Уведіть зашифрований текст тут для його розшифрування та/або перевірки… From 40e3b9cf79915c4a238c2413a564b372140e036e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Thu, 3 Apr 2014 15:21:34 +0200 Subject: [PATCH 06/11] version 2.5 --- OpenPGP-Keychain/src/main/AndroidManifest.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenPGP-Keychain/src/main/AndroidManifest.xml b/OpenPGP-Keychain/src/main/AndroidManifest.xml index 10505248f..e588817e7 100644 --- a/OpenPGP-Keychain/src/main/AndroidManifest.xml +++ b/OpenPGP-Keychain/src/main/AndroidManifest.xml @@ -2,8 +2,8 @@ + android:versionCode="25000" + android:versionName="2.5">