Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit fd07e1a2 authored by cketti's avatar cketti Committed by GitHub
Browse files

Merge pull request #3299 from k9mail/autocrypt-reply-encrypted

More correct Autocrypt encrypted replies
parents 740d67a0 b5f2935a
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -966,11 +966,11 @@ public class MessageCompose extends K9Activity implements OnClickListener,
                recipientPresenter.onMenuAddFromContacts();
                break;
            case R.id.openpgp_encrypt_disable:
                recipientPresenter.onMenuSetEnableEncryption(false);
                recipientPresenter.onMenuToggleEncryption();
                updateMessageFormat();
                break;
            case R.id.openpgp_encrypt_enable:
                recipientPresenter.onMenuSetEnableEncryption(true);
                recipientPresenter.onMenuToggleEncryption();
                updateMessageFormat();
                break;
            case R.id.openpgp_inline_enable:
+33 −43
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ public class ComposeCryptoStatus {
    private String[] recipientAddresses;
    private boolean enablePgpInline;
    private boolean preferEncryptMutual;
    private boolean isReplyToEncrypted;
    private CryptoMode cryptoMode;
    private RecipientAutocryptStatus recipientAutocryptStatus;

@@ -60,48 +61,20 @@ public class ComposeCryptoStatus {
            return CryptoStatusDisplayType.ERROR;
        }

        switch (cryptoMode) {
            case CHOICE_ENABLED:
                if (recipientAutocryptStatusType.canEncrypt()) {
                    if (recipientAutocryptStatusType.isConfirmed()) {
                        return CryptoStatusDisplayType.CHOICE_ENABLED_TRUSTED;
        if (isEncryptionEnabled()) {
            if (!recipientAutocryptStatusType.canEncrypt()) {
                return CryptoStatusDisplayType.ENABLED_ERROR;
            } else if (recipientAutocryptStatusType.isConfirmed()) {
                return CryptoStatusDisplayType.ENABLED_TRUSTED;
            } else {
                        return CryptoStatusDisplayType.CHOICE_ENABLED_UNTRUSTED;
                    }
                } else {
                    return CryptoStatusDisplayType.CHOICE_ENABLED_ERROR;
                }
            case CHOICE_DISABLED:
                if (recipientAutocryptStatusType.canEncrypt()) {
                    if (recipientAutocryptStatusType.isConfirmed()) {
                        return CryptoStatusDisplayType.CHOICE_DISABLED_TRUSTED;
                    } else {
                        return CryptoStatusDisplayType.CHOICE_DISABLED_UNTRUSTED;
                    }
                } else {
                    return CryptoStatusDisplayType.CHOICE_DISABLED_UNAVAILABLE;
                }
            case NO_CHOICE:
                if (recipientAutocryptStatusType == RecipientAutocryptStatusType.NO_RECIPIENTS) {
                    return CryptoStatusDisplayType.NO_CHOICE_EMPTY;
                } else if (canEncryptAndIsMutualDefault()) {
                    if (recipientAutocryptStatusType.isConfirmed()) {
                        return CryptoStatusDisplayType.NO_CHOICE_MUTUAL_TRUSTED;
                    } else {
                        return CryptoStatusDisplayType.NO_CHOICE_MUTUAL;
                return CryptoStatusDisplayType.ENABLED;
            }
        } else if (isSigningEnabled()) {
            return CryptoStatusDisplayType.SIGN_ONLY;
        } else if (recipientAutocryptStatusType.canEncrypt()) {
                    if (recipientAutocryptStatusType.isConfirmed()) {
                        return CryptoStatusDisplayType.NO_CHOICE_AVAILABLE_TRUSTED;
            return CryptoStatusDisplayType.AVAILABLE;
        } else {
                        return CryptoStatusDisplayType.NO_CHOICE_AVAILABLE;
                    }
                }
                return CryptoStatusDisplayType.NO_CHOICE_UNAVAILABLE;
            case SIGN_ONLY:
                return CryptoStatusDisplayType.SIGN_ONLY;
            default:
                throw new AssertionError("all CryptoModes must be handled!");
            return CryptoStatusDisplayType.UNAVAILABLE;
        }
    }

@@ -137,7 +110,8 @@ public class ComposeCryptoStatus {

        boolean isExplicitlyEnabled = (cryptoMode == CryptoMode.CHOICE_ENABLED);
        boolean isMutualAndNotDisabled = (cryptoMode != CryptoMode.CHOICE_DISABLED && canEncryptAndIsMutualDefault());
        return isExplicitlyEnabled || isMutualAndNotDisabled;
        boolean isReplyAndNotDisabled = (cryptoMode != CryptoMode.CHOICE_DISABLED && isReplyToEncrypted());
        return isExplicitlyEnabled || isMutualAndNotDisabled || isReplyAndNotDisabled;
    }

    boolean isSignOnly() {
@@ -176,6 +150,10 @@ public class ComposeCryptoStatus {
        return recipientAutocryptStatus.type.isMutual();
    }

    public boolean isReplyToEncrypted() {
        return isReplyToEncrypted;
    }

    boolean canEncryptAndIsMutualDefault() {
        return allRecipientsCanEncrypt() && isSenderPreferEncryptMutual() && isRecipientsPreferEncryptMutual();
    }
@@ -196,6 +174,7 @@ public class ComposeCryptoStatus {
        private List<Recipient> recipients;
        private Boolean enablePgpInline;
        private Boolean preferEncryptMutual;
        private Boolean isReplyToEncrypted;

        public ComposeCryptoStatusBuilder setOpenPgpProviderState(OpenPgpProviderState openPgpProviderState) {
            this.openPgpProviderState = openPgpProviderState;
@@ -227,6 +206,11 @@ public class ComposeCryptoStatus {
            return this;
        }

        public ComposeCryptoStatusBuilder setIsReplyToEncrypted(boolean isReplyToEncrypted) {
            this.isReplyToEncrypted = isReplyToEncrypted;
            return this;
        }

        public ComposeCryptoStatus build() {
            if (openPgpProviderState == null) {
                throw new AssertionError("cryptoProviderState must be set!");
@@ -243,6 +227,9 @@ public class ComposeCryptoStatus {
            if (preferEncryptMutual == null) {
                throw new AssertionError("preferEncryptMutual must be set!");
            }
            if (isReplyToEncrypted == null) {
                throw new AssertionError("isReplyToEncrypted must be set!");
            }

            ArrayList<String> recipientAddresses = new ArrayList<>();
            for (Recipient recipient : recipients) {
@@ -254,6 +241,7 @@ public class ComposeCryptoStatus {
            result.cryptoMode = cryptoMode;
            result.recipientAddresses = recipientAddresses.toArray(new String[0]);
            result.openPgpKeyId = openPgpKeyId;
            result.isReplyToEncrypted = isReplyToEncrypted;
            result.enablePgpInline = enablePgpInline;
            result.preferEncryptMutual = preferEncryptMutual;
            return result;
@@ -265,8 +253,10 @@ public class ComposeCryptoStatus {
        result.openPgpProviderState = openPgpProviderState;
        result.cryptoMode = cryptoMode;
        result.recipientAddresses = recipientAddresses;
        result.isReplyToEncrypted = isReplyToEncrypted;
        result.openPgpKeyId = openPgpKeyId;
        result.enablePgpInline = enablePgpInline;
        result.preferEncryptMutual = preferEncryptMutual;
        result.recipientAutocryptStatus = recipientAutocryptStatusType;
        return result;
    }
+5 −12
Original line number Diff line number Diff line
@@ -442,18 +442,11 @@ public class RecipientMvpView implements OnFocusChangeListener, OnClickListener
        UNCONFIGURED(VIEW_INDEX_HIDDEN),
        UNINITIALIZED(VIEW_INDEX_HIDDEN),
        SIGN_ONLY(R.id.crypto_status_disabled),
        NO_CHOICE_EMPTY(VIEW_INDEX_HIDDEN),
        NO_CHOICE_UNAVAILABLE(VIEW_INDEX_HIDDEN),
        NO_CHOICE_AVAILABLE(R.id.crypto_status_disabled),
        NO_CHOICE_AVAILABLE_TRUSTED(R.id.crypto_status_disabled),
        NO_CHOICE_MUTUAL(R.id.crypto_status_enabled),
        NO_CHOICE_MUTUAL_TRUSTED(R.id.crypto_status_trusted),
        CHOICE_ENABLED_UNTRUSTED(R.id.crypto_status_enabled),
        CHOICE_ENABLED_TRUSTED(R.id.crypto_status_trusted),
        CHOICE_ENABLED_ERROR(R.id.crypto_status_error),
        CHOICE_DISABLED_UNTRUSTED(R.id.crypto_status_disabled),
        CHOICE_DISABLED_TRUSTED(R.id.crypto_status_disabled),
        CHOICE_DISABLED_UNAVAILABLE(VIEW_INDEX_HIDDEN),
        UNAVAILABLE(VIEW_INDEX_HIDDEN),
        ENABLED(R.id.crypto_status_enabled),
        ENABLED_ERROR(R.id.crypto_status_error),
        ENABLED_TRUSTED(R.id.crypto_status_trusted),
        AVAILABLE(R.id.crypto_status_disabled),
        ERROR(R.id.crypto_status_error);


+45 −60
Original line number Diff line number Diff line
@@ -85,6 +85,7 @@ public class RecipientPresenter {
    private RecipientType lastFocusedType = RecipientType.TO;
    private CryptoMode currentCryptoMode = CryptoMode.NO_CHOICE;
    private boolean cryptoEnablePgpInline = false;
    private boolean isReplyToEncryptedMessage = false;


    public RecipientPresenter(Context context, LoaderManager loaderManager,
@@ -170,8 +171,7 @@ public class RecipientPresenter {
            cryptoEnablePgpInline = true;
        }

        boolean shouldEnablePgpByDefault = composePgpEnableByDefaultDecider.shouldEncryptByDefault(message);
        currentCryptoMode = shouldEnablePgpByDefault ? CryptoMode.CHOICE_ENABLED : CryptoMode.NO_CHOICE;
        isReplyToEncryptedMessage = composePgpEnableByDefaultDecider.shouldEncryptByDefault(message);
    }

    public void initFromTrustIdAction(String trustId) {
@@ -393,6 +393,7 @@ public class RecipientPresenter {
                .setCryptoMode(currentCryptoMode)
                .setEnablePgpInline(cryptoEnablePgpInline)
                .setPreferEncryptMutual(account.getAutocryptPreferEncryptMutual())
                .setIsReplyToEncrypted(isReplyToEncryptedMessage)
                .setRecipients(getAllRecipients())
                .setOpenPgpKeyId(accountCryptoKey)
                .build();
@@ -617,6 +618,20 @@ public class RecipientPresenter {
                Timber.e("click on crypto status while unconfigured - this should not really happen?!");
                return;
            case OK:
                toggleEncryptionState(false);
                return;
            case UI_REQUIRED:
                // TODO show openpgp settings
                PendingIntent pendingIntent = openPgpApiManager.getUserInteractionPendingIntent();
                recipientMvpView.launchUserInteractionPendingIntent(pendingIntent, OPENPGP_USER_INTERACTION);
                break;
            case UNINITIALIZED:
            case ERROR:
                openPgpApiManager.refreshConnection();
        }
    }

    private void toggleEncryptionState(boolean showGotIt) {
        ComposeCryptoStatus currentCryptoStatus = getCurrentCachedCryptoStatus();
        if (currentCryptoStatus == null) {
            Timber.e("click on crypto status while crypto status not available - should not really happen?!");
@@ -633,35 +648,25 @@ public class RecipientPresenter {
            return;
        }

        boolean isEncryptOnNoChoice = currentCryptoStatus.canEncryptAndIsMutualDefault() ||
                currentCryptoStatus.isReplyToEncrypted();
        if (currentCryptoMode == CryptoMode.NO_CHOICE) {
            if (currentCryptoStatus.hasAutocryptPendingIntent()) {
                recipientMvpView.launchUserInteractionPendingIntent(
                        currentCryptoStatus.getAutocryptPendingIntent(), REQUEST_CODE_AUTOCRYPT);
                    } else if (currentCryptoStatus.canEncryptAndIsMutualDefault()) {
            } else if (isEncryptOnNoChoice) {
                // TODO warning dialog if we override, especially from reply!
                onCryptoModeChanged(CryptoMode.CHOICE_DISABLED);
            } else {
                onCryptoModeChanged(CryptoMode.CHOICE_ENABLED);
                if (showGotIt) {
                    recipientMvpView.showOpenPgpEncryptExplanationDialog();
                }
                    return;
            }

                if (currentCryptoMode == CryptoMode.CHOICE_DISABLED && !currentCryptoStatus.canEncryptAndIsMutualDefault()) {
        } else if (currentCryptoMode == CryptoMode.CHOICE_DISABLED && !isEncryptOnNoChoice) {
            onCryptoModeChanged(CryptoMode.CHOICE_ENABLED);
                    return;
                }

        } else {
            onCryptoModeChanged(CryptoMode.NO_CHOICE);
                return;

            case UI_REQUIRED:
                // TODO show openpgp settings
                PendingIntent pendingIntent = openPgpApiManager.getUserInteractionPendingIntent();
                recipientMvpView.launchUserInteractionPendingIntent(pendingIntent, OPENPGP_USER_INTERACTION);
                break;

            case UNINITIALIZED:
            case ERROR:
                openPgpApiManager.refreshConnection();
        }
    }

@@ -751,28 +756,8 @@ public class RecipientPresenter {
        }
    }

    public void onMenuSetEnableEncryption(boolean enableEncryption) {
        if (cachedCryptoStatus == null) {
            Timber.e("Received crypto button press while status wasn't initialized?");
            return;
        }
        if (enableEncryption) {
            if (!cachedCryptoStatus.allRecipientsCanEncrypt()) {
                onCryptoModeChanged(CryptoMode.CHOICE_ENABLED);
                recipientMvpView.showOpenPgpEnabledErrorDialog(true);
            } else if (cachedCryptoStatus.canEncryptAndIsMutualDefault()) {
                onCryptoModeChanged(CryptoMode.NO_CHOICE);
            } else {
                recipientMvpView.showOpenPgpEncryptExplanationDialog();
                onCryptoModeChanged(CryptoMode.CHOICE_ENABLED);
            }
        } else {
            if (cachedCryptoStatus.canEncryptAndIsMutualDefault()) {
                onCryptoModeChanged(CryptoMode.CHOICE_DISABLED);
            } else {
                onCryptoModeChanged(CryptoMode.NO_CHOICE);
            }
        }
    public void onMenuToggleEncryption() {
        toggleEncryptionState(true);
    }

    public void onCryptoPgpClickDisable() {
+8 −8
Original line number Diff line number Diff line
@@ -156,7 +156,7 @@ public class RecipientPresenterTest extends K9RobolectricTest {

        ComposeCryptoStatus status = recipientPresenter.getCurrentCachedCryptoStatus();

        assertEquals(CryptoStatusDisplayType.NO_CHOICE_EMPTY, status.getCryptoStatusDisplayType());
        assertEquals(CryptoStatusDisplayType.UNAVAILABLE, status.getCryptoStatusDisplayType());
        assertTrue(status.isProviderStateOk());
        assertTrue(status.shouldUsePgpMessageBuilder());
    }
@@ -169,7 +169,7 @@ public class RecipientPresenterTest extends K9RobolectricTest {

        ComposeCryptoStatus status = recipientPresenter.getCurrentCachedCryptoStatus();

        assertEquals(CryptoStatusDisplayType.NO_CHOICE_AVAILABLE, status.getCryptoStatusDisplayType());
        assertEquals(CryptoStatusDisplayType.AVAILABLE, status.getCryptoStatusDisplayType());
        assertTrue(status.isProviderStateOk());
        assertTrue(status.shouldUsePgpMessageBuilder());
    }
@@ -182,7 +182,7 @@ public class RecipientPresenterTest extends K9RobolectricTest {

        ComposeCryptoStatus status = recipientPresenter.getCurrentCachedCryptoStatus();

        assertEquals(CryptoStatusDisplayType.NO_CHOICE_AVAILABLE_TRUSTED, status.getCryptoStatusDisplayType());
        assertEquals(CryptoStatusDisplayType.AVAILABLE, status.getCryptoStatusDisplayType());
        assertTrue(status.isProviderStateOk());
        assertTrue(status.shouldUsePgpMessageBuilder());
    }
@@ -195,7 +195,7 @@ public class RecipientPresenterTest extends K9RobolectricTest {

        ComposeCryptoStatus status = recipientPresenter.getCurrentCachedCryptoStatus();

        assertEquals(CryptoStatusDisplayType.NO_CHOICE_UNAVAILABLE, status.getCryptoStatusDisplayType());
        assertEquals(CryptoStatusDisplayType.UNAVAILABLE, status.getCryptoStatusDisplayType());
        assertTrue(status.isProviderStateOk());
        assertTrue(status.shouldUsePgpMessageBuilder());
    }
@@ -210,7 +210,7 @@ public class RecipientPresenterTest extends K9RobolectricTest {
        runBackgroundTask();
        ComposeCryptoStatus status = recipientPresenter.getCurrentCachedCryptoStatus();

        assertEquals(CryptoStatusDisplayType.CHOICE_ENABLED_ERROR, status.getCryptoStatusDisplayType());
        assertEquals(CryptoStatusDisplayType.ENABLED_ERROR, status.getCryptoStatusDisplayType());
        assertTrue(status.isProviderStateOk());
        assertTrue(status.shouldUsePgpMessageBuilder());
    }
@@ -225,7 +225,7 @@ public class RecipientPresenterTest extends K9RobolectricTest {
        runBackgroundTask();
        ComposeCryptoStatus status = recipientPresenter.getCurrentCachedCryptoStatus();

        assertEquals(CryptoStatusDisplayType.CHOICE_DISABLED_UNTRUSTED, status.getCryptoStatusDisplayType());
        assertEquals(CryptoStatusDisplayType.AVAILABLE, status.getCryptoStatusDisplayType());
        assertTrue(status.isProviderStateOk());
        assertTrue(status.shouldUsePgpMessageBuilder());
    }
@@ -240,7 +240,7 @@ public class RecipientPresenterTest extends K9RobolectricTest {
        runBackgroundTask();
        ComposeCryptoStatus status = recipientPresenter.getCurrentCachedCryptoStatus();

        assertEquals(CryptoStatusDisplayType.CHOICE_ENABLED_UNTRUSTED, status.getCryptoStatusDisplayType());
        assertEquals(CryptoStatusDisplayType.ENABLED, status.getCryptoStatusDisplayType());
        assertTrue(status.isProviderStateOk());
        assertTrue(status.shouldUsePgpMessageBuilder());
    }
@@ -267,7 +267,7 @@ public class RecipientPresenterTest extends K9RobolectricTest {
        runBackgroundTask();
        ComposeCryptoStatus status = recipientPresenter.getCurrentCachedCryptoStatus();

        assertEquals(CryptoStatusDisplayType.NO_CHOICE_EMPTY, status.getCryptoStatusDisplayType());
        assertEquals(CryptoStatusDisplayType.UNAVAILABLE, status.getCryptoStatusDisplayType());
        assertTrue(status.isProviderStateOk());
        assertTrue(status.isPgpInlineModeEnabled());
    }
Loading