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

Commit ee16a83e authored by Vincent Breitmoser's avatar Vincent Breitmoser
Browse files

move OpenPgpApiManager into openpgp-api lib

parent 6d78f6fe
Loading
Loading
Loading
Loading
+15 −15
Original line number Diff line number Diff line
@@ -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
@@ -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;
@@ -35,7 +35,7 @@ public class ComposeCryptoStatus {
    }

    CryptoStatusDisplayType getCryptoStatusDisplayType() {
        switch (cryptoProviderState) {
        switch (openPgpProviderState) {
            case UNCONFIGURED:
                return CryptoStatusDisplayType.UNCONFIGURED;
            case UNINITIALIZED:
@@ -106,7 +106,7 @@ public class ComposeCryptoStatus {
    }

    CryptoSpecialModeDisplayType getCryptoSpecialModeDisplayType() {
        if (cryptoProviderState != CryptoProviderState.OK) {
        if (openPgpProviderState != OpenPgpProviderState.OK) {
            return CryptoSpecialModeDisplayType.NONE;
        }

@@ -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;
        }

@@ -153,7 +153,7 @@ public class ComposeCryptoStatus {
    }

    public boolean isProviderStateOk() {
        return cryptoProviderState == CryptoProviderState.OK;
        return openPgpProviderState == OpenPgpProviderState.OK;
    }

    boolean allRecipientsCanEncrypt() {
@@ -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;
        }

@@ -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) {
@@ -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;
@@ -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;
@@ -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;
        }
@@ -299,7 +299,7 @@ public class ComposeCryptoStatus {
    }

    AttachErrorState getAttachErrorStateOrNull() {
        if (cryptoProviderState == CryptoProviderState.UNCONFIGURED) {
        if (openPgpProviderState == OpenPgpProviderState.UNCONFIGURED) {
            return null;
        }

+10 −10
Original line number Diff line number Diff line
@@ -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;

@@ -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) {
@@ -388,7 +388,7 @@ public class RecipientPresenter {
        }

        final ComposeCryptoStatus composeCryptoStatus = new ComposeCryptoStatusBuilder()
                .setCryptoProviderState(cryptoProviderState)
                .setOpenPgpProviderState(openPgpProviderState)
                .setCryptoMode(currentCryptoMode)
                .setEnablePgpInline(cryptoEnablePgpInline)
                .setPreferEncryptMutual(account.getAutocryptPreferEncryptMutual())
@@ -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;
                }

@@ -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;
@@ -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();
+5 −5
Original line number Diff line number Diff line
@@ -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);
@@ -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);
@@ -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);
@@ -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);
@@ -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,
+5 −0
Original line number Diff line number Diff line
@@ -18,6 +18,11 @@ android {
    }
}

dependencies {
    implementation "android.arch.lifecycle:extensions:1.1.0"
    implementation "com.jakewharton.timber:timber:${timberVersion}"
}

/*
publish {
    userOrg = 'sufficientlysecure'
+28 −30
Original line number Diff line number Diff line
package com.fsck.k9.ui.crypto;
package org.openintents.openpgp;


import android.app.PendingIntent;
@@ -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;
@@ -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) {
@@ -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) {
@@ -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;
        }

@@ -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:
@@ -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();
        }
    }

@@ -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);
        }
    }

@@ -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,
@@ -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);
    }
}