diff --git a/stomp-client/src/main/java/org/projectodd/stilts/stomp/client/ClientContextImpl.java b/stomp-client/src/main/java/org/projectodd/stilts/stomp/client/ClientContextImpl.java index 7c91b362..61da6224 100644 --- a/stomp-client/src/main/java/org/projectodd/stilts/stomp/client/ClientContextImpl.java +++ b/stomp-client/src/main/java/org/projectodd/stilts/stomp/client/ClientContextImpl.java @@ -81,6 +81,21 @@ public SSLContext getSSLContext() { return this.client.getSSLContext(); } + @Override + public boolean isAuthenticated() { + return client.isAuthenticated(); + } + + @Override + public String getUsername() { + return client.getAuthenticationUser(); + } + + @Override + public String getPassword() { + return client.getAuthenticationPassword(); + } + private StompClient client; } diff --git a/stomp-client/src/main/java/org/projectodd/stilts/stomp/client/StompClient.java b/stomp-client/src/main/java/org/projectodd/stilts/stomp/client/StompClient.java index 4213971e..1d7173a4 100644 --- a/stomp-client/src/main/java/org/projectodd/stilts/stomp/client/StompClient.java +++ b/stomp-client/src/main/java/org/projectodd/stilts/stomp/client/StompClient.java @@ -112,9 +112,32 @@ public StompClient(URI uri, SSLContext sslContext) throws URISyntaxException { } } + + String userInfo = uri.getUserInfo(); + if (userInfo != null) { + int firstColonIndex = userInfo.indexOf(":"); + if (firstColonIndex > -1 && firstColonIndex < (userInfo.length() - 1)) { + this.useAuthentication = true; + this.authenticationUser = userInfo.substring(0, firstColonIndex); + this.authenticationPassword = userInfo.substring(firstColonIndex + 1); + } + } + this.serverAddress = new InetSocketAddress( host, port ); } + public boolean isAuthenticated() { + return this.useAuthentication; + } + + public String getAuthenticationUser() { + return this.authenticationUser; + } + + public String getAuthenticationPassword() { + return this.authenticationPassword; + } + public boolean isSecure() { return this.useSSL; } @@ -488,6 +511,9 @@ public Void call() throws Exception { private Version version = Version.VERSION_1_0; private boolean useWebSockets = false; private boolean useSSL = false; + private boolean useAuthentication = false; + private String authenticationUser; + private String authenticationPassword; private Class webSocketHandshakeClass = Ietf17Handshake.class; private SSLContext sslContext; diff --git a/stomp-client/src/main/java/org/projectodd/stilts/stomp/client/protocol/ClientContext.java b/stomp-client/src/main/java/org/projectodd/stilts/stomp/client/protocol/ClientContext.java index a6bcc286..586e9e43 100644 --- a/stomp-client/src/main/java/org/projectodd/stilts/stomp/client/protocol/ClientContext.java +++ b/stomp-client/src/main/java/org/projectodd/stilts/stomp/client/protocol/ClientContext.java @@ -32,7 +32,11 @@ public interface ClientContext { boolean isSecure(); SSLContext getSSLContext(); - + + boolean isAuthenticated(); + String getUsername(); + String getPassword(); + void setConnectionState(State state); void setVersion(Version version); diff --git a/stomp-client/src/main/java/org/projectodd/stilts/stomp/client/protocol/StompConnectionNegotiator.java b/stomp-client/src/main/java/org/projectodd/stilts/stomp/client/protocol/StompConnectionNegotiator.java index dc74763e..03f55085 100644 --- a/stomp-client/src/main/java/org/projectodd/stilts/stomp/client/protocol/StompConnectionNegotiator.java +++ b/stomp-client/src/main/java/org/projectodd/stilts/stomp/client/protocol/StompConnectionNegotiator.java @@ -34,6 +34,10 @@ public void channelConnected(ChannelHandlerContext context, ChannelStateEvent e) StompControlFrame frame = new StompControlFrame( Command.CONNECT ); frame.setHeader( Header.HOST, this.host ); frame.setHeader( Header.ACCEPT_VERSION, Version.supportedVersions() ); + if(getClientContext().isAuthenticated()) { + frame.setHeader( Header.LOGIN, getClientContext().getUsername() ); + frame.setHeader( Header.PASSCODE, getClientContext().getPassword() ); + } Channels.write( context.getChannel(), frame ); } diff --git a/stomp-client/src/test/java/org/projectodd/stilts/stomp/client/MockClientContext.java b/stomp-client/src/test/java/org/projectodd/stilts/stomp/client/MockClientContext.java index d6cf6336..9c5d0864 100644 --- a/stomp-client/src/test/java/org/projectodd/stilts/stomp/client/MockClientContext.java +++ b/stomp-client/src/test/java/org/projectodd/stilts/stomp/client/MockClientContext.java @@ -36,7 +36,22 @@ public void setSSLContext(SSLContext sslContext) { public SSLContext getSSLContext() { return this.sslContext; } - + + @Override + public boolean isAuthenticated() { + return this.authenticated; + } + + @Override + public String getUsername() { + return this.user; + } + + @Override + public String getPassword() { + return this.password; + } + @Override public State getConnectionState() { return this.state; @@ -90,6 +105,9 @@ public void setVersion(Version version) { private Version version = Version.VERSION_1_0; private boolean secure = false; private SSLContext sslContext; + private boolean authenticated = false; + private String user; + private String password; private List receipts = new ArrayList(); diff --git a/stomp-common/src/main/java/org/projectodd/stilts/stomp/protocol/StompFrame.java b/stomp-common/src/main/java/org/projectodd/stilts/stomp/protocol/StompFrame.java index 6b7bcace..fa853411 100644 --- a/stomp-common/src/main/java/org/projectodd/stilts/stomp/protocol/StompFrame.java +++ b/stomp-common/src/main/java/org/projectodd/stilts/stomp/protocol/StompFrame.java @@ -94,6 +94,8 @@ public static class Header { public static final String SERVER = "server"; public static final String MESSAGE = "message"; public static final String HEARTBEAT = "heart-beat"; + public static final String LOGIN = "login"; + public static final String PASSCODE = "passcode"; } public static class Command {