end otr sessions earlier / more often. can lead to unesessary handshakes but can improve reliabilty
This commit is contained in:
parent
8133dcd881
commit
a0dde05ee5
|
@ -10,11 +10,11 @@ import net.java.otr4j.crypto.OtrCryptoException;
|
||||||
import net.java.otr4j.session.SessionID;
|
import net.java.otr4j.session.SessionID;
|
||||||
import net.java.otr4j.session.SessionImpl;
|
import net.java.otr4j.session.SessionImpl;
|
||||||
import net.java.otr4j.session.SessionStatus;
|
import net.java.otr4j.session.SessionStatus;
|
||||||
|
|
||||||
import android.content.ContentValues;
|
import android.content.ContentValues;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
public class Conversation extends AbstractEntity {
|
public class Conversation extends AbstractEntity {
|
||||||
|
|
||||||
|
@ -240,6 +240,7 @@ public class Conversation extends AbstractEntity {
|
||||||
public void endOtrIfNeeded() {
|
public void endOtrIfNeeded() {
|
||||||
if (this.otrSession != null) {
|
if (this.otrSession != null) {
|
||||||
if (this.otrSession.getSessionStatus() == SessionStatus.ENCRYPTED) {
|
if (this.otrSession.getSessionStatus() == SessionStatus.ENCRYPTED) {
|
||||||
|
Log.d("xmppService","ending otr session with "+getContactJid());
|
||||||
try {
|
try {
|
||||||
this.otrSession.endSession();
|
this.otrSession.endSession();
|
||||||
this.resetOtrSession();
|
this.resetOtrSession();
|
||||||
|
@ -251,20 +252,7 @@ public class Conversation extends AbstractEntity {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasValidOtrSession() {
|
public boolean hasValidOtrSession() {
|
||||||
if (this.otrSession == null) {
|
return this.otrSession != null;
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
String foreignPresence = this.otrSession.getSessionID().getUserID();
|
|
||||||
if (getContact()==null) {
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
if (!getContact().getPresences().containsKey(foreignPresence)) {
|
|
||||||
this.resetOtrSession();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getOtrFingerprint() {
|
public String getOtrFingerprint() {
|
||||||
|
|
|
@ -36,6 +36,7 @@ import eu.siacs.conversations.utils.PhoneHelper;
|
||||||
import eu.siacs.conversations.utils.UIHelper;
|
import eu.siacs.conversations.utils.UIHelper;
|
||||||
import eu.siacs.conversations.xml.Element;
|
import eu.siacs.conversations.xml.Element;
|
||||||
import eu.siacs.conversations.xmpp.OnBindListener;
|
import eu.siacs.conversations.xmpp.OnBindListener;
|
||||||
|
import eu.siacs.conversations.xmpp.OnContactStatusChanged;
|
||||||
import eu.siacs.conversations.xmpp.OnIqPacketReceived;
|
import eu.siacs.conversations.xmpp.OnIqPacketReceived;
|
||||||
import eu.siacs.conversations.xmpp.OnMessagePacketReceived;
|
import eu.siacs.conversations.xmpp.OnMessagePacketReceived;
|
||||||
import eu.siacs.conversations.xmpp.OnPresencePacketReceived;
|
import eu.siacs.conversations.xmpp.OnPresencePacketReceived;
|
||||||
|
@ -95,6 +96,16 @@ public class XmppConnectionService extends Service {
|
||||||
private int convChangedListenerCount = 0;
|
private int convChangedListenerCount = 0;
|
||||||
private OnAccountListChangedListener accountChangedListener = null;
|
private OnAccountListChangedListener accountChangedListener = null;
|
||||||
private OnTLSExceptionReceived tlsException = null;
|
private OnTLSExceptionReceived tlsException = null;
|
||||||
|
private OnContactStatusChanged onContactStatusChanged = new OnContactStatusChanged() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onContactStatusChanged(Contact contact) {
|
||||||
|
Conversation conversation = findActiveConversation(contact);
|
||||||
|
if (conversation!=null) {
|
||||||
|
conversation.endOtrIfNeeded();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
public void setOnTLSExceptionReceivedListener(
|
public void setOnTLSExceptionReceivedListener(
|
||||||
OnTLSExceptionReceived listener) {
|
OnTLSExceptionReceived listener) {
|
||||||
|
@ -325,8 +336,7 @@ public class XmppConnectionService extends Service {
|
||||||
msg, x.getContent()));
|
msg, x.getContent()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
onContactStatusChanged.onContactStatusChanged(contact);
|
||||||
// Log.d(LOGTAG,"presence without resource "+packet.toString());
|
|
||||||
}
|
}
|
||||||
} else if (type.equals("unavailable")) {
|
} else if (type.equals("unavailable")) {
|
||||||
if (fromParts.length != 2) {
|
if (fromParts.length != 2) {
|
||||||
|
@ -334,6 +344,7 @@ public class XmppConnectionService extends Service {
|
||||||
} else {
|
} else {
|
||||||
contact.removePresence(fromParts[1]);
|
contact.removePresence(fromParts[1]);
|
||||||
}
|
}
|
||||||
|
onContactStatusChanged.onContactStatusChanged(contact);
|
||||||
} else if (type.equals("subscribe")) {
|
} else if (type.equals("subscribe")) {
|
||||||
Log.d(LOGTAG, "received subscribe packet from "
|
Log.d(LOGTAG, "received subscribe packet from "
|
||||||
+ packet.getFrom());
|
+ packet.getFrom());
|
||||||
|
@ -947,6 +958,15 @@ public class XmppConnectionService extends Service {
|
||||||
public List<Account> getAccounts() {
|
public List<Account> getAccounts() {
|
||||||
return this.accounts;
|
return this.accounts;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Conversation findActiveConversation(Contact contact) {
|
||||||
|
for (Conversation conversation : this.getConversations()) {
|
||||||
|
if (conversation.getContact() == contact) {
|
||||||
|
return conversation;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public Conversation findOrCreateConversation(Account account, String jid,
|
public Conversation findOrCreateConversation(Account account, String jid,
|
||||||
boolean muc) {
|
boolean muc) {
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
package eu.siacs.conversations.xmpp;
|
||||||
|
|
||||||
|
import eu.siacs.conversations.entities.Contact;
|
||||||
|
|
||||||
|
public interface OnContactStatusChanged {
|
||||||
|
public void onContactStatusChanged(Contact contact);
|
||||||
|
}
|
Loading…
Reference in a new issue