aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/eu/siacs/conversations/generator/MessageGenerator.java57
-rw-r--r--src/eu/siacs/conversations/services/XmppConnectionService.java95
-rw-r--r--src/eu/siacs/conversations/ui/ConversationActivity.java1
3 files changed, 84 insertions, 69 deletions
diff --git a/src/eu/siacs/conversations/generator/MessageGenerator.java b/src/eu/siacs/conversations/generator/MessageGenerator.java
new file mode 100644
index 000000000..57b21fcf7
--- /dev/null
+++ b/src/eu/siacs/conversations/generator/MessageGenerator.java
@@ -0,0 +1,57 @@
+package eu.siacs.conversations.generator;
+
+import net.java.otr4j.OtrException;
+import net.java.otr4j.session.Session;
+import eu.siacs.conversations.entities.Account;
+import eu.siacs.conversations.entities.Conversation;
+import eu.siacs.conversations.entities.Message;
+import eu.siacs.conversations.xmpp.stanzas.MessagePacket;
+
+public class MessageGenerator {
+ private MessagePacket preparePacket(Message message) {
+ Conversation conversation = message.getConversation();
+ Account account = conversation.getAccount();
+ MessagePacket packet = new MessagePacket();
+ if (conversation.getMode() == Conversation.MODE_SINGLE) {
+ packet.setTo(message.getCounterpart());
+ packet.setType(MessagePacket.TYPE_CHAT);
+ } else {
+ packet.setTo(message.getCounterpart().split("/")[0]);
+ packet.setType(MessagePacket.TYPE_GROUPCHAT);
+ }
+ packet.setFrom(account.getFullJid());
+ packet.setId(message.getUuid());
+ return packet;
+ }
+
+ public MessagePacket generateOtrChat(Message message) throws OtrException {
+ Session otrSession = message.getConversation().getOtrSession();
+ if (otrSession==null) {
+ throw new OtrException(null);
+ }
+ MessagePacket packet = preparePacket(message);
+ packet.addChild("private", "urn:xmpp:carbons:2");
+ packet.addChild("no-copy", "urn:xmpp:hints");
+ packet.setBody(otrSession.transformSending(message
+ .getBody()));
+ return packet;
+ }
+
+ public MessagePacket generateChat(Message message) {
+ MessagePacket packet = preparePacket(message);
+ packet.setBody(message.getBody());
+ return packet;
+ }
+
+ public MessagePacket generatePgpChat(Message message) {
+ MessagePacket packet = preparePacket(message);
+ packet.setBody("This is an XEP-0027 encryted message");
+ if (message.getEncryption() == Message.ENCRYPTION_DECRYPTED) {
+ packet.addChild("x", "jabber:x:encrypted").setContent(
+ message.getEncryptedBody());
+ } else if (message.getEncryption() == Message.ENCRYPTION_PGP) {
+ packet.setBody(message.getBody());
+ }
+ return packet;
+ }
+}
diff --git a/src/eu/siacs/conversations/services/XmppConnectionService.java b/src/eu/siacs/conversations/services/XmppConnectionService.java
index 69a40d4cb..b3cb84307 100644
--- a/src/eu/siacs/conversations/services/XmppConnectionService.java
+++ b/src/eu/siacs/conversations/services/XmppConnectionService.java
@@ -21,6 +21,7 @@ import eu.siacs.conversations.entities.Message;
import eu.siacs.conversations.entities.MucOptions;
import eu.siacs.conversations.entities.MucOptions.OnRenameListener;
import eu.siacs.conversations.entities.Presences;
+import eu.siacs.conversations.generator.MessageGenerator;
import eu.siacs.conversations.parser.MessageParser;
import eu.siacs.conversations.parser.PresenceParser;
import eu.siacs.conversations.persistance.DatabaseBackend;
@@ -88,6 +89,7 @@ public class XmppConnectionService extends Service {
private MessageParser mMessageParser = new MessageParser(this);
private PresenceParser mPresenceParser = new PresenceParser(this);
+ private MessageGenerator mMessageGenerator = new MessageGenerator();
private List<Account> accounts;
private List<Conversation> conversations = null;
@@ -685,42 +687,41 @@ public class XmppConnectionService extends Service {
message.setStatus(Message.STATUS_WAITING);
} else if (conv.hasValidOtrSession()
&& conv.getOtrSession().getSessionStatus() == SessionStatus.ENCRYPTED) {
- packet = prepareMessagePacket(account, message,
- conv.getOtrSession());
- send = true;
- message.setStatus(Message.STATUS_SEND);
+ message.setPresence(conv.getOtrSession().getSessionID().getUserID());
+ try {
+ packet = mMessageGenerator.generateOtrChat(message);
+ send = true;
+ message.setStatus(Message.STATUS_SEND);
+ } catch (OtrException e) {
+ Log.e(LOGTAG,"error generating otr packet");
+ packet = null;
+ }
} else if (message.getPresence() == null) {
message.setStatus(Message.STATUS_WAITING);
}
- } else if (message.getEncryption() == Message.ENCRYPTION_PGP) {
+ } else if (message.getEncryption() == Message.ENCRYPTION_DECRYPTED) {
message.getConversation().endOtrIfNeeded();
- packet = prepareMessagePacket(account, message, null);
- packet.setBody("This is an XEP-0027 encryted message");
- packet.addChild("x", "jabber:x:encrypted").setContent(
- message.getEncryptedBody());
+ packet = mMessageGenerator.generatePgpChat(message);
message.setStatus(Message.STATUS_SEND);
- message.setEncryption(Message.ENCRYPTION_DECRYPTED);
send = true;
} else {
message.getConversation().endOtrIfNeeded();
- // don't encrypt
if (message.getConversation().getMode() == Conversation.MODE_SINGLE) {
message.setStatus(Message.STATUS_SEND);
}
- packet = prepareMessagePacket(account, message, null);
+ packet = mMessageGenerator.generateChat(message);
send = true;
}
}
} else {
message.setStatus(Message.STATUS_WAITING);
if (message.getType() == Message.TYPE_TEXT) {
- if (message.getEncryption() == Message.ENCRYPTION_PGP) {
+ if (message.getEncryption() == Message.ENCRYPTION_DECRYPTED) {
String pgpBody = message.getEncryptedBody();
String decryptedBody = message.getBody();
message.setBody(pgpBody);
databaseBackend.createMessage(message);
saveInDb = false;
- message.setEncryption(Message.ENCRYPTION_DECRYPTED);
message.setBody(decryptedBody);
} else if (message.getEncryption() == Message.ENCRYPTION_OTR) {
if (conv.hasValidOtrSession()) {
@@ -762,21 +763,9 @@ public class XmppConnectionService extends Service {
if (message.getType() == Message.TYPE_TEXT) {
MessagePacket packet = null;
if (message.getEncryption() == Message.ENCRYPTION_NONE) {
- packet = prepareMessagePacket(account, message, null);
- } else if (message.getEncryption() == Message.ENCRYPTION_DECRYPTED) {
- packet = prepareMessagePacket(account, message, null);
- packet.setBody("This is an XEP-0027 encryted message");
- if (message.getEncryptedBody() == null) {
- markMessage(message, Message.STATUS_SEND_FAILED);
- return;
- }
- packet.addChild("x", "jabber:x:encrypted").setContent(
- message.getEncryptedBody());
- } else if (message.getEncryption() == Message.ENCRYPTION_PGP) {
- packet = prepareMessagePacket(account, message, null);
- packet.setBody("This is an XEP-0027 encryted message");
- packet.addChild("x", "jabber:x:encrypted").setContent(
- message.getBody());
+ packet = mMessageGenerator.generateChat(message);
+ } else if ((message.getEncryption() == Message.ENCRYPTION_DECRYPTED)||(message.getEncryption() == Message.ENCRYPTION_PGP)) {
+ packet = mMessageGenerator.generatePgpChat(message);
} else if (message.getEncryption() == Message.ENCRYPTION_OTR) {
Presences presences = message.getConversation().getContact()
.getPresences();
@@ -817,41 +806,6 @@ public class XmppConnectionService extends Service {
}
}
- public MessagePacket prepareMessagePacket(Account account, Message message,
- Session otrSession) {
- MessagePacket packet = new MessagePacket();
- if (message.getConversation().getMode() == Conversation.MODE_SINGLE) {
- packet.setType(MessagePacket.TYPE_CHAT);
- packet.setFrom(account.getFullJid());
- if (otrSession != null) {
- try {
- packet.setBody(otrSession.transformSending(message
- .getBody()));
- } catch (OtrException e) {
- Log.d(LOGTAG,
- account.getJid()
- + ": could not encrypt message to "
- + message.getCounterpart());
- }
- packet.addChild("private", "urn:xmpp:carbons:2");
- packet.addChild("no-copy", "urn:xmpp:hints");
- packet.setTo(otrSession.getSessionID().getAccountID() + "/"
- + otrSession.getSessionID().getUserID());
- } else {
- packet.setBody(message.getBody());
- packet.setTo(message.getCounterpart());
- }
- packet.addChild("markable", "urn:xmpp:chat-markers:0");
- } else if (message.getConversation().getMode() == Conversation.MODE_MULTI) {
- packet.setType(MessagePacket.TYPE_GROUPCHAT);
- packet.setBody(message.getBody());
- packet.setTo(message.getCounterpart().split("/")[0]);
- packet.setFrom(account.getJid());
- }
- packet.setId(message.getUuid());
- return packet;
- }
-
public void fetchRosterFromServer(Account account) {
IqPacket iqPacket = new IqPacket(IqPacket.TYPE_GET);
if (!"".equals(account.getRosterVersion())) {
@@ -1252,11 +1206,14 @@ public class XmppConnectionService extends Service {
&& (msg.getEncryption() == Message.ENCRYPTION_OTR)) {
msg.setPresence(otrSession.getSessionID().getUserID());
if (msg.getType() == Message.TYPE_TEXT) {
- MessagePacket outPacket = prepareMessagePacket(account,
- msg, otrSession);
- msg.setStatus(Message.STATUS_SEND);
- databaseBackend.updateMessage(msg);
- account.getXmppConnection().sendMessagePacket(outPacket);
+ try {
+ MessagePacket outPacket = mMessageGenerator.generateOtrChat(msg);
+ msg.setStatus(Message.STATUS_SEND);
+ databaseBackend.updateMessage(msg);
+ account.getXmppConnection().sendMessagePacket(outPacket);
+ } catch (OtrException e) {
+ Log.e(LOGTAG,"error creating otr packet");
+ }
} else if (msg.getType() == Message.TYPE_IMAGE) {
mJingleConnectionManager.createNewConnection(msg);
}
diff --git a/src/eu/siacs/conversations/ui/ConversationActivity.java b/src/eu/siacs/conversations/ui/ConversationActivity.java
index 4e264df74..1e806d31d 100644
--- a/src/eu/siacs/conversations/ui/ConversationActivity.java
+++ b/src/eu/siacs/conversations/ui/ConversationActivity.java
@@ -967,6 +967,7 @@ public class ConversationActivity extends XmppActivity {
@Override
public void success(Message message) {
+ message.setEncryption(Message.ENCRYPTION_DECRYPTED);
xmppConnectionService.sendMessage(message);
}