insert api app when key is selected in SelectSignKeyIdFragment as well

This commit is contained in:
Vincent Breitmoser 2018-07-18 12:37:40 +02:00
parent 54498ef4c4
commit 22f4eb3e44
6 changed files with 25 additions and 11 deletions

View file

@ -119,7 +119,7 @@ public class ApiAppDao extends AbstractDao {
public void addAllowedKeyIdForApp(String packageName, long allowedKeyId) { public void addAllowedKeyIdForApp(String packageName, long allowedKeyId) {
InsertAllowedKey statement = new InsertAllowedKey(getWritableDb()); InsertAllowedKey statement = new InsertAllowedKey(getWritableDb());
statement.bind(packageName, allowedKeyId); statement.bind(packageName, allowedKeyId);
statement.execute(); statement.executeInsert();
getDatabaseNotifyManager().notifyApiAppChange(packageName); getDatabaseNotifyManager().notifyApiAppChange(packageName);
} }

View file

@ -137,9 +137,10 @@ public class ApiPendingIntentFactory {
} }
public PendingIntent createSelectSignKeyIdLegacyPendingIntent(Intent data, String packageName, public PendingIntent createSelectSignKeyIdLegacyPendingIntent(Intent data, String packageName,
String preferredUserId) { byte[] packageSignature, String preferredUserId) {
Intent intent = new Intent(mContext, SelectSignKeyIdActivity.class); Intent intent = new Intent(mContext, SelectSignKeyIdActivity.class);
intent.putExtra(SelectSignKeyIdActivity.EXTRA_PACKAGE_NAME, packageName); intent.putExtra(SelectSignKeyIdActivity.EXTRA_PACKAGE_NAME, packageName);
intent.putExtra(SelectSignKeyIdActivity.EXTRA_PACKAGE_SIGNATURE, packageSignature);
intent.putExtra(SelectSignKeyIdActivity.EXTRA_USER_ID, preferredUserId); intent.putExtra(SelectSignKeyIdActivity.EXTRA_USER_ID, preferredUserId);
return createInternal(data, intent); return createInternal(data, intent);

View file

@ -702,10 +702,11 @@ public class OpenPgpService extends Service {
return result; return result;
} else { } else {
String currentPkg = mApiPermissionHelper.getCurrentCallingPackage(); String currentPkg = mApiPermissionHelper.getCurrentCallingPackage();
byte[] packageSignature = mApiPermissionHelper.getPackageCertificateOrError(currentPkg);
String preferredUserId = data.getStringExtra(OpenPgpApi.EXTRA_USER_ID); String preferredUserId = data.getStringExtra(OpenPgpApi.EXTRA_USER_ID);
PendingIntent pi = mApiPendingIntentFactory.createSelectSignKeyIdLegacyPendingIntent( PendingIntent pi = mApiPendingIntentFactory.createSelectSignKeyIdLegacyPendingIntent(
data, currentPkg, preferredUserId); data, currentPkg, packageSignature, preferredUserId);
// return PendingIntent to be executed by client // return PendingIntent to be executed by client
Intent result = new Intent(); Intent result = new Intent();
@ -722,13 +723,14 @@ public class OpenPgpService extends Service {
{ // return PendingIntent to be executed by client { // return PendingIntent to be executed by client
String currentPkg = mApiPermissionHelper.getCurrentCallingPackage(); String currentPkg = mApiPermissionHelper.getCurrentCallingPackage();
byte[] packageSignature = mApiPermissionHelper.getPackageCertificateOrError(currentPkg);
String preferredUserId = data.getStringExtra(OpenPgpApi.EXTRA_USER_ID); String preferredUserId = data.getStringExtra(OpenPgpApi.EXTRA_USER_ID);
PendingIntent pi; PendingIntent pi;
// the new dialog doesn't really work if we don't have a user id to work with. just show the old... // the new dialog doesn't really work if we don't have a user id to work with. just show the old...
if (TextUtils.isEmpty(preferredUserId)) { if (TextUtils.isEmpty(preferredUserId)) {
pi = mApiPendingIntentFactory.createSelectSignKeyIdLegacyPendingIntent(data, currentPkg, null); pi = mApiPendingIntentFactory.createSelectSignKeyIdLegacyPendingIntent(
data, currentPkg, packageSignature, null);
} else { } else {
byte[] packageSignature = mApiPermissionHelper.getPackageCertificateOrError(currentPkg);
boolean showAutocryptHint = data.getBooleanExtra(OpenPgpApi.EXTRA_SHOW_AUTOCRYPT_HINT, false); boolean showAutocryptHint = data.getBooleanExtra(OpenPgpApi.EXTRA_SHOW_AUTOCRYPT_HINT, false);
pi = mApiPendingIntentFactory.createSelectSignKeyIdPendingIntent( pi = mApiPendingIntentFactory.createSelectSignKeyIdPendingIntent(
data, currentPkg, packageSignature, preferredUserId, showAutocryptHint); data, currentPkg, packageSignature, preferredUserId, showAutocryptHint);

View file

@ -17,9 +17,9 @@
package org.sufficientlysecure.keychain.remote.ui; package org.sufficientlysecure.keychain.remote.ui;
import android.app.Activity; import android.app.Activity;
import android.content.Intent; import android.content.Intent;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
import android.widget.TextView; import android.widget.TextView;
@ -35,6 +35,7 @@ import timber.log.Timber;
public class SelectSignKeyIdActivity extends BaseActivity { public class SelectSignKeyIdActivity extends BaseActivity {
public static final String EXTRA_PACKAGE_NAME = "package_name"; public static final String EXTRA_PACKAGE_NAME = "package_name";
public static final String EXTRA_PACKAGE_SIGNATURE = "package_signature";
public static final String EXTRA_USER_ID = OpenPgpApi.EXTRA_USER_ID; public static final String EXTRA_USER_ID = OpenPgpApi.EXTRA_USER_ID;
public static final String EXTRA_DATA = "data"; public static final String EXTRA_DATA = "data";
@ -70,17 +71,19 @@ public class SelectSignKeyIdActivity extends BaseActivity {
Intent intent = getIntent(); Intent intent = getIntent();
String packageName = intent.getStringExtra(EXTRA_PACKAGE_NAME); String packageName = intent.getStringExtra(EXTRA_PACKAGE_NAME);
byte[] packageSignature = intent.getByteArrayExtra(EXTRA_PACKAGE_SIGNATURE);
mPreferredUserId = intent.getStringExtra(EXTRA_USER_ID); mPreferredUserId = intent.getStringExtra(EXTRA_USER_ID);
mData = intent.getParcelableExtra(EXTRA_DATA); mData = intent.getParcelableExtra(EXTRA_DATA);
if (packageName == null) { if (packageName == null) {
Timber.e("Intent data missing. Should be Uri of app!"); Timber.e("Intent data missing. Should be Uri of app!");
finish(); finish();
} else { } else {
startListFragments(savedInstanceState, packageName, mData, mPreferredUserId); startListFragments(savedInstanceState, packageName, packageSignature, mData, mPreferredUserId);
} }
} }
private void startListFragments(Bundle savedInstanceState, String packageName, Intent data, String preferredUserId) { private void startListFragments(Bundle savedInstanceState, String packageName, byte[] packageSignature, Intent data,
String preferredUserId) {
// However, if we're being restored from a previous state, // However, if we're being restored from a previous state,
// then we don't need to do anything and should return or else // then we don't need to do anything and should return or else
// we could end up with overlapping fragments. // we could end up with overlapping fragments.
@ -90,7 +93,7 @@ public class SelectSignKeyIdActivity extends BaseActivity {
// Create an instance of the fragments // Create an instance of the fragments
SelectSignKeyIdListFragment listFragment = SelectSignKeyIdListFragment SelectSignKeyIdListFragment listFragment = SelectSignKeyIdListFragment
.newInstance(packageName, data, preferredUserId); .newInstance(packageName, packageSignature, data, preferredUserId);
// Add the fragment to the 'fragment_container' FrameLayout // Add the fragment to the 'fragment_container' FrameLayout
// NOTE: We use commitAllowingStateLoss() to prevent weird crashes! // NOTE: We use commitAllowingStateLoss() to prevent weird crashes!
getSupportFragmentManager().beginTransaction() getSupportFragmentManager().beginTransaction()

View file

@ -34,6 +34,7 @@ import android.widget.LinearLayout;
import org.openintents.openpgp.util.OpenPgpApi; import org.openintents.openpgp.util.OpenPgpApi;
import org.openintents.openpgp.util.OpenPgpUtils; import org.openintents.openpgp.util.OpenPgpUtils;
import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.model.ApiApp;
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo; import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
import org.sufficientlysecure.keychain.pgp.KeyRing; import org.sufficientlysecure.keychain.pgp.KeyRing;
import org.sufficientlysecure.keychain.daos.ApiAppDao; import org.sufficientlysecure.keychain.daos.ApiAppDao;
@ -46,6 +47,7 @@ import org.sufficientlysecure.keychain.ui.keyview.GenericViewModel;
public class SelectSignKeyIdListFragment extends RecyclerFragment<KeyChoiceAdapter> { public class SelectSignKeyIdListFragment extends RecyclerFragment<KeyChoiceAdapter> {
private static final String ARG_PACKAGE_NAME = "package_name"; private static final String ARG_PACKAGE_NAME = "package_name";
private static final String ARG_PACKAGE_SIGNATURE = "package_signature";
private static final String ARG_PREF_UID = "pref_uid"; private static final String ARG_PREF_UID = "pref_uid";
public static final String ARG_DATA = "data"; public static final String ARG_DATA = "data";
@ -57,12 +59,15 @@ public class SelectSignKeyIdListFragment extends RecyclerFragment<KeyChoiceAdapt
private Intent resultIntent; private Intent resultIntent;
private String prefUid; private String prefUid;
private String packageName; private String packageName;
private byte[] packageSignature;
public static SelectSignKeyIdListFragment newInstance(String packageName, Intent data, String preferredUserId) { public static SelectSignKeyIdListFragment newInstance(String packageName, byte[] packageSignature,
Intent data, String preferredUserId) {
SelectSignKeyIdListFragment frag = new SelectSignKeyIdListFragment(); SelectSignKeyIdListFragment frag = new SelectSignKeyIdListFragment();
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putString(ARG_PACKAGE_NAME, packageName); args.putString(ARG_PACKAGE_NAME, packageName);
args.putByteArray(ARG_PACKAGE_SIGNATURE, packageSignature);
args.putParcelable(ARG_DATA, data); args.putParcelable(ARG_DATA, data);
args.putString(ARG_PREF_UID, preferredUserId); args.putString(ARG_PREF_UID, preferredUserId);
@ -103,6 +108,7 @@ public class SelectSignKeyIdListFragment extends RecyclerFragment<KeyChoiceAdapt
resultIntent = getArguments().getParcelable(ARG_DATA); resultIntent = getArguments().getParcelable(ARG_DATA);
prefUid = getArguments().getString(ARG_PREF_UID); prefUid = getArguments().getString(ARG_PREF_UID);
packageName = getArguments().getString(ARG_PACKAGE_NAME); packageName = getArguments().getString(ARG_PACKAGE_NAME);
packageSignature = getArguments().getByteArray(ARG_PACKAGE_SIGNATURE);
setEmptyText(getString(R.string.list_empty)); setEmptyText(getString(R.string.list_empty));
setLayoutManager(new LinearLayoutManager(getContext())); setLayoutManager(new LinearLayoutManager(getContext()));
@ -149,6 +155,8 @@ public class SelectSignKeyIdListFragment extends RecyclerFragment<KeyChoiceAdapt
} }
private void onSelectKeyItemClicked(UnifiedKeyInfo keyInfo) { private void onSelectKeyItemClicked(UnifiedKeyInfo keyInfo) {
ApiApp apiApp = ApiApp.create(packageName, packageSignature);
apiAppDao.insertApiApp(apiApp);
apiAppDao.addAllowedKeyIdForApp(packageName, keyInfo.master_key_id()); apiAppDao.addAllowedKeyIdForApp(packageName, keyInfo.master_key_id());
resultIntent.putExtra(OpenPgpApi.EXTRA_SIGN_KEY_ID, keyInfo.master_key_id()); resultIntent.putExtra(OpenPgpApi.EXTRA_SIGN_KEY_ID, keyInfo.master_key_id());

View file

@ -102,7 +102,7 @@ public class DebugActionsActivity extends Activity {
}); });
addButtonToLayout(context, verticalLayout, "Select Signing Key (legacy)").setOnClickListener((v) -> { addButtonToLayout(context, verticalLayout, "Select Signing Key (legacy)").setOnClickListener((v) -> {
PendingIntent pendingIntent = pendingIntentFactory.createSelectSignKeyIdLegacyPendingIntent( PendingIntent pendingIntent = pendingIntentFactory.createSelectSignKeyIdLegacyPendingIntent(
new Intent(), BuildConfig.APPLICATION_ID, "test@openkeychain.org"); new Intent(), BuildConfig.APPLICATION_ID, getPackageSig(), "test@openkeychain.org");
startPendingIntent(pendingIntent); startPendingIntent(pendingIntent);
}); });
addButtonToLayout(context, verticalLayout, "Select Signing Key").setOnClickListener((v) -> { addButtonToLayout(context, verticalLayout, "Select Signing Key").setOnClickListener((v) -> {