summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTarun Gupta <tarun1995gupta@gmail.com>2015-07-24 17:01:42 (GMT)
committerNick Hudson <nick.hudson@isode.com>2015-08-14 15:32:08 (GMT)
commit0a1f7199e26523dd2693f44a5841c5434cc9000d (patch)
tree8f28ebb20fbe60f420ea25055955ac3d246db549 /src/com/isode/stroke/session/BasicSessionStream.java
parentdc2b35bee48261e8b06e12bd82a434af118e035e (diff)
downloadstroke-0a1f7199e26523dd2693f44a5841c5434cc9000d.zip
stroke-0a1f7199e26523dd2693f44a5841c5434cc9000d.tar.bz2
Completes TLS & Session.
Adds TLSError and TLSOptions. Updates BasicSessionStream, SessionStream and Session. Updates Client and Components to accomodate changes in TLS. Also completes TLSLayer in StreamStack which was pending due to TLS port. License: This patch is BSD-licensed, see Documentation/Licenses/BSD-simplified.txt for details. Test-Information: Tests added for Certificate and ServerIdentityVerifier. Test updated for ComponentSession. All tests pass. Change-Id: I34a8fe068c1e8af5348cc4ab49d3d1ed118ae833
Diffstat (limited to 'src/com/isode/stroke/session/BasicSessionStream.java')
-rw-r--r--src/com/isode/stroke/session/BasicSessionStream.java73
1 files changed, 53 insertions, 20 deletions
diff --git a/src/com/isode/stroke/session/BasicSessionStream.java b/src/com/isode/stroke/session/BasicSessionStream.java
index 9ba862d..4048363 100644
--- a/src/com/isode/stroke/session/BasicSessionStream.java
+++ b/src/com/isode/stroke/session/BasicSessionStream.java
@@ -20,6 +20,7 @@ import com.isode.stroke.parser.PayloadParserFactoryCollection;
import com.isode.stroke.serializer.PayloadSerializerCollection;
import com.isode.stroke.signals.Slot;
import com.isode.stroke.signals.Slot1;
+import com.isode.stroke.signals.SignalConnection;
import com.isode.stroke.streamstack.CompressionLayer;
import com.isode.stroke.streamstack.ConnectionLayer;
import com.isode.stroke.streamstack.StreamStack;
@@ -29,6 +30,8 @@ import com.isode.stroke.streamstack.XMPPLayer;
import com.isode.stroke.tls.Certificate;
import com.isode.stroke.tls.CertificateVerificationError;
import com.isode.stroke.tls.TLSContextFactory;
+import com.isode.stroke.tls.TLSOptions;
+import com.isode.stroke.tls.TLSError;
public class BasicSessionStream extends SessionStream {
@@ -38,7 +41,8 @@ public class BasicSessionStream extends SessionStream {
PayloadParserFactoryCollection payloadParserFactories,
PayloadSerializerCollection payloadSerializers,
TLSContextFactory tlsContextFactory,
- TimerFactory timerFactory) {
+ TimerFactory timerFactory,
+ TLSOptions tlsOptions) {
available = false;
this.connection = connection;
this.payloadParserFactories = payloadParserFactories;
@@ -52,40 +56,40 @@ public class BasicSessionStream extends SessionStream {
this.compressionLayer = null;
this.tlsLayer = null;
this.whitespacePingLayer = null;
-
+ this.tlsOptions_ = tlsOptions;
xmppLayer = new XMPPLayer(payloadParserFactories, payloadSerializers, streamType);
- xmppLayer.onStreamStart.connect(new Slot1<ProtocolHeader>() {
+ onStreamStartConnection = xmppLayer.onStreamStart.connect(new Slot1<ProtocolHeader>() {
public void call(ProtocolHeader p1) {
handleStreamStartReceived(p1);
}
});
- xmppLayer.onElement.connect(new Slot1<Element>() {
+ onElementConnection = xmppLayer.onElement.connect(new Slot1<Element>() {
public void call(Element p1) {
handleElementReceived(p1);
}
});
- xmppLayer.onError.connect(new Slot() {
+ onErrorConnection = xmppLayer.onError.connect(new Slot() {
public void call() {
handleXMPPError();
}
});
- xmppLayer.onDataRead.connect(new Slot1<SafeByteArray>() {
+ onDataReadConnection = xmppLayer.onDataRead.connect(new Slot1<SafeByteArray>() {
public void call(SafeByteArray p1) {
handleDataRead(p1);
}
});
- xmppLayer.onWriteData.connect(new Slot1<SafeByteArray>() {
+ onWriteDataConnection = xmppLayer.onWriteData.connect(new Slot1<SafeByteArray>() {
public void call(SafeByteArray p1) {
handleDataWritten(p1);
}
});
- connection.onDisconnected.connect(new Slot1<Connection.Error>() {
+ onDisconnectedConnection = connection.onDisconnected.connect(new Slot1<Connection.Error>() {
public void call(Connection.Error p1) {
handleConnectionFinished(p1);
@@ -99,6 +103,28 @@ public class BasicSessionStream extends SessionStream {
}
+ /**
+ * User will have to call disconnect() method to free up the resources.
+ */
+ @Override
+ public void disconnect() {
+ if(tlsLayer != null) {
+ onErrorConnection.disconnect();
+ onConnectedConnection.disconnect();
+ tlsLayer = null;
+ }
+ whitespacePingLayer = null;
+ streamStack = null;
+ onDisconnectedConnection.disconnect();
+ connectionLayer = null;
+ onStreamStartConnection.disconnect();
+ onElementConnection.disconnect();
+ onErrorConnection.disconnect();
+ onDataReadConnection.disconnect();
+ onWriteDataConnection.disconnect();
+ xmppLayer = null;
+ }
+
public void writeHeader(ProtocolHeader header) {
assert available;
xmppLayer.writeHeader(header);
@@ -133,18 +159,18 @@ public class BasicSessionStream extends SessionStream {
public void addTLSEncryption() {
assert available;
- tlsLayer = new TLSLayer(tlsContextFactory);
+ tlsLayer = new TLSLayer(tlsContextFactory, tlsOptions_);
if (hasTLSCertificate() && !tlsLayer.setClientCertificate(getTLSCertificate())) {
- onClosed.emit(new Error(Error.Type.InvalidTLSCertificateError));
+ onClosed.emit(new SessionStreamError(SessionStreamError.Type.InvalidTLSCertificateError));
} else {
streamStack.addLayer(tlsLayer);
- tlsLayer.onError.connect(new Slot() {
+ onErrorConnection = tlsLayer.onError.connect(new Slot1<TLSError>() {
- public void call() {
- handleTLSError();
+ public void call(TLSError e) {
+ handleTLSError(e);
}
});
- tlsLayer.onConnected.connect(new Slot() {
+ onConnectedConnection = tlsLayer.onConnected.connect(new Slot() {
public void call() {
handleTLSConnected();
@@ -211,25 +237,25 @@ public class BasicSessionStream extends SessionStream {
private void handleXMPPError() {
available = false;
- onClosed.emit(new Error(Error.Type.ParseError));
+ onClosed.emit(new SessionStreamError(SessionStreamError.Type.ParseError));
}
private void handleTLSConnected() {
onTLSEncrypted.emit();
}
- private void handleTLSError() {
+ private void handleTLSError(TLSError error) {
available = false;
- onClosed.emit(new Error(Error.Type.TLSError));
+ onClosed.emit(error);
}
private void handleConnectionFinished(Connection.Error error) {
available = false;
if (Connection.Error.ReadError.equals(error)) {
- onClosed.emit(new Error(Error.Type.ConnectionReadError));
+ onClosed.emit(new SessionStreamError(SessionStreamError.Type.ConnectionReadError));
}
else if (error != null) {
- onClosed.emit(new Error(Error.Type.ConnectionWriteError));
+ onClosed.emit(new SessionStreamError(SessionStreamError.Type.ConnectionWriteError));
}
else {
onClosed.emit(null);
@@ -262,5 +288,12 @@ public class BasicSessionStream extends SessionStream {
private TLSLayer tlsLayer;
private WhitespacePingLayer whitespacePingLayer;
private StreamStack streamStack;
-
+ private TLSOptions tlsOptions_;
+ private SignalConnection onErrorConnection;
+ private SignalConnection onConnectedConnection;
+ private SignalConnection onDisconnectedConnection;
+ private SignalConnection onStreamStartConnection;
+ private SignalConnection onElementConnection;
+ private SignalConnection onDataReadConnection;
+ private SignalConnection onWriteDataConnection;
}