Refactor ProviderHelper to be non-static using a constructor based on context (first commit to get context out of pgp classes)

This commit is contained in:
Dominik Schürmann
2014-04-11 17:45:52 +02:00
parent bbd97cf800
commit 094fb698de
23 changed files with 266 additions and 228 deletions

View File

@@ -39,6 +39,7 @@ import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import com.beardedhen.androidbootstrap.BootstrapButton;
import com.devspark.appmsg.AppMsg;
@@ -159,7 +160,7 @@ public class CertifyKeyActivity extends ActionBarActivity implements
static final String USER_IDS_SELECTION = UserIds.IS_REVOKED + " = 0";
static final String[] KEYRING_PROJECTION =
new String[] {
new String[]{
KeyRings._ID,
KeyRings.MASTER_KEY_ID,
KeyRings.FINGERPRINT,
@@ -171,7 +172,7 @@ public class CertifyKeyActivity extends ActionBarActivity implements
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
switch(id) {
switch (id) {
case LOADER_ID_KEYRING: {
Uri uri = KeyRings.buildUnifiedKeyRingUri(mDataUri);
return new CursorLoader(this, uri, KEYRING_PROJECTION, null, null, null);
@@ -187,7 +188,7 @@ public class CertifyKeyActivity extends ActionBarActivity implements
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
switch(loader.getId()) {
switch (loader.getId()) {
case LOADER_ID_KEYRING:
// the first key here is our master key
if (data.moveToFirst()) {
@@ -202,7 +203,7 @@ public class CertifyKeyActivity extends ActionBarActivity implements
byte[] fingerprintBlob = data.getBlob(INDEX_FINGERPRINT);
String fingerprint = PgpKeyHelper.convertFingerprintToHex(fingerprintBlob);
((TextView) findViewById(R.id.fingerprint))
.setText(PgpKeyHelper.colorizeFingerprint(fingerprint));
.setText(PgpKeyHelper.colorizeFingerprint(fingerprint));
}
break;
case LOADER_ID_USER_IDS:
@@ -213,7 +214,7 @@ public class CertifyKeyActivity extends ActionBarActivity implements
@Override
public void onLoaderReset(Loader<Cursor> loader) {
switch(loader.getId()) {
switch (loader.getId()) {
case LOADER_ID_USER_IDS:
mUserIdsAdapter.swapCursor(null);
break;
@@ -225,7 +226,7 @@ public class CertifyKeyActivity extends ActionBarActivity implements
*/
private void initiateSigning() {
try {
PGPPublicKeyRing pubring = ProviderHelper.getPGPPublicKeyRing(this, mPubKeyId);
PGPPublicKeyRing pubring = new ProviderHelper(this).getPGPPublicKeyRing(mPubKeyId);
// if we have already signed this key, dont bother doing it again
boolean alreadySigned = false;

View File

@@ -290,7 +290,7 @@ public class EditKeyActivity extends ActionBarActivity implements EditorListener
try {
Uri secretUri = KeychainContract.KeyRingData.buildSecretKeyRingUri(mDataUri);
mKeyRing = (PGPSecretKeyRing) ProviderHelper.getPGPKeyRing(this, secretUri);
mKeyRing = (PGPSecretKeyRing) new ProviderHelper(this).getPGPKeyRing(secretUri);
PGPSecretKey masterKey = mKeyRing.getSecretKey();
mMasterCanSign = PgpKeyHelper.isCertificationKey(mKeyRing.getSecretKey());

View File

@@ -53,6 +53,8 @@ public class EncryptAsymmetricFragment extends Fragment {
public static final int RESULT_CODE_PUBLIC_KEYS = 0x00007001;
public static final int RESULT_CODE_SECRET_KEYS = 0x00007002;
ProviderHelper mProviderHelper;
OnAsymmetricKeySelection mKeySelectionListener;
// view
@@ -133,8 +135,10 @@ public class EncryptAsymmetricFragment extends Fragment {
long signatureKeyId = getArguments().getLong(ARG_SIGNATURE_KEY_ID);
long[] encryptionKeyIds = getArguments().getLongArray(ARG_ENCRYPTION_KEY_IDS);
mProviderHelper = new ProviderHelper(getActivity());
// preselect keys given by arguments (given by Intent to EncryptActivity)
preselectKeys(signatureKeyId, encryptionKeyIds);
preselectKeys(signatureKeyId, encryptionKeyIds, mProviderHelper);
}
/**
@@ -143,11 +147,12 @@ public class EncryptAsymmetricFragment extends Fragment {
* @param preselectedSignatureKeyId
* @param preselectedEncryptionKeyIds
*/
private void preselectKeys(long preselectedSignatureKeyId, long[] preselectedEncryptionKeyIds) {
private void preselectKeys(long preselectedSignatureKeyId, long[] preselectedEncryptionKeyIds,
ProviderHelper providerHelper) {
if (preselectedSignatureKeyId != 0) {
// TODO: don't use bouncy castle objects!
try {
PGPSecretKeyRing keyRing = ProviderHelper.getPGPSecretKeyRingWithKeyId(getActivity(),
PGPSecretKeyRing keyRing = providerHelper.getPGPSecretKeyRingWithKeyId(
preselectedSignatureKeyId);
PGPSecretKey masterKey = keyRing.getSecretKey();
@@ -167,7 +172,7 @@ public class EncryptAsymmetricFragment extends Fragment {
for (int i = 0; i < preselectedEncryptionKeyIds.length; ++i) {
// TODO One query per selected key?! wtf
try {
long id = ProviderHelper.getMasterKeyId(getActivity(),
long id = providerHelper.getMasterKeyId(
KeyRings.buildUnifiedKeyRingsFindBySubkeyUri(
Long.toString(preselectedEncryptionKeyIds[i]))
);
@@ -201,8 +206,8 @@ public class EncryptAsymmetricFragment extends Fragment {
mMainUserIdRest.setText("");
} else {
// See if we can get a user_id from a unified query
String userIdResult = (String) ProviderHelper.getUnifiedData(
getActivity(), mSecretKeyId, KeyRings.USER_ID, ProviderHelper.FIELD_TYPE_STRING);
String userIdResult = (String) mProviderHelper.getUnifiedData(
mSecretKeyId, KeyRings.USER_ID, ProviderHelper.FIELD_TYPE_STRING);
String[] userId = PgpKeyHelper.splitUserId(userIdResult);
if (userId[0] != null) {
mMainUserId.setText(userId[0]);

View File

@@ -145,10 +145,11 @@ public class ViewCertActivity extends ActionBarActivity
PGPSignature sig = PgpConversionHelper.BytesToPGPSignature(data.getBlob(INDEX_DATA));
try {
PGPKeyRing signeeRing = ProviderHelper.getPGPKeyRing(this,
ProviderHelper providerHelper = new ProviderHelper(this);
PGPKeyRing signeeRing = providerHelper.getPGPKeyRing(
KeychainContract.KeyRingData.buildPublicKeyRingUri(
Long.toString(data.getLong(INDEX_MASTER_KEY_ID))));
PGPKeyRing signerRing = ProviderHelper.getPGPKeyRing(this,
PGPKeyRing signerRing = providerHelper.getPGPKeyRing(
KeychainContract.KeyRingData.buildPublicKeyRingUri(
Long.toString(sig.getKeyID())));
@@ -230,7 +231,8 @@ public class ViewCertActivity extends ActionBarActivity
Intent viewIntent = new Intent(this, ViewKeyActivity.class);
try {
long signerMasterKeyId = ProviderHelper.getMasterKeyId(this,
ProviderHelper providerHelper = new ProviderHelper(this);
long signerMasterKeyId = providerHelper.getMasterKeyId(
KeyRings.buildUnifiedKeyRingsFindBySubkeyUri(Long.toString(mSignerKeyId))
);
viewIntent.setData(KeyRings.buildGenericKeyRingUri(

View File

@@ -54,12 +54,14 @@ import org.sufficientlysecure.keychain.ui.dialog.ShareQrCodeDialogFragment;
import org.sufficientlysecure.keychain.util.Log;
import java.io.IOException;
import java.security.Provider;
import java.util.ArrayList;
import java.util.HashMap;
public class ViewKeyActivity extends ActionBarActivity {
ExportHelper mExportHelper;
ProviderHelper mProviderHelper;
protected Uri mDataUri;
@@ -83,6 +85,7 @@ public class ViewKeyActivity extends ActionBarActivity {
super.onCreate(savedInstanceState);
mExportHelper = new ExportHelper(this);
mProviderHelper = new ProviderHelper(this);
// let the actionbar look like Android's contact app
ActionBar actionBar = getSupportActionBar();
@@ -134,19 +137,19 @@ public class ViewKeyActivity extends ActionBarActivity {
startActivity(homeIntent);
return true;
case R.id.menu_key_view_update:
updateFromKeyserver(mDataUri);
updateFromKeyserver(mDataUri, mProviderHelper);
return true;
case R.id.menu_key_view_export_keyserver:
uploadToKeyserver(mDataUri);
return true;
case R.id.menu_key_view_export_file:
exportToFile(mDataUri, mExportHelper);
exportToFile(mDataUri, mExportHelper, mProviderHelper);
return true;
case R.id.menu_key_view_share_default_fingerprint:
shareKey(mDataUri, true);
shareKey(mDataUri, true, mProviderHelper);
return true;
case R.id.menu_key_view_share_default:
shareKey(mDataUri, false);
shareKey(mDataUri, false, mProviderHelper);
return true;
case R.id.menu_key_view_share_qr_code_fingerprint:
shareKeyQrCode(mDataUri, true);
@@ -158,7 +161,7 @@ public class ViewKeyActivity extends ActionBarActivity {
shareNfc();
return true;
case R.id.menu_key_view_share_clipboard:
copyToClipboard(mDataUri);
copyToClipboard(mDataUri, mProviderHelper);
return true;
case R.id.menu_key_view_delete: {
deleteKey(mDataUri, mExportHelper);
@@ -168,10 +171,10 @@ public class ViewKeyActivity extends ActionBarActivity {
return super.onOptionsItemSelected(item);
}
private void exportToFile(Uri dataUri, ExportHelper exportHelper) {
private void exportToFile(Uri dataUri, ExportHelper exportHelper, ProviderHelper providerHelper) {
Uri baseUri = KeychainContract.KeyRings.buildUnifiedKeyRingUri(dataUri);
HashMap<String, Object> data = ProviderHelper.getGenericData(this,
HashMap<String, Object> data = providerHelper.getGenericData(
baseUri,
new String[]{KeychainContract.Keys.MASTER_KEY_ID, KeychainContract.KeyRings.HAS_SECRET},
new int[]{ProviderHelper.FIELD_TYPE_INTEGER, ProviderHelper.FIELD_TYPE_INTEGER});
@@ -189,9 +192,9 @@ public class ViewKeyActivity extends ActionBarActivity {
startActivityForResult(uploadIntent, Id.request.export_to_server);
}
private void updateFromKeyserver(Uri dataUri) {
byte[] blob = (byte[]) ProviderHelper.getGenericData(
this, KeychainContract.KeyRings.buildUnifiedKeyRingUri(dataUri),
private void updateFromKeyserver(Uri dataUri, ProviderHelper providerHelper) {
byte[] blob = (byte[]) providerHelper.getGenericData(
KeychainContract.KeyRings.buildUnifiedKeyRingUri(dataUri),
KeychainContract.Keys.FINGERPRINT, ProviderHelper.FIELD_TYPE_BLOB);
String fingerprint = PgpKeyHelper.convertFingerprintToHex(blob);
@@ -202,11 +205,11 @@ public class ViewKeyActivity extends ActionBarActivity {
startActivityForResult(queryIntent, RESULT_CODE_LOOKUP_KEY);
}
private void shareKey(Uri dataUri, boolean fingerprintOnly) {
private void shareKey(Uri dataUri, boolean fingerprintOnly, ProviderHelper providerHelper) {
String content = null;
if (fingerprintOnly) {
byte[] data = (byte[]) ProviderHelper.getGenericData(
this, KeychainContract.KeyRings.buildUnifiedKeyRingUri(dataUri),
byte[] data = (byte[]) providerHelper.getGenericData(
KeychainContract.KeyRings.buildUnifiedKeyRingUri(dataUri),
KeychainContract.Keys.FINGERPRINT, ProviderHelper.FIELD_TYPE_BLOB);
if (data != null) {
String fingerprint = PgpKeyHelper.convertFingerprintToHex(data);
@@ -220,7 +223,7 @@ public class ViewKeyActivity extends ActionBarActivity {
// get public keyring as ascii armored string
try {
Uri uri = KeychainContract.KeyRingData.buildPublicKeyRingUri(dataUri);
content = ProviderHelper.getKeyRingAsArmoredString(this, uri);
content = providerHelper.getKeyRingAsArmoredString(uri);
// Android will fail with android.os.TransactionTooLargeException if key is too big
// see http://www.lonestarprod.com/?p=34
@@ -256,11 +259,11 @@ public class ViewKeyActivity extends ActionBarActivity {
dialog.show(getSupportFragmentManager(), "shareQrCodeDialog");
}
private void copyToClipboard(Uri dataUri) {
private void copyToClipboard(Uri dataUri, ProviderHelper providerHelper) {
// get public keyring as ascii armored string
try {
Uri uri = KeychainContract.KeyRingData.buildPublicKeyRingUri(dataUri);
String keyringArmored = ProviderHelper.getKeyRingAsArmoredString(this, uri);
String keyringArmored = providerHelper.getKeyRingAsArmoredString(uri);
ClipboardReflection.copyToClipboard(this, keyringArmored);
AppMsg.makeText(this, R.string.key_copied_to_clipboard, AppMsg.STYLE_INFO)
@@ -359,8 +362,8 @@ public class ViewKeyActivity extends ActionBarActivity {
try {
Uri blobUri =
KeychainContract.KeyRingData.buildPublicKeyRingUri(dataUri);
mNfcKeyringBytes = ProviderHelper.getPGPKeyRing(
ViewKeyActivity.this, blobUri).getEncoded();
mNfcKeyringBytes = mProviderHelper.getPGPKeyRing(
blobUri).getEncoded();
} catch (IOException e) {
Log.e(Constants.TAG, "Error parsing keyring", e);
} catch (ProviderHelper.NotFoundException e) {

View File

@@ -332,7 +332,7 @@ public class ViewKeyMainFragment extends Fragment implements
private void encryptToContact(Uri dataUri) {
try {
long keyId = ProviderHelper.extractOrGetMasterKeyId(getActivity(), dataUri);
long keyId = new ProviderHelper(getActivity()).extractOrGetMasterKeyId(dataUri);
long[] encryptionKeyIds = new long[]{ keyId };
Intent intent = new Intent(getActivity(), EncryptActivity.class);
intent.setAction(EncryptActivity.ACTION_ENCRYPT);

View File

@@ -102,7 +102,7 @@ public class DeleteKeyDialogFragment extends DialogFragment {
long masterKeyId = masterKeyIds[0];
HashMap<String, Object> data = ProviderHelper.getUnifiedData(activity, masterKeyId, new String[]{
HashMap<String, Object> data = new ProviderHelper(activity).getUnifiedData(masterKeyId, new String[]{
KeyRings.USER_ID,
KeyRings.HAS_SECRET
}, new int[] { ProviderHelper.FIELD_TYPE_STRING, ProviderHelper.FIELD_TYPE_INTEGER });

View File

@@ -140,7 +140,7 @@ public class PassphraseDialogFragment extends DialogFragment implements OnEditor
alert.setMessage(R.string.passphrase_for_symmetric_encryption);
} else {
try {
secretKey = ProviderHelper.getPGPSecretKeyRing(activity, secretKeyId).getSecretKey();
secretKey = new ProviderHelper(activity).getPGPSecretKeyRing(secretKeyId).getSecretKey();
} catch (ProviderHelper.NotFoundException e) {
alert.setTitle(R.string.title_key_not_found);
alert.setMessage(getString(R.string.key_not_found, secretKeyId));
@@ -196,8 +196,8 @@ public class PassphraseDialogFragment extends DialogFragment implements OnEditor
return;
} else {
try {
clickSecretKey = PgpKeyHelper.getKeyNum(ProviderHelper
.getPGPSecretKeyRingWithKeyId(activity, secretKeyId),
clickSecretKey = PgpKeyHelper.getKeyNum(new ProviderHelper(activity)
.getPGPSecretKeyRingWithKeyId(secretKeyId),
curKeyIndex);
} catch (ProviderHelper.NotFoundException e) {
Log.e(Constants.TAG, "key not found!", e);

View File

@@ -41,6 +41,7 @@ import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.QrCodeUtils;
import java.io.IOException;
import java.security.Provider;
import java.util.ArrayList;
public class ShareQrCodeDialogFragment extends DialogFragment {
@@ -91,14 +92,15 @@ public class ShareQrCodeDialogFragment extends DialogFragment {
mImage = (ImageView) view.findViewById(R.id.share_qr_code_dialog_image);
mText = (TextView) view.findViewById(R.id.share_qr_code_dialog_text);
ProviderHelper providerHelper = new ProviderHelper(getActivity());
String content = null;
if (mFingerprintOnly) {
alert.setPositiveButton(R.string.btn_okay, null);
byte[] blob = (byte[]) ProviderHelper.getGenericData(
getActivity(), KeyRings.buildUnifiedKeyRingUri(dataUri),
byte[] blob = (byte[]) providerHelper.getGenericData(
KeyRings.buildUnifiedKeyRingUri(dataUri),
KeyRings.FINGERPRINT, ProviderHelper.FIELD_TYPE_BLOB);
if(blob == null) {
if (blob == null) {
Log.e(Constants.TAG, "key not found!");
AppMsg.makeText(getActivity(), R.string.error_key_not_found, AppMsg.STYLE_ALERT).show();
return null;
@@ -113,7 +115,7 @@ public class ShareQrCodeDialogFragment extends DialogFragment {
try {
Uri uri = KeychainContract.KeyRingData.buildPublicKeyRingUri(dataUri);
content = ProviderHelper.getKeyRingAsArmoredString(getActivity(), uri);
content = providerHelper.getKeyRingAsArmoredString(uri);
} catch (IOException e) {
Log.e(Constants.TAG, "error processing key!", e);
AppMsg.makeText(getActivity(), R.string.error_invalid_data, AppMsg.STYLE_ALERT).show();