aboutsummaryrefslogtreecommitdiffstats
path: root/OpenPGP-Keychain
diff options
context:
space:
mode:
authorDominik Schürmann <dominik@dominikschuermann.de>2013-09-08 17:04:33 +0200
committerDominik Schürmann <dominik@dominikschuermann.de>2013-09-08 17:04:33 +0200
commit4d1d3f6f5ea2eca224965ed3a2f1de5c551453fc (patch)
tree3b59394f6fdc4eb331ec318b2a19274ee4f99205 /OpenPGP-Keychain
parent6fdae001cc5ee742cceaeea82c75f0e314a3449f (diff)
downloadopen-keychain-4d1d3f6f5ea2eca224965ed3a2f1de5c551453fc.tar.gz
open-keychain-4d1d3f6f5ea2eca224965ed3a2f1de5c551453fc.tar.bz2
open-keychain-4d1d3f6f5ea2eca224965ed3a2f1de5c551453fc.zip
Select pub key when email could not be found
Diffstat (limited to 'OpenPGP-Keychain')
-rw-r--r--OpenPGP-Keychain/res/layout/api_app_select_pub_keys_activity.xml22
-rw-r--r--OpenPGP-Keychain/res/values/strings.xml9
-rw-r--r--OpenPGP-Keychain/src/org/sufficientlysecure/keychain/helper/PgpMain.java8
-rw-r--r--OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/CryptoService.java26
-rw-r--r--OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/CryptoServiceActivity.java60
-rw-r--r--OpenPGP-Keychain/src/org/sufficientlysecure/keychain/service/KeychainIntentService.java17
6 files changed, 102 insertions, 40 deletions
diff --git a/OpenPGP-Keychain/res/layout/api_app_select_pub_keys_activity.xml b/OpenPGP-Keychain/res/layout/api_app_select_pub_keys_activity.xml
new file mode 100644
index 000000000..fe9332a92
--- /dev/null
+++ b/OpenPGP-Keychain/res/layout/api_app_select_pub_keys_activity.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:orientation="vertical" >
+
+ <TextView
+ android:id="@+id/api_select_pub_keys_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:padding="8dp"
+ android:paddingBottom="3dip"
+ android:text="@string/api_select_pub_keys_text"
+ android:textAppearance="?android:attr/textAppearanceLarge" />
+
+ <FrameLayout
+ android:id="@+id/api_select_pub_keys_fragment_container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+
+</LinearLayout> \ No newline at end of file
diff --git a/OpenPGP-Keychain/res/values/strings.xml b/OpenPGP-Keychain/res/values/strings.xml
index 70f4993d7..526901835 100644
--- a/OpenPGP-Keychain/res/values/strings.xml
+++ b/OpenPGP-Keychain/res/values/strings.xml
@@ -329,12 +329,12 @@
<string name="key_size_1024">1024</string>
<string name="key_size_2048">2048</string>
<string name="key_size_4096">4096</string>
-
+
<!-- misc -->
<string name="fast">fast</string>
<string name="slow">slow</string>
<string name="very_slow">very slow</string>
-
+
<!-- APG 2.0 -->
@@ -377,5 +377,6 @@
<string name="api_register_allow">Allow access</string>
<string name="api_register_disallow">Disallow access</string>
<string name="api_register_error_select_key">Please select a key!</string>
-
-</resources>
+ <string name="api_select_pub_keys_text">You have selected recipients (e.g. by selecting email addresses), which public keys could not be found. Please verify your selection!</string>
+
+</resources> \ No newline at end of file
diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/helper/PgpMain.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/helper/PgpMain.java
index e1bd415be..76fc880a0 100644
--- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/helper/PgpMain.java
+++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/helper/PgpMain.java
@@ -735,14 +735,14 @@ public class PgpMain {
*/
public static void encryptAndSign(Context context, ProgressDialogUpdater progress,
InputData data, OutputStream outStream, boolean useAsciiArmor, int compression,
- ArrayList<Long> encryptionKeyIds, String encryptionPassphrase,
+ long[] encryptionKeyIds, String encryptionPassphrase,
int symmetricEncryptionAlgorithm, long signatureKeyId, int signatureHashAlgorithm,
boolean signatureForceV3, String signaturePassphrase) throws IOException,
PgpGeneralException, PGPException, NoSuchProviderException, NoSuchAlgorithmException,
SignatureException {
if (encryptionKeyIds == null) {
- encryptionKeyIds = new ArrayList<Long>();
+ encryptionKeyIds = new long[0];
}
ArmoredOutputStream armorOut = null;
@@ -759,7 +759,7 @@ public class PgpMain {
PGPSecretKeyRing signingKeyRing = null;
PGPPrivateKey signaturePrivateKey = null;
- if (encryptionKeyIds.size() == 0 && encryptionPassphrase == null) {
+ if (encryptionKeyIds.length == 0 && encryptionPassphrase == null) {
throw new PgpGeneralException(
context.getString(R.string.error_noEncryptionKeysOrPassPhrase));
}
@@ -795,7 +795,7 @@ public class PgpMain {
PGPEncryptedDataGenerator cPk = new PGPEncryptedDataGenerator(encryptorBuilder);
- if (encryptionKeyIds.size() == 0) {
+ if (encryptionKeyIds.length == 0) {
// Symmetric encryption
Log.d(Constants.TAG, "encryptionKeyIds length is 0 -> symmetric encryption");
diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/CryptoService.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/CryptoService.java
index 962412055..cec52e47e 100644
--- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/CryptoService.java
+++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/CryptoService.java
@@ -112,7 +112,7 @@ public class CryptoService extends Service {
* @param encryptionUserIds
* @return
*/
- private ArrayList<Long> getKeyIdsFromEmails(String[] encryptionUserIds) {
+ private long[] getKeyIdsFromEmails(String[] encryptionUserIds, long ownKeyId) {
// find key ids to given emails in database
boolean manySameUserIds = false;
boolean missingUserIds = false;
@@ -133,9 +133,22 @@ public class CryptoService extends Service {
}
}
- // TODO: show selection activity on missingUserIds or manySameUserIds
+ // also encrypt to our self (so that we can decrypt it later!)
+ keyIds.add(ownKeyId);
- return keyIds;
+ // convert o long[]
+ long[] keyIdsArray = new long[keyIds.size()];
+ for (int i = 0; i < keyIdsArray.length; i++) {
+ keyIdsArray[i] = keyIds.get(i);
+ }
+
+ if (missingUserIds || manySameUserIds) {
+ Bundle extras = new Bundle();
+ extras.putLongArray(CryptoServiceActivity.EXTRA_SELECTED_MASTER_KEY_IDS, keyIdsArray);
+ pauseQueueAndStartServiceActivity(CryptoServiceActivity.ACTION_SELECT_PUB_KEYS, extras);
+ }
+
+ return keyIdsArray;
}
private synchronized void encryptAndSignSafe(byte[] inputBytes, String[] encryptionUserIds,
@@ -154,10 +167,7 @@ public class CryptoService extends Service {
OutputStream outputStream = new ByteArrayOutputStream();
- ArrayList<Long> keyIds = getKeyIdsFromEmails(encryptionUserIds);
-
- // also encrypt to our self (so that we can decrypt it later!)
- keyIds.add(appSettings.getKeyId());
+ long[] keyIds = getKeyIdsFromEmails(encryptionUserIds, appSettings.getKeyId());
if (sign) {
PgpMain.encryptAndSign(mContext, null, inputData, outputStream,
@@ -384,7 +394,7 @@ public class CryptoService extends Service {
@Override
public void onSelectedPublicKeys(long[] keyIds) throws RemoteException {
// TODO Auto-generated method stub
-
+
}
};
diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/CryptoServiceActivity.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/CryptoServiceActivity.java
index 63e3a5290..43f825dc0 100644
--- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/CryptoServiceActivity.java
+++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/CryptoServiceActivity.java
@@ -21,9 +21,9 @@ import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.Id;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.helper.ActionBarHelper;
-import org.sufficientlysecure.keychain.helper.OtherHelper;
import org.sufficientlysecure.keychain.helper.PgpMain;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
+import org.sufficientlysecure.keychain.ui.SelectPublicKeyFragment;
import org.sufficientlysecure.keychain.ui.dialog.PassphraseDialogFragment;
import org.sufficientlysecure.keychain.util.Log;
@@ -37,13 +37,9 @@ import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
-import android.view.LayoutInflater;
import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
import android.widget.Toast;
-import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockFragmentActivity;
public class CryptoServiceActivity extends SherlockFragmentActivity {
@@ -56,12 +52,15 @@ public class CryptoServiceActivity extends SherlockFragmentActivity {
public static final String EXTRA_SECRET_KEY_ID = "secretKeyId";
public static final String EXTRA_PACKAGE_NAME = "packageName";
+ public static final String EXTRA_SELECTED_MASTER_KEY_IDS = "masterKeyIds";
private IServiceActivityCallback mServiceCallback;
private boolean mServiceBound;
// register view
- AppSettingsFragment settingsFragment;
+ AppSettingsFragment mSettingsFragment;
+ // select pub key view
+ SelectPublicKeyFragment mSelectFragment;
private ServiceConnection mServiceActivityConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName name, IBinder service) {
@@ -116,7 +115,7 @@ public class CryptoServiceActivity extends SherlockFragmentActivity {
// bind to our own crypto service
bindToService();
- handleActions(getIntent());
+ handleActions(getIntent(), savedInstanceState);
}
@Override
@@ -129,7 +128,7 @@ public class CryptoServiceActivity extends SherlockFragmentActivity {
}
}
- protected void handleActions(Intent intent) {
+ protected void handleActions(Intent intent, Bundle savedInstanceState) {
String action = intent.getAction();
Bundle extras = intent.getExtras();
@@ -151,13 +150,13 @@ public class CryptoServiceActivity extends SherlockFragmentActivity {
// Allow
// user needs to select a key!
- if (settingsFragment.getAppSettings().getKeyId() == Id.key.none) {
+ if (mSettingsFragment.getAppSettings().getKeyId() == Id.key.none) {
Toast.makeText(CryptoServiceActivity.this,
R.string.api_register_error_select_key, Toast.LENGTH_LONG)
.show();
} else {
ProviderHelper.insertApiApp(CryptoServiceActivity.this,
- settingsFragment.getAppSettings());
+ mSettingsFragment.getAppSettings());
try {
mServiceCallback.onRegistered(true, packageName);
@@ -183,11 +182,11 @@ public class CryptoServiceActivity extends SherlockFragmentActivity {
setContentView(R.layout.api_app_register_activity);
- settingsFragment = (AppSettingsFragment) getSupportFragmentManager().findFragmentById(
+ mSettingsFragment = (AppSettingsFragment) getSupportFragmentManager().findFragmentById(
R.id.api_app_settings_fragment);
AppSettings settings = new AppSettings(packageName);
- settingsFragment.setAppSettings(settings);
+ mSettingsFragment.setAppSettings(settings);
// TODO: handle if app is already registered
// LinearLayout layoutRegister = (LinearLayout)
@@ -211,6 +210,7 @@ public class CryptoServiceActivity extends SherlockFragmentActivity {
showPassphraseDialog(secretKeyId);
} else if (ACTION_SELECT_PUB_KEYS.equals(action)) {
+ long[] selectedMasterKeyIds = intent.getLongArrayExtra(EXTRA_SELECTED_MASTER_KEY_IDS);
// Inflate a "Done"/"Cancel" custom action bar view
ActionBarHelper.setDoneCancelView(getSupportActionBar(), R.string.btn_okay,
@@ -219,15 +219,51 @@ public class CryptoServiceActivity extends SherlockFragmentActivity {
public void onClick(View v) {
// ok
+ try {
+ mServiceCallback.onSelectedPublicKeys(mSelectFragment
+ .getSelectedMasterKeyIds());
+ } catch (RemoteException e) {
+ Log.e(Constants.TAG, "ServiceActivity");
+ }
+ finish();
}
}, R.string.btn_doNotSave, new View.OnClickListener() {
@Override
public void onClick(View v) {
// cancel
+ // TODO: currently does the same as OK...
+ try {
+ mServiceCallback.onSelectedPublicKeys(mSelectFragment
+ .getSelectedMasterKeyIds());
+ } catch (RemoteException e) {
+ Log.e(Constants.TAG, "ServiceActivity");
+ }
+ finish();
}
});
+ setContentView(R.layout.api_app_select_pub_keys_activity);
+
+ // Check that the activity is using the layout version with
+ // the fragment_container FrameLayout
+ if (findViewById(R.id.api_select_pub_keys_fragment_container) != null) {
+
+ // However, if we're being restored from a previous state,
+ // then we don't need to do anything and should return or else
+ // we could end up with overlapping fragments.
+ if (savedInstanceState != null) {
+ return;
+ }
+
+ // Create an instance of the fragment
+ mSelectFragment = SelectPublicKeyFragment.newInstance(selectedMasterKeyIds);
+
+ // Add the fragment to the 'fragment_container' FrameLayout
+ getSupportFragmentManager().beginTransaction()
+ .add(R.id.api_select_pub_keys_fragment_container, mSelectFragment).commit();
+ }
+
} else {
Log.e(Constants.TAG, "Wrong action!");
finish();
diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/service/KeychainIntentService.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/service/KeychainIntentService.java
index 1ffb390c0..9e7f811f8 100644
--- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/service/KeychainIntentService.java
+++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/service/KeychainIntentService.java
@@ -27,28 +27,26 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
import org.spongycastle.openpgp.PGPPublicKeyRing;
import org.spongycastle.openpgp.PGPSecretKey;
import org.spongycastle.openpgp.PGPSecretKeyRing;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.Id;
+import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.helper.FileHelper;
import org.sufficientlysecure.keychain.helper.OtherHelper;
import org.sufficientlysecure.keychain.helper.PgpConversionHelper;
import org.sufficientlysecure.keychain.helper.PgpMain;
-import org.sufficientlysecure.keychain.helper.Preferences;
import org.sufficientlysecure.keychain.helper.PgpMain.PgpGeneralException;
-import org.sufficientlysecure.keychain.provider.ProviderHelper;
+import org.sufficientlysecure.keychain.helper.Preferences;
import org.sufficientlysecure.keychain.provider.KeychainContract.DataStream;
+import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.util.HkpKeyServer;
import org.sufficientlysecure.keychain.util.InputData;
+import org.sufficientlysecure.keychain.util.KeyServer.KeyInfo;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.ProgressDialogUpdater;
-import org.sufficientlysecure.keychain.util.KeyServer.KeyInfo;
-import org.sufficientlysecure.keychain.R;
import android.app.IntentService;
import android.content.Context;
@@ -316,11 +314,6 @@ public class KeychainIntentService extends IntentService implements ProgressDial
}
/* Operation */
- // convert to arraylist
- ArrayList<Long> keyIdsList = new ArrayList<Long>(encryptionKeyIds.length);
- for (long n : encryptionKeyIds)
- keyIdsList.add(n);
-
if (generateSignature) {
Log.d(Constants.TAG, "generating signature...");
PgpMain.generateSignature(this, this, inputData, outStream, useAsciiArmor,
@@ -337,7 +330,7 @@ public class KeychainIntentService extends IntentService implements ProgressDial
} else {
Log.d(Constants.TAG, "encrypt...");
PgpMain.encryptAndSign(this, this, inputData, outStream, useAsciiArmor,
- compressionId, keyIdsList, encryptionPassphrase, Preferences
+ compressionId, encryptionKeyIds, encryptionPassphrase, Preferences
.getPreferences(this).getDefaultEncryptionAlgorithm(),
secretKeyId,
Preferences.getPreferences(this).getDefaultHashAlgorithm(), Preferences