mirror of
https://github.com/moparisthebest/open-keychain
synced 2024-11-23 17:22:16 -05:00
more work on streamlining uris, and stripping ProviderHelper
This commit is contained in:
parent
428e94bb57
commit
dedcfd8a72
@ -256,6 +256,9 @@ public class KeychainProvider extends ContentProvider {
|
||||
+ Tables.USER_IDS + "." + UserIdsColumns.USER_ID + " ASC";
|
||||
}
|
||||
|
||||
// uri to watch is all /key_rings/
|
||||
uri = KeyRings.CONTENT_URI;
|
||||
|
||||
break;
|
||||
}
|
||||
/*case SECRET_KEY_RING_BY_EMAILS:
|
||||
@ -503,6 +506,7 @@ public class KeychainProvider extends ContentProvider {
|
||||
}
|
||||
// corresponding keys and userIds are deleted by ON DELETE CASCADE
|
||||
count = db.delete(Tables.KEY_RINGS_PUBLIC, selection, selectionArgs);
|
||||
uri = KeyRings.buildGenericKeyRingUri(uri.getPathSegments().get(1));
|
||||
break;
|
||||
}
|
||||
case KEY_RING_SECRET: {
|
||||
@ -512,6 +516,7 @@ public class KeychainProvider extends ContentProvider {
|
||||
selection += " AND (" + additionalSelection + ")";
|
||||
}
|
||||
count = db.delete(Tables.KEY_RINGS_SECRET, selection, selectionArgs);
|
||||
uri = KeyRings.buildGenericKeyRingUri(uri.getPathSegments().get(1));
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -23,7 +23,10 @@ import android.content.ContentValues;
|
||||
import android.content.Context;
|
||||
import android.content.OperationApplicationException;
|
||||
import android.database.Cursor;
|
||||
import android.database.CursorWindow;
|
||||
import android.database.CursorWrapper;
|
||||
import android.database.DatabaseUtils;
|
||||
import android.database.sqlite.SQLiteCursor;
|
||||
import android.net.Uri;
|
||||
import android.os.RemoteException;
|
||||
|
||||
@ -42,7 +45,6 @@ import org.sufficientlysecure.keychain.provider.KeychainContract.ApiApps;
|
||||
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
|
||||
import org.sufficientlysecure.keychain.provider.KeychainContract.Keys;
|
||||
import org.sufficientlysecure.keychain.provider.KeychainContract.UserIds;
|
||||
import org.sufficientlysecure.keychain.provider.KeychainDatabase.Tables;
|
||||
import org.sufficientlysecure.keychain.remote.AccountSettings;
|
||||
import org.sufficientlysecure.keychain.remote.AppSettings;
|
||||
import org.sufficientlysecure.keychain.util.IterableIterator;
|
||||
@ -52,6 +54,7 @@ import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
@ -81,6 +84,57 @@ public class ProviderHelper {
|
||||
return keyRing;
|
||||
}
|
||||
|
||||
public static Object getUnifiedData(Context context, long masterKeyId, String column) {
|
||||
return getUnifiedData(context, masterKeyId, new String[] { column }).get(column);
|
||||
}
|
||||
public static Object getUnifiedData(Context context, Uri uri, String column) {
|
||||
return getUnifiedData(context, uri, new String[] { column }).get(column);
|
||||
}
|
||||
|
||||
public static HashMap<String,Object> getUnifiedData(Context context, long masterKeyId, String[] proj) {
|
||||
return getUnifiedData(context, KeyRings.buildGenericKeyRingUri(Long.toString(masterKeyId)), proj);
|
||||
}
|
||||
|
||||
public static HashMap<String,Object> getUnifiedData(Context context, Uri uri, String[] proj) {
|
||||
uri = KeyRings.buildUnifiedKeyRingUri(uri);
|
||||
|
||||
Cursor cursor = context.getContentResolver().query(uri, proj, null, null, null);
|
||||
|
||||
HashMap<String, Object> result = new HashMap<String, Object>(proj.length);
|
||||
if (cursor != null && cursor.moveToFirst()) {
|
||||
// this is a HACK because we don't have Cursor.getType (which is api level 11)
|
||||
CursorWindow cursorWindow;
|
||||
if(cursor instanceof CursorWrapper) {
|
||||
cursorWindow = ((SQLiteCursor) ((CursorWrapper) cursor).getWrappedCursor()).getWindow();
|
||||
} else {
|
||||
cursorWindow = ((SQLiteCursor) cursor).getWindow();
|
||||
}
|
||||
|
||||
int pos = 0;
|
||||
for(String p : proj) {
|
||||
if (cursorWindow.isNull(0, pos)) {
|
||||
result.put(p, cursor.isNull(pos));
|
||||
} else if (cursorWindow.isLong(0, pos)) {
|
||||
result.put(p, cursor.getLong(pos));
|
||||
} else if (cursorWindow.isFloat(0, pos)) {
|
||||
result.put(p, cursor.getFloat(pos));
|
||||
} else if (cursorWindow.isString(0, pos)) {
|
||||
result.put(p, cursor.getString(pos));
|
||||
} else if (cursorWindow.isBlob(0, pos)) {
|
||||
result.put(p, cursor.getBlob(pos));
|
||||
}
|
||||
pos += 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (cursor != null) {
|
||||
cursor.close();
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
public static PGPPublicKey getPGPPublicKeyByKeyId(Context context, long keyId) {
|
||||
return getPGPPublicKeyRingWithKeyId(context, keyId).getPublicKey(keyId);
|
||||
}
|
||||
@ -307,84 +361,6 @@ public class ProviderHelper {
|
||||
return masterKeyId;
|
||||
}
|
||||
|
||||
public static long getRowId(Context context, Uri queryUri) {
|
||||
String[] projection = new String[]{KeyRings._ID};
|
||||
Cursor cursor = context.getContentResolver().query(queryUri, projection, null, null, null);
|
||||
|
||||
long rowId = 0;
|
||||
try {
|
||||
if (cursor != null && cursor.moveToFirst()) {
|
||||
int idCol = cursor.getColumnIndexOrThrow(KeyRings._ID);
|
||||
|
||||
rowId = cursor.getLong(idCol);
|
||||
}
|
||||
} finally {
|
||||
if (cursor != null) {
|
||||
cursor.close();
|
||||
}
|
||||
}
|
||||
|
||||
return rowId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get fingerprint of key
|
||||
*/
|
||||
public static byte[] getFingerprint(Context context, Uri queryUri) {
|
||||
String[] projection = new String[]{Keys.FINGERPRINT};
|
||||
Cursor cursor = context.getContentResolver().query(queryUri, projection, null, null, null);
|
||||
|
||||
byte[] fingerprint = null;
|
||||
try {
|
||||
if (cursor != null && cursor.moveToFirst()) {
|
||||
int col = cursor.getColumnIndexOrThrow(Keys.FINGERPRINT);
|
||||
|
||||
fingerprint = cursor.getBlob(col);
|
||||
}
|
||||
} finally {
|
||||
if (cursor != null) {
|
||||
cursor.close();
|
||||
}
|
||||
}
|
||||
|
||||
// FALLBACK: If fingerprint is not in database, get it from key blob!
|
||||
// this could happen if the key was saved by a previous version of Keychain!
|
||||
if (fingerprint == null) {
|
||||
Log.d(Constants.TAG, "FALLBACK: fingerprint is not in database, get it from key blob!");
|
||||
|
||||
// get master key id
|
||||
projection = new String[]{KeyRings.MASTER_KEY_ID};
|
||||
cursor = context.getContentResolver().query(queryUri, projection, null, null, null);
|
||||
long masterKeyId = 0;
|
||||
try {
|
||||
if (cursor != null && cursor.moveToFirst()) {
|
||||
int col = cursor.getColumnIndexOrThrow(KeyRings.MASTER_KEY_ID);
|
||||
|
||||
masterKeyId = cursor.getLong(col);
|
||||
}
|
||||
} finally {
|
||||
if (cursor != null) {
|
||||
cursor.close();
|
||||
}
|
||||
}
|
||||
|
||||
PGPPublicKey key = ProviderHelper.getPGPPublicKeyRing(context, masterKeyId).getPublicKey();
|
||||
// if it is no public key get it from your own keys...
|
||||
if (key == null) {
|
||||
PGPSecretKey secretKey = ProviderHelper.getPGPSecretKeyRing(context, masterKeyId).getSecretKey();
|
||||
if (secretKey == null) {
|
||||
Log.e(Constants.TAG, "Key could not be found!");
|
||||
return null;
|
||||
}
|
||||
key = secretKey.getPublicKey();
|
||||
}
|
||||
|
||||
fingerprint = key.getFingerprint();
|
||||
}
|
||||
|
||||
return fingerprint;
|
||||
}
|
||||
|
||||
public static ArrayList<String> getKeyRingsAsArmoredString(Context context, Uri uri,
|
||||
long[] masterKeyIds) {
|
||||
ArrayList<String> output = new ArrayList<String>();
|
||||
|
@ -34,6 +34,7 @@ import com.beardedhen.androidbootstrap.BootstrapButton;
|
||||
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.provider.KeychainContract;
|
||||
import org.sufficientlysecure.keychain.provider.ProviderHelper;
|
||||
import org.sufficientlysecure.keychain.remote.AccountSettings;
|
||||
import org.sufficientlysecure.keychain.ui.EditKeyActivity;
|
||||
import org.sufficientlysecure.keychain.ui.SelectSecretKeyLayoutFragment;
|
||||
@ -176,9 +177,8 @@ public class AccountSettingsFragment extends Fragment implements
|
||||
case REQUEST_CODE_CREATE_KEY: {
|
||||
if (resultCode == Activity.RESULT_OK) {
|
||||
// select newly created key
|
||||
Uri newKeyUri = data.getData();
|
||||
// TODO helper method for this?
|
||||
mSelectKeyFragment.selectKey(Long.parseLong(newKeyUri.getPathSegments().get(1)));
|
||||
long masterKeyId = ProviderHelper.getMasterKeyId(getActivity(), data.getData());
|
||||
mSelectKeyFragment.selectKey(masterKeyId);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -37,8 +37,10 @@ import org.spongycastle.openpgp.PGPSecretKeyRing;
|
||||
import org.sufficientlysecure.keychain.Id;
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
|
||||
import org.sufficientlysecure.keychain.provider.KeychainContract;
|
||||
import org.sufficientlysecure.keychain.provider.ProviderHelper;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Vector;
|
||||
|
||||
public class EncryptAsymmetricFragment extends Fragment {
|
||||
@ -202,20 +204,17 @@ public class EncryptAsymmetricFragment extends Fragment {
|
||||
} else {
|
||||
String uid = getResources().getString(R.string.user_id_no_name);
|
||||
String uidExtra = "";
|
||||
// TODO: don't use bouncy castle objects!
|
||||
PGPSecretKeyRing keyRing = ProviderHelper.getPGPSecretKeyRingWithKeyId(getActivity(),
|
||||
mSecretKeyId);
|
||||
if (keyRing != null) {
|
||||
PGPSecretKey key = PgpKeyHelper.getMasterKey(keyRing);
|
||||
if (key != null) {
|
||||
String userId = PgpKeyHelper.getMainUserIdSafe(getActivity(), key);
|
||||
String chunks[] = userId.split(" <", 2);
|
||||
uid = chunks[0];
|
||||
if (chunks.length > 1) {
|
||||
uidExtra = "<" + chunks[1];
|
||||
}
|
||||
// See if we can get a user_id from a unified query
|
||||
Object data = ProviderHelper.getUnifiedData(
|
||||
getActivity(), mSecretKeyId, KeychainContract.UserIds.USER_ID);
|
||||
if(data instanceof String) {
|
||||
String chunks[] = ((String) data).split(" <", 2);
|
||||
uid = chunks[0];
|
||||
if (chunks.length > 1) {
|
||||
uidExtra = "<" + chunks[1];
|
||||
}
|
||||
}
|
||||
|
||||
mMainUserId.setText(uid);
|
||||
mMainUserIdRest.setText(uidExtra);
|
||||
mSign.setChecked(true);
|
||||
|
@ -193,28 +193,15 @@ public class KeyListFragment extends Fragment
|
||||
break;
|
||||
}
|
||||
case R.id.menu_key_list_multi_delete: {
|
||||
ids = mStickyList.getWrappedList().getCheckedItemIds();
|
||||
ids = mAdapter.getCurrentSelectedMasterKeyIds();
|
||||
showDeleteKeyDialog(mode, ids);
|
||||
break;
|
||||
}
|
||||
case R.id.menu_key_list_multi_export: {
|
||||
ids = mStickyList.getWrappedList().getCheckedItemIds();
|
||||
long[] masterKeyIds = new long[2*ids.length];
|
||||
/* TODO! redo
|
||||
ArrayList<Long> allPubRowIds =
|
||||
ProviderHelper.getPublicKeyRingsRowIds(getActivity());
|
||||
for (int i = 0; i < ids.length; i++) {
|
||||
if (allPubRowIds.contains(ids[i])) {
|
||||
masterKeyIds[i] =
|
||||
ProviderHelper.getPublicMasterKeyId(getActivity(), ids[i]);
|
||||
} else {
|
||||
masterKeyIds[i] =
|
||||
ProviderHelper.getSecretMasterKeyId(getActivity(), ids[i]);
|
||||
}
|
||||
}*/
|
||||
ids = mAdapter.getCurrentSelectedMasterKeyIds();
|
||||
ExportHelper mExportHelper = new ExportHelper((ActionBarActivity) getActivity());
|
||||
mExportHelper
|
||||
.showExportKeysDialog(masterKeyIds, Id.type.public_key,
|
||||
.showExportKeysDialog(ids, Id.type.public_key,
|
||||
Constants.Path.APP_DIR_FILE_PUB,
|
||||
getString(R.string.also_export_secret_keys));
|
||||
break;
|
||||
@ -343,7 +330,7 @@ public class KeyListFragment extends Fragment
|
||||
}
|
||||
viewIntent.setData(
|
||||
KeychainContract
|
||||
.KeyRings.buildPublicKeyRingUri(
|
||||
.KeyRings.buildGenericKeyRingUri(
|
||||
Long.toString(mAdapter.getMasterKeyId(position))));
|
||||
startActivity(viewIntent);
|
||||
}
|
||||
@ -362,11 +349,11 @@ public class KeyListFragment extends Fragment
|
||||
/**
|
||||
* Show dialog to delete key
|
||||
*
|
||||
* @param keyRingRowIds
|
||||
* @param masterKeyIds
|
||||
*/
|
||||
@TargetApi(11)
|
||||
// TODO: this method needs an overhaul to handle both public and secret keys gracefully!
|
||||
public void showDeleteKeyDialog(final ActionMode mode, long[] keyRingRowIds) {
|
||||
public void showDeleteKeyDialog(final ActionMode mode, long[] masterKeyIds) {
|
||||
// Message is received after key is deleted
|
||||
Handler returnHandler = new Handler() {
|
||||
@Override
|
||||
@ -381,7 +368,7 @@ public class KeyListFragment extends Fragment
|
||||
Messenger messenger = new Messenger(returnHandler);
|
||||
|
||||
DeleteKeyDialogFragment deleteKeyDialog = DeleteKeyDialogFragment.newInstance(messenger,
|
||||
keyRingRowIds);
|
||||
masterKeyIds);
|
||||
|
||||
deleteKeyDialog.show(getActivity().getSupportFragmentManager(), "deleteKeyDialog");
|
||||
}
|
||||
|
@ -173,10 +173,15 @@ public class ViewKeyActivity extends ActionBarActivity {
|
||||
private void shareKey(Uri dataUri, boolean fingerprintOnly) {
|
||||
String content;
|
||||
if (fingerprintOnly) {
|
||||
byte[] fingerprintBlob = ProviderHelper.getFingerprint(this, dataUri);
|
||||
String fingerprint = PgpKeyHelper.convertFingerprintToHex(fingerprintBlob);
|
||||
|
||||
content = Constants.FINGERPRINT_SCHEME + ":" + fingerprint;
|
||||
Object blob = ProviderHelper.getUnifiedData(this, dataUri, KeychainContract.Keys.FINGERPRINT);
|
||||
if(blob instanceof byte[]) {
|
||||
String fingerprint = PgpKeyHelper.convertFingerprintToHex((byte[]) blob);
|
||||
content = Constants.FINGERPRINT_SCHEME + ":" + fingerprint;
|
||||
} else {
|
||||
Toast.makeText(getApplicationContext(), "Bad key selected!",
|
||||
Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
// get public keyring as ascii armored string
|
||||
long masterKeyId = ProviderHelper.getMasterKeyId(this, dataUri);
|
||||
|
@ -34,6 +34,9 @@ import android.widget.Toast;
|
||||
import org.sufficientlysecure.keychain.Constants;
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.provider.ProviderHelper;
|
||||
import org.sufficientlysecure.keychain.util.Log;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
|
||||
public class ViewKeyActivityJB extends ViewKeyActivity implements CreateNdefMessageCallback,
|
||||
@ -64,13 +67,17 @@ public class ViewKeyActivityJB extends ViewKeyActivity implements CreateNdefMess
|
||||
|
||||
// get public keyring as byte array
|
||||
long masterKeyId = ProviderHelper.getMasterKeyId(this, dataUri);
|
||||
mSharedKeyringBytes = ProviderHelper.getKeyRingsAsByteArray(this, dataUri,
|
||||
new long[]{masterKeyId});
|
||||
try {
|
||||
mSharedKeyringBytes = ProviderHelper.getPGPPublicKeyRing(this, masterKeyId).getEncoded();
|
||||
|
||||
// Register callback to set NDEF message
|
||||
mNfcAdapter.setNdefPushMessageCallback(this, this);
|
||||
// Register callback to listen for message-sent success
|
||||
mNfcAdapter.setOnNdefPushCompleteCallback(this, this);
|
||||
// Register callback to set NDEF message
|
||||
mNfcAdapter.setNdefPushMessageCallback(this, this);
|
||||
// Register callback to listen for message-sent success
|
||||
mNfcAdapter.setOnNdefPushCompleteCallback(this, this);
|
||||
} catch(IOException e) {
|
||||
// not much trouble, but leave a note
|
||||
Log.e(Constants.TAG, "Error parsing keyring: ", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -298,10 +298,6 @@ public class ViewKeyMainFragment extends Fragment implements
|
||||
mAlgorithm.setText(algorithmStr);
|
||||
|
||||
byte[] fingerprintBlob = data.getBlob(KEYS_INDEX_FINGERPRINT);
|
||||
if (fingerprintBlob == null) {
|
||||
// FALLBACK for old database entries
|
||||
fingerprintBlob = ProviderHelper.getFingerprint(getActivity(), mDataUri);
|
||||
}
|
||||
String fingerprint = PgpKeyHelper.convertFingerprintToHex(fingerprintBlob);
|
||||
|
||||
mFingerprint.setText(PgpKeyHelper.colorizeFingerprint(fingerprint));
|
||||
|
@ -43,10 +43,11 @@ import org.sufficientlysecure.keychain.provider.ProviderHelper;
|
||||
import org.sufficientlysecure.keychain.util.Log;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
|
||||
public class DeleteKeyDialogFragment extends DialogFragment {
|
||||
private static final String ARG_MESSENGER = "messenger";
|
||||
private static final String ARG_DELETE_KEY_RING_ROW_IDS = "delete_key_ring_row_ids";
|
||||
private static final String ARG_DELETE_MASTER_KEY_IDS = "delete_master_key_ids";
|
||||
|
||||
public static final int MESSAGE_OKAY = 1;
|
||||
public static final int MESSAGE_ERROR = 0;
|
||||
@ -63,13 +64,13 @@ public class DeleteKeyDialogFragment extends DialogFragment {
|
||||
/**
|
||||
* Creates new instance of this delete file dialog fragment
|
||||
*/
|
||||
public static DeleteKeyDialogFragment newInstance(Messenger messenger, long[] keyRingRowIds
|
||||
) {
|
||||
public static DeleteKeyDialogFragment newInstance(Messenger messenger,
|
||||
long[] masterKeyIds) {
|
||||
DeleteKeyDialogFragment frag = new DeleteKeyDialogFragment();
|
||||
Bundle args = new Bundle();
|
||||
|
||||
args.putParcelable(ARG_MESSENGER, messenger);
|
||||
args.putLongArray(ARG_DELETE_KEY_RING_ROW_IDS, keyRingRowIds);
|
||||
args.putLongArray(ARG_DELETE_MASTER_KEY_IDS, masterKeyIds);
|
||||
//We don't need the key type
|
||||
|
||||
frag.setArguments(args);
|
||||
@ -84,7 +85,7 @@ public class DeleteKeyDialogFragment extends DialogFragment {
|
||||
final FragmentActivity activity = getActivity();
|
||||
mMessenger = getArguments().getParcelable(ARG_MESSENGER);
|
||||
|
||||
final long[] keyRingRowIds = getArguments().getLongArray(ARG_DELETE_KEY_RING_ROW_IDS);
|
||||
final long[] masterKeyIds = getArguments().getLongArray(ARG_DELETE_MASTER_KEY_IDS);
|
||||
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
|
||||
|
||||
@ -98,35 +99,29 @@ public class DeleteKeyDialogFragment extends DialogFragment {
|
||||
mCheckDeleteSecret = (CheckBox) mInflateView.findViewById(R.id.checkDeleteSecret);
|
||||
|
||||
builder.setTitle(R.string.warning);
|
||||
/* TODO! redo
|
||||
|
||||
//If only a single key has been selected
|
||||
if (keyRingRowIds.length == 1) {
|
||||
Uri dataUri;
|
||||
ArrayList<Long> publicKeyRings; //Any one will do
|
||||
// If only a single key has been selected
|
||||
if (masterKeyIds.length == 1) {
|
||||
mIsSingleSelection = true;
|
||||
|
||||
long selectedRow = keyRingRowIds[0];
|
||||
long keyType;
|
||||
publicKeyRings = ProviderHelper.getPublicKeyRingsRowIds(activity);
|
||||
long masterKeyId = masterKeyIds[0];
|
||||
|
||||
if (publicKeyRings.contains(selectedRow)) {
|
||||
//TODO Should be a better method to do this other than getting all the KeyRings
|
||||
dataUri = KeychainContract.KeyRings.buildPublicKeyRingsUri(String.valueOf(selectedRow));
|
||||
keyType = Id.type.public_key;
|
||||
} else {
|
||||
dataUri = KeychainContract.KeyRings.buildSecretKeyRingsUri(String.valueOf(selectedRow));
|
||||
keyType = Id.type.secret_key;
|
||||
}
|
||||
HashMap<String, Object> data = ProviderHelper.getUnifiedData(activity, masterKeyId, new String[]{
|
||||
KeychainContract.UserIds.USER_ID,
|
||||
KeychainDatabase.Tables.KEY_RINGS_SECRET + "." + KeychainContract.KeyRings.MASTER_KEY_ID
|
||||
});
|
||||
String userId = (String) data.get(KeychainContract.UserIds.USER_ID);
|
||||
boolean hasSecret = data.get(
|
||||
KeychainDatabase.Tables.KEY_RINGS_SECRET + "." + KeychainContract.KeyRings.MASTER_KEY_ID
|
||||
) instanceof Long;
|
||||
|
||||
String userId = ProviderHelper.getUserId(activity, dataUri);
|
||||
// Hide the Checkbox and TextView since this is a single selection,
|
||||
// user will be notified thru message
|
||||
// Hide the Checkbox and TextView since this is a single selection,user will be notified through message
|
||||
mDeleteSecretKeyView.setVisibility(View.GONE);
|
||||
// Set message depending on which key it is.
|
||||
mMainMessage.setText(getString(keyType == Id.type.secret_key ?
|
||||
R.string.secret_key_deletion_confirmation :
|
||||
R.string.public_key_deletetion_confirmation, userId));
|
||||
mMainMessage.setText(getString(
|
||||
hasSecret ? R.string.secret_key_deletion_confirmation
|
||||
: R.string.public_key_deletetion_confirmation,
|
||||
userId));
|
||||
} else {
|
||||
mDeleteSecretKeyView.setVisibility(View.VISIBLE);
|
||||
mMainMessage.setText(R.string.key_deletion_confirmation_multi);
|
||||
@ -137,75 +132,27 @@ public class DeleteKeyDialogFragment extends DialogFragment {
|
||||
builder.setPositiveButton(R.string.btn_delete, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
Uri queryUri = KeychainContract.KeyRings.buildUnifiedKeyRingsUri();
|
||||
String[] projection = new String[]{
|
||||
KeychainContract.KeyRings.MASTER_KEY_ID, // 0
|
||||
KeychainContract.KeyRings.TYPE// 1
|
||||
};
|
||||
|
||||
// make selection with all entries where _ID is one of the given row ids
|
||||
String selection = KeychainDatabase.Tables.KEY_RINGS + "." +
|
||||
KeychainContract.KeyRings._ID + " IN(";
|
||||
String selectionIDs = "";
|
||||
for (int i = 0; i < keyRingRowIds.length; i++) {
|
||||
selectionIDs += "'" + String.valueOf(keyRingRowIds[i]) + "'";
|
||||
if (i + 1 < keyRingRowIds.length) {
|
||||
selectionIDs += ",";
|
||||
}
|
||||
}
|
||||
selection += selectionIDs + ")";
|
||||
|
||||
Cursor cursor = activity.getContentResolver().query(queryUri, projection,
|
||||
selection, null, null);
|
||||
|
||||
|
||||
long masterKeyId;
|
||||
long keyType;
|
||||
boolean isSuccessfullyDeleted;
|
||||
try {
|
||||
isSuccessfullyDeleted = false;
|
||||
while (cursor != null && cursor.moveToNext()) {
|
||||
masterKeyId = cursor.getLong(0);
|
||||
keyType = cursor.getLong(1);
|
||||
|
||||
Log.d(Constants.TAG, "masterKeyId: " + masterKeyId +
|
||||
", keyType:" +
|
||||
(keyType == KeychainContract.KeyTypes.PUBLIC ?
|
||||
"Public" : "Private"));
|
||||
|
||||
if (keyType == KeychainContract.KeyTypes.SECRET) {
|
||||
if (mCheckDeleteSecret.isChecked() || mIsSingleSelection) {
|
||||
ProviderHelper.deleteUnifiedKeyRing(activity,
|
||||
String.valueOf(masterKeyId), true);
|
||||
}
|
||||
} else {
|
||||
ProviderHelper.deleteUnifiedKeyRing(activity,
|
||||
String.valueOf(masterKeyId), false);
|
||||
}
|
||||
}
|
||||
|
||||
//Check if the selected rows have actually been deleted
|
||||
cursor = activity.getContentResolver().query(
|
||||
queryUri, projection, selection, null, null);
|
||||
if (cursor == null || cursor.getCount() == 0 ||
|
||||
!mCheckDeleteSecret.isChecked()) {
|
||||
isSuccessfullyDeleted = true;
|
||||
}
|
||||
} finally {
|
||||
if (cursor != null) {
|
||||
cursor.close();
|
||||
}
|
||||
boolean success = false;
|
||||
for(long masterKeyId : masterKeyIds) {
|
||||
int count = activity.getContentResolver().delete(
|
||||
KeychainContract.KeyRings.buildPublicKeyRingUri(Long.toString(masterKeyId)), null, null
|
||||
);
|
||||
if(count > 0)
|
||||
success = true;
|
||||
}
|
||||
|
||||
dismiss();
|
||||
|
||||
if (isSuccessfullyDeleted) {
|
||||
if (success) {
|
||||
sendMessageToHandler(MESSAGE_OKAY, null);
|
||||
} else {
|
||||
sendMessageToHandler(MESSAGE_ERROR, null);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
);
|
||||
builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
|
||||
|
||||
@Override
|
||||
@ -213,7 +160,7 @@ public class DeleteKeyDialogFragment extends DialogFragment {
|
||||
dismiss();
|
||||
}
|
||||
});
|
||||
*/
|
||||
|
||||
return builder.create();
|
||||
}
|
||||
|
||||
|
@ -31,6 +31,7 @@ import android.widget.TextView;
|
||||
import org.sufficientlysecure.keychain.Constants;
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
|
||||
import org.sufficientlysecure.keychain.provider.KeychainContract;
|
||||
import org.sufficientlysecure.keychain.provider.ProviderHelper;
|
||||
import org.sufficientlysecure.keychain.util.QrCodeUtils;
|
||||
|
||||
@ -89,22 +90,24 @@ public class ShareQrCodeDialogFragment extends DialogFragment {
|
||||
if (mFingerprintOnly) {
|
||||
alert.setPositiveButton(R.string.btn_okay, null);
|
||||
|
||||
byte[] fingerprintBlob = ProviderHelper.getFingerprint(getActivity(), dataUri);
|
||||
String fingerprint = PgpKeyHelper.convertFingerprintToHex(fingerprintBlob);
|
||||
Object blob = ProviderHelper.getUnifiedData(getActivity(), dataUri, KeychainContract.Keys.FINGERPRINT);
|
||||
if(!(blob instanceof byte[])) {
|
||||
// TODO error handling?!
|
||||
return null;
|
||||
}
|
||||
|
||||
String fingerprint = PgpKeyHelper.convertFingerprintToHex((byte[]) blob);
|
||||
mText.setText(getString(R.string.share_qr_code_dialog_fingerprint_text) + " " + fingerprint);
|
||||
|
||||
content = Constants.FINGERPRINT_SCHEME + ":" + fingerprint;
|
||||
setQrCode(content);
|
||||
} else {
|
||||
mText.setText(R.string.share_qr_code_dialog_start);
|
||||
|
||||
// TODO
|
||||
// TODO works, but
|
||||
long masterKeyId = ProviderHelper.getMasterKeyId(getActivity(), dataUri);
|
||||
|
||||
// get public keyring as ascii armored string
|
||||
ArrayList<String> keyringArmored = ProviderHelper.getKeyRingsAsArmoredString(
|
||||
getActivity(), dataUri, new long[]{masterKeyId});
|
||||
getActivity(), dataUri, new long[] { masterKeyId });
|
||||
|
||||
// TODO: binary?
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user