diff --git a/libs/minidns b/libs/minidns index 921674b3f..114bda4d3 160000 --- a/libs/minidns +++ b/libs/minidns @@ -1 +1 @@ -Subproject commit 921674b3f1585dde76d13f181abcfc6d49bd737d +Subproject commit 114bda4d3fde90d5c824884ce6b3f8ada846b435 diff --git a/libs/openpgp-keychain b/libs/openpgp-keychain index 68668fd44..098823bd5 160000 --- a/libs/openpgp-keychain +++ b/libs/openpgp-keychain @@ -1 +1 @@ -Subproject commit 68668fd444b973502b91b7cbe0cf7dbdd8a8b5c4 +Subproject commit 098823bd525bdbf215060dba1ed248af853bbfac diff --git a/src/eu/siacs/conversations/crypto/PgpEngine.java b/src/eu/siacs/conversations/crypto/PgpEngine.java index d071f7dfd..869a84375 100644 --- a/src/eu/siacs/conversations/crypto/PgpEngine.java +++ b/src/eu/siacs/conversations/crypto/PgpEngine.java @@ -8,8 +8,11 @@ import org.openintents.openpgp.OpenPgpError; import org.openintents.openpgp.OpenPgpSignatureResult; import org.openintents.openpgp.util.OpenPgpApi; +import eu.siacs.conversations.entities.Account; + import android.app.PendingIntent; import android.content.Intent; +import android.util.Log; public class PgpEngine { private OpenPgpApi api; @@ -18,14 +21,15 @@ public class PgpEngine { this.api = api; } - public String decrypt(String message) throws UserInputRequiredException, + public String decrypt(Account account, String message) throws UserInputRequiredException, OpenPgpException { Intent params = new Intent(); params.setAction(OpenPgpApi.ACTION_DECRYPT_VERIFY); + params.putExtra(OpenPgpApi.EXTRA_ACCOUNT_NAME, account.getJid()); InputStream is = new ByteArrayInputStream(message.getBytes()); ByteArrayOutputStream os = new ByteArrayOutputStream(); Intent result = api.executeApi(params, is, os); - switch (result.getIntExtra(OpenPgpApi.RESULT_CODE, 0)) { + switch (result.getIntExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_ERROR)) { case OpenPgpApi.RESULT_CODE_SUCCESS: return os.toString(); case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED: @@ -38,25 +42,39 @@ public class PgpEngine { } } - public String encrypt(long keyId, String message) { + public String encrypt(Account account, long keyId, String message) throws UserInputRequiredException, OpenPgpException { + Log.d("xmppService","called to pgpengine::encrypt"); long[] keys = {keyId}; Intent params = new Intent(); params.setAction(OpenPgpApi.ACTION_ENCRYPT); params.putExtra(OpenPgpApi.EXTRA_KEY_IDS,keys); params.putExtra(OpenPgpApi.EXTRA_REQUEST_ASCII_ARMOR, true); + params.putExtra(OpenPgpApi.EXTRA_ACCOUNT_NAME, account.getJid()); InputStream is = new ByteArrayInputStream(message.getBytes()); ByteArrayOutputStream os = new ByteArrayOutputStream(); Intent result = api.executeApi(params, is, os); - StringBuilder encryptedMessageBody = new StringBuilder(); - String[] lines = os.toString().split("\n"); - for (int i = 3; i < lines.length - 1; ++i) { - encryptedMessageBody.append(lines[i].trim()); + switch (result.getIntExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_ERROR)) { + case OpenPgpApi.RESULT_CODE_SUCCESS: + StringBuilder encryptedMessageBody = new StringBuilder(); + String[] lines = os.toString().split("\n"); + for (int i = 3; i < lines.length - 1; ++i) { + encryptedMessageBody.append(lines[i].trim()); + } + Log.d("xmppService","encrpyted message: "+encryptedMessageBody.toString()); + return encryptedMessageBody.toString(); + case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED: + Log.d("xmppService","user input required"); + throw new UserInputRequiredException((PendingIntent) result.getParcelableExtra(OpenPgpApi.RESULT_INTENT)); + case OpenPgpApi.RESULT_CODE_ERROR: + OpenPgpError error = (OpenPgpError) result.getParcelableExtra(OpenPgpApi.RESULT_ERROR); + throw new OpenPgpException(error); + default: + return null; } - return encryptedMessageBody.toString(); } - public long fetchKeyId(String status, String signature) + public long fetchKeyId(Account account, String status, String signature) throws OpenPgpException { if ((signature==null)||(api==null)) { return 0; @@ -82,7 +100,7 @@ public class PgpEngine { InputStream is = new ByteArrayInputStream(pgpSig.toString().getBytes()); ByteArrayOutputStream os = new ByteArrayOutputStream(); Intent result = api.executeApi(params, is, os); - switch (result.getIntExtra(OpenPgpApi.RESULT_CODE, 0)) { + switch (result.getIntExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_ERROR)) { case OpenPgpApi.RESULT_CODE_SUCCESS: OpenPgpSignatureResult sigResult = result.getParcelableExtra(OpenPgpApi.RESULT_SIGNATURE); diff --git a/src/eu/siacs/conversations/entities/Message.java b/src/eu/siacs/conversations/entities/Message.java index 0fce2a5b6..b91d822d9 100644 --- a/src/eu/siacs/conversations/entities/Message.java +++ b/src/eu/siacs/conversations/entities/Message.java @@ -29,6 +29,7 @@ public class Message extends AbstractEntity { protected String conversationUuid; protected String counterpart; protected String body; + protected String encryptedBody; protected long timeSent; protected int encryption; protected int status; @@ -141,4 +142,12 @@ public class Message extends AbstractEntity { public void setBody(String body) { this.body = body; } + + public String getEncryptedBody() { + return this.encryptedBody; + } + + public void setEncryptedBody(String body) { + this.encryptedBody = body; + } } diff --git a/src/eu/siacs/conversations/services/XmppConnectionService.java b/src/eu/siacs/conversations/services/XmppConnectionService.java index 9ca312553..786605abf 100644 --- a/src/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/eu/siacs/conversations/services/XmppConnectionService.java @@ -288,7 +288,7 @@ public class XmppConnectionService extends Service { } else { msg = ""; } - contact.setPgpKeyId(pgp.fetchKeyId(msg, x + contact.setPgpKeyId(pgp.fetchKeyId(account,msg, x .getContent())); } catch (OpenPgpException e) { Log.d(LOGTAG, "faulty pgp. just ignore"); @@ -657,8 +657,7 @@ public class XmppConnectionService extends Service { .getFullJid()); packet.setTo(message.getCounterpart()); packet.setBody("This is an XEP-0027 encryted message"); - packet.addChild("x","jabber:x:encrypted").setContent(this.getPgpEngine().encrypt(keyId, - message.getBody())); + packet.addChild("x", "jabber:x:encrypted").setContent(message.getEncryptedBody()); account.getXmppConnection().sendMessagePacket(packet); message.setStatus(Message.STATUS_SEND); message.setEncryption(Message.ENCRYPTION_DECRYPTED); diff --git a/src/eu/siacs/conversations/ui/ConversationFragment.java b/src/eu/siacs/conversations/ui/ConversationFragment.java index 7bbef42fc..51caafbd5 100644 --- a/src/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/eu/siacs/conversations/ui/ConversationFragment.java @@ -12,6 +12,7 @@ import net.java.otr4j.session.SessionStatus; import eu.siacs.conversations.R; import eu.siacs.conversations.crypto.PgpEngine.OpenPgpException; import eu.siacs.conversations.crypto.PgpEngine.UserInputRequiredException; +import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.entities.Contact; import eu.siacs.conversations.entities.Conversation; import eu.siacs.conversations.entities.Message; @@ -481,10 +482,24 @@ public class ConversationFragment extends Fragment { ConversationActivity activity = (ConversationActivity) getActivity(); final XmppConnectionService xmppService = activity.xmppConnectionService; Contact contact = message.getConversation().getContact(); + Account account = message.getConversation().getAccount(); if (activity.hasPgp()) { if (contact.getPgpKeyId() != 0) { - xmppService.sendMessage(message, null); - chatMsg.setText(""); + try { + message.setEncryptedBody(xmppService.getPgpEngine().encrypt(account, contact.getPgpKeyId(), message.getBody())); + xmppService.sendMessage(message, null); + chatMsg.setText(""); + } catch (UserInputRequiredException e) { + try { + getActivity().startIntentSenderForResult(e.getPendingIntent().getIntentSender(), + ConversationActivity.REQUEST_SEND_MESSAGE, null, 0, + 0, 0); + } catch (SendIntentException e1) { + Log.d("xmppService","failed to start intent to send message"); + } + } catch (OpenPgpException e) { + Log.d("xmppService","error encrypting with pgp: "+e.getOpenPgpError().getMessage()); + } } else { AlertDialog.Builder builder = new AlertDialog.Builder( getActivity()); @@ -616,7 +631,7 @@ public class ConversationFragment extends Fragment { } try { decrypted = activity.xmppConnectionService - .getPgpEngine().decrypt(body); + .getPgpEngine().decrypt(conversation.getAccount(),body); } catch (UserInputRequiredException e) { askForPassphraseIntent = e.getPendingIntent() .getIntentSender(); diff --git a/src/eu/siacs/conversations/utils/ExceptionHelper.java b/src/eu/siacs/conversations/utils/ExceptionHelper.java index 63c4ab6a6..c6e857c06 100644 --- a/src/eu/siacs/conversations/utils/ExceptionHelper.java +++ b/src/eu/siacs/conversations/utils/ExceptionHelper.java @@ -1,6 +1,5 @@ package eu.siacs.conversations.utils; -import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -80,11 +79,9 @@ public class ExceptionHelper { }); builder.create().show(); } catch (FileNotFoundException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + return; } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + return; } }