package info.guardianproject.otr; //Originally: package com.zadov.beem; import info.guardianproject.otr.app.im.plugin.xmpp.XmppConnection; import java.security.PublicKey; import java.util.Hashtable; import net.java.otr4j.OtrEngineImpl; import net.java.otr4j.OtrEngineListener; import net.java.otr4j.OtrPolicy; import net.java.otr4j.OtrPolicyImpl; import net.java.otr4j.session.SessionID; import net.java.otr4j.session.SessionStatus; import android.util.Log; public class OtrChatManager implements OtrEngineListener { private final static String TAG = "Xmpp"; protected XmppConnection xConn; protected OtrEngineHostImpl myHost; private OtrEngineImpl otrEngine; private Hashtable<String,SessionID> sessions; public OtrChatManager(XmppConnection xConn){ this.xConn = xConn; try { myHost = new OtrEngineHostImpl(xConn, new OtrPolicyImpl(OtrPolicy.ALLOW_V2 | OtrPolicy.ERROR_START_AKE)); otrEngine = new OtrEngineImpl(myHost); otrEngine.addOtrEngineListener(this); sessions = new Hashtable<String,SessionID>(); } catch (Exception re) { Log.w(TAG, re); } } public SessionID getSessionId (String localUserId, String remoteUserId) { SessionID sessionId = sessions.get(remoteUserId); if (sessionId == null) { sessionId = new SessionID(localUserId, remoteUserId, "XMPP"); sessions.put(remoteUserId, sessionId); } return sessionId; } public boolean isEncryptedSession (String localUserId, String remoteUserId) { if (otrEngine.getSessionStatus(getSessionId(localUserId,remoteUserId)) == SessionStatus.ENCRYPTED) return true; else return false; } public void refreshSession (String localUserId, String remoteUserId) { otrEngine.refreshSession(getSessionId(localUserId,remoteUserId)); } public void startSession(String localUserId, String remoteUserId) { otrEngine.startSession(getSessionId(localUserId,remoteUserId)); } public void endSession(String localUserId, String remoteUserId){ otrEngine.endSession(getSessionId(localUserId,remoteUserId)); } public void status(String localUserId, String remoteUserId){ otrEngine.getSessionStatus(getSessionId(localUserId,remoteUserId)).toString(); } public String receiveMessage(String localUserId, String remoteUserId, String msg){ //Log.i(TAG,"session status: " + otrEngine.getSessionStatus(localSessionID)); // Log.d(TAG, "in-cypher: "+msg); String plain = null; if(otrEngine != null){ plain = otrEngine.transformReceiving(getSessionId(localUserId,remoteUserId), msg); //remove HTML in text plain = plain.replaceAll("\\<.*?\\>", ""); // Log.d(TAG,"in-plain: "+plain); } return plain; } public String sendMessage(String localUserId, String remoteUserId, String msg){ // Log.i(TAG,"session status: " + otrEngine.getSessionStatus(localSessionID)); // Log.d(TAG, "out-plain: "+msg); if(otrEngine != null){ msg = otrEngine.transformSending(getSessionId(localUserId,remoteUserId), msg); // Log.d(TAG, "out-cypher: "+msg); } return msg; } @Override public void sessionStatusChanged(SessionID sessionID) { Log.i(TAG,"session status changed: " + otrEngine.getSessionStatus(sessionID)); if (otrEngine.getSessionStatus(sessionID) == SessionStatus.ENCRYPTED) { String sKey = sessionID.getUserID(); if (sKey.indexOf("/")!=-1) sKey = sKey.substring(0,sKey.indexOf("/")); this.sessions.put(sKey, sessionID); if (!myHost.isRemoteKeyVerified(sessionID)) { PublicKey remoteKey = otrEngine.getRemotePublicKey(sessionID); myHost.storeRemoteKey(sessionID, remoteKey); String rkFingerprint = myHost.getRemoteKeyFingerprint(sessionID); Log.i(TAG,"remote key fingerprint: " + rkFingerprint); } } else if (otrEngine.getSessionStatus(sessionID) == SessionStatus.PLAINTEXT) { } else if (otrEngine.getSessionStatus(sessionID) == SessionStatus.FINISHED) { } } public String getLocalKeyFingerprint (String localUserId, String remoteUserId) { return myHost.getLocalKeyFingerprint(getSessionId(localUserId,remoteUserId)); } public String getRemoteKeyFingerprint(String localUserId, String remoteUserId) { SessionID sessionID = getSessionId(localUserId,remoteUserId); String rkFingerprint = myHost.getRemoteKeyFingerprint(sessionID); if (rkFingerprint == null) { PublicKey remoteKey = otrEngine.getRemotePublicKey(sessionID); myHost.storeRemoteKey(sessionID, remoteKey); rkFingerprint = myHost.getRemoteKeyFingerprint(sessionID); Log.i(TAG,"remote key fingerprint: " + rkFingerprint); } return rkFingerprint; } }