From 7287058285e07ae680d90e6071fa21d747bd04fc Mon Sep 17 00:00:00 2001 From: Wolfgang Herget Date: Tue, 3 Sep 2013 15:47:04 +0200 Subject: [PATCH 1/3] Stomp-Client: add authentication to connection process --- .../stomp/client/ClientContextImpl.java | 15 +++++++++++ .../stilts/stomp/client/StompClient.java | 25 +++++++++++++++++++ .../stomp/client/protocol/ClientContext.java | 6 ++++- .../protocol/StompConnectionNegotiator.java | 4 +++ .../stomp/client/MockClientContext.java | 20 ++++++++++++++- .../stilts/stomp/protocol/StompFrame.java | 2 ++ 6 files changed, 70 insertions(+), 2 deletions(-) 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..c942a843 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.getAuthentiactionPassword(); + } + 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..8f40a0bb 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,31 @@ public StompClient(URI uri, SSLContext sslContext) throws URISyntaxException { } } + + if (uri.getUserInfo() != null) { + String[] authenticationTokens = uri.getUserInfo().split(":"); + if (authenticationTokens.length == 2) { + this.useAuthentication = true; + this.authenticationUser = authenticationTokens[0]; + this.authentiactionPassword = authenticationTokens[1]; + } + } + this.serverAddress = new InetSocketAddress( host, port ); } + public boolean isAuthenticated() { + return this.useAuthentication; + } + + public String getAuthenticationUser() { + return this.authenticationUser; + } + + public String getAuthentiactionPassword() { + return this.authentiactionPassword; + } + public boolean isSecure() { return this.useSSL; } @@ -488,6 +510,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 authentiactionPassword; 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 { From 959e7fe11d18deff19f40183276eba8bbb335987 Mon Sep 17 00:00:00 2001 From: Wolfgang Herget Date: Wed, 27 Nov 2013 12:24:52 +0100 Subject: [PATCH 2/3] fix typo authenti{ac=>ca}tionPassword --- .../projectodd/stilts/stomp/client/ClientContextImpl.java | 2 +- .../org/projectodd/stilts/stomp/client/StompClient.java | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) 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 c942a843..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 @@ -93,7 +93,7 @@ public String getUsername() { @Override public String getPassword() { - return client.getAuthentiactionPassword(); + 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 8f40a0bb..9ec11d25 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 @@ -118,7 +118,7 @@ public StompClient(URI uri, SSLContext sslContext) throws URISyntaxException { if (authenticationTokens.length == 2) { this.useAuthentication = true; this.authenticationUser = authenticationTokens[0]; - this.authentiactionPassword = authenticationTokens[1]; + this.authenticationPassword = authenticationTokens[1]; } } @@ -133,8 +133,8 @@ public String getAuthenticationUser() { return this.authenticationUser; } - public String getAuthentiactionPassword() { - return this.authentiactionPassword; + public String getAuthenticationPassword() { + return this.authenticationPassword; } public boolean isSecure() { @@ -512,7 +512,7 @@ public Void call() throws Exception { private boolean useSSL = false; private boolean useAuthentication = false; private String authenticationUser; - private String authentiactionPassword; + private String authenticationPassword; private Class webSocketHandshakeClass = Ietf17Handshake.class; private SSLContext sslContext; From ec9bdcee7067c0c2b962d63b3702d0afdf6acda6 Mon Sep 17 00:00:00 2001 From: Wolfgang Herget Date: Tue, 28 Jan 2014 12:23:49 +0100 Subject: [PATCH 3/3] Rewrite extraction of authorization info from URL. This should now be more compliant to RFC3986. RFC3986 (3.2.1) states that the username ends at the first colon, and everything after that is to be considered parameters for the authorization scheme. (Here, it will be the password only.) --- .../projectodd/stilts/stomp/client/StompClient.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) 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 9ec11d25..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 @@ -113,12 +113,13 @@ public StompClient(URI uri, SSLContext sslContext) throws URISyntaxException { } - if (uri.getUserInfo() != null) { - String[] authenticationTokens = uri.getUserInfo().split(":"); - if (authenticationTokens.length == 2) { + String userInfo = uri.getUserInfo(); + if (userInfo != null) { + int firstColonIndex = userInfo.indexOf(":"); + if (firstColonIndex > -1 && firstColonIndex < (userInfo.length() - 1)) { this.useAuthentication = true; - this.authenticationUser = authenticationTokens[0]; - this.authenticationPassword = authenticationTokens[1]; + this.authenticationUser = userInfo.substring(0, firstColonIndex); + this.authenticationPassword = userInfo.substring(firstColonIndex + 1); } }