be compatible with openkeychain api v3

Daniel Gultsch created

Change summary

libs/minidns                                                   |  2 
libs/openpgp-keychain                                          |  2 
src/eu/siacs/conversations/crypto/PgpEngine.java               | 38 ++-
src/eu/siacs/conversations/entities/Message.java               |  9 
src/eu/siacs/conversations/services/XmppConnectionService.java |  5 
src/eu/siacs/conversations/ui/ConversationFragment.java        | 21 +
src/eu/siacs/conversations/utils/ExceptionHelper.java          |  7 
7 files changed, 61 insertions(+), 23 deletions(-)

Detailed changes

libs/minidns 🔗

@@ -1 +1 @@
-Subproject commit 921674b3f1585dde76d13f181abcfc6d49bd737d
+Subproject commit 114bda4d3fde90d5c824884ce6b3f8ada846b435

libs/openpgp-keychain 🔗

@@ -1 +1 @@
-Subproject commit 68668fd444b973502b91b7cbe0cf7dbdd8a8b5c4
+Subproject commit 098823bd525bdbf215060dba1ed248af853bbfac

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

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

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

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();

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