mirror of
https://github.com/moparisthebest/Conversations
synced 2024-11-24 17:52:17 -05:00
handle bare jid presences. fixes for otr
This commit is contained in:
parent
9960cb819e
commit
f247abc2dc
@ -154,13 +154,16 @@ public class OtrEngine implements OtrEngineHost {
|
|||||||
@Override
|
@Override
|
||||||
public void injectMessage(SessionID session, String body) throws OtrException {
|
public void injectMessage(SessionID session, String body) throws OtrException {
|
||||||
MessagePacket packet = new MessagePacket();
|
MessagePacket packet = new MessagePacket();
|
||||||
packet.setFrom(account.getFullJid()); //sender
|
packet.setFrom(account.getFullJid());
|
||||||
packet.setTo(session.getAccountID()+"/"+session.getUserID()); //reciepient
|
if (session.getUserID().isEmpty()) {
|
||||||
|
packet.setTo(session.getAccountID());
|
||||||
|
} else {
|
||||||
|
packet.setTo(session.getAccountID()+"/"+session.getUserID());
|
||||||
|
}
|
||||||
packet.setBody(body);
|
packet.setBody(body);
|
||||||
packet.addChild("private","urn:xmpp:carbons:2");
|
packet.addChild("private","urn:xmpp:carbons:2");
|
||||||
packet.addChild("no-copy","urn:xmpp:hints");
|
packet.addChild("no-copy","urn:xmpp:hints");
|
||||||
packet.setType(MessagePacket.TYPE_CHAT);
|
packet.setType(MessagePacket.TYPE_CHAT);
|
||||||
//Log.d(LOGTAG,packet.toString());
|
|
||||||
account.getXmppConnection().sendMessagePacket(packet);
|
account.getXmppConnection().sendMessagePacket(packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -224,7 +224,7 @@ public class Message extends AbstractEntity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void setPresence(String presence) {
|
public void setPresence(String presence) {
|
||||||
if (presence == null) {
|
if (presence == null || presence.isEmpty()) {
|
||||||
this.counterpart = this.counterpart.split("/")[0];
|
this.counterpart = this.counterpart.split("/")[0];
|
||||||
} else {
|
} else {
|
||||||
this.counterpart = this.counterpart.split("/")[0] + "/" + presence;
|
this.counterpart = this.counterpart.split("/")[0] + "/" + presence;
|
||||||
|
@ -63,6 +63,8 @@ public abstract class AbstractParser {
|
|||||||
String presence = null;
|
String presence = null;
|
||||||
if (fromParts.length >= 2) {
|
if (fromParts.length >= 2) {
|
||||||
presence = fromParts[1];
|
presence = fromParts[1];
|
||||||
|
} else {
|
||||||
|
presence = "";
|
||||||
}
|
}
|
||||||
Contact contact = account.getRoster().getContact(from);
|
Contact contact = account.getRoster().getContact(from);
|
||||||
long timestamp = getTimestamp(packet);
|
long timestamp = getTimestamp(packet);
|
||||||
|
@ -58,25 +58,31 @@ public class MessageParser extends AbstractParser implements
|
|||||||
String[] fromParts = packet.getFrom().split("/");
|
String[] fromParts = packet.getFrom().split("/");
|
||||||
Conversation conversation = mXmppConnectionService
|
Conversation conversation = mXmppConnectionService
|
||||||
.findOrCreateConversation(account, fromParts[0], false);
|
.findOrCreateConversation(account, fromParts[0], false);
|
||||||
|
String presence;
|
||||||
|
if (fromParts.length >= 2) {
|
||||||
|
presence = fromParts[1];
|
||||||
|
} else {
|
||||||
|
presence = "";
|
||||||
|
}
|
||||||
updateLastseen(packet, account, true);
|
updateLastseen(packet, account, true);
|
||||||
String body = packet.getBody();
|
String body = packet.getBody();
|
||||||
if (!conversation.hasValidOtrSession()) {
|
if (!conversation.hasValidOtrSession()) {
|
||||||
if (properlyAddressed) {
|
if (properlyAddressed) {
|
||||||
conversation.startOtrSession(
|
conversation.startOtrSession(
|
||||||
mXmppConnectionService.getApplicationContext(),
|
mXmppConnectionService.getApplicationContext(),
|
||||||
fromParts[1], false);
|
presence, false);
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
String foreignPresence = conversation.getOtrSession()
|
String foreignPresence = conversation.getOtrSession()
|
||||||
.getSessionID().getUserID();
|
.getSessionID().getUserID();
|
||||||
if (!foreignPresence.equals(fromParts[1])) {
|
if (!foreignPresence.equals(presence)) {
|
||||||
conversation.endOtrIfNeeded();
|
conversation.endOtrIfNeeded();
|
||||||
if (properlyAddressed) {
|
if (properlyAddressed) {
|
||||||
conversation.startOtrSession(
|
conversation.startOtrSession(
|
||||||
mXmppConnectionService.getApplicationContext(),
|
mXmppConnectionService.getApplicationContext(),
|
||||||
fromParts[1], false);
|
presence, false);
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,7 @@ import eu.siacs.conversations.xmpp.stanzas.PresencePacket;
|
|||||||
|
|
||||||
public class PresenceParser extends AbstractParser implements
|
public class PresenceParser extends AbstractParser implements
|
||||||
OnPresencePacketReceived {
|
OnPresencePacketReceived {
|
||||||
|
|
||||||
public PresenceParser(XmppConnectionService service) {
|
public PresenceParser(XmppConnectionService service) {
|
||||||
super(service);
|
super(service);
|
||||||
}
|
}
|
||||||
@ -21,13 +21,13 @@ public class PresenceParser extends AbstractParser implements
|
|||||||
public void parseConferencePresence(PresencePacket packet, Account account) {
|
public void parseConferencePresence(PresencePacket packet, Account account) {
|
||||||
PgpEngine mPgpEngine = mXmppConnectionService.getPgpEngine();
|
PgpEngine mPgpEngine = mXmppConnectionService.getPgpEngine();
|
||||||
if (packet.hasChild("x", "http://jabber.org/protocol/muc#user")) {
|
if (packet.hasChild("x", "http://jabber.org/protocol/muc#user")) {
|
||||||
Conversation muc = mXmppConnectionService.find(account,packet
|
Conversation muc = mXmppConnectionService.find(account, packet
|
||||||
.getAttribute("from").split("/")[0]);
|
.getAttribute("from").split("/")[0]);
|
||||||
if (muc != null) {
|
if (muc != null) {
|
||||||
muc.getMucOptions().processPacket(packet, mPgpEngine);
|
muc.getMucOptions().processPacket(packet, mPgpEngine);
|
||||||
}
|
}
|
||||||
} else if (packet.hasChild("x", "http://jabber.org/protocol/muc")) {
|
} else if (packet.hasChild("x", "http://jabber.org/protocol/muc")) {
|
||||||
Conversation muc = mXmppConnectionService.find(account,packet
|
Conversation muc = mXmppConnectionService.find(account, packet
|
||||||
.getAttribute("from").split("/")[0]);
|
.getAttribute("from").split("/")[0]);
|
||||||
if (muc != null) {
|
if (muc != null) {
|
||||||
muc.getMucOptions().processPacket(packet, mPgpEngine);
|
muc.getMucOptions().processPacket(packet, mPgpEngine);
|
||||||
@ -37,7 +37,8 @@ public class PresenceParser extends AbstractParser implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void parseContactPresence(PresencePacket packet, Account account) {
|
public void parseContactPresence(PresencePacket packet, Account account) {
|
||||||
PresenceGenerator mPresenceGenerator = mXmppConnectionService.getPresenceGenerator();
|
PresenceGenerator mPresenceGenerator = mXmppConnectionService
|
||||||
|
.getPresenceGenerator();
|
||||||
if (packet.getFrom() == null) {
|
if (packet.getFrom() == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -56,30 +57,34 @@ public class PresenceParser extends AbstractParser implements
|
|||||||
} else {
|
} else {
|
||||||
Contact contact = account.getRoster().getContact(packet.getFrom());
|
Contact contact = account.getRoster().getContact(packet.getFrom());
|
||||||
if (type == null) {
|
if (type == null) {
|
||||||
if (fromParts.length == 2) {
|
String presence;
|
||||||
int sizeBefore = contact.getPresences().size();
|
if (fromParts.length >= 2) {
|
||||||
contact.updatePresence(fromParts[1],
|
presence = fromParts[1];
|
||||||
Presences.parseShow(packet.findChild("show")));
|
} else {
|
||||||
PgpEngine pgp = mXmppConnectionService.getPgpEngine();
|
presence = "";
|
||||||
if (pgp != null) {
|
|
||||||
Element x = packet.findChild("x", "jabber:x:signed");
|
|
||||||
if (x != null) {
|
|
||||||
Element status = packet.findChild("status");
|
|
||||||
String msg;
|
|
||||||
if (status != null) {
|
|
||||||
msg = status.getContent();
|
|
||||||
} else {
|
|
||||||
msg = "";
|
|
||||||
}
|
|
||||||
contact.setPgpKeyId(pgp.fetchKeyId(account, msg,
|
|
||||||
x.getContent()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
boolean online = sizeBefore < contact.getPresences().size();
|
|
||||||
updateLastseen(packet, account, true);
|
|
||||||
mXmppConnectionService.onContactStatusChanged
|
|
||||||
.onContactStatusChanged(contact, online);
|
|
||||||
}
|
}
|
||||||
|
int sizeBefore = contact.getPresences().size();
|
||||||
|
contact.updatePresence(presence,
|
||||||
|
Presences.parseShow(packet.findChild("show")));
|
||||||
|
PgpEngine pgp = mXmppConnectionService.getPgpEngine();
|
||||||
|
if (pgp != null) {
|
||||||
|
Element x = packet.findChild("x", "jabber:x:signed");
|
||||||
|
if (x != null) {
|
||||||
|
Element status = packet.findChild("status");
|
||||||
|
String msg;
|
||||||
|
if (status != null) {
|
||||||
|
msg = status.getContent();
|
||||||
|
} else {
|
||||||
|
msg = "";
|
||||||
|
}
|
||||||
|
contact.setPgpKeyId(pgp.fetchKeyId(account, msg,
|
||||||
|
x.getContent()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
boolean online = sizeBefore < contact.getPresences().size();
|
||||||
|
updateLastseen(packet, account, true);
|
||||||
|
mXmppConnectionService.onContactStatusChanged
|
||||||
|
.onContactStatusChanged(contact, online);
|
||||||
} else if (type.equals("unavailable")) {
|
} else if (type.equals("unavailable")) {
|
||||||
if (fromParts.length != 2) {
|
if (fromParts.length != 2) {
|
||||||
contact.clearPresences();
|
contact.clearPresences();
|
||||||
@ -90,7 +95,8 @@ public class PresenceParser extends AbstractParser implements
|
|||||||
.onContactStatusChanged(contact, false);
|
.onContactStatusChanged(contact, false);
|
||||||
} else if (type.equals("subscribe")) {
|
} else if (type.equals("subscribe")) {
|
||||||
if (contact.getOption(Contact.Options.PREEMPTIVE_GRANT)) {
|
if (contact.getOption(Contact.Options.PREEMPTIVE_GRANT)) {
|
||||||
mXmppConnectionService.sendPresencePacket(account, mPresenceGenerator.sendPresenceUpdatesTo(contact));
|
mXmppConnectionService.sendPresencePacket(account,
|
||||||
|
mPresenceGenerator.sendPresenceUpdatesTo(contact));
|
||||||
} else {
|
} else {
|
||||||
contact.setOption(Contact.Options.PENDING_SUBSCRIPTION_REQUEST);
|
contact.setOption(Contact.Options.PENDING_SUBSCRIPTION_REQUEST);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user