Search in sources :

Example 11 with OpenPgpError

use of org.openintents.openpgp.OpenPgpError in project Conversations by siacs.

the class PgpEngine method generateSignature.

public void generateSignature(final Account account, String status, final UiCallback<Account> callback) {
    if (account.getPgpId() == 0) {
        return;
    }
    Intent params = new Intent();
    params.setAction(OpenPgpApi.ACTION_CLEARTEXT_SIGN);
    params.putExtra(OpenPgpApi.EXTRA_REQUEST_ASCII_ARMOR, true);
    params.putExtra(OpenPgpApi.EXTRA_SIGN_KEY_ID, account.getPgpId());
    InputStream is = new ByteArrayInputStream(status.getBytes());
    final OutputStream os = new ByteArrayOutputStream();
    Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": signing status message \"" + status + "\"");
    api.executeApiAsync(params, is, os, new IOpenPgpCallback() {

        @Override
        public void onReturn(Intent result) {
            switch(result.getIntExtra(OpenPgpApi.RESULT_CODE, 0)) {
                case OpenPgpApi.RESULT_CODE_SUCCESS:
                    StringBuilder signatureBuilder = new StringBuilder();
                    try {
                        os.flush();
                        String[] lines = os.toString().split("\n");
                        boolean sig = false;
                        for (String line : lines) {
                            if (sig) {
                                if (line.contains("END PGP SIGNATURE")) {
                                    sig = false;
                                } else {
                                    if (!line.contains("Version")) {
                                        signatureBuilder.append(line.trim());
                                    }
                                }
                            }
                            if (line.contains("BEGIN PGP SIGNATURE")) {
                                sig = true;
                            }
                        }
                    } catch (IOException e) {
                        callback.error(R.string.openpgp_error, account);
                        return;
                    }
                    account.setPgpSignature(signatureBuilder.toString());
                    callback.success(account);
                    return;
                case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED:
                    callback.userInputRequried((PendingIntent) result.getParcelableExtra(OpenPgpApi.RESULT_INTENT), account);
                    return;
                case OpenPgpApi.RESULT_CODE_ERROR:
                    OpenPgpError error = result.getParcelableExtra(OpenPgpApi.RESULT_ERROR);
                    if (error != null && "signing subkey not found!".equals(error.getMessage())) {
                        callback.error(0, account);
                    } else {
                        logError(account, error);
                        callback.error(R.string.unable_to_connect_to_keychain, null);
                    }
            }
        }
    });
}
Also used : IOpenPgpCallback(org.openintents.openpgp.util.OpenPgpApi.IOpenPgpCallback) ByteArrayInputStream(java.io.ByteArrayInputStream) FileInputStream(java.io.FileInputStream) ByteArrayInputStream(java.io.ByteArrayInputStream) InputStream(java.io.InputStream) OutputStream(java.io.OutputStream) ByteArrayOutputStream(java.io.ByteArrayOutputStream) FileOutputStream(java.io.FileOutputStream) Intent(android.content.Intent) PendingIntent(android.app.PendingIntent) ByteArrayOutputStream(java.io.ByteArrayOutputStream) IOException(java.io.IOException) PendingIntent(android.app.PendingIntent) OpenPgpError(org.openintents.openpgp.OpenPgpError)

Example 12 with OpenPgpError

use of org.openintents.openpgp.OpenPgpError in project Conversations by siacs.

the class PgpEngine method encrypt.

public void encrypt(final Message message, final UiCallback<Message> callback) {
    Intent params = new Intent();
    params.setAction(OpenPgpApi.ACTION_ENCRYPT);
    final Conversation conversation = message.getConversation();
    if (conversation.getMode() == Conversation.MODE_SINGLE) {
        long[] keys = { conversation.getContact().getPgpKeyId(), conversation.getAccount().getPgpId() };
        params.putExtra(OpenPgpApi.EXTRA_KEY_IDS, keys);
    } else {
        params.putExtra(OpenPgpApi.EXTRA_KEY_IDS, conversation.getMucOptions().getPgpKeyIds());
    }
    if (!message.needsUploading()) {
        params.putExtra(OpenPgpApi.EXTRA_REQUEST_ASCII_ARMOR, true);
        String body;
        if (message.hasFileOnRemoteHost()) {
            body = message.getFileParams().url.toString();
        } else {
            body = message.getBody();
        }
        InputStream is = new ByteArrayInputStream(body.getBytes());
        final OutputStream os = new ByteArrayOutputStream();
        api.executeApiAsync(params, is, os, new IOpenPgpCallback() {

            @Override
            public void onReturn(Intent result) {
                switch(result.getIntExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_ERROR)) {
                    case OpenPgpApi.RESULT_CODE_SUCCESS:
                        try {
                            os.flush();
                            StringBuilder encryptedMessageBody = new StringBuilder();
                            String[] lines = os.toString().split("\n");
                            for (int i = 2; i < lines.length - 1; ++i) {
                                if (!lines[i].contains("Version")) {
                                    encryptedMessageBody.append(lines[i].trim());
                                }
                            }
                            message.setEncryptedBody(encryptedMessageBody.toString());
                            callback.success(message);
                        } catch (IOException e) {
                            callback.error(R.string.openpgp_error, message);
                        }
                        break;
                    case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED:
                        callback.userInputRequried((PendingIntent) result.getParcelableExtra(OpenPgpApi.RESULT_INTENT), message);
                        break;
                    case OpenPgpApi.RESULT_CODE_ERROR:
                        logError(conversation.getAccount(), (OpenPgpError) result.getParcelableExtra(OpenPgpApi.RESULT_ERROR));
                        callback.error(R.string.openpgp_error, message);
                        break;
                }
            }
        });
    } else {
        try {
            DownloadableFile inputFile = this.mXmppConnectionService.getFileBackend().getFile(message, true);
            DownloadableFile outputFile = this.mXmppConnectionService.getFileBackend().getFile(message, false);
            outputFile.getParentFile().mkdirs();
            outputFile.createNewFile();
            final InputStream is = new FileInputStream(inputFile);
            final OutputStream os = new FileOutputStream(outputFile);
            api.executeApiAsync(params, is, os, new IOpenPgpCallback() {

                @Override
                public void onReturn(Intent result) {
                    switch(result.getIntExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_ERROR)) {
                        case OpenPgpApi.RESULT_CODE_SUCCESS:
                            try {
                                os.flush();
                            } catch (IOException ignored) {
                            //ignored
                            }
                            FileBackend.close(os);
                            callback.success(message);
                            break;
                        case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED:
                            callback.userInputRequried((PendingIntent) result.getParcelableExtra(OpenPgpApi.RESULT_INTENT), message);
                            break;
                        case OpenPgpApi.RESULT_CODE_ERROR:
                            logError(conversation.getAccount(), (OpenPgpError) result.getParcelableExtra(OpenPgpApi.RESULT_ERROR));
                            callback.error(R.string.openpgp_error, message);
                            break;
                    }
                }
            });
        } catch (final IOException e) {
            callback.error(R.string.openpgp_error, message);
        }
    }
}
Also used : IOpenPgpCallback(org.openintents.openpgp.util.OpenPgpApi.IOpenPgpCallback) FileInputStream(java.io.FileInputStream) ByteArrayInputStream(java.io.ByteArrayInputStream) InputStream(java.io.InputStream) OutputStream(java.io.OutputStream) ByteArrayOutputStream(java.io.ByteArrayOutputStream) FileOutputStream(java.io.FileOutputStream) Intent(android.content.Intent) PendingIntent(android.app.PendingIntent) Conversation(eu.siacs.conversations.entities.Conversation) ByteArrayOutputStream(java.io.ByteArrayOutputStream) IOException(java.io.IOException) FileInputStream(java.io.FileInputStream) ByteArrayInputStream(java.io.ByteArrayInputStream) FileOutputStream(java.io.FileOutputStream) PendingIntent(android.app.PendingIntent) OpenPgpError(org.openintents.openpgp.OpenPgpError) DownloadableFile(eu.siacs.conversations.entities.DownloadableFile)

Aggregations

OpenPgpError (org.openintents.openpgp.OpenPgpError)12 Intent (android.content.Intent)10 IOException (java.io.IOException)7 PendingIntent (android.app.PendingIntent)6 OutputStream (java.io.OutputStream)4 IOpenPgpCallback (org.openintents.openpgp.util.OpenPgpApi.IOpenPgpCallback)4 ParcelFileDescriptor (android.os.ParcelFileDescriptor)3 ByteArrayOutputStream (java.io.ByteArrayOutputStream)3 ByteArrayInputStream (java.io.ByteArrayInputStream)2 FileInputStream (java.io.FileInputStream)2 FileOutputStream (java.io.FileOutputStream)2 InputStream (java.io.InputStream)2 OpenPgpDataSource (org.openintents.openpgp.util.OpenPgpApi.OpenPgpDataSource)2 DataSinkTransferThread (org.openintents.openpgp.util.ParcelFileDescriptorUtil.DataSinkTransferThread)2 DataSourceTransferThread (org.openintents.openpgp.util.ParcelFileDescriptorUtil.DataSourceTransferThread)2 View (android.view.View)1 ImageView (android.widget.ImageView)1 TextView (android.widget.TextView)1 ComposeCryptoStatus (com.fsck.k9.activity.compose.ComposeCryptoStatus)1 MessagingException (com.fsck.k9.mail.MessagingException)1