be compatible with openkeychain api v3
This commit is contained in:
parent
a53716af82
commit
2506ef82df
|
@ -1 +1 @@
|
|||
Subproject commit 921674b3f1585dde76d13f181abcfc6d49bd737d
|
||||
Subproject commit 114bda4d3fde90d5c824884ce6b3f8ada846b435
|
|
@ -1 +1 @@
|
|||
Subproject commit 68668fd444b973502b91b7cbe0cf7dbdd8a8b5c4
|
||||
Subproject commit 098823bd525bdbf215060dba1ed248af853bbfac
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue