package org.jivesoftware.spark.otrplug;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.swing.Icon;
import net.java.otr4j.session.SessionID;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.spark.ChatManager;
import org.jivesoftware.spark.SparkManager;
import org.jivesoftware.spark.otrplug.impl.MyOtrKeyManager;
import org.jivesoftware.spark.otrplug.impl.OTRSession;
import org.jivesoftware.spark.otrplug.util.OTRProperties;
import org.jivesoftware.spark.ui.ChatRoom;
import org.jivesoftware.spark.ui.ChatRoomListenerAdapter;
import org.jivesoftware.spark.ui.ContactItem;
import org.jivesoftware.spark.ui.ContactItemHandler;
import org.jivesoftware.spark.ui.rooms.ChatRoomImpl;
/**
* OTRManager controls the whole OTR process. It checks if a new chat window is
* opened and creates an OTR session if there is no available.
*
* @author Bergunde Holger
*
*/
public class OTRManager extends ChatRoomListenerAdapter implements ContactItemHandler {
private static OTRManager singleton;
private static Object LOCK = new Object();
private Map<String, OTRSession> _activeSessions = new HashMap<String, OTRSession>();
final ChatManager chatManager = SparkManager.getChatManager();
private static MyOtrKeyManager _keyManager;
private OTRManager() {
chatManager.addChatRoomListener(this);
chatManager.addContactItemHandler(this);
}
@Override
public void chatRoomOpened(ChatRoom room) {
super.chatRoomOpened(room);
if (room instanceof ChatRoomImpl) {
createOTRSession((ChatRoomImpl) room, ((ChatRoomImpl) room).getParticipantJID());
}
}
@Override
public void chatRoomClosed(ChatRoom room) {
super.chatRoomClosed(room);
if (OTRProperties.getInstance().getOTRCloseOnChatClose()) {
if (room instanceof ChatRoomImpl) {
ChatRoomImpl myroom = (ChatRoomImpl) room;
if (_activeSessions.containsKey(myroom.getParticipantJID())) {
OTRSession searchedSession = _activeSessions.get(myroom.getParticipantJID());
searchedSession.stopSession();
_activeSessions.remove(myroom.getParticipantJID());
}
}
}
}
/**
* OTRManager is a sigleton. Use this method to get the instance.
*
* @return
*/
public static OTRManager getInstance() {
// Synchronize on LOCK to ensure that we don't end up creating
// two singletons.
synchronized (LOCK) {
if (null == singleton) {
OTRManager controller = new OTRManager();
singleton = controller;
try {
_keyManager = new MyOtrKeyManager(SparkManager.getUserDirectory().getPath() + "/otrkey.priv");
// we should generate a local keyprint if there is no
// avaiable
String key = _keyManager.getLocalFingerprint(new SessionID(SparkManager.getConnection().getUser(), "none", "Scytale"));
if (key == null) {
_keyManager.generateLocalKeyPair(new SessionID(SparkManager.getConnection().getUser(), "none", "Scytale"));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return controller;
}
}
return singleton;
}
/**
* Starts the OTR session with specified JID.
*
* @param jid
* participant
*/
public void startOtrWithUser(String jid) {
if (_activeSessions.containsKey(jid)) {
_activeSessions.get(jid).startSession();
}
}
private void createOTRSession(ChatRoomImpl chatroom, String jid) {
if (!_activeSessions.containsKey(jid)) {
_activeSessions.put(jid, startOTRSession(chatroom, jid));
} else {
_activeSessions.get(jid).updateChatRoom(chatroom);
}
}
/**
* Returns the OtrKeyManager to store and load keys
*
* @return
*/
public MyOtrKeyManager getKeyManager() {
return _keyManager;
}
private OTRSession startOTRSession(ChatRoomImpl chatroom, String jid) {
return new OTRSession(chatroom, SparkManager.getConnection().getUser(), jid);
}
@Override
public boolean handlePresence(ContactItem item, Presence presence) {
if (OTRProperties.getInstance().getOTRCloseOnDisc()) {
if (!presence.isAvailable() && _activeSessions.containsKey(item.getJID())) {
_activeSessions.get(item.getJID()).stopSession();
}
}
return false;
}
@Override
public Icon getIcon(String jid) {
// TODO Auto-generated method stub
return null;
}
@Override
public Icon getTabIcon(Presence presence) {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean handleDoubleClick(ContactItem item) {
// TODO Auto-generated method stub
return false;
}
}