Integrate OTR and related modifications to crypto stuff.

cusax-fix
Werner Dittmann 16 years ago
parent 766d4bbb8f
commit 88bf145942

@ -810,7 +810,8 @@
bundle-plugin-googletalkaccregwizz,bundle-argdelegation-service,
bundle-argdelegation,bundle-zrtp4j,
bundle-filehistory,bundle-metahistory,bundle-metahistory-slick,
bundle-facebook,bundle-plugin-facebookaccregwizz"/>
bundle-facebook,bundle-plugin-facebookaccregwizz,
bundle-bouncycastle,bundle-plugin-otr"/>
<!--BUNDLE-SC-LAUNCHER-->
<target name="bundle-sc-launcher">
@ -2025,11 +2026,17 @@ org.apache.http.util"/>
<zipfileset src="${lib.noinst}/zrtp4j-light.jar" prefix=""/>
<manifest>
<attribute name="Export-Package" value="gnu.java.zrtp,gnu.java.zrtp.packets,
gnu.java.zrtp.utils,gnu.java.zrtp.zidfile,
org.bouncycastle.crypto,org.bouncycastle.crypto.digests,org.bouncycastle.crypto.macs,
org.bouncycastle.crypto.params,org.bouncycastle.crypto.engines,
org.bouncycastle.crypto.modes"/>
<attribute name="Export-Package" value="
gnu.java.zrtp,
gnu.java.zrtp.packets,
gnu.java.zrtp.utils,
gnu.java.zrtp.zidfile"/>
<attribute name="Import-Package" value="org.bouncycastle.crypto,
org.bouncycastle.crypto.digests,
org.bouncycastle.crypto.macs,
org.bouncycastle.crypto.params,
org.bouncycastle.crypto.engines,
org.bouncycastle.crypto.modes"/>
<attribute name="Bundle-Name" value="ZRTP4J"/>
<attribute name="Bundle-Description" value="ZRTP for Java library."/>
<attribute name="Bundle-Version" value="1.4.5"/>
@ -2059,6 +2066,37 @@ org.apache.http.util"/>
<zipfileset dir="${dest}/net/java/sip/communicator/impl/metahistory"
prefix="net/java/sip/communicator/impl/metahistory" />
</jar>
</target>
<!--BUNDLE-BOUNCYCASTLE -->
<target name="bundle-bouncycastle">
<jar compress="true" destfile="${bundles.dest}/bouncycastle.jar">
<zipfileset src="${lib.noinst}/lcrypto-jdk16-143.jar"/>
<manifest>
<attribute name="Export-Package" value="org.bouncycastle.crypto,
org.bouncycastle.crypto.digests,
org.bouncycastle.crypto.macs,
org.bouncycastle.crypto.params,
org.bouncycastle.crypto.engines,
org.bouncycastle.crypto.modes,
org.bouncycastle.crypto.generators,
org.bouncycastle.crypto.signers,
org.bouncycastle.util.encoders,
org.bouncycastle.util"/>
<attribute name="Bundle-Name" value="BouncyCastle"/>
<attribute name="Bundle-Version" value="1.4.3.1"/>
<attribute name="System-Bundle" value="yes"/>
</manifest>
</jar>
</target>
<!--BUNDLE-PLUGIN-OTR -->
<!--<property name="otr4j_classes" value="../otr4j/bin/classes"/>-->
<target name="bundle-plugin-otr">
<jar compress="false" destfile="${bundles.dest}/otr.jar" manifest="${src}/net/java/sip/communicator/plugin/otr/otr.manifest.mf">
<zipfileset dir="${dest}/net/java/sip/communicator/plugin/otr"
prefix="net/java/sip/communicator/plugin/otr"/>
<!--<fileset dir="${otr4j_classes}" excludes="**/*Test.class"/>-->
<zipfileset src="${lib.noinst}/otr4j.jar"/>
</jar>
</target>
<!--BUNDLE-METAHISTORY-SLICK-->
<target name="bundle-metahistory-slick">
@ -2068,6 +2106,4 @@ org.apache.http.util"/>
prefix="net/java/sip/communicator/slick/metahistory"/>
</jar>
</target>
</project>

@ -50,7 +50,14 @@ org.osgi.framework.system.packages.extra= org.osgi.framework; version=1.3.0, \
javax.crypto; \
javax.crypto.spec; \
javax.crypto.interfaces; \
sun.awt.shell;
sun.awt.shell; \
java.io; \
java.math; \
java.nio; \
java.security; \
java.security.interfaces; \
java.security.spec;
felix.auto.start.10= \
reference:file:lib/bundle/org.apache.felix.bundlerepository-1.0.0.jar
@ -83,6 +90,7 @@ felix.auto.start.45= \
reference:file:sc-bundles/branding.jar
felix.auto.start.49= \
reference:file:sc-bundles/bouncycastle.jar \
reference:file:sc-bundles/zrtp4j.jar \
reference:file:sc-bundles/protocol.jar \
reference:file:lib/bundle/httpcore.jar
@ -157,6 +165,7 @@ felix.auto.start.67= \
reference:file:sc-bundles/keybindingChooser.jar \
reference:file:sc-bundles/generalconfig.jar \
reference:file:sc-bundles/dictaccregwizz.jar \
reference:file:sc-bundles/otr.jar \
reference:file:sc-bundles/facebookaccregwizz.jar
#level 68 is for profiler, don't use it or change the build.xml file accordingly

@ -49,7 +49,13 @@ org.osgi.framework.system.packages.extra= org.osgi.framework; ; version=1.3.0, \
javax.crypto; \
javax.crypto.spec; \
javax.crypto.interfaces; \
sun.awt.shell;
sun.awt.shell; \
java.io; \
java.math; \
java.nio; \
java.security; \
java.security.interfaces; \
java.security.spec;
#
@ -88,6 +94,7 @@ felix.auto.start.4= \
reference:file:sc-bundles/netaddr.jar
felix.auto.start.5= \
reference:file:sc-bundles/bouncycastle.jar \
reference:file:sc-bundles/zrtp4j.jar \
reference:file:sc-bundles/protocol.jar \
reference:file:lib/bundle/httpcore.jar

Binary file not shown.

@ -407,3 +407,7 @@ plugin.notificationconfig.FOLDER_ICON=resources/images/plugin/notificationconfig
# media configuration form
plugin.mediaconfig.PLUGIN_ICON=resources/images/impl/media/media.png
# otr plugin icons
plugin.otr.ENCRYPTED_ICON=resources/images/plugin/otr/encrypted.png
plugin.otr.DECRYPTED_ICON=resources/images/plugin/otr/decrypted.png

@ -169,6 +169,27 @@ public void sendInstantMessage(Contact to, Message message)
else
messageContent = message.getContent();
MessageDeliveredEvent msgDeliveryPendingEvt = new MessageDeliveredEvent(
message, to, System.currentTimeMillis());
OperationSetInstantMessageTransformIcqImpl messageTransform =
(OperationSetInstantMessageTransformIcqImpl)icqProvider.getOperationSet(OperationSetInstantMessageTransform.class);
for (Map.Entry<Integer, Vector<TransformLayer>> entry : messageTransform.transformLayers
.entrySet())
{
for (Iterator<TransformLayer> iterator = entry.getValue().iterator(); iterator
.hasNext();)
{
TransformLayer transformLayer = (TransformLayer) iterator.next();
if (msgDeliveryPendingEvt != null)
msgDeliveryPendingEvt = transformLayer.messageDeliveryPending(msgDeliveryPendingEvt);
}
}
if (msgDeliveryPendingEvt == null)
return;
if (to.getPresenceStatus().isOnline())
{
//do not add the conversation listener in here. we'll add it
@ -178,10 +199,23 @@ public void sendInstantMessage(Contact to, Message message)
else
imConversation.sendMessage(new SimpleMessage(messageContent), true);
MessageDeliveredEvent msgDeliveredEvt
= new MessageDeliveredEvent(message, to, System.currentTimeMillis());
MessageDeliveredEvent msgDeliveredEvt = new MessageDeliveredEvent(
message, to, System.currentTimeMillis());
fireMessageEvent(msgDeliveredEvt);
for (Map.Entry<Integer, Vector<TransformLayer>> entry : messageTransform.transformLayers
.entrySet())
{
for (Iterator<TransformLayer> iterator = entry.getValue().iterator(); iterator
.hasNext();)
{
TransformLayer transformLayer = (TransformLayer) iterator.next();
if (msgDeliveredEvt != null)
msgDeliveredEvt = transformLayer.messageDelivered(msgDeliveredEvt);
}
}
if (msgDeliveredEvt != null)
fireMessageEvent(msgDeliveredEvt);
}
@ -258,9 +292,28 @@ public void handleResponse(SnacResponseEvent evt)
createMessage(offlineMsgCmd.getContents()),
sourceContact,
msgDate);
logger.debug("fire msg received for : " +
offlineMsgCmd.getContents());
fireMessageEvent(msgReceivedEvt);
OperationSetInstantMessageTransformIcqImpl messageTransform =
(OperationSetInstantMessageTransformIcqImpl)icqProvider.getOperationSet(OperationSetInstantMessageTransform.class);
for (Map.Entry<Integer, Vector<TransformLayer>> entry : messageTransform.transformLayers
.entrySet())
{
for (Iterator<TransformLayer> iterator = entry.getValue().iterator(); iterator
.hasNext();)
{
TransformLayer transformLayer = (TransformLayer) iterator.next();
if (msgReceivedEvt != null)
msgReceivedEvt = transformLayer.messageReceived(msgReceivedEvt);
}
}
if (msgReceivedEvt != null)
{
logger.debug("fire msg received for : " +
offlineMsgCmd.getContents());
fireMessageEvent(msgReceivedEvt);
}
}
else if (snac instanceof OfflineMsgDoneCmd)
{
@ -527,11 +580,30 @@ public void gotMessage(Conversation conversation, MessageInfo minfo)
msgDate = current;
MessageReceivedEvent msgReceivedEvt
= new MessageReceivedEvent(
newMessage, sourceContact , msgDate );
MessageReceivedEvent msgReceivedEvt =
new MessageReceivedEvent(newMessage, sourceContact, msgDate);
fireMessageEvent(msgReceivedEvt);
OperationSetInstantMessageTransformIcqImpl messageTransform =
(OperationSetInstantMessageTransformIcqImpl)icqProvider.getOperationSet(OperationSetInstantMessageTransform.class);
for (Map.Entry<Integer, Vector<TransformLayer>> entry : messageTransform.transformLayers
.entrySet())
{
for (Iterator<TransformLayer> iterator = entry.getValue().iterator(); iterator
.hasNext();)
{
TransformLayer transformLayer = (TransformLayer) iterator.next();
if (msgReceivedEvt != null)
msgReceivedEvt = transformLayer.messageReceived(msgReceivedEvt);
}
}
if (msgReceivedEvt != null)
{
logger.debug("fire msg received for : " +
newMessage);
fireMessageEvent(msgReceivedEvt);
}
}
public void sentOtherEvent(Conversation conversation,

@ -0,0 +1,62 @@
package net.java.sip.communicator.impl.protocol.icq;
import java.util.*;
import net.java.sip.communicator.service.protocol.*;
public class OperationSetInstantMessageTransformIcqImpl
implements OperationSetInstantMessageTransform
{
public final Map<Integer, Vector<TransformLayer>> transformLayers =
new Hashtable<Integer, Vector<TransformLayer>>();
private final int defaultPriority = 1;
@Override
public void addTransformLayer(TransformLayer transformLayer)
{
this.addTransformLayer(defaultPriority, transformLayer);
}
@Override
public void addTransformLayer(int priority, TransformLayer transformLayer)
{
synchronized (transformLayers)
{
if (!transformLayers.containsKey(defaultPriority))
transformLayers.put(defaultPriority,
new Vector<TransformLayer>());
transformLayers.get(defaultPriority).add(transformLayer);
}
}
@Override
public boolean containsLayer(TransformLayer layer)
{
synchronized (transformLayers)
{
for (Map.Entry<Integer, Vector<TransformLayer>> entry : transformLayers
.entrySet())
{
if (entry.getValue().contains(layer))
return true;
}
}
return false;
}
@Override
public void removeTransformLayer(TransformLayer transformLayer)
{
synchronized (transformLayers)
{
for (Map.Entry<Integer, Vector<TransformLayer>> entry : transformLayers
.entrySet())
{
entry.getValue().remove(transformLayer);
}
}
}
}

@ -455,6 +455,9 @@ protected void initialize(String screenname,
if(IcqAccountID.isAIM(accountID.getAccountProperties()))
USING_ICQ = false;
supportedOperationSets.put(OperationSetInstantMessageTransform.class.getName(),
new OperationSetInstantMessageTransformIcqImpl());
//initialize the presence operationset
OperationSetPersistentPresence persistentPresence =
new OperationSetPersistentPresenceIcqImpl(this, screenname);

@ -195,7 +195,29 @@ public void processMessage(
org.jivesoftware.smack.packet.Message msg =
new org.jivesoftware.smack.packet.Message();
String content = message.getContent();
MessageDeliveredEvent msgDeliveryPendingEvt
= new MessageDeliveredEvent(
message, to, System.currentTimeMillis());
OperationSetInstantMessageTransformJabberImpl messageTransform =
(OperationSetInstantMessageTransformJabberImpl)jabberProvider.getOperationSet(OperationSetInstantMessageTransform.class);
for (Map.Entry<Integer, Vector<TransformLayer>> entry : messageTransform.transformLayers
.entrySet())
{
for (Iterator<TransformLayer> iterator = entry.getValue().iterator(); iterator
.hasNext();)
{
TransformLayer transformLayer = (TransformLayer) iterator.next();
if (msgDeliveryPendingEvt != null)
msgDeliveryPendingEvt = transformLayer.messageDeliveryPending(msgDeliveryPendingEvt);
}
}
if (msgDeliveryPendingEvt == null)
return;
String content = msgDeliveryPendingEvt.getSourceMessage().getContent();
if(message.getContentType().equals(HTML_MIME_TYPE))
{
@ -220,14 +242,27 @@ public void processMessage(
MessageEventManager.
addNotificationsRequests(msg, true, false, false, true);
chat.sendMessage(msg);
MessageDeliveredEvent msgDeliveredEvt
= new MessageDeliveredEvent(
message, to, System.currentTimeMillis());
fireMessageEvent(msgDeliveredEvt);
for (Map.Entry<Integer, Vector<TransformLayer>> entry : messageTransform.transformLayers
.entrySet())
{
for (Iterator<TransformLayer> iterator = entry.getValue().iterator(); iterator
.hasNext();)
{
TransformLayer transformLayer = (TransformLayer) iterator.next();
if (msgDeliveredEvt != null)
msgDeliveredEvt = transformLayer.messageDelivered(msgDeliveredEvt);
}
}
if (msgDeliveredEvt != null)
fireMessageEvent(msgDeliveredEvt);
}
catch (XMPPException ex)
{
@ -392,7 +427,24 @@ public void processPacket(Packet packet)
new MessageDeliveryFailedEvent(newMessage,
sourceContact,
errorResultCode);
fireMessageEvent(ev);
OperationSetInstantMessageTransformJabberImpl messageTransform =
(OperationSetInstantMessageTransformJabberImpl)jabberProvider.getOperationSet(OperationSetInstantMessageTransform.class);
for (Map.Entry<Integer, Vector<TransformLayer>> entry : messageTransform.transformLayers
.entrySet())
{
for (Iterator<TransformLayer> iterator = entry.getValue().iterator(); iterator
.hasNext();)
{
TransformLayer transformLayer = (TransformLayer) iterator.next();
if (ev != null)
ev = transformLayer.messageDeliveryFailed(ev);
}
}
if (ev != null)
fireMessageEvent(ev);
return;
}
@ -411,7 +463,23 @@ public void processPacket(Packet packet)
= new MessageReceivedEvent(
newMessage, sourceContact , System.currentTimeMillis() );
fireMessageEvent(msgReceivedEvt);
OperationSetInstantMessageTransformJabberImpl messageTransform =
(OperationSetInstantMessageTransformJabberImpl)jabberProvider.getOperationSet(OperationSetInstantMessageTransform.class);
for (Map.Entry<Integer, Vector<TransformLayer>> entry : messageTransform.transformLayers
.entrySet())
{
for (Iterator<TransformLayer> iterator = entry.getValue().iterator(); iterator
.hasNext();)
{
TransformLayer transformLayer = (TransformLayer) iterator.next();
if (msgReceivedEvt != null)
msgReceivedEvt = transformLayer.messageReceived(msgReceivedEvt);
}
}
if (msgReceivedEvt != null)
fireMessageEvent(msgReceivedEvt);
}
}

@ -0,0 +1,62 @@
package net.java.sip.communicator.impl.protocol.jabber;
import java.util.*;
import net.java.sip.communicator.service.protocol.*;
public class OperationSetInstantMessageTransformJabberImpl
implements OperationSetInstantMessageTransform
{
public final Map<Integer, Vector<TransformLayer>> transformLayers =
new Hashtable<Integer, Vector<TransformLayer>>();
private final int defaultPriority = 1;
@Override
public void addTransformLayer(TransformLayer transformLayer)
{
this.addTransformLayer(defaultPriority, transformLayer);
}
@Override
public void addTransformLayer(int priority, TransformLayer transformLayer)
{
synchronized (transformLayers)
{
if (!transformLayers.containsKey(defaultPriority))
transformLayers.put(defaultPriority,
new Vector<TransformLayer>());
transformLayers.get(defaultPriority).add(transformLayer);
}
}
@Override
public boolean containsLayer(TransformLayer layer)
{
synchronized (transformLayers)
{
for (Map.Entry<Integer, Vector<TransformLayer>> entry : transformLayers
.entrySet())
{
if (entry.getValue().contains(layer))
return true;
}
}
return false;
}
@Override
public void removeTransformLayer(TransformLayer transformLayer)
{
synchronized (transformLayers)
{
for (Map.Entry<Integer, Vector<TransformLayer>> entry : transformLayers
.entrySet())
{
entry.getValue().remove(transformLayer);
}
}
}
}

@ -642,6 +642,13 @@ protected void initialize(String screenname,
OperationSetFileTransfer.class.getName(),
fileTransfer);
OperationSetInstantMessageTransform messageTransform
= new OperationSetInstantMessageTransformJabberImpl();
supportedOperationSets.put(
OperationSetInstantMessageTransform.class.getName(),
messageTransform);
// Include features we're supporting in plus of the four that
// included by smack itself:
// http://jabber.org/protocol/si/profile/file-transfer

@ -7,6 +7,7 @@
package net.java.sip.communicator.impl.protocol.msn;
import java.text.*;
import java.util.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.service.protocol.event.*;
@ -116,15 +117,51 @@ public void sendInstantMessage(Contact to, Message message)
"The specified contact is not an MSN contact."
+ to);
MessageDeliveredEvent msgDeliveryPendingEvt
= new MessageDeliveredEvent(
message, to, System.currentTimeMillis());
OperationSetInstantMessageTransformMsnImpl messageTransform =
(OperationSetInstantMessageTransformMsnImpl)msnProvider.getOperationSet(OperationSetInstantMessageTransform.class);
for (Map.Entry<Integer, Vector<TransformLayer>> entry : messageTransform.transformLayers
.entrySet())
{
for (Iterator<TransformLayer> iterator = entry.getValue().iterator(); iterator
.hasNext();)
{
TransformLayer transformLayer = (TransformLayer) iterator.next();
if (msgDeliveryPendingEvt != null)
msgDeliveryPendingEvt = transformLayer.messageDeliveryPending(msgDeliveryPendingEvt);
}
}
if (msgDeliveryPendingEvt == null)
return;
msnProvider.getMessenger().
sendText(
((ContactMsnImpl)to).getSourceContact().getEmail(),
message.getContent()
msgDeliveryPendingEvt.getSourceMessage().getContent()
);
MessageDeliveredEvent msgDeliveredEvt
= new MessageDeliveredEvent(message, to, System.currentTimeMillis());
fireMessageEvent(msgDeliveredEvt);
for (Map.Entry<Integer, Vector<TransformLayer>> entry : messageTransform.transformLayers
.entrySet())
{
for (Iterator<TransformLayer> iterator = entry.getValue().iterator(); iterator
.hasNext();)
{
TransformLayer transformLayer = (TransformLayer) iterator.next();
if (msgDeliveredEvt != null)
msgDeliveredEvt = transformLayer.messageDelivered(msgDeliveredEvt);
}
}
if (msgDeliveredEvt != null)
fireMessageEvent(msgDeliveredEvt);
}
/**
@ -206,8 +243,24 @@ public void instantMessageReceived(MsnSwitchboard switchboard,
MessageReceivedEvent msgReceivedEvt
= new MessageReceivedEvent(
newMessage, sourceContact , System.currentTimeMillis() );
fireMessageEvent(msgReceivedEvt);
OperationSetInstantMessageTransformMsnImpl messageTransform =
(OperationSetInstantMessageTransformMsnImpl)msnProvider.getOperationSet(OperationSetInstantMessageTransform.class);
for (Map.Entry<Integer, Vector<TransformLayer>> entry : messageTransform.transformLayers
.entrySet())
{
for (Iterator<TransformLayer> iterator = entry.getValue().iterator(); iterator
.hasNext();)
{
TransformLayer transformLayer = (TransformLayer) iterator.next();
if (msgReceivedEvt != null)
msgReceivedEvt = transformLayer.messageReceived(msgReceivedEvt);
}
}
if (msgReceivedEvt != null)
fireMessageEvent(msgReceivedEvt);
}
/**

@ -0,0 +1,62 @@
package net.java.sip.communicator.impl.protocol.msn;
import java.util.*;
import net.java.sip.communicator.service.protocol.*;
public class OperationSetInstantMessageTransformMsnImpl
implements OperationSetInstantMessageTransform
{
public final Map<Integer, Vector<TransformLayer>> transformLayers =
new Hashtable<Integer, Vector<TransformLayer>>();
private final int defaultPriority = 1;
@Override
public void addTransformLayer(TransformLayer transformLayer)
{
this.addTransformLayer(defaultPriority, transformLayer);
}
@Override
public void addTransformLayer(int priority, TransformLayer transformLayer)
{
synchronized (transformLayers)
{
if (!transformLayers.containsKey(defaultPriority))
transformLayers.put(defaultPriority,
new Vector<TransformLayer>());
transformLayers.get(defaultPriority).add(transformLayer);
}
}
@Override
public boolean containsLayer(TransformLayer layer)
{
synchronized (transformLayers)
{
for (Map.Entry<Integer, Vector<TransformLayer>> entry : transformLayers
.entrySet())
{
if (entry.getValue().contains(layer))
return true;
}
}
return false;
}
@Override
public void removeTransformLayer(TransformLayer transformLayer)
{
synchronized (transformLayers)
{
for (Map.Entry<Integer, Vector<TransformLayer>> entry : transformLayers
.entrySet())
{
entry.getValue().remove(transformLayer);
}
}
}
}

@ -261,9 +261,12 @@ protected void initialize(String screenname,
{
this.accountID = accountID;
supportedOperationSets.put(OperationSetInstantMessageTransform.class.getName(),
new OperationSetInstantMessageTransformMsnImpl());
//initialize the presence operationset
persistentPresence = new OperationSetPersistentPresenceMsnImpl(this);
supportedOperationSets.put(
OperationSetPersistentPresence.class.getName(),
persistentPresence);

@ -142,7 +142,30 @@ public void sendInstantMessage(Contact to, Message message)
{
String toUserID = ((ContactYahooImpl) to).getID();
byte[] msgBytesToBeSent = message.getContent().trim().getBytes();
MessageDeliveredEvent msgDeliveryPendingEvt
= new MessageDeliveredEvent(
message, to, System.currentTimeMillis());
OperationSetInstantMessageTransformYahooImpl messageTransform =
(OperationSetInstantMessageTransformYahooImpl)yahooProvider.getOperationSet(OperationSetInstantMessageTransform.class);
for (Map.Entry<Integer, Vector<TransformLayer>> entry : messageTransform.transformLayers
.entrySet())
{
for (Iterator<TransformLayer> iterator = entry.getValue().iterator(); iterator
.hasNext();)
{
TransformLayer transformLayer = (TransformLayer) iterator.next();
if (msgDeliveryPendingEvt != null)
msgDeliveryPendingEvt = transformLayer.messageDeliveryPending(msgDeliveryPendingEvt);
}
}
if (msgDeliveryPendingEvt == null)
return;
byte[] msgBytesToBeSent = msgDeliveryPendingEvt.getSourceMessage().
getContent().trim().getBytes();
// split the message in parts with max allowed length
// and send them all
@ -173,10 +196,23 @@ public void sendInstantMessage(Contact to, Message message)
}
MessageDeliveredEvent msgDeliveredEvt
= new MessageDeliveredEvent(
message, to, System.currentTimeMillis());
fireMessageEvent(msgDeliveredEvt);
= new MessageDeliveredEvent(
message, to, System.currentTimeMillis());
for (Map.Entry<Integer, Vector<TransformLayer>> entry : messageTransform.transformLayers
.entrySet())
{
for (Iterator<TransformLayer> iterator = entry.getValue().iterator(); iterator
.hasNext();)
{
TransformLayer transformLayer = (TransformLayer) iterator.next();
if (msgDeliveredEvt != null)
msgDeliveredEvt = transformLayer.messageDelivered(msgDeliveredEvt);
}
}
if (msgDeliveredEvt != null)
fireMessageEvent(msgDeliveredEvt);
}
while(msgBytesToBeSent.length > MAX_MESSAGE_LENGTH);
}
@ -188,7 +224,24 @@ public void sendInstantMessage(Contact to, Message message)
message,
to,
MessageDeliveryFailedEvent.NETWORK_FAILURE);
fireMessageEvent(evt);
OperationSetInstantMessageTransformYahooImpl messageTransform =
(OperationSetInstantMessageTransformYahooImpl)yahooProvider.getOperationSet(OperationSetInstantMessageTransform.class);
for (Map.Entry<Integer, Vector<TransformLayer>> entry : messageTransform.transformLayers
.entrySet())
{
for (Iterator<TransformLayer> iterator = entry.getValue().iterator(); iterator
.hasNext();)
{
TransformLayer transformLayer = (TransformLayer) iterator.next();
if (evt != null)
evt = transformLayer.messageDeliveryFailed(evt);
}
}
if (evt != null)
fireMessageEvent(evt);
return;
}
}
@ -430,11 +483,27 @@ private void handleNewMessage(SessionEvent ev)
.createVolatileContact(ev.getFrom());
}
MessageReceivedEvent msgReceivedEvt
= new MessageReceivedEvent(
newMessage, sourceContact , System.currentTimeMillis() );
fireMessageEvent(msgReceivedEvt);
MessageReceivedEvent msgReceivedEvt
= new MessageReceivedEvent(
newMessage, sourceContact , System.currentTimeMillis() );
OperationSetInstantMessageTransformYahooImpl messageTransform =
(OperationSetInstantMessageTransformYahooImpl)yahooProvider.getOperationSet(OperationSetInstantMessageTransform.class);
for (Map.Entry<Integer, Vector<TransformLayer>> entry : messageTransform.transformLayers
.entrySet())
{
for (Iterator<TransformLayer> iterator = entry.getValue().iterator(); iterator
.hasNext();)
{
TransformLayer transformLayer = (TransformLayer) iterator.next();
if (msgReceivedEvt != null)
msgReceivedEvt = transformLayer.messageReceived(msgReceivedEvt);
}
}
if (msgReceivedEvt != null)
fireMessageEvent(msgReceivedEvt);
}
}

@ -0,0 +1,62 @@
package net.java.sip.communicator.impl.protocol.yahoo;
import java.util.*;
import net.java.sip.communicator.service.protocol.*;
public class OperationSetInstantMessageTransformYahooImpl
implements OperationSetInstantMessageTransform
{
public final Map<Integer, Vector<TransformLayer>> transformLayers =
new Hashtable<Integer, Vector<TransformLayer>>();
private final int defaultPriority = 1;
@Override
public void addTransformLayer(TransformLayer transformLayer)
{
this.addTransformLayer(defaultPriority, transformLayer);
}
@Override
public void addTransformLayer(int priority, TransformLayer transformLayer)
{
synchronized (transformLayers)
{
if (!transformLayers.containsKey(defaultPriority))
transformLayers.put(defaultPriority,
new Vector<TransformLayer>());
transformLayers.get(defaultPriority).add(transformLayer);
}
}
@Override
public boolean containsLayer(TransformLayer layer)
{
synchronized (transformLayers)
{
for (Map.Entry<Integer, Vector<TransformLayer>> entry : transformLayers
.entrySet())
{
if (entry.getValue().contains(layer))
return true;
}
}
return false;
}
@Override
public void removeTransformLayer(TransformLayer transformLayer)
{
synchronized (transformLayers)
{
for (Map.Entry<Integer, Vector<TransformLayer>> entry : transformLayers
.entrySet())
{
entry.getValue().remove(transformLayer);
}
}
}
}

@ -318,6 +318,10 @@ protected void initialize(String screenname,
{
this.accountID = accountID;
supportedOperationSets.put(
OperationSetInstantMessageTransform.class.getName(),
new OperationSetInstantMessageTransformYahooImpl());
//initialize the presence operationset
persistentPresence = new OperationSetPersistentPresenceYahooImpl(this);

@ -0,0 +1,159 @@
package net.java.sip.communicator.plugin.otr;
import java.util.*;
import net.java.sip.communicator.service.gui.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.service.resources.*;
import net.java.sip.communicator.util.*;
import org.osgi.framework.*;
public class OtrActivator
implements BundleActivator, ServiceListener
{
private BundleContext bundleContext = null;
private OtrTransformLayer transformLayer = new OtrTransformLayer();
private static Logger logger = Logger.getLogger(OtrActivator.class);
@Override
public void start(BundleContext bc) throws Exception
{
this.bundleContext = bc;
bc.addServiceListener(this);
ServiceReference[] protocolProviderRefs = null;
try
{
protocolProviderRefs =
bc.getServiceReferences(
ProtocolProviderService.class.getName(), null);
}
catch (InvalidSyntaxException ex)
{
logger.error("Error while retrieving service refs", ex);
return;
}
if (protocolProviderRefs != null)
{
logger.debug("Found " + protocolProviderRefs.length
+ " already installed providers.");
for (int i = 0; i < protocolProviderRefs.length; i++)
{
ProtocolProviderService provider =
(ProtocolProviderService) bc
.getService(protocolProviderRefs[i]);
this.handleProviderAdded(provider);
}
}
Hashtable<String, String> containerFilter =
new Hashtable<String, String>();
containerFilter.put(Container.CONTAINER_ID,
Container.CONTAINER_CONTACT_RIGHT_BUTTON_MENU.getID());
bundleContext.registerService(PluginComponent.class.getName(),
new OtrMenu(ResourceManagementServiceUtils
.getService(bc)), containerFilter);
}
private void handleProviderAdded(ProtocolProviderService provider)
{
OperationSetInstantMessageTransform opSetMessageTransform =
(OperationSetInstantMessageTransform) provider
.getOperationSet(OperationSetInstantMessageTransform.class);
if (opSetMessageTransform != null)
{
opSetMessageTransform.addTransformLayer(transformLayer);
}
else
{
logger.trace("Service did not have a transform op. set.");
}
}
@Override
public void stop(BundleContext bc) throws Exception
{
// start listening for newly register or removed protocol providers
bc.removeServiceListener(this);
ServiceReference[] protocolProviderRefs = null;
try
{
protocolProviderRefs =
bc.getServiceReferences(
ProtocolProviderService.class.getName(), null);
}
catch (InvalidSyntaxException ex)
{
// this shouldn't happen since we're providing no parameter string
// but let's log just in case.
logger.error("Error while retrieving service refs", ex);
return;
}
// in case we found any
if (protocolProviderRefs != null)
{
for (int i = 0; i < protocolProviderRefs.length; i++)
{
ProtocolProviderService provider =
(ProtocolProviderService) bc
.getService(protocolProviderRefs[i]);
this.handleProviderRemoved(provider);
}
}
}
private void handleProviderRemoved(ProtocolProviderService provider)
{
// check whether the provider has a basic im operation set
OperationSetInstantMessageTransform opSetMessageTransform =
(OperationSetInstantMessageTransform) provider
.getOperationSet(OperationSetInstantMessageTransform.class);
if (opSetMessageTransform != null)
{
opSetMessageTransform.removeTransformLayer(transformLayer);
}
}
@Override
public void serviceChanged(ServiceEvent serviceEvent)
{
Object sService =
bundleContext.getService(serviceEvent.getServiceReference());
logger.trace("Received a service event for: "
+ sService.getClass().getName());
// we don't care if the source service is not a protocol provider
if (!(sService instanceof ProtocolProviderService))
{
return;
}
logger.debug("Service is a protocol provider.");
if (serviceEvent.getType() == ServiceEvent.REGISTERED)
{
logger.debug("Handling registration of a new Protocol Provider.");
this.handleProviderAdded((ProtocolProviderService) sService);
}
else if (serviceEvent.getType() == ServiceEvent.UNREGISTERING)
{
this.handleProviderRemoved((ProtocolProviderService) sService);
}
}
}

@ -0,0 +1,93 @@
package net.java.sip.communicator.plugin.otr;
import java.awt.Component;
import java.awt.event.*;
import javax.swing.*;
import net.java.sip.communicator.service.contactlist.*;
import net.java.sip.communicator.service.gui.*;
import net.java.sip.communicator.service.resources.*;
@SuppressWarnings("serial")
public class OtrMenu
extends JMenu
implements PluginComponent, ActionListener
{
private static final String imageID = "plugin.otr.DECRYPTED_ICON";
private ResourceManagementService resourceService;
public OtrMenu(ResourceManagementService resourceService)
{
super("Encryption");
this.setToolTipText("Options for OTR Encryption");
if (resourceService != null)
this.setIcon(resourceService.getImage(imageID));
// TODO Internationalize Strings...
JMenuItem mitmStartOtr = new JMenuItem("Start Private Conversation");
JMenuItem mitmEndOtr = new JMenuItem("End Private Conversation");
JMenuItem mitmRefreshOtr =
new JMenuItem("Refresh Private Conversation");
JMenuItem mitmAuthenticateBuddy = new JMenuItem("Authenticate Buddy");
JMenuItem mitmWhatsThis = new JMenuItem("What's this?");
// Shown if we don't have an OTR session.
this.add(mitmStartOtr);
// Shown if we have an OTR session.
this.add(mitmEndOtr);
this.add(mitmRefreshOtr);
this.add(mitmAuthenticateBuddy);
this.add(mitmWhatsThis);
}
@Override
public String getConstraints()
{
return null;
}
public Component getComponent()
{
return this;
}
@Override
public Container getContainer()
{
return Container.CONTAINER_CONTACT_RIGHT_BUTTON_MENU;
}
@Override
public int getPositionIndex()
{
return -1;
}
@Override
public boolean isNativeComponent()
{
return false;
}
private MetaContact metaContact;
@Override
public void setCurrentContact(MetaContact metaContact)
{
this.metaContact = metaContact;
}
@Override
public void setCurrentContactGroup(MetaContactGroup metaGroup)
{
}
@Override
public void actionPerformed(ActionEvent e)
{
}
}

@ -0,0 +1,201 @@
package net.java.sip.communicator.plugin.otr;
import java.security.*;
import java.util.*;
import net.java.otr4j.*;
import net.java.otr4j.message.MessageConstants;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.service.protocol.event.*;
import net.java.sip.communicator.util.*;
public class OtrTransformLayer
implements TransformLayer
{
private static Logger logger = Logger.getLogger(TransformLayer.class);
private UserState us = new UserState(new OTR4jListener()
{
@Override
public void showWarning(String warn)
{
logger.warn(warn);
}
@Override
public void showError(String err)
{
logger.error(err);
}
@Override
public void injectMessage(String messageText, String account,
String user, String protocol)
{
Contact contact = getContact(account, user, protocol);
OperationSetBasicInstantMessaging imOpSet =
(OperationSetBasicInstantMessaging) contact
.getProtocolProvider().getOperationSet(
OperationSetBasicInstantMessaging.class);
Message message = imOpSet.createMessage(messageText);
imOpSet.sendInstantMessage(contact, message);
}
@Override
public int getPolicy(ConnContext arg0)
{
return PolicyConstants.ALLOW_V2;
}
@Override
public KeyPair getKeyPair(String arg0, String arg1)
throws NoSuchAlgorithmException
{
try
{
return CryptoUtils.generateDsaKeyPair();
}
catch (Exception e)
{
return null;
}
}
});
private List<Contact> contacts = new Vector<Contact>();
private Contact getContact(String account, String user, String protocol)
{
for (Contact c : contacts)
{
String cuser = c.getAddress();
ProtocolProviderService cprotoProvider = c.getProtocolProvider();
String caccount = cprotoProvider.getAccountID().toString();
String cprotocol = cprotoProvider.getProtocolName();
if (user.equals(cuser) && account.equals(caccount)
&& protocol.equals(cprotocol))
return c;
}
return null;
}
private void addContact(Contact contact)
{
if (contact == null)
return;
String user = contact.getAddress();
ProtocolProviderService protoProvider = contact.getProtocolProvider();
String account = protoProvider.getAccountID().toString();
String protocol = protoProvider.getProtocolName();
for (Contact c : contacts)
{
String cuser = c.getAddress();
ProtocolProviderService cprotoProvider = c.getProtocolProvider();
String caccount = cprotoProvider.getAccountID().toString();
String cprotocol = cprotoProvider.getProtocolName();
if (user.equals(cuser) && account.equals(caccount)
&& protocol.equals(cprotocol))
return;
}
contacts.add(contact);
}
@Override
public MessageDeliveredEvent messageDelivered(MessageDeliveredEvent evt)
{
if (evt.getSourceMessage().getContent().contains(MessageConstants.BASE_HEAD))
return null;
else
return evt;
}
@Override
public MessageDeliveryFailedEvent messageDeliveryFailed(
MessageDeliveryFailedEvent evt)
{
return evt;
}
@Override
public MessageDeliveredEvent messageDeliveryPending(
MessageDeliveredEvent evt)
{
Contact contact = evt.getDestinationContact();
addContact(contact);
String user = contact.getAddress();
ProtocolProviderService protoProvider = contact.getProtocolProvider();
String account = protoProvider.getAccountID().toString();
String protocol = protoProvider.getProtocolName();
Message msg = evt.getSourceMessage();
String msgContent = msg.getContent();
OperationSetBasicInstantMessaging imOpSet =
(OperationSetBasicInstantMessaging) contact.getProtocolProvider()
.getOperationSet(OperationSetBasicInstantMessaging.class);
String processedMessageContent =
us.handleSendingMessage(user, account, protocol, msgContent);
if (processedMessageContent == null
|| processedMessageContent.length() < 1)
return null;
if (processedMessageContent.equals(msgContent))
return evt;
Message processedMessage =
imOpSet.createMessage(processedMessageContent);
MessageDeliveredEvent processedEvent =
new MessageDeliveredEvent(processedMessage, contact, evt
.getTimestamp());
return processedEvent;
}
@Override
public MessageReceivedEvent messageReceived(MessageReceivedEvent evt)
{
Contact contact = evt.getSourceContact();
addContact(contact);
String user = contact.getAddress();
ProtocolProviderService protoProvider = contact.getProtocolProvider();
String account = protoProvider.getAccountID().toString();
String protocol = protoProvider.getProtocolName();
Message msg = evt.getSourceMessage();
String msgContent = msg.getContent();
OperationSetBasicInstantMessaging imOpSet =
(OperationSetBasicInstantMessaging) contact.getProtocolProvider()
.getOperationSet(OperationSetBasicInstantMessaging.class);
String processedMessageContent =
us.handleReceivingMessage(user, account, protocol, msgContent);
if (processedMessageContent == null
|| processedMessageContent.length() < 1)
return null;
if (processedMessageContent.equals(msgContent))
return evt;
Message processedMessage =
imOpSet.createMessage(processedMessageContent);
MessageReceivedEvent processedEvent =
new MessageReceivedEvent(processedMessage, contact, evt
.getTimestamp());
return processedEvent;
}
}

@ -0,0 +1,25 @@
Bundle-Activator: net.java.sip.communicator.plugin.otr.OtrActivator
Bundle-Name: OTR (Off-the-Record) Messaging
Bundle-Description: Support for secure, Off The Record messaging in SIP Communicator
Bundle-Vendor: sip-communicator.org
Bundle-Version: 0.0.1
System-Bundle: yes
Import-Package: org.osgi.framework,
net.java.sip.communicator.util,
net.java.sip.communicator.service.gui,
net.java.sip.communicator.service.protocol,
net.java.sip.communicator.service.protocol.event,
net.java.sip.communicator.service.contactlist,
net.java.sip.communicator.service.resources,
javax.swing,
javax.crypto,
javax.crypto.interfaces,
javax.crypto.spec,
org.bouncycastle.crypto,
org.bouncycastle.crypto.generators,
org.bouncycastle.crypto.params,
org.bouncycastle.crypto.signers,
org.bouncycastle.crypto.engines,
org.bouncycastle.crypto.modes,
org.bouncycastle.util,
org.bouncycastle.util.encoders

@ -23,6 +23,7 @@
*
*/
public interface OperationSetInstantMessageTransform
extends OperationSet
{
/**
* Adds a transformation layer to this protocol provider using a default

Loading…
Cancel
Save