be compatible with openkeychain api v3

This commit is contained in:
Daniel Gultsch 2014-04-03 17:39:57 +02:00
parent a53716af82
commit 2506ef82df
7 changed files with 61 additions and 23 deletions

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

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

View File

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

View File

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

View File

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

View File

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

View File

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