diff options
author | Nick Hudson <nick.hudson@isode.com> | 2012-03-13 09:32:17 (GMT) |
---|---|---|
committer | Kevin Smith <git@kismith.co.uk> | 2012-03-19 11:18:23 (GMT) |
commit | 843382f762f88f37d9b363fe3fc1418326894d21 (patch) | |
tree | 1a07cce8dc9989ac4988706d58e89f7246d7e91d /src/com | |
parent | 0a3221059218de8290ed5b6e16d3234a8ab40bad (diff) | |
download | stroke-843382f762f88f37d9b363fe3fc1418326894d21.zip stroke-843382f762f88f37d9b363fe3fc1418326894d21.tar.bz2 |
Update CoreClient to be a bit more in line with Swiften
This change
- renames the "onError" signal to be "onDisconnected" (as per change
59be74ec6 in Swiften)
- adds "setCertificateTrustChecker()" method and uses the supplied checker
when configuring TLS
Test-information:
My applications still work.
When I configure my server with a certificate that doesn't correspond
to the requirements in RFC 6120, my CertificateTrustChecker gets
called, and the session is either dropped or maintained depending on
what my checker returns.
Diffstat (limited to 'src/com')
-rw-r--r-- | src/com/isode/stroke/client/CoreClient.java | 39 | ||||
-rw-r--r-- | src/com/isode/stroke/examples/gui/StrokeGUI.java | 4 |
2 files changed, 32 insertions, 11 deletions
diff --git a/src/com/isode/stroke/client/CoreClient.java b/src/com/isode/stroke/client/CoreClient.java index 49b6df7..cae1bdb 100644 --- a/src/com/isode/stroke/client/CoreClient.java +++ b/src/com/isode/stroke/client/CoreClient.java @@ -8,6 +8,7 @@ */ package com.isode.stroke.client; +import com.isode.stroke.base.NotNull; import com.isode.stroke.elements.Message; import com.isode.stroke.elements.Presence; import com.isode.stroke.elements.Stanza; @@ -32,7 +33,6 @@ import com.isode.stroke.signals.Slot1; import com.isode.stroke.tls.CertificateTrustChecker; import com.isode.stroke.tls.CertificateVerificationError; import com.isode.stroke.tls.CertificateWithKey; -import com.isode.stroke.tls.PKCS12Certificate; import com.isode.stroke.tls.PlatformTLSFactories; /** @@ -159,11 +159,10 @@ public class CoreClient { if (connectorConnectFinishedConnection_ != null) { connectorConnectFinishedConnection_.disconnect(); } + connector_ = null; if (connection == null) { - if (!disconnectRequested_) { - onError.emit(new ClientError(ClientError.Type.ConnectionError)); - } + onDisconnected.emit(disconnectRequested_ ? null : new ClientError(ClientError.Type.ConnectionError)); } else { assert (connection_ == null); connection_ = connection; @@ -193,6 +192,7 @@ public class CoreClient { switch (options.useTLS) { case UseTLSWhenAvailable: session_.setUseTLS(ClientSession.UseTLS.UseTLSWhenAvailable); + session_.setCertificateTrustChecker(certificateTrustChecker); break; case NeverUseTLS: session_.setUseTLS(ClientSession.UseTLS.NeverUseTLS); @@ -232,6 +232,20 @@ public class CoreClient { public void setCertificate(CertificateWithKey certificate) { certificate_ = certificate; } + + /** + * Sets the certificate trust checker. If a server presents a certificate + * which does not conform to the requirements of RFC 6120, then the + * trust checker, if configured, will be called. If the trust checker + * says the certificate is trusted, then connecting will proceed; if + * not, the connection will end with an error. + * + * @param checker a CertificateTrustChecker that will be called when + * the server sends a TLS certificate that does not validate. + */ + public void setCertificateTrustChecker(CertificateTrustChecker checker) { + certificateTrustChecker = checker; + } private void handleSessionFinished(com.isode.stroke.base.Error error) { sessionFinishedConnection_.disconnect(); @@ -245,8 +259,8 @@ public class CoreClient { connection_.disconnect(); connection_ = null; + ClientError clientError = null; if (error != null) { - ClientError clientError = null; if (error instanceof ClientSession.Error) { ClientSession.Error actualError = (ClientSession.Error) error; switch (actualError.type) { @@ -277,6 +291,7 @@ public class CoreClient { case TLSClientCertificateError: clientError = new ClientError(ClientError.Type.ClientCertificateError); break; + /* Note: no case clause for "StreamError" */ } } else if (error instanceof SessionStream.Error) { SessionStream.Error actualError = (SessionStream.Error) error; @@ -335,9 +350,12 @@ public class CoreClient { break; } } - assert clientError != null; - onError.emit(clientError); + /* If "error" was non-null, we expect to be able to derive + * a non-null "clientError". + */ + NotNull.exceptIfNull(clientError,"clientError"); } + onDisconnected.emit(clientError); } private void handleNeedCredentials() { @@ -409,9 +427,12 @@ public class CoreClient { /** * The user should add a listener to this signal, which will be called when - * a stream or connection error (not stanza error) occurs. + * the client was disconnected from tne network. + * + * <p>If the disconnection was due to a non-recoverable error, the type + * of error will be passed as a parameter. */ - public final Signal1<ClientError> onError = new Signal1<ClientError>(); + public final Signal1<ClientError> onDisconnected = new Signal1<ClientError>(); /** * The user should add a listener to this signal, which will be called when diff --git a/src/com/isode/stroke/examples/gui/StrokeGUI.java b/src/com/isode/stroke/examples/gui/StrokeGUI.java index 0422abb..e8580fc 100644 --- a/src/com/isode/stroke/examples/gui/StrokeGUI.java +++ b/src/com/isode/stroke/examples/gui/StrokeGUI.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2011, Isode Limited, London, England. + * Copyright (c) 2010-2012, Isode Limited, London, England. * All rights reserved. */ @@ -173,7 +173,7 @@ public class StrokeGUI extends javax.swing.JFrame { thisObject.handleMessageReceived(p1); } }); - client_.onError.connect(new Slot1<ClientError>() { + client_.onDisconnected.connect(new Slot1<ClientError>() { public void call(ClientError p1) { thisObject.handleClientError(p1); |