package info.guardianproject.otr; import info.guardianproject.otr.app.im.ImService; import info.guardianproject.otr.app.im.engine.Address; import info.guardianproject.otr.app.im.engine.Message; import info.guardianproject.otr.app.im.plugin.xmpp.XmppAddress; import info.guardianproject.otr.app.im.service.ChatSessionAdapter; import info.guardianproject.otr.app.im.service.ChatSessionManagerAdapter; import info.guardianproject.otr.app.im.service.ImConnectionAdapter; import info.guardianproject.otr.app.im.service.RemoteImService; import java.io.IOException; import java.security.KeyPair; import java.security.PublicKey; import java.util.Date; import java.util.Hashtable; import net.java.otr4j.OtrEngineHost; import net.java.otr4j.OtrKeyManager; import net.java.otr4j.OtrPolicy; import net.java.otr4j.session.SessionID; import net.java.otr4j.session.SessionStatus; import android.content.Context; import android.os.RemoteException; import android.widget.Toast; /* * OtrEngineHostImpl is the connects this app and the OtrEngine * http://code.google.com/p/otr4j/wiki/QuickStart */ public class OtrEngineHostImpl implements OtrEngineHost { private OtrPolicy mPolicy; private OtrKeyManager mOtrKeyManager; private Context mContext; private Hashtable<SessionID, String> mSessionResources; private RemoteImService mImService; public OtrEngineHostImpl(OtrPolicy policy, Context context, OtrKeyManager otrKeyManager, RemoteImService imService) throws IOException { mPolicy = policy; mContext = context; mSessionResources = new Hashtable<SessionID, String>(); mOtrKeyManager = otrKeyManager; mImService = imService; } public void putSessionResource(SessionID session, String resource) { mSessionResources.put(session, resource); } public void removeSessionResource(SessionID session) { mSessionResources.remove(session); } public Address appendSessionResource(SessionID session, Address to) { String resource = mSessionResources.get(session); if (resource != null) return new XmppAddress(to.getBareAddress() + '/' + resource); else return to; //return new XmppAddress(session.getRemoteUserId()); } public ImConnectionAdapter findConnection(SessionID session) { return mImService.getConnection(Address.stripResource(session.getLocalUserId())); } public OtrKeyManager getKeyManager() { return mOtrKeyManager; } public void storeRemoteKey(SessionID sessionID, PublicKey remoteKey) { mOtrKeyManager.savePublicKey(sessionID, remoteKey); } public boolean isRemoteKeyVerified(SessionID sessionID) { return mOtrKeyManager.isVerified(sessionID); } public String getLocalKeyFingerprint(SessionID sessionID) { return mOtrKeyManager.getLocalFingerprint(sessionID); } public String getRemoteKeyFingerprint(SessionID sessionID) { return mOtrKeyManager.getRemoteFingerprint(sessionID); } public KeyPair getKeyPair(SessionID sessionID) { KeyPair kp = null; kp = mOtrKeyManager.loadLocalKeyPair(sessionID); if (kp == null) { mOtrKeyManager.generateLocalKeyPair(sessionID); kp = mOtrKeyManager.loadLocalKeyPair(sessionID); } return kp; } public OtrPolicy getSessionPolicy(SessionID sessionID) { return mPolicy; } public void setSessionPolicy(OtrPolicy policy) { mPolicy = policy; } public void injectMessage(SessionID sessionID, String text) { OtrDebugLogger.log(sessionID.toString() + ": injecting message: " + text); ImConnectionAdapter connection = findConnection(sessionID); if (connection != null) { ChatSessionManagerAdapter chatSessionManagerAdapter = (ChatSessionManagerAdapter) connection .getChatSessionManager(); ChatSessionAdapter chatSessionAdapter = (ChatSessionAdapter) chatSessionManagerAdapter .getChatSession(Address.stripResource(sessionID.getRemoteUserId())); if (chatSessionAdapter != null) { String body = text; if (body == null) body = ""; //don't allow null messages, only empty ones! Message msg = new Message(body); // msg.setFrom(new XmppAddress(sessionID.getLocalUserId())); // final Address to = chatSessionAdapter.getAdaptee().getParticipant().getAddress(); Address to = new XmppAddress(sessionID.getRemoteUserId()); try { SessionStatus chatStatus = SessionStatus.values()[chatSessionAdapter.getOtrChatSession().getChatStatus()]; if (chatStatus == SessionStatus.ENCRYPTED) { msg.setTo(appendSessionResource(sessionID, to)); } else { msg.setTo(new XmppAddress(chatSessionAdapter.getAdaptee().getParticipant().getAddress().getBareAddress())); } } catch (RemoteException e) { msg.setTo(chatSessionAdapter.getAdaptee().getParticipant().getAddress()); } //msg.setTo(to); // msg.setDateTime(new Date()); // msg ID is set by plugin chatSessionManagerAdapter.getChatSessionManager().sendMessageAsync(chatSessionAdapter.getAdaptee(), msg); } else { OtrDebugLogger.log(sessionID.toString() + ": could not find chatSession"); } } else { OtrDebugLogger.log(sessionID.toString() + ": could not find ImConnection"); } } public void showError(SessionID sessionID, String error) { OtrDebugLogger.log(sessionID.toString() + ": ERROR=" + error); // Toast.makeText(mContext, "ERROR: " + error, Toast.LENGTH_SHORT).show(); } public void showWarning(SessionID sessionID, String warning) { OtrDebugLogger.log(sessionID.toString() + ": WARNING=" + warning); } }