Loading k9mail/src/main/java/com/fsck/k9/activity/compose/ComposeCryptoStatus.java +15 −15 Original line number Diff line number Diff line Loading @@ -11,7 +11,7 @@ import com.fsck.k9.activity.compose.RecipientMvpView.CryptoStatusDisplayType; import com.fsck.k9.activity.compose.RecipientPresenter.CryptoMode; import com.fsck.k9.message.AutocryptStatusInteractor.RecipientAutocryptStatus; import com.fsck.k9.message.AutocryptStatusInteractor.RecipientAutocryptStatusType; import com.fsck.k9.ui.crypto.OpenPgpApiManager.CryptoProviderState; import org.openintents.openpgp.OpenPgpApiManager.OpenPgpProviderState; import com.fsck.k9.view.RecipientSelectView.Recipient; /** This is an immutable object which contains all relevant metadata entered Loading @@ -21,7 +21,7 @@ import com.fsck.k9.view.RecipientSelectView.Recipient; public class ComposeCryptoStatus { private CryptoProviderState cryptoProviderState; private OpenPgpProviderState openPgpProviderState; private Long openPgpKeyId; private String[] recipientAddresses; private boolean enablePgpInline; Loading @@ -35,7 +35,7 @@ public class ComposeCryptoStatus { } CryptoStatusDisplayType getCryptoStatusDisplayType() { switch (cryptoProviderState) { switch (openPgpProviderState) { case UNCONFIGURED: return CryptoStatusDisplayType.UNCONFIGURED; case UNINITIALIZED: Loading Loading @@ -106,7 +106,7 @@ public class ComposeCryptoStatus { } CryptoSpecialModeDisplayType getCryptoSpecialModeDisplayType() { if (cryptoProviderState != CryptoProviderState.OK) { if (openPgpProviderState != OpenPgpProviderState.OK) { return CryptoSpecialModeDisplayType.NONE; } Loading @@ -127,11 +127,11 @@ public class ComposeCryptoStatus { public boolean shouldUsePgpMessageBuilder() { // CryptoProviderState.ERROR will be handled as an actual error, see SendErrorState return cryptoProviderState != CryptoProviderState.UNCONFIGURED; return openPgpProviderState != OpenPgpProviderState.UNCONFIGURED; } public boolean isEncryptionEnabled() { if (cryptoProviderState == CryptoProviderState.UNCONFIGURED) { if (openPgpProviderState == OpenPgpProviderState.UNCONFIGURED) { return false; } Loading @@ -153,7 +153,7 @@ public class ComposeCryptoStatus { } public boolean isProviderStateOk() { return cryptoProviderState == CryptoProviderState.OK; return openPgpProviderState == OpenPgpProviderState.OK; } boolean allRecipientsCanEncrypt() { Loading Loading @@ -190,15 +190,15 @@ public class ComposeCryptoStatus { public static class ComposeCryptoStatusBuilder { private CryptoProviderState cryptoProviderState; private OpenPgpProviderState openPgpProviderState; private CryptoMode cryptoMode; private Long openPgpKeyId; private List<Recipient> recipients; private Boolean enablePgpInline; private Boolean preferEncryptMutual; public ComposeCryptoStatusBuilder setCryptoProviderState(CryptoProviderState cryptoProviderState) { this.cryptoProviderState = cryptoProviderState; public ComposeCryptoStatusBuilder setOpenPgpProviderState(OpenPgpProviderState openPgpProviderState) { this.openPgpProviderState = openPgpProviderState; return this; } Loading Loading @@ -228,7 +228,7 @@ public class ComposeCryptoStatus { } public ComposeCryptoStatus build() { if (cryptoProviderState == null) { if (openPgpProviderState == null) { throw new AssertionError("cryptoProviderState must be set!"); } if (cryptoMode == null) { Loading @@ -250,7 +250,7 @@ public class ComposeCryptoStatus { } ComposeCryptoStatus result = new ComposeCryptoStatus(); result.cryptoProviderState = cryptoProviderState; result.openPgpProviderState = openPgpProviderState; result.cryptoMode = cryptoMode; result.recipientAddresses = recipientAddresses.toArray(new String[0]); result.openPgpKeyId = openPgpKeyId; Loading @@ -262,7 +262,7 @@ public class ComposeCryptoStatus { ComposeCryptoStatus withRecipientAutocryptStatus(RecipientAutocryptStatus recipientAutocryptStatusType) { ComposeCryptoStatus result = new ComposeCryptoStatus(); result.cryptoProviderState = cryptoProviderState; result.openPgpProviderState = openPgpProviderState; result.cryptoMode = cryptoMode; result.recipientAddresses = recipientAddresses; result.openPgpKeyId = openPgpKeyId; Loading @@ -278,7 +278,7 @@ public class ComposeCryptoStatus { } public SendErrorState getSendErrorStateOrNull() { if (cryptoProviderState != CryptoProviderState.OK) { if (openPgpProviderState != OpenPgpProviderState.OK) { // TODO: be more specific about this error return SendErrorState.PROVIDER_ERROR; } Loading @@ -299,7 +299,7 @@ public class ComposeCryptoStatus { } AttachErrorState getAttachErrorStateOrNull() { if (cryptoProviderState == CryptoProviderState.UNCONFIGURED) { if (openPgpProviderState == OpenPgpProviderState.UNCONFIGURED) { return null; } Loading k9mail/src/main/java/com/fsck/k9/activity/compose/RecipientPresenter.java +10 −10 Original line number Diff line number Diff line Loading @@ -42,10 +42,10 @@ import com.fsck.k9.message.ComposePgpEnableByDefaultDecider; import com.fsck.k9.message.ComposePgpInlineDecider; import com.fsck.k9.message.MessageBuilder; import com.fsck.k9.message.PgpMessageBuilder; import com.fsck.k9.ui.crypto.OpenPgpApiManager; import com.fsck.k9.ui.crypto.OpenPgpApiManager.CryptoProviderError; import com.fsck.k9.ui.crypto.OpenPgpApiManager.OpenPgpApiManagerCallback; import com.fsck.k9.ui.crypto.OpenPgpApiManager.CryptoProviderState; import org.openintents.openpgp.OpenPgpApiManager; import org.openintents.openpgp.OpenPgpApiManager.OpenPgpProviderError; import org.openintents.openpgp.OpenPgpApiManager.OpenPgpApiManagerCallback; import org.openintents.openpgp.OpenPgpApiManager.OpenPgpProviderState; import com.fsck.k9.view.RecipientSelectView.Recipient; import timber.log.Timber; Loading Loading @@ -380,7 +380,7 @@ public class RecipientPresenter { public void asyncUpdateCryptoStatus() { cachedCryptoStatus = null; final CryptoProviderState cryptoProviderState = openPgpApiManager.getCryptoProviderState(); final OpenPgpProviderState openPgpProviderState = openPgpApiManager.getOpenPgpProviderState(); Long accountCryptoKey = account.getOpenPgpKey(); if (accountCryptoKey == Account.NO_OPENPGP_KEY) { Loading @@ -388,7 +388,7 @@ public class RecipientPresenter { } final ComposeCryptoStatus composeCryptoStatus = new ComposeCryptoStatusBuilder() .setCryptoProviderState(cryptoProviderState) .setOpenPgpProviderState(openPgpProviderState) .setCryptoMode(currentCryptoMode) .setEnablePgpInline(cryptoEnablePgpInline) .setPreferEncryptMutual(account.getAutocryptPreferEncryptMutual()) Loading @@ -401,7 +401,7 @@ public class RecipientPresenter { new AsyncTask<Void,Void,RecipientAutocryptStatus>() { @Override protected RecipientAutocryptStatus doInBackground(Void... voids) { if (cryptoProviderState != CryptoProviderState.OK) { if (openPgpProviderState != OpenPgpProviderState.OK) { return null; } Loading Loading @@ -606,7 +606,7 @@ public class RecipientPresenter { } void onClickCryptoStatus() { switch (openPgpApiManager.getCryptoProviderState()) { switch (openPgpApiManager.getOpenPgpProviderState()) { case UNCONFIGURED: Timber.e("click on crypto status while unconfigured - this should not really happen?!"); return; Loading Loading @@ -819,12 +819,12 @@ public class RecipientPresenter { } @Override public void onCryptoStatusChanged() { public void onOpenPgpProviderStatusChanged() { asyncUpdateCryptoStatus(); } @Override public void onCryptoProviderError(CryptoProviderError error) { public void onOpenPgpProviderError(OpenPgpProviderError error) { switch (error) { case VersionIncompatible: recipientMvpView.showErrorOpenPgpIncompatible(); Loading k9mail/src/test/java/com/fsck/k9/message/PgpMessageBuilderTest.java +5 −5 Original line number Diff line number Diff line Loading @@ -86,7 +86,7 @@ public class PgpMessageBuilderTest extends K9RobolectricTest { public void build__withCryptoProviderUnconfigured__shouldThrow() throws MessagingException { cryptoStatusBuilder.setCryptoMode(CryptoMode.NO_CHOICE); cryptoStatusBuilder.setCryptoProviderState(CryptoProviderState.UNCONFIGURED); cryptoStatusBuilder.setOpenPgpProviderState(CryptoProviderState.UNCONFIGURED); pgpMessageBuilder.setCryptoStatus(cryptoStatusBuilder.build()); Callback mockCallback = mock(Callback.class); Loading @@ -100,7 +100,7 @@ public class PgpMessageBuilderTest extends K9RobolectricTest { public void build__withCryptoProviderUninitialized__shouldThrow() throws MessagingException { cryptoStatusBuilder.setCryptoMode(CryptoMode.NO_CHOICE); cryptoStatusBuilder.setCryptoProviderState(CryptoProviderState.UNINITIALIZED); cryptoStatusBuilder.setOpenPgpProviderState(CryptoProviderState.UNINITIALIZED); pgpMessageBuilder.setCryptoStatus(cryptoStatusBuilder.build()); Callback mockCallback = mock(Callback.class); Loading @@ -114,7 +114,7 @@ public class PgpMessageBuilderTest extends K9RobolectricTest { public void build__withCryptoProviderError__shouldThrow() throws MessagingException { cryptoStatusBuilder.setCryptoMode(CryptoMode.NO_CHOICE); cryptoStatusBuilder.setCryptoProviderState(CryptoProviderState.ERROR); cryptoStatusBuilder.setOpenPgpProviderState(CryptoProviderState.ERROR); pgpMessageBuilder.setCryptoStatus(cryptoStatusBuilder.build()); Callback mockCallback = mock(Callback.class); Loading @@ -128,7 +128,7 @@ public class PgpMessageBuilderTest extends K9RobolectricTest { public void build__withCryptoProviderLostConnection__shouldThrow() throws MessagingException { cryptoStatusBuilder.setCryptoMode(CryptoMode.NO_CHOICE); cryptoStatusBuilder.setCryptoProviderState(CryptoProviderState.LOST_CONNECTION); cryptoStatusBuilder.setOpenPgpProviderState(CryptoProviderState.LOST_CONNECTION); pgpMessageBuilder.setCryptoStatus(cryptoStatusBuilder.build()); Callback mockCallback = mock(Callback.class); Loading Loading @@ -607,7 +607,7 @@ public class PgpMessageBuilderTest extends K9RobolectricTest { .setPreferEncryptMutual(false) .setOpenPgpKeyId(TEST_KEY_ID) .setRecipients(new ArrayList<Recipient>()) .setCryptoProviderState(CryptoProviderState.OK); .setOpenPgpProviderState(CryptoProviderState.OK); } private static PgpMessageBuilder createDefaultPgpMessageBuilder(OpenPgpApi openPgpApi, Loading plugins/openpgp-api-lib/openpgp-api/build.gradle +5 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,11 @@ android { } } dependencies { implementation "android.arch.lifecycle:extensions:1.1.0" implementation "com.jakewharton.timber:timber:${timberVersion}" } /* publish { userOrg = 'sufficientlysecure' Loading k9mail/src/main/java/com/fsck/k9/ui/crypto/OpenPgpApiManager.java→plugins/openpgp-api-lib/openpgp-api/src/main/java/org/openintents/openpgp/OpenPgpApiManager.java +28 −30 Original line number Diff line number Diff line package com.fsck.k9.ui.crypto; package org.openintents.openpgp; import android.app.PendingIntent; Loading @@ -10,8 +10,6 @@ import android.content.Context; import android.content.Intent; import android.support.annotation.Nullable; import org.openintents.openpgp.IOpenPgpService2; import org.openintents.openpgp.OpenPgpError; import org.openintents.openpgp.util.OpenPgpApi; import org.openintents.openpgp.util.OpenPgpApi.IOpenPgpCallback; import org.openintents.openpgp.util.OpenPgpServiceConnection; Loading @@ -27,7 +25,7 @@ public class OpenPgpApiManager implements LifecycleObserver { private OpenPgpApi openPgpApi; private PendingIntent pendingUserInteractionIntent; private OpenPgpApiManagerCallback callback; private CryptoProviderState cryptoProviderState = CryptoProviderState.UNCONFIGURED; private OpenPgpProviderState openPgpProviderState = OpenPgpProviderState.UNCONFIGURED; public OpenPgpApiManager(Context context, Lifecycle lifecycle, OpenPgpApiManagerCallback callback, String openPgpProvider) { Loading Loading @@ -61,11 +59,11 @@ public class OpenPgpApiManager implements LifecycleObserver { } if (openPgpProvider == null) { setCryptoProviderState(CryptoProviderState.UNCONFIGURED); setOpenPgpProviderState(OpenPgpProviderState.UNCONFIGURED); return; } setCryptoProviderState(CryptoProviderState.UNINITIALIZED); setOpenPgpProviderState(OpenPgpProviderState.UNINITIALIZED); openPgpServiceConnection = new OpenPgpServiceConnection(context, openPgpProvider, new OnBound() { @Override public void onBound(IOpenPgpService2 service) { Loading @@ -76,24 +74,24 @@ public class OpenPgpApiManager implements LifecycleObserver { @Override public void onError(Exception e) { Timber.e(e, "error connecting to crypto provider!"); setCryptoProviderState(CryptoProviderState.ERROR); callback.onCryptoProviderError(CryptoProviderError.ConnectionFailed); setOpenPgpProviderState(OpenPgpProviderState.ERROR); callback.onOpenPgpProviderError(OpenPgpProviderError.ConnectionFailed); } }); refreshConnection(); } public void refreshConnection() { boolean isOkStateButLostConnection = cryptoProviderState == CryptoProviderState.OK && boolean isOkStateButLostConnection = openPgpProviderState == OpenPgpProviderState.OK && (openPgpServiceConnection == null || !openPgpServiceConnection.isBound()); if (isOkStateButLostConnection) { setCryptoProviderState(CryptoProviderState.LOST_CONNECTION); setOpenPgpProviderState(OpenPgpProviderState.LOST_CONNECTION); pendingUserInteractionIntent = null; return; } if (openPgpServiceConnection == null) { setCryptoProviderState(CryptoProviderState.UNCONFIGURED); setOpenPgpProviderState(OpenPgpProviderState.UNCONFIGURED); return; } Loading Loading @@ -126,13 +124,13 @@ public class OpenPgpApiManager implements LifecycleObserver { int resultCode = result.getIntExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_ERROR); switch (resultCode) { case OpenPgpApi.RESULT_CODE_SUCCESS: setCryptoProviderState(CryptoProviderState.OK); setOpenPgpProviderState(OpenPgpProviderState.OK); break; case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED: pendingUserInteractionIntent = result.getParcelableExtra(OpenPgpApi.RESULT_INTENT); setCryptoProviderState(CryptoProviderState.ERROR); callback.onCryptoProviderError(CryptoProviderError.UserInteractionRequired); setOpenPgpProviderState(OpenPgpProviderState.ERROR); callback.onOpenPgpProviderError(OpenPgpProviderError.UserInteractionRequired); break; case OpenPgpApi.RESULT_CODE_ERROR: Loading @@ -141,18 +139,18 @@ public class OpenPgpApiManager implements LifecycleObserver { OpenPgpError error = result.getParcelableExtra(OpenPgpApi.RESULT_ERROR); handleOpenPgpError(error); } else { setCryptoProviderState(CryptoProviderState.ERROR); callback.onCryptoProviderError(CryptoProviderError.ConnectionFailed); setOpenPgpProviderState(OpenPgpProviderState.ERROR); callback.onOpenPgpProviderError(OpenPgpProviderError.ConnectionFailed); } break; } } private void setCryptoProviderState(CryptoProviderState state) { boolean statusChanged = cryptoProviderState != state; private void setOpenPgpProviderState(OpenPgpProviderState state) { boolean statusChanged = openPgpProviderState != state; if (statusChanged) { cryptoProviderState = state; callback.onCryptoStatusChanged(); openPgpProviderState = state; callback.onOpenPgpProviderStatusChanged(); } } Loading @@ -160,11 +158,11 @@ public class OpenPgpApiManager implements LifecycleObserver { Timber.e("OpenPGP Api error: %s", error); if (error != null && error.getErrorId() == OpenPgpError.INCOMPATIBLE_API_VERSIONS) { callback.onCryptoProviderError(CryptoProviderError.VersionIncompatible); setCryptoProviderState(CryptoProviderState.UNCONFIGURED); callback.onOpenPgpProviderError(OpenPgpProviderError.VersionIncompatible); setOpenPgpProviderState(OpenPgpProviderState.UNCONFIGURED); } else { callback.onCryptoProviderError(CryptoProviderError.ConnectionFailed); setCryptoProviderState(CryptoProviderState.ERROR); callback.onOpenPgpProviderError(OpenPgpProviderError.ConnectionFailed); setOpenPgpProviderState(OpenPgpProviderState.ERROR); } } Loading @@ -183,11 +181,11 @@ public class OpenPgpApiManager implements LifecycleObserver { return openPgpApi; } public CryptoProviderState getCryptoProviderState() { return cryptoProviderState; public OpenPgpProviderState getOpenPgpProviderState() { return openPgpProviderState; } public enum CryptoProviderState { public enum OpenPgpProviderState { UNCONFIGURED, UNINITIALIZED, LOST_CONNECTION, Loading @@ -195,13 +193,13 @@ public class OpenPgpApiManager implements LifecycleObserver { OK } public enum CryptoProviderError { public enum OpenPgpProviderError { ConnectionFailed, VersionIncompatible, UserInteractionRequired } public interface OpenPgpApiManagerCallback { void launchUserInteractionPendingIntent(PendingIntent pendingIntent); void onCryptoStatusChanged(); void onCryptoProviderError(CryptoProviderError error); void onOpenPgpProviderStatusChanged(); void onOpenPgpProviderError(OpenPgpProviderError error); } } Loading
k9mail/src/main/java/com/fsck/k9/activity/compose/ComposeCryptoStatus.java +15 −15 Original line number Diff line number Diff line Loading @@ -11,7 +11,7 @@ import com.fsck.k9.activity.compose.RecipientMvpView.CryptoStatusDisplayType; import com.fsck.k9.activity.compose.RecipientPresenter.CryptoMode; import com.fsck.k9.message.AutocryptStatusInteractor.RecipientAutocryptStatus; import com.fsck.k9.message.AutocryptStatusInteractor.RecipientAutocryptStatusType; import com.fsck.k9.ui.crypto.OpenPgpApiManager.CryptoProviderState; import org.openintents.openpgp.OpenPgpApiManager.OpenPgpProviderState; import com.fsck.k9.view.RecipientSelectView.Recipient; /** This is an immutable object which contains all relevant metadata entered Loading @@ -21,7 +21,7 @@ import com.fsck.k9.view.RecipientSelectView.Recipient; public class ComposeCryptoStatus { private CryptoProviderState cryptoProviderState; private OpenPgpProviderState openPgpProviderState; private Long openPgpKeyId; private String[] recipientAddresses; private boolean enablePgpInline; Loading @@ -35,7 +35,7 @@ public class ComposeCryptoStatus { } CryptoStatusDisplayType getCryptoStatusDisplayType() { switch (cryptoProviderState) { switch (openPgpProviderState) { case UNCONFIGURED: return CryptoStatusDisplayType.UNCONFIGURED; case UNINITIALIZED: Loading Loading @@ -106,7 +106,7 @@ public class ComposeCryptoStatus { } CryptoSpecialModeDisplayType getCryptoSpecialModeDisplayType() { if (cryptoProviderState != CryptoProviderState.OK) { if (openPgpProviderState != OpenPgpProviderState.OK) { return CryptoSpecialModeDisplayType.NONE; } Loading @@ -127,11 +127,11 @@ public class ComposeCryptoStatus { public boolean shouldUsePgpMessageBuilder() { // CryptoProviderState.ERROR will be handled as an actual error, see SendErrorState return cryptoProviderState != CryptoProviderState.UNCONFIGURED; return openPgpProviderState != OpenPgpProviderState.UNCONFIGURED; } public boolean isEncryptionEnabled() { if (cryptoProviderState == CryptoProviderState.UNCONFIGURED) { if (openPgpProviderState == OpenPgpProviderState.UNCONFIGURED) { return false; } Loading @@ -153,7 +153,7 @@ public class ComposeCryptoStatus { } public boolean isProviderStateOk() { return cryptoProviderState == CryptoProviderState.OK; return openPgpProviderState == OpenPgpProviderState.OK; } boolean allRecipientsCanEncrypt() { Loading Loading @@ -190,15 +190,15 @@ public class ComposeCryptoStatus { public static class ComposeCryptoStatusBuilder { private CryptoProviderState cryptoProviderState; private OpenPgpProviderState openPgpProviderState; private CryptoMode cryptoMode; private Long openPgpKeyId; private List<Recipient> recipients; private Boolean enablePgpInline; private Boolean preferEncryptMutual; public ComposeCryptoStatusBuilder setCryptoProviderState(CryptoProviderState cryptoProviderState) { this.cryptoProviderState = cryptoProviderState; public ComposeCryptoStatusBuilder setOpenPgpProviderState(OpenPgpProviderState openPgpProviderState) { this.openPgpProviderState = openPgpProviderState; return this; } Loading Loading @@ -228,7 +228,7 @@ public class ComposeCryptoStatus { } public ComposeCryptoStatus build() { if (cryptoProviderState == null) { if (openPgpProviderState == null) { throw new AssertionError("cryptoProviderState must be set!"); } if (cryptoMode == null) { Loading @@ -250,7 +250,7 @@ public class ComposeCryptoStatus { } ComposeCryptoStatus result = new ComposeCryptoStatus(); result.cryptoProviderState = cryptoProviderState; result.openPgpProviderState = openPgpProviderState; result.cryptoMode = cryptoMode; result.recipientAddresses = recipientAddresses.toArray(new String[0]); result.openPgpKeyId = openPgpKeyId; Loading @@ -262,7 +262,7 @@ public class ComposeCryptoStatus { ComposeCryptoStatus withRecipientAutocryptStatus(RecipientAutocryptStatus recipientAutocryptStatusType) { ComposeCryptoStatus result = new ComposeCryptoStatus(); result.cryptoProviderState = cryptoProviderState; result.openPgpProviderState = openPgpProviderState; result.cryptoMode = cryptoMode; result.recipientAddresses = recipientAddresses; result.openPgpKeyId = openPgpKeyId; Loading @@ -278,7 +278,7 @@ public class ComposeCryptoStatus { } public SendErrorState getSendErrorStateOrNull() { if (cryptoProviderState != CryptoProviderState.OK) { if (openPgpProviderState != OpenPgpProviderState.OK) { // TODO: be more specific about this error return SendErrorState.PROVIDER_ERROR; } Loading @@ -299,7 +299,7 @@ public class ComposeCryptoStatus { } AttachErrorState getAttachErrorStateOrNull() { if (cryptoProviderState == CryptoProviderState.UNCONFIGURED) { if (openPgpProviderState == OpenPgpProviderState.UNCONFIGURED) { return null; } Loading
k9mail/src/main/java/com/fsck/k9/activity/compose/RecipientPresenter.java +10 −10 Original line number Diff line number Diff line Loading @@ -42,10 +42,10 @@ import com.fsck.k9.message.ComposePgpEnableByDefaultDecider; import com.fsck.k9.message.ComposePgpInlineDecider; import com.fsck.k9.message.MessageBuilder; import com.fsck.k9.message.PgpMessageBuilder; import com.fsck.k9.ui.crypto.OpenPgpApiManager; import com.fsck.k9.ui.crypto.OpenPgpApiManager.CryptoProviderError; import com.fsck.k9.ui.crypto.OpenPgpApiManager.OpenPgpApiManagerCallback; import com.fsck.k9.ui.crypto.OpenPgpApiManager.CryptoProviderState; import org.openintents.openpgp.OpenPgpApiManager; import org.openintents.openpgp.OpenPgpApiManager.OpenPgpProviderError; import org.openintents.openpgp.OpenPgpApiManager.OpenPgpApiManagerCallback; import org.openintents.openpgp.OpenPgpApiManager.OpenPgpProviderState; import com.fsck.k9.view.RecipientSelectView.Recipient; import timber.log.Timber; Loading Loading @@ -380,7 +380,7 @@ public class RecipientPresenter { public void asyncUpdateCryptoStatus() { cachedCryptoStatus = null; final CryptoProviderState cryptoProviderState = openPgpApiManager.getCryptoProviderState(); final OpenPgpProviderState openPgpProviderState = openPgpApiManager.getOpenPgpProviderState(); Long accountCryptoKey = account.getOpenPgpKey(); if (accountCryptoKey == Account.NO_OPENPGP_KEY) { Loading @@ -388,7 +388,7 @@ public class RecipientPresenter { } final ComposeCryptoStatus composeCryptoStatus = new ComposeCryptoStatusBuilder() .setCryptoProviderState(cryptoProviderState) .setOpenPgpProviderState(openPgpProviderState) .setCryptoMode(currentCryptoMode) .setEnablePgpInline(cryptoEnablePgpInline) .setPreferEncryptMutual(account.getAutocryptPreferEncryptMutual()) Loading @@ -401,7 +401,7 @@ public class RecipientPresenter { new AsyncTask<Void,Void,RecipientAutocryptStatus>() { @Override protected RecipientAutocryptStatus doInBackground(Void... voids) { if (cryptoProviderState != CryptoProviderState.OK) { if (openPgpProviderState != OpenPgpProviderState.OK) { return null; } Loading Loading @@ -606,7 +606,7 @@ public class RecipientPresenter { } void onClickCryptoStatus() { switch (openPgpApiManager.getCryptoProviderState()) { switch (openPgpApiManager.getOpenPgpProviderState()) { case UNCONFIGURED: Timber.e("click on crypto status while unconfigured - this should not really happen?!"); return; Loading Loading @@ -819,12 +819,12 @@ public class RecipientPresenter { } @Override public void onCryptoStatusChanged() { public void onOpenPgpProviderStatusChanged() { asyncUpdateCryptoStatus(); } @Override public void onCryptoProviderError(CryptoProviderError error) { public void onOpenPgpProviderError(OpenPgpProviderError error) { switch (error) { case VersionIncompatible: recipientMvpView.showErrorOpenPgpIncompatible(); Loading
k9mail/src/test/java/com/fsck/k9/message/PgpMessageBuilderTest.java +5 −5 Original line number Diff line number Diff line Loading @@ -86,7 +86,7 @@ public class PgpMessageBuilderTest extends K9RobolectricTest { public void build__withCryptoProviderUnconfigured__shouldThrow() throws MessagingException { cryptoStatusBuilder.setCryptoMode(CryptoMode.NO_CHOICE); cryptoStatusBuilder.setCryptoProviderState(CryptoProviderState.UNCONFIGURED); cryptoStatusBuilder.setOpenPgpProviderState(CryptoProviderState.UNCONFIGURED); pgpMessageBuilder.setCryptoStatus(cryptoStatusBuilder.build()); Callback mockCallback = mock(Callback.class); Loading @@ -100,7 +100,7 @@ public class PgpMessageBuilderTest extends K9RobolectricTest { public void build__withCryptoProviderUninitialized__shouldThrow() throws MessagingException { cryptoStatusBuilder.setCryptoMode(CryptoMode.NO_CHOICE); cryptoStatusBuilder.setCryptoProviderState(CryptoProviderState.UNINITIALIZED); cryptoStatusBuilder.setOpenPgpProviderState(CryptoProviderState.UNINITIALIZED); pgpMessageBuilder.setCryptoStatus(cryptoStatusBuilder.build()); Callback mockCallback = mock(Callback.class); Loading @@ -114,7 +114,7 @@ public class PgpMessageBuilderTest extends K9RobolectricTest { public void build__withCryptoProviderError__shouldThrow() throws MessagingException { cryptoStatusBuilder.setCryptoMode(CryptoMode.NO_CHOICE); cryptoStatusBuilder.setCryptoProviderState(CryptoProviderState.ERROR); cryptoStatusBuilder.setOpenPgpProviderState(CryptoProviderState.ERROR); pgpMessageBuilder.setCryptoStatus(cryptoStatusBuilder.build()); Callback mockCallback = mock(Callback.class); Loading @@ -128,7 +128,7 @@ public class PgpMessageBuilderTest extends K9RobolectricTest { public void build__withCryptoProviderLostConnection__shouldThrow() throws MessagingException { cryptoStatusBuilder.setCryptoMode(CryptoMode.NO_CHOICE); cryptoStatusBuilder.setCryptoProviderState(CryptoProviderState.LOST_CONNECTION); cryptoStatusBuilder.setOpenPgpProviderState(CryptoProviderState.LOST_CONNECTION); pgpMessageBuilder.setCryptoStatus(cryptoStatusBuilder.build()); Callback mockCallback = mock(Callback.class); Loading Loading @@ -607,7 +607,7 @@ public class PgpMessageBuilderTest extends K9RobolectricTest { .setPreferEncryptMutual(false) .setOpenPgpKeyId(TEST_KEY_ID) .setRecipients(new ArrayList<Recipient>()) .setCryptoProviderState(CryptoProviderState.OK); .setOpenPgpProviderState(CryptoProviderState.OK); } private static PgpMessageBuilder createDefaultPgpMessageBuilder(OpenPgpApi openPgpApi, Loading
plugins/openpgp-api-lib/openpgp-api/build.gradle +5 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,11 @@ android { } } dependencies { implementation "android.arch.lifecycle:extensions:1.1.0" implementation "com.jakewharton.timber:timber:${timberVersion}" } /* publish { userOrg = 'sufficientlysecure' Loading
k9mail/src/main/java/com/fsck/k9/ui/crypto/OpenPgpApiManager.java→plugins/openpgp-api-lib/openpgp-api/src/main/java/org/openintents/openpgp/OpenPgpApiManager.java +28 −30 Original line number Diff line number Diff line package com.fsck.k9.ui.crypto; package org.openintents.openpgp; import android.app.PendingIntent; Loading @@ -10,8 +10,6 @@ import android.content.Context; import android.content.Intent; import android.support.annotation.Nullable; import org.openintents.openpgp.IOpenPgpService2; import org.openintents.openpgp.OpenPgpError; import org.openintents.openpgp.util.OpenPgpApi; import org.openintents.openpgp.util.OpenPgpApi.IOpenPgpCallback; import org.openintents.openpgp.util.OpenPgpServiceConnection; Loading @@ -27,7 +25,7 @@ public class OpenPgpApiManager implements LifecycleObserver { private OpenPgpApi openPgpApi; private PendingIntent pendingUserInteractionIntent; private OpenPgpApiManagerCallback callback; private CryptoProviderState cryptoProviderState = CryptoProviderState.UNCONFIGURED; private OpenPgpProviderState openPgpProviderState = OpenPgpProviderState.UNCONFIGURED; public OpenPgpApiManager(Context context, Lifecycle lifecycle, OpenPgpApiManagerCallback callback, String openPgpProvider) { Loading Loading @@ -61,11 +59,11 @@ public class OpenPgpApiManager implements LifecycleObserver { } if (openPgpProvider == null) { setCryptoProviderState(CryptoProviderState.UNCONFIGURED); setOpenPgpProviderState(OpenPgpProviderState.UNCONFIGURED); return; } setCryptoProviderState(CryptoProviderState.UNINITIALIZED); setOpenPgpProviderState(OpenPgpProviderState.UNINITIALIZED); openPgpServiceConnection = new OpenPgpServiceConnection(context, openPgpProvider, new OnBound() { @Override public void onBound(IOpenPgpService2 service) { Loading @@ -76,24 +74,24 @@ public class OpenPgpApiManager implements LifecycleObserver { @Override public void onError(Exception e) { Timber.e(e, "error connecting to crypto provider!"); setCryptoProviderState(CryptoProviderState.ERROR); callback.onCryptoProviderError(CryptoProviderError.ConnectionFailed); setOpenPgpProviderState(OpenPgpProviderState.ERROR); callback.onOpenPgpProviderError(OpenPgpProviderError.ConnectionFailed); } }); refreshConnection(); } public void refreshConnection() { boolean isOkStateButLostConnection = cryptoProviderState == CryptoProviderState.OK && boolean isOkStateButLostConnection = openPgpProviderState == OpenPgpProviderState.OK && (openPgpServiceConnection == null || !openPgpServiceConnection.isBound()); if (isOkStateButLostConnection) { setCryptoProviderState(CryptoProviderState.LOST_CONNECTION); setOpenPgpProviderState(OpenPgpProviderState.LOST_CONNECTION); pendingUserInteractionIntent = null; return; } if (openPgpServiceConnection == null) { setCryptoProviderState(CryptoProviderState.UNCONFIGURED); setOpenPgpProviderState(OpenPgpProviderState.UNCONFIGURED); return; } Loading Loading @@ -126,13 +124,13 @@ public class OpenPgpApiManager implements LifecycleObserver { int resultCode = result.getIntExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_ERROR); switch (resultCode) { case OpenPgpApi.RESULT_CODE_SUCCESS: setCryptoProviderState(CryptoProviderState.OK); setOpenPgpProviderState(OpenPgpProviderState.OK); break; case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED: pendingUserInteractionIntent = result.getParcelableExtra(OpenPgpApi.RESULT_INTENT); setCryptoProviderState(CryptoProviderState.ERROR); callback.onCryptoProviderError(CryptoProviderError.UserInteractionRequired); setOpenPgpProviderState(OpenPgpProviderState.ERROR); callback.onOpenPgpProviderError(OpenPgpProviderError.UserInteractionRequired); break; case OpenPgpApi.RESULT_CODE_ERROR: Loading @@ -141,18 +139,18 @@ public class OpenPgpApiManager implements LifecycleObserver { OpenPgpError error = result.getParcelableExtra(OpenPgpApi.RESULT_ERROR); handleOpenPgpError(error); } else { setCryptoProviderState(CryptoProviderState.ERROR); callback.onCryptoProviderError(CryptoProviderError.ConnectionFailed); setOpenPgpProviderState(OpenPgpProviderState.ERROR); callback.onOpenPgpProviderError(OpenPgpProviderError.ConnectionFailed); } break; } } private void setCryptoProviderState(CryptoProviderState state) { boolean statusChanged = cryptoProviderState != state; private void setOpenPgpProviderState(OpenPgpProviderState state) { boolean statusChanged = openPgpProviderState != state; if (statusChanged) { cryptoProviderState = state; callback.onCryptoStatusChanged(); openPgpProviderState = state; callback.onOpenPgpProviderStatusChanged(); } } Loading @@ -160,11 +158,11 @@ public class OpenPgpApiManager implements LifecycleObserver { Timber.e("OpenPGP Api error: %s", error); if (error != null && error.getErrorId() == OpenPgpError.INCOMPATIBLE_API_VERSIONS) { callback.onCryptoProviderError(CryptoProviderError.VersionIncompatible); setCryptoProviderState(CryptoProviderState.UNCONFIGURED); callback.onOpenPgpProviderError(OpenPgpProviderError.VersionIncompatible); setOpenPgpProviderState(OpenPgpProviderState.UNCONFIGURED); } else { callback.onCryptoProviderError(CryptoProviderError.ConnectionFailed); setCryptoProviderState(CryptoProviderState.ERROR); callback.onOpenPgpProviderError(OpenPgpProviderError.ConnectionFailed); setOpenPgpProviderState(OpenPgpProviderState.ERROR); } } Loading @@ -183,11 +181,11 @@ public class OpenPgpApiManager implements LifecycleObserver { return openPgpApi; } public CryptoProviderState getCryptoProviderState() { return cryptoProviderState; public OpenPgpProviderState getOpenPgpProviderState() { return openPgpProviderState; } public enum CryptoProviderState { public enum OpenPgpProviderState { UNCONFIGURED, UNINITIALIZED, LOST_CONNECTION, Loading @@ -195,13 +193,13 @@ public class OpenPgpApiManager implements LifecycleObserver { OK } public enum CryptoProviderError { public enum OpenPgpProviderError { ConnectionFailed, VersionIncompatible, UserInteractionRequired } public interface OpenPgpApiManagerCallback { void launchUserInteractionPendingIntent(PendingIntent pendingIntent); void onCryptoStatusChanged(); void onCryptoProviderError(CryptoProviderError error); void onOpenPgpProviderStatusChanged(); void onOpenPgpProviderError(OpenPgpProviderError error); } }