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

Commit 0617d425 authored by cketti's avatar cketti Committed by GitHub
Browse files

Merge pull request #1759 from k9mail/mch-fix-broken-signature-behavior

Improve behavior for broken signatures
parents 59dcdf6b 80d7ce48
Loading
Loading
Loading
Loading
+10 −3
Original line number Diff line number Diff line
@@ -72,8 +72,14 @@ public final class CryptoResultAnnotation {
        return new CryptoResultAnnotation(CryptoError.OPENPGP_UI_CANCELED, null, null, null, null, null);
    }

    public static CryptoResultAnnotation createOpenPgpErrorAnnotation(OpenPgpError error) {
        return new CryptoResultAnnotation(CryptoError.OPENPGP_API_RETURNED_ERROR, null, null, null, null, error);
    public static CryptoResultAnnotation createOpenPgpSignatureErrorAnnotation(
            OpenPgpError error, MimeBodyPart replacementData) {
        return new CryptoResultAnnotation(
                CryptoError.OPENPGP_SIGNED_API_ERROR, replacementData, null, null, null, error);
    }

    public static CryptoResultAnnotation createOpenPgpEncryptionErrorAnnotation(OpenPgpError error) {
        return new CryptoResultAnnotation(CryptoError.OPENPGP_ENCRYPTED_API_ERROR, null, null, null, null, error);
    }

    public boolean isOpenPgpResult() {
@@ -136,7 +142,8 @@ public final class CryptoResultAnnotation {
    public enum CryptoError {
        OPENPGP_OK,
        OPENPGP_UI_CANCELED,
        OPENPGP_API_RETURNED_ERROR,
        OPENPGP_SIGNED_API_ERROR,
        OPENPGP_ENCRYPTED_API_ERROR,
        OPENPGP_SIGNED_BUT_INCOMPLETE,
        OPENPGP_ENCRYPTED_BUT_INCOMPLETE,
        SIGNED_BUT_UNSUPPORTED,
+11 −5
Original line number Diff line number Diff line
@@ -347,7 +347,7 @@ public class MessageCryptoHelper {
    }

    private void callAsyncDetachedVerify(Intent intent) throws IOException, MessagingException {
        OpenPgpDataSource dataSource = getDataSourceForSignedData();
        OpenPgpDataSource dataSource = getDataSourceForSignedData(currentCryptoPart.part);

        byte[] signatureData = MessageDecryptVerifier.getSignatureData(currentCryptoPart.part);
        intent.putExtra(OpenPgpApi.EXTRA_DETACHED_SIGNATURE, signatureData);
@@ -368,12 +368,12 @@ public class MessageCryptoHelper {
        });
    }

    private OpenPgpDataSource getDataSourceForSignedData() throws IOException {
    private OpenPgpDataSource getDataSourceForSignedData(final Part signedPart) throws IOException {
        return new OpenPgpDataSource() {
            @Override
            public void writeTo(OutputStream os) throws IOException {
                try {
                    Multipart multipartSignedMultipart = (Multipart) currentCryptoPart.part.getBody();
                    Multipart multipartSignedMultipart = (Multipart) signedPart.getBody();
                    BodyPart signatureBodyPart = multipartSignedMultipart.getBodyPart(0);
                    Log.d(K9.LOG_TAG, "signed data type: " + signatureBodyPart.getMimeType());
                    signatureBodyPart.writeTo(os);
@@ -560,8 +560,14 @@ public class MessageCryptoHelper {
    }

    private void onCryptoOperationFailed(OpenPgpError error) {
        CryptoResultAnnotation errorPart = CryptoResultAnnotation.createOpenPgpErrorAnnotation(error);
        addCryptoResultAnnotationToMessage(errorPart);
        CryptoResultAnnotation annotation;
        if (currentCryptoPart.type == CryptoPartType.PGP_SIGNED) {
            MimeBodyPart replacementPart = getMultipartSignedContentPartIfAvailable(currentCryptoPart.part);
            annotation = CryptoResultAnnotation.createOpenPgpSignatureErrorAnnotation(error, replacementPart);
        } else {
            annotation = CryptoResultAnnotation.createOpenPgpEncryptionErrorAnnotation(error);
        }
        addCryptoResultAnnotationToMessage(annotation);
        onCryptoFinished();
    }

+4 −1
Original line number Diff line number Diff line
@@ -209,7 +209,10 @@ public enum MessageCryptoDisplayStatus {
            case OPENPGP_UI_CANCELED:
                return CANCELLED;

            case OPENPGP_API_RETURNED_ERROR:
            case OPENPGP_SIGNED_API_ERROR:
                return UNENCRYPTED_SIGN_ERROR;

            case OPENPGP_ENCRYPTED_API_ERROR:
                return ENCRYPTED_ERROR;
        }
        throw new IllegalStateException("Unhandled case!");