aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/eu/siacs/conversations/crypto/PgpEngine.java38
-rw-r--r--src/eu/siacs/conversations/entities/Message.java9
-rw-r--r--src/eu/siacs/conversations/services/XmppConnectionService.java5
-rw-r--r--src/eu/siacs/conversations/ui/ConversationFragment.java21
-rw-r--r--src/eu/siacs/conversations/utils/ExceptionHelper.java7
5 files changed, 59 insertions, 21 deletions
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;
}
}