diff options
author | Vincent Breitmoser <valodim@mugenguild.com> | 2014-04-05 19:30:52 +0200 |
---|---|---|
committer | Vincent Breitmoser <valodim@mugenguild.com> | 2014-04-05 19:30:52 +0200 |
commit | aa6f5118f5b88ed40e1318b59d47465bae6067df (patch) | |
tree | c00db3802cd6258073b16d197b1bd2e8d2d7e975 /OpenPGP-Keychain-API | |
parent | 5e4239a7b98a050b4312eee075f2fdac7f2b8af2 (diff) | |
parent | db25433890cfc5bbf0200eb488076df23cb44866 (diff) | |
download | open-keychain-aa6f5118f5b88ed40e1318b59d47465bae6067df.tar.gz open-keychain-aa6f5118f5b88ed40e1318b59d47465bae6067df.tar.bz2 open-keychain-aa6f5118f5b88ed40e1318b59d47465bae6067df.zip |
Merge remote-tracking branch 'origin/master' into certs
A lot of things are completely broken, but it compiles and doesn't crash
right away. Good enough for me.
Conflicts:
OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainContract.java
OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java
OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java
OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java
OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java
OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java
OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ViewKeyUserIdsAdapter.java
OpenPGP-Keychain/src/main/res/layout/view_key_certs_fragment.xml
Diffstat (limited to 'OpenPGP-Keychain-API')
7 files changed, 144 insertions, 24 deletions
diff --git a/OpenPGP-Keychain-API/example-app/src/main/AndroidManifest.xml b/OpenPGP-Keychain-API/example-app/src/main/AndroidManifest.xml index 74bc88708..d62c26495 100644 --- a/OpenPGP-Keychain-API/example-app/src/main/AndroidManifest.xml +++ b/OpenPGP-Keychain-API/example-app/src/main/AndroidManifest.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.sufficientlysecure.keychain.demo" - android:versionCode="3" - android:versionName="2"> + android:versionCode="4" + android:versionName="3"> <uses-sdk android:minSdkVersion="9" diff --git a/OpenPGP-Keychain-API/example-app/src/main/java/org/sufficientlysecure/keychain/demo/OpenPgpProviderActivity.java b/OpenPGP-Keychain-API/example-app/src/main/java/org/sufficientlysecure/keychain/demo/OpenPgpProviderActivity.java index a660b1c9a..345d63eef 100644 --- a/OpenPGP-Keychain-API/example-app/src/main/java/org/sufficientlysecure/keychain/demo/OpenPgpProviderActivity.java +++ b/OpenPGP-Keychain-API/example-app/src/main/java/org/sufficientlysecure/keychain/demo/OpenPgpProviderActivity.java @@ -48,6 +48,7 @@ public class OpenPgpProviderActivity extends Activity { private Button mEncrypt; private Button mSignAndEncrypt; private Button mDecryptAndVerify; + private EditText mAccount; private OpenPgpServiceConnection mServiceConnection; @@ -57,8 +58,8 @@ public class OpenPgpProviderActivity extends Activity { public static final int REQUEST_CODE_DECRYPT_AND_VERIFY = 9913; @Override - public void onCreate(Bundle icicle) { - super.onCreate(icicle); + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); setContentView(R.layout.openpgp_provider); mMessage = (EditText) findViewById(R.id.crypto_provider_demo_message); @@ -68,6 +69,7 @@ public class OpenPgpProviderActivity extends Activity { mEncrypt = (Button) findViewById(R.id.crypto_provider_demo_encrypt); mSignAndEncrypt = (Button) findViewById(R.id.crypto_provider_demo_sign_and_encrypt); mDecryptAndVerify = (Button) findViewById(R.id.crypto_provider_demo_decrypt_and_verify); + mAccount = (EditText) findViewById(R.id.crypto_provider_demo_account); mSign.setOnClickListener(new View.OnClickListener() { @Override @@ -142,7 +144,7 @@ public class OpenPgpProviderActivity extends Activity { private InputStream getInputstream(boolean ciphertext) { InputStream is = null; try { - String inputStr = null; + String inputStr; if (ciphertext) { inputStr = mCiphertext.getText().toString(); } else { @@ -169,7 +171,7 @@ public class OpenPgpProviderActivity extends Activity { @Override public void onReturn(Intent result) { - switch (result.getIntExtra(OpenPgpApi.RESULT_CODE, 0)) { + switch (result.getIntExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_ERROR)) { case OpenPgpApi.RESULT_CODE_SUCCESS: { try { Log.d(OpenPgpApi.TAG, "result: " + os.toByteArray().length @@ -213,9 +215,10 @@ public class OpenPgpProviderActivity extends Activity { public void sign(Intent data) { data.setAction(OpenPgpApi.ACTION_SIGN); data.putExtra(OpenPgpApi.EXTRA_REQUEST_ASCII_ARMOR, true); + data.putExtra(OpenPgpApi.EXTRA_ACCOUNT_NAME, mAccount.getText().toString()); InputStream is = getInputstream(false); - final ByteArrayOutputStream os = new ByteArrayOutputStream(); + ByteArrayOutputStream os = new ByteArrayOutputStream(); OpenPgpApi api = new OpenPgpApi(this, mServiceConnection.getService()); api.executeApiAsync(data, is, os, new MyCallback(true, os, REQUEST_CODE_SIGN)); @@ -225,9 +228,10 @@ public class OpenPgpProviderActivity extends Activity { data.setAction(OpenPgpApi.ACTION_ENCRYPT); data.putExtra(OpenPgpApi.EXTRA_USER_IDS, mEncryptUserIds.getText().toString().split(",")); data.putExtra(OpenPgpApi.EXTRA_REQUEST_ASCII_ARMOR, true); + data.putExtra(OpenPgpApi.EXTRA_ACCOUNT_NAME, mAccount.getText().toString()); InputStream is = getInputstream(false); - final ByteArrayOutputStream os = new ByteArrayOutputStream(); + ByteArrayOutputStream os = new ByteArrayOutputStream(); OpenPgpApi api = new OpenPgpApi(this, mServiceConnection.getService()); api.executeApiAsync(data, is, os, new MyCallback(true, os, REQUEST_CODE_ENCRYPT)); @@ -237,9 +241,10 @@ public class OpenPgpProviderActivity extends Activity { data.setAction(OpenPgpApi.ACTION_SIGN_AND_ENCRYPT); data.putExtra(OpenPgpApi.EXTRA_USER_IDS, mEncryptUserIds.getText().toString().split(",")); data.putExtra(OpenPgpApi.EXTRA_REQUEST_ASCII_ARMOR, true); + data.putExtra(OpenPgpApi.EXTRA_ACCOUNT_NAME, mAccount.getText().toString()); InputStream is = getInputstream(false); - final ByteArrayOutputStream os = new ByteArrayOutputStream(); + ByteArrayOutputStream os = new ByteArrayOutputStream(); OpenPgpApi api = new OpenPgpApi(this, mServiceConnection.getService()); api.executeApiAsync(data, is, os, new MyCallback(true, os, REQUEST_CODE_SIGN_AND_ENCRYPT)); @@ -248,9 +253,10 @@ public class OpenPgpProviderActivity extends Activity { public void decryptAndVerify(Intent data) { data.setAction(OpenPgpApi.ACTION_DECRYPT_VERIFY); data.putExtra(OpenPgpApi.EXTRA_REQUEST_ASCII_ARMOR, true); + data.putExtra(OpenPgpApi.EXTRA_ACCOUNT_NAME, mAccount.getText().toString()); InputStream is = getInputstream(true); - final ByteArrayOutputStream os = new ByteArrayOutputStream(); + ByteArrayOutputStream os = new ByteArrayOutputStream(); OpenPgpApi api = new OpenPgpApi(this, mServiceConnection.getService()); api.executeApiAsync(data, is, os, new MyCallback(false, os, REQUEST_CODE_DECRYPT_AND_VERIFY)); @@ -264,13 +270,11 @@ public class OpenPgpProviderActivity extends Activity { // try again after user interaction if (resultCode == RESULT_OK) { /* - * The data originally given to the pgp method are are again - * returned here to be used when calling again after user interaction. - * - * They also contain results from the user interaction which happened, - * for example selected key ids. + * The data originally given to one of the methods above, is again + * returned here to be used when calling the method again after user + * interaction. The Intent now also contains results from the user + * interaction, for example selected key ids. */ - switch (requestCode) { case REQUEST_CODE_SIGN: { sign(data); diff --git a/OpenPGP-Keychain-API/example-app/src/main/res/layout/openpgp_provider.xml b/OpenPGP-Keychain-API/example-app/src/main/res/layout/openpgp_provider.xml index 6c2ce1a7c..2b8e8016a 100644 --- a/OpenPGP-Keychain-API/example-app/src/main/res/layout/openpgp_provider.xml +++ b/OpenPGP-Keychain-API/example-app/src/main/res/layout/openpgp_provider.xml @@ -46,6 +46,7 @@ android:scrollHorizontally="true" android:scrollbars="vertical" android:text="message" + android:hint="cleartext message" android:textAppearance="@android:style/TextAppearance.Small" /> </ScrollView> @@ -66,6 +67,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:text="ciphertext" + android:hint="ciphertext" android:textAppearance="@android:style/TextAppearance.Small" /> </ScrollView> @@ -104,5 +106,18 @@ android:layout_height="wrap_content" android:text="Decrypt and Verify" /> + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Account ID:" + android:textAppearance="?android:attr/textAppearanceMedium" + android:id="@+id/textView" /> + + <EditText + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="Alice <alice@example.com>" + android:id="@+id/crypto_provider_demo_account" /> + </LinearLayout> </ScrollView>
\ No newline at end of file diff --git a/OpenPGP-Keychain-API/libraries/openpgp-api-library/src/org/openintents/openpgp/OpenPgpError.java b/OpenPGP-Keychain-API/libraries/openpgp-api-library/src/org/openintents/openpgp/OpenPgpError.java index 4dd2cc641..b894a4609 100644 --- a/OpenPGP-Keychain-API/libraries/openpgp-api-library/src/org/openintents/openpgp/OpenPgpError.java +++ b/OpenPGP-Keychain-API/libraries/openpgp-api-library/src/org/openintents/openpgp/OpenPgpError.java @@ -19,12 +19,22 @@ package org.openintents.openpgp; import android.os.Parcel; import android.os.Parcelable; +/** + * Parcelable versioning has been copied from Dashclock Widget + * https://code.google.com/p/dashclock/source/browse/api/src/main/java/com/google/android/apps/dashclock/api/ExtensionData.java + */ public class OpenPgpError implements Parcelable { + /** + * Since there might be a case where new versions of the client using the library getting + * old versions of the protocol (and thus old versions of this class), we need a versioning + * system for the parcels sent between the clients and the providers. + */ + public static final int PARCELABLE_VERSION = 1; + + // possible values for errorId public static final int CLIENT_SIDE_ERROR = -1; - public static final int GENERIC_ERROR = 0; public static final int INCOMPATIBLE_API_VERSIONS = 1; - public static final int NO_OR_WRONG_PASSPHRASE = 2; public static final int NO_USER_IDS = 3; @@ -65,15 +75,39 @@ public class OpenPgpError implements Parcelable { } public void writeToParcel(Parcel dest, int flags) { + /** + * NOTE: When adding fields in the process of updating this API, make sure to bump + * {@link #PARCELABLE_VERSION}. + */ + dest.writeInt(PARCELABLE_VERSION); + // Inject a placeholder that will store the parcel size from this point on + // (not including the size itself). + int sizePosition = dest.dataPosition(); + dest.writeInt(0); + int startPosition = dest.dataPosition(); + // version 1 dest.writeInt(errorId); dest.writeString(message); + // Go back and write the size + int parcelableSize = dest.dataPosition() - startPosition; + dest.setDataPosition(sizePosition); + dest.writeInt(parcelableSize); + dest.setDataPosition(startPosition + parcelableSize); } public static final Creator<OpenPgpError> CREATOR = new Creator<OpenPgpError>() { public OpenPgpError createFromParcel(final Parcel source) { + int parcelableVersion = source.readInt(); + int parcelableSize = source.readInt(); + int startPosition = source.dataPosition(); + OpenPgpError error = new OpenPgpError(); error.errorId = source.readInt(); error.message = source.readString(); + + // skip over all fields added in future versions of this parcel + source.setDataPosition(startPosition + parcelableSize); + return error; } diff --git a/OpenPGP-Keychain-API/libraries/openpgp-api-library/src/org/openintents/openpgp/OpenPgpSignatureResult.java b/OpenPGP-Keychain-API/libraries/openpgp-api-library/src/org/openintents/openpgp/OpenPgpSignatureResult.java index cb220cf6d..157dd1aad 100644 --- a/OpenPGP-Keychain-API/libraries/openpgp-api-library/src/org/openintents/openpgp/OpenPgpSignatureResult.java +++ b/OpenPGP-Keychain-API/libraries/openpgp-api-library/src/org/openintents/openpgp/OpenPgpSignatureResult.java @@ -19,7 +19,18 @@ package org.openintents.openpgp; import android.os.Parcel; import android.os.Parcelable; +/** + * Parcelable versioning has been copied from Dashclock Widget + * https://code.google.com/p/dashclock/source/browse/api/src/main/java/com/google/android/apps/dashclock/api/ExtensionData.java + */ public class OpenPgpSignatureResult implements Parcelable { + /** + * Since there might be a case where new versions of the client using the library getting + * old versions of the protocol (and thus old versions of this class), we need a versioning + * system for the parcels sent between the clients and the providers. + */ + public static final int PARCELABLE_VERSION = 1; + // generic error on signature verification public static final int SIGNATURE_ERROR = 0; // successfully verified signature, with certified public key @@ -90,19 +101,43 @@ public class OpenPgpSignatureResult implements Parcelable { } public void writeToParcel(Parcel dest, int flags) { + /** + * NOTE: When adding fields in the process of updating this API, make sure to bump + * {@link #PARCELABLE_VERSION}. + */ + dest.writeInt(PARCELABLE_VERSION); + // Inject a placeholder that will store the parcel size from this point on + // (not including the size itself). + int sizePosition = dest.dataPosition(); + dest.writeInt(0); + int startPosition = dest.dataPosition(); + // version 1 dest.writeInt(status); dest.writeByte((byte) (signatureOnly ? 1 : 0)); dest.writeString(userId); dest.writeLong(keyId); + // Go back and write the size + int parcelableSize = dest.dataPosition() - startPosition; + dest.setDataPosition(sizePosition); + dest.writeInt(parcelableSize); + dest.setDataPosition(startPosition + parcelableSize); } public static final Creator<OpenPgpSignatureResult> CREATOR = new Creator<OpenPgpSignatureResult>() { public OpenPgpSignatureResult createFromParcel(final Parcel source) { + int parcelableVersion = source.readInt(); + int parcelableSize = source.readInt(); + int startPosition = source.dataPosition(); + OpenPgpSignatureResult vr = new OpenPgpSignatureResult(); vr.status = source.readInt(); vr.signatureOnly = source.readByte() == 1; vr.userId = source.readString(); vr.keyId = source.readLong(); + + // skip over all fields added in future versions of this parcel + source.setDataPosition(startPosition + parcelableSize); + return vr; } diff --git a/OpenPGP-Keychain-API/libraries/openpgp-api-library/src/org/openintents/openpgp/util/OpenPgpApi.java b/OpenPGP-Keychain-API/libraries/openpgp-api-library/src/org/openintents/openpgp/util/OpenPgpApi.java index f768a1685..465a12002 100644 --- a/OpenPGP-Keychain-API/libraries/openpgp-api-library/src/org/openintents/openpgp/util/OpenPgpApi.java +++ b/OpenPGP-Keychain-API/libraries/openpgp-api-library/src/org/openintents/openpgp/util/OpenPgpApi.java @@ -32,7 +32,7 @@ public class OpenPgpApi { public static final String TAG = "OpenPgp API"; - public static final int API_VERSION = 2; + public static final int API_VERSION = 3; public static final String SERVICE_INTENT = "org.openintents.openpgp.IOpenPgpService"; /** @@ -126,6 +126,8 @@ public class OpenPgpApi { /* Intent extras */ public static final String EXTRA_API_VERSION = "api_version"; + public static final String EXTRA_ACCOUNT_NAME = "account_name"; + // SIGN, ENCRYPT, SIGN_AND_ENCRYPT, DECRYPT_VERIFY // request ASCII Armor for output // OpenPGP Radix-64, 33 percent overhead compared to binary, see http://tools.ietf.org/html/rfc4880#page-53) diff --git a/OpenPGP-Keychain-API/libraries/openpgp-api-library/src/org/openintents/openpgp/util/OpenPgpServiceConnection.java b/OpenPGP-Keychain-API/libraries/openpgp-api-library/src/org/openintents/openpgp/util/OpenPgpServiceConnection.java index c80656c52..0395a7bc5 100644 --- a/OpenPGP-Keychain-API/libraries/openpgp-api-library/src/org/openintents/openpgp/util/OpenPgpServiceConnection.java +++ b/OpenPGP-Keychain-API/libraries/openpgp-api-library/src/org/openintents/openpgp/util/OpenPgpServiceConnection.java @@ -25,34 +25,64 @@ import android.content.ServiceConnection; import android.os.IBinder; public class OpenPgpServiceConnection { + + // interface to create callbacks for onServiceConnected + public interface OnBound { + public void onBound(IOpenPgpService service); + } + private Context mApplicationContext; - private boolean mBound; private IOpenPgpService mService; private String mProviderPackageName; + private OnBound mOnBoundListener; + + /** + * Create new OpenPgpServiceConnection + * + * @param context + * @param providerPackageName specify package name of OpenPGP provider, + * e.g., "org.sufficientlysecure.keychain" + */ public OpenPgpServiceConnection(Context context, String providerPackageName) { this.mApplicationContext = context.getApplicationContext(); this.mProviderPackageName = providerPackageName; } + /** + * Create new OpenPgpServiceConnection + * + * @param context + * @param providerPackageName specify package name of OpenPGP provider, + * e.g., "org.sufficientlysecure.keychain" + * @param onBoundListener callback, executed when connection to service has been established + */ + public OpenPgpServiceConnection(Context context, String providerPackageName, + OnBound onBoundListener) { + this.mApplicationContext = context.getApplicationContext(); + this.mProviderPackageName = providerPackageName; + this.mOnBoundListener = onBoundListener; + } + public IOpenPgpService getService() { return mService; } public boolean isBound() { - return mBound; + return (mService != null); } private ServiceConnection mServiceConnection = new ServiceConnection() { public void onServiceConnected(ComponentName name, IBinder service) { mService = IOpenPgpService.Stub.asInterface(service); - mBound = true; + if (mOnBoundListener != null) { + mOnBoundListener.onBound(mService); + } } public void onServiceDisconnected(ComponentName name) { mService = null; - mBound = false; } }; @@ -63,7 +93,7 @@ public class OpenPgpServiceConnection { */ public boolean bindToService() { // if not already bound... - if (mService == null && !mBound) { + if (mService == null) { try { Intent serviceIntent = new Intent(); serviceIntent.setAction(IOpenPgpService.class.getName()); |