stomp 1.2.1 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/CHANGELOG.rdoc CHANGED
@@ -1,3 +1,13 @@
1
+ == 1.2.2 2012-24-03
2
+
3
+ * Major performance improvement for read of messages without content-length header
4
+ * Correct Stomp 1.1 failing test
5
+ * Update sample code to reflect removal of 'send'
6
+ * Add on_ssl_connectfail callback and allow clients to signal quit from the callback
7
+ * Ensure that SSL certificates and SSL related files exist and are readable
8
+ * Allow SSL file checks before connect using SSLParams.new(:fsck => true, ...)
9
+ * Correct a test for Windows compatibility
10
+
1
11
  == 1.2.1 2012-13-03
2
12
 
3
13
  * Robust SSL certificate support. See examples and: https://github.com/morellon/stomp/wiki/extended-ssl-overview
data/README.rdoc CHANGED
@@ -1,8 +1,7 @@
1
1
  ==README
2
2
 
3
- * (http://gitorious.org/projects/stomp/)
4
3
  * (https://github.com/morellon/stomp/)
5
- * (http://stomp.rubyforge.org/)
4
+ * (http://gitorious.org/projects/stomp/)
6
5
 
7
6
  ===Overview
8
7
 
@@ -12,13 +11,17 @@ An implementation of the Stomp protocol for Ruby. See:
12
11
 
13
12
  ===New
14
13
 
15
- Support of Stomp protocol level 1.1 is announced as of gem version 1.2.0.
14
+ * Gem version 1.2.2. Performance and more SSL enhancements.
15
+ * Full support of SSL certificates is announced as of gem version 1.2.1.
16
+ * Support of Stomp protocol level 1.1 is announced as of gem version 1.2.0.
17
+
18
+ See the change log for details.
16
19
 
17
20
  ===Example Usage
18
21
 
19
22
  client = Stomp::Client.new("test", "user", "localhost", 61613)
20
- client.send("/my/queue", "hello world!")
21
- client.subscribe("/my/queue") do |msg|
23
+ client.send("/queue/mine", "hello world!")
24
+ client.subscribe("/queue/mine") do |msg|
22
25
  p msg
23
26
  end
24
27
 
@@ -26,11 +29,11 @@ Support of Stomp protocol level 1.1 is announced as of gem version 1.2.0.
26
29
 
27
30
  options = "initialReconnectDelay=5000&randomize=false&useExponentialBackOff=false"
28
31
 
29
- #remotehost1 uses SSL, remotehost2 doesn't
32
+ # remotehost1 uses SSL, remotehost2 doesn't
30
33
  client = Stomp::Client.new("failover:(stomp+ssl://login1:passcode1@remotehost1:61612,stomp://login2:passcode2@remotehost2:61613)?#{options}")
31
34
 
32
- client.send("/my/queue", "hello world!")
33
- client.subscribe("/my/queue") do |msg|
35
+ client.publish("/queue/mine", "hello world!")
36
+ client.subscribe("/queue/mine") do |msg|
34
37
  p msg
35
38
  end
36
39
 
@@ -63,26 +66,16 @@ Support of Stomp protocol level 1.1 is announced as of gem version 1.2.0.
63
66
  connection = Stomp::Connection.new(hash)
64
67
 
65
68
 
66
- ===Contact info
69
+ ===Hstorical Information
67
70
 
68
71
  Up until March 2009 the project was maintained and primarily developed by Brian McCallister.
69
72
 
70
- The project is now maintained by Johan Sørensen <johan@johansorensen.com> and others.
71
-
72
- ===Source Code
73
+ ===Source Code and Project URLs
73
74
 
74
75
  https://github.com/morellon/stomp/
75
76
  http://gitorious.org/projects/stomp/
76
- http://github.com/js/stomp/
77
-
78
- ===Project urls
79
-
80
- Project Home :
81
-
82
- http://gitorious.org/projects/stomp/
83
- http://rubyforge.org/projects/stomp/
84
77
 
85
- Stomp Protocol Info :
78
+ ===Stomp Protocol Information :
86
79
 
87
80
  http://stomp.github.com/index.html
88
81
 
@@ -110,6 +103,16 @@ The following people have contributed to Stomp:
110
103
  * Chris Needham
111
104
  * R.I. Pienaar
112
105
  * tworker
106
+ * James Pearson
107
+
108
+ = Announcements
109
+
110
+ In the next version of the gem, the dates in CHANGELOG.rdoc will be changed from:
111
+
112
+ * yyyy-dd-mm
113
+
114
+ to:
113
115
 
116
+ * ISO8601 format (yyyymmdd)
114
117
 
115
118
 
data/Rakefile CHANGED
@@ -61,8 +61,8 @@ Rake::RDocTask.new do |rdoc|
61
61
  rdoc.rdoc_dir = "doc"
62
62
  rdoc.title = "Stomp"
63
63
  rdoc.options += %w[ --line-numbers --inline-source --charset utf-8 ]
64
- rdoc.rdoc_files.include("README.rdoc", "CHANGELOG.rdoc")
65
- rdoc.rdoc_files.include("lib/**/*.rb")
64
+ rdoc.rdoc_files.include("README.rdoc", "CHANGELOG.rdoc", "lib/**/*.rb", "examples/**/*.rb",
65
+ "test/**/*.rb")
66
66
  end
67
67
 
68
68
  Rake::TestTask.new do |t|
data/examples/slogger.rb CHANGED
@@ -17,12 +17,27 @@ Optional callback methods:
17
17
  on_subscribe: subscribe called
18
18
  on_receive: receive called and successful
19
19
 
20
+ on_ssl_connecting: SSL connection starting
21
+ on_ssl_connected: successful SSL connect
22
+ on_ssl_connectfail: unsuccessful SSL connect (will usually be retried)
23
+
24
+ on_hbread_fail: unsuccessful Heartbeat read
25
+ on_hbwrite_fail: unsuccessful Heartbeat write
26
+
20
27
  All methods are optional, at the user's requirements.
21
28
 
22
29
  If a method is not provided, it is not called (of course.)
23
30
 
24
- IMPORTANT NOTE: call back logging methods *MUST* not raise exceptions,
25
- otherwise the underlying STOMP connection will fail in mysterious ways.
31
+ IMPORTANT NOTE: in general, call back logging methods *SHOULD* not raise exceptions,
32
+ otherwise the underlying STOMP connection may fail in mysterious ways.
33
+
34
+ There are two useful exceptions to this rule for:
35
+
36
+ on_connectfail
37
+ on_ssl_connectfail
38
+
39
+ These two methods can raise a Stomp::Errors::LoggerConnectionError. If this
40
+ exception is raised, it is passed up the chain to the caller.
26
41
 
27
42
  Callback parameters: are a copy of the @parameters instance variable for
28
43
  the Stomp::Connection.
@@ -64,6 +79,11 @@ class Slogger
64
79
  rescue
65
80
  @log.debug "Connect Fail oops"
66
81
  end
82
+ =begin
83
+ # An example LoggerConnectionError raise
84
+ @log.debug "Connect Fail, will raise"
85
+ raise Stomp::Error::LoggerConnectionError.new("quit from connect")
86
+ =end
67
87
  end
68
88
 
69
89
  # Log disconnect events
@@ -136,28 +156,6 @@ class Slogger
136
156
  end
137
157
  end
138
158
 
139
-
140
- # Stomp 1.1+ - heart beat read (receive) failed
141
- def on_hbread_fail(parms, ticker_data)
142
- begin
143
- @log.debug "Hbreadf Parms #{info(parms)}"
144
- @log.debug "Hbreadf Result #{ticker_data}"
145
- rescue
146
- @log.debug "Hbreadf oops"
147
- end
148
- end
149
-
150
- # Stomp 1.1+ - heart beat thread fires
151
- def on_hbfire(parms, type, time)
152
- begin
153
- @log.debug "HBfire #{type} " + "=" * 30
154
- @log.debug "HBfire #{type} Parms #{info(parms)}"
155
- @log.debug "HBfire #{type} Time #{time}"
156
- rescue
157
- @log.debug "HBfire #{type} oops"
158
- end
159
- end
160
-
161
159
  def on_ssl_connecting(parms)
162
160
  begin
163
161
  @log.debug "SSL Connecting Parms #{info(parms)}"
@@ -174,6 +172,20 @@ class Slogger
174
172
  end
175
173
  end
176
174
 
175
+ def on_ssl_connectfail(parms)
176
+ begin
177
+ @log.debug "SSL Connect Fail Parms #{info(parms)}"
178
+ @log.debug "SSL Connect Fail Excception #{parms[:ssl_exception]}, #{parms[:ssl_exception].message}"
179
+ rescue
180
+ @log.debug "SSL Connect Fail oops"
181
+ end
182
+ =begin
183
+ # An example LoggerConnectionError raise
184
+ @log.debug "SSL Connect Fail, will raise"
185
+ raise Stomp::Error::LoggerConnectionError.new("quit from SSL connect")
186
+ =end
187
+ end
188
+
177
189
  private
178
190
 
179
191
  def info(parms)
@@ -188,6 +200,9 @@ class Slogger
188
200
  # parms[:cur_parseto]
189
201
  # parms[:cur_conattempts]
190
202
  #
203
+ # For the on_ssl_connectfail callback these are also available:
204
+ # parms[:ssl_exception]
205
+ #
191
206
  "Host: #{parms[:cur_host]}, Port: #{parms[:cur_port]}, Login: Port: #{parms[:cur_login]}, Passcode: #{parms[:cur_passcode]}, ssl: #{parms[:cur_ssl]}"
192
207
  end
193
208
  end # of class
@@ -141,8 +141,14 @@ module Stomp
141
141
  @failure = $!
142
142
  used_socket = nil
143
143
  raise unless @reliable
144
+ raise if @failure.is_a?(Stomp::Error::LoggerConnectionError)
144
145
  if @logger && @logger.respond_to?(:on_connectfail)
145
- @logger.on_connectfail(log_params)
146
+ # on_connectfail may raise
147
+ begin
148
+ @logger.on_connectfail(log_params)
149
+ rescue Exception => aex
150
+ raise if aex.is_a?(Stomp::Error::LoggerConnectionError)
151
+ end
146
152
  else
147
153
  $stderr.print "connect to #{@host} failed: #{$!} will retry(##{@connection_attempts}) in #{@reconnect_delay}\n"
148
154
  end
@@ -500,14 +506,14 @@ module Stomp
500
506
  content_length = message_header.match /content-length\s?:\s?(\d+)\s?\n/
501
507
  message_body = ''
502
508
 
503
- # If it does, reads the specified amount of bytes
504
- char = ''
509
+ # If content_length is present, read the specified amount of bytes
505
510
  if content_length
506
511
  message_body = read_socket.read content_length[1].to_i
507
512
  raise Stomp::Error::InvalidMessageLength unless parse_char(read_socket.getc) == "\0"
508
- # Else reads, the rest of the message until the first \0
513
+ # Else read the rest of the message until the first \0
509
514
  else
510
- message_body += char while (char = parse_char(read_socket.getc)) != "\0"
515
+ message_body = read_socket.readline("\0")
516
+ message_body.chop!
511
517
  end
512
518
 
513
519
  # If the buffer isn't empty, reads trailing new lines.
@@ -629,93 +635,106 @@ module Stomp
629
635
 
630
636
  def open_ssl_socket
631
637
  require 'openssl' unless defined?(OpenSSL)
632
- ctx = OpenSSL::SSL::SSLContext.new
633
- ctx.verify_mode = OpenSSL::SSL::VERIFY_NONE # Assume for now
634
- #
635
- # Note: if a client uses :ssl => true this results in the gem using
636
- # the _default_ Ruby ciphers list. This is _known_ to fail in later
637
- # Ruby releases. The gem provides a default cipher list that may
638
- # function in these cases. To use this connect with:
639
- # * :ssl => Stomp::SSLParams.new
640
- # * :ssl => Stomp::SSLParams.new(..., :ciphers => Stomp::DEFAULT_CIPHERS)
641
- #
642
- # If connecting with an SSLParams instance, and the _default_ Ruby
643
- # ciphers list is required, use:
644
- # * :ssl => Stomp::SSLParams.new(..., :use_ruby_ciphers => true)
645
- #
646
- # If a custom ciphers list is required, connect with:
647
- # * :ssl => Stomp::SSLParams.new(..., :ciphers => custom_ciphers_list)
648
- #
649
- if @ssl != true
638
+ begin # Any raised SSL exceptions
639
+ ctx = OpenSSL::SSL::SSLContext.new
640
+ ctx.verify_mode = OpenSSL::SSL::VERIFY_NONE # Assume for now
641
+ #
642
+ # Note: if a client uses :ssl => true this results in the gem using
643
+ # the _default_ Ruby ciphers list. This is _known_ to fail in later
644
+ # Ruby releases. The gem provides a default cipher list that may
645
+ # function in these cases. To use this connect with:
646
+ # * :ssl => Stomp::SSLParams.new
647
+ # * :ssl => Stomp::SSLParams.new(..., :ciphers => Stomp::DEFAULT_CIPHERS)
650
648
  #
651
- # Here @ssl is:
652
- # * an instance of Stomp::SSLParams
653
- # Control would not be here if @ssl == false or @ssl.nil?.
649
+ # If connecting with an SSLParams instance, and the _default_ Ruby
650
+ # ciphers list is required, use:
651
+ # * :ssl => Stomp::SSLParams.new(..., :use_ruby_ciphers => true)
654
652
  #
653
+ # If a custom ciphers list is required, connect with:
654
+ # * :ssl => Stomp::SSLParams.new(..., :ciphers => custom_ciphers_list)
655
+ #
656
+ if @ssl != true
657
+ #
658
+ # Here @ssl is:
659
+ # * an instance of Stomp::SSLParams
660
+ # Control would not be here if @ssl == false or @ssl.nil?.
661
+ #
662
+
663
+ # Back reference the SSLContext
664
+ @ssl.ctx = ctx
665
+
666
+ # Server authentication parameters if required
667
+ if @ssl.ts_files
668
+ ctx.verify_mode = OpenSSL::SSL::VERIFY_PEER
669
+ truststores = OpenSSL::X509::Store.new
670
+ fl = @ssl.ts_files.split(",")
671
+ fl.each do |fn|
672
+ # Add next cert file listed
673
+ raise Stomp::Error::SSLNoTruststoreFileError if !File::exists?(fn)
674
+ raise Stomp::Error::SSLUnreadableTruststoreFileError if !File::readable?(fn)
675
+ truststores.add_file(fn)
676
+ end
677
+ ctx.cert_store = truststores
678
+ end
655
679
 
656
- # Back reference the SSLContext
657
- @ssl.ctx = ctx
658
-
659
- # Server authentication parameters if required
660
- if @ssl.ts_files
661
- ctx.verify_mode = OpenSSL::SSL::VERIFY_PEER
662
- truststores = OpenSSL::X509::Store.new
663
- fl = @ssl.ts_files.split(",")
664
- fl.each do |fn|
665
- # Add next cert file listed
666
- raise Stomp::Error::SSLNoTruststoreFileError if !File::exists?(fn)
667
- truststores.add_file(fn)
680
+ # Client authentication parameters
681
+ # Both cert file and key file must be present or not, it can not be a mix
682
+ raise Stomp::Error::SSLClientParamsError if @ssl.cert_file.nil? && !@ssl.key_file.nil?
683
+ raise Stomp::Error::SSLClientParamsError if !@ssl.cert_file.nil? && @ssl.key_file.nil?
684
+ if @ssl.cert_file # Any check will do here
685
+ raise Stomp::Error::SSLNoCertFileError if !File::exists?(@ssl.cert_file)
686
+ raise Stomp::Error::SSLUnreadableCertFileError if !File::readable?(@ssl.cert_file)
687
+ ctx.cert = OpenSSL::X509::Certificate.new(File.open(@ssl.cert_file))
688
+ raise Stomp::Error::SSLNoKeyFileError if !File::exists?(@ssl.key_file)
689
+ raise Stomp::Error::SSLUnreadableKeyFileError if !File::readable?(@ssl.key_file)
690
+ ctx.key = OpenSSL::PKey::RSA.new(File.open(@ssl.key_file))
691
+ end
692
+
693
+ # Cipher list
694
+ if !@ssl.use_ruby_ciphers # No Ruby ciphers (the default)
695
+ if @ssl.ciphers # User ciphers list?
696
+ ctx.ciphers = @ssl.ciphers # Accept user supplied ciphers
697
+ else
698
+ ctx.ciphers = Stomp::DEFAULT_CIPHERS # Just use Stomp defaults
699
+ end
668
700
  end
669
- ctx.cert_store = truststores
670
701
  end
671
702
 
672
- # Client authentication parameters
673
- # Both cert file and key file must be present or not, it can not be a mix
674
- raise Stomp::Error::SSLClientParamsError if @ssl.cert_file.nil? && !@ssl.key_file.nil?
675
- raise Stomp::Error::SSLClientParamsError if !@ssl.cert_file.nil? && @ssl.key_file.nil?
676
- if @ssl.cert_file # Any check will do here
677
- raise Stomp::Error::SSLNoCertFileError if !File::exists?(@ssl.cert_file)
678
- ctx.cert = OpenSSL::X509::Certificate.new(File.open(@ssl.cert_file))
679
- raise Stomp::Error::SSLNoKeyFileError if !File::exists?(@ssl.key_file)
680
- ctx.key = OpenSSL::PKey::RSA.new(File.open(@ssl.key_file))
703
+ #
704
+ ssl = nil
705
+ if @logger && @logger.respond_to?(:on_ssl_connecting)
706
+ @logger.on_ssl_connecting(log_params)
681
707
  end
682
708
 
683
- # Cipher list
684
- if !@ssl.use_ruby_ciphers # No Ruby ciphers (the default)
685
- if @ssl.ciphers # User ciphers list?
686
- ctx.ciphers = @ssl.ciphers # Accept user supplied ciphers
709
+ Timeout::timeout(@connect_timeout, Stomp::Error::SocketOpenTimeout) do
710
+ ssl = OpenSSL::SSL::SSLSocket.new(open_tcp_socket, ctx)
711
+ end
712
+ def ssl.ready?
713
+ ! @rbuffer.empty? || @io.ready?
714
+ end
715
+ ssl.connect
716
+ if @ssl != true
717
+ # Pass back results if possible
718
+ if RUBY_VERSION =~ /1\.8\.[56]/
719
+ @ssl.verify_result = "N/A for Ruby #{RUBY_VERSION}"
687
720
  else
688
- ctx.ciphers = Stomp::DEFAULT_CIPHERS # Just use Stomp defaults
721
+ @ssl.verify_result = ssl.verify_result
689
722
  end
723
+ @ssl.peer_cert = ssl.peer_cert
690
724
  end
691
- end
692
-
693
- #
694
- ssl = nil
695
- if @logger && @logger.respond_to?(:on_ssl_connecting)
696
- @logger.on_ssl_connecting(log_params)
697
- end
698
-
699
- Timeout::timeout(@connect_timeout, Stomp::Error::SocketOpenTimeout) do
700
- ssl = OpenSSL::SSL::SSLSocket.new(open_tcp_socket, ctx)
701
- end
702
- def ssl.ready?
703
- ! @rbuffer.empty? || @io.ready?
704
- end
705
- ssl.connect
706
- if @ssl != true
707
- # Pass back results if possible
708
- if RUBY_VERSION =~ /1\.8\.[56]/
709
- @ssl.verify_result = "N/A for Ruby #{RUBY_VERSION}"
710
- else
711
- @ssl.verify_result = ssl.verify_result
725
+ if @logger && @logger.respond_to?(:on_ssl_connected)
726
+ @logger.on_ssl_connected(log_params)
712
727
  end
713
- @ssl.peer_cert = ssl.peer_cert
714
- end
715
- if @logger && @logger.respond_to?(:on_ssl_connected)
716
- @logger.on_ssl_connected(log_params)
728
+ ssl
729
+ rescue Exception => ex
730
+ if @logger && @logger.respond_to?(:on_ssl_connectfail)
731
+ lp = log_params.clone
732
+ lp[:ssl_exception] = ex
733
+ @logger.on_ssl_connectfail(lp)
734
+ end
735
+ #
736
+ raise # Reraise
717
737
  end
718
- ssl
719
738
  end
720
739
 
721
740
  def close_socket
@@ -25,7 +25,7 @@ module Stomp
25
25
  SPL_10 = "1.0"
26
26
  SPL_11 = "1.1"
27
27
 
28
- # To be: No 1.1 yet
28
+ # Stomp 1.0 and 1.1
29
29
  SUPPORTED = [SPL_10, SPL_11]
30
30
 
31
31
  # 1.9 Encoding Name
data/lib/stomp/errors.rb CHANGED
@@ -104,18 +104,39 @@ module Stomp
104
104
  end
105
105
  end
106
106
 
107
+ class SSLUnreadableKeyFileError < RuntimeError
108
+ def message
109
+ "client key file can not be read"
110
+ end
111
+ end
112
+
107
113
  class SSLNoCertFileError < RuntimeError
108
114
  def message
109
115
  "client cert file does not exist"
110
116
  end
111
117
  end
112
118
 
119
+ class SSLUnreadableCertFileError < RuntimeError
120
+ def message
121
+ "client cert file can not be read"
122
+ end
123
+ end
124
+
113
125
  class SSLNoTruststoreFileError < RuntimeError
114
126
  def message
115
127
  "a client truststore file does not exist"
116
128
  end
117
129
  end
118
130
 
131
+ class SSLUnreadableTruststoreFileError < RuntimeError
132
+ def message
133
+ "a client truststore file can not be read"
134
+ end
135
+ end
136
+
137
+ class LoggerConnectionError < RuntimeError
138
+ end
139
+
119
140
  end # module Error
120
141
  end # module Stomp
121
142
 
@@ -1,50 +1,69 @@
1
- # -*- encoding: utf-8 -*-
1
+ # -*- encoding: utf-8 -*-
2
2
 
3
- module Stomp
4
- #
5
- # == Purpose
6
- #
7
- # Parameters for STOMP ssl connections.
8
- #
9
- class SSLParams
10
- # The trust store files. Normally the certificate of the CA that signed
11
- # the server's certificate. One file name, or a CSV list of file names.
12
- attr_accessor :ts_files
13
- # The client certificate file.
14
- attr_accessor :cert_file
15
- # The client private key file.
16
- attr_accessor :key_file
17
- # SSL Connect Verify Result. The result of the handshake.
18
- attr_accessor :verify_result
19
- # The certificate of the connection peer (the server), received during
20
- # the handshake.
21
- attr_accessor :peer_cert
22
- # Optional list of SSL ciphers to be used. In the format documented for
23
- # Ruby's OpenSSL.
24
- attr_accessor :ciphers
25
- # Abcolute command to use Ruby default ciphers
26
- attr_reader :use_ruby_ciphers
27
- # Back reference to the OpenSSL::SSL::SSLContext instance, gem sets before connect
28
- attr_accessor :ctx # Set by the gem during connect, before the callbacks
3
+ module Stomp
29
4
  #
30
- def initialize(opts={})
5
+ # == Purpose
6
+ #
7
+ # Parameters for STOMP ssl connections.
8
+ #
9
+ class SSLParams
10
+ # The trust store files. Normally the certificate of the CA that signed
11
+ # the server's certificate. One file name, or a CSV list of file names.
12
+ attr_accessor :ts_files
13
+ # The client certificate file.
14
+ attr_accessor :cert_file
15
+ # The client private key file.
16
+ attr_accessor :key_file
17
+ # SSL Connect Verify Result. The result of the handshake.
18
+ attr_accessor :verify_result
19
+ # The certificate of the connection peer (the server), received during
20
+ # the handshake.
21
+ attr_accessor :peer_cert
22
+ # Optional list of SSL ciphers to be used. In the format documented for
23
+ # Ruby's OpenSSL.
24
+ attr_accessor :ciphers
25
+ # Abcolute command to use Ruby default ciphers
26
+ attr_reader :use_ruby_ciphers
27
+ # Back reference to the OpenSSL::SSL::SSLContext instance, gem sets before connect
28
+ attr_accessor :ctx # Set by the gem during connect, before the callbacks
29
+ # Client wants file existance check now. true/value or false/nil
30
+ attr_reader :fsck #
31
+ #
32
+ def initialize(opts={})
31
33
 
32
- # Server authentication parameters
33
- @ts_files = opts[:ts_files] # A trust store file, normally a CA's cert
34
- # or a CSV list of cert file names
34
+ # Server authentication parameters
35
+ @ts_files = opts[:ts_files] # A trust store file, normally a CA's cert
36
+ # or a CSV list of cert file names
35
37
 
36
- # Client authentication parameters
37
- @cert_file = opts[:cert_file] # Client cert
38
- @key_file = opts[:key_file] # Client key
39
- #
40
- raise Stomp::Error::SSLClientParamsError if @cert_file.nil? && !@key_file.nil?
41
- raise Stomp::Error::SSLClientParamsError if !@cert_file.nil? && @key_file.nil?
42
- #
43
- @ciphers = opts[:ciphers]
44
- @use_ruby_ciphers = opts[:use_ruby_ciphers] ? opts[:use_ruby_ciphers] : false
45
- #
46
- end
47
- end # of class SSLParams
38
+ # Client authentication parameters
39
+ @cert_file = opts[:cert_file] # Client cert
40
+ @key_file = opts[:key_file] # Client key
41
+ #
42
+ raise Stomp::Error::SSLClientParamsError if @cert_file.nil? && !@key_file.nil?
43
+ raise Stomp::Error::SSLClientParamsError if !@cert_file.nil? && @key_file.nil?
44
+ #
45
+ @ciphers = opts[:ciphers]
46
+ @use_ruby_ciphers = opts[:use_ruby_ciphers] ? opts[:use_ruby_ciphers] : false
47
+ #
48
+ if opts[:fsck]
49
+ if @cert_file
50
+ raise Stomp::Error::SSLNoCertFileError if !File::exists?(@cert_file)
51
+ raise Stomp::Error::SSLUnreadableCertFileError if !File::readable?(@cert_file)
52
+ end
53
+ if @key_file
54
+ raise Stomp::Error::SSLNoKeyFileError if !File::exists?(@key_file)
55
+ raise Stomp::Error::SSLUnreadableKeyFileError if !File::readable?(@key_file)
56
+ end
57
+ if @ts_files
58
+ tsa = @ts_files.split(",")
59
+ tsa.each do |fn|
60
+ raise Stomp::Error::SSLNoTruststoreFileError if !File::exists?(fn)
61
+ raise Stomp::Error::SSLUnreadableTruststoreFileError if !File::readable?(fn)
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end # of class SSLParams
48
67
 
49
- end # of module Stomp
68
+ end # of module Stomp
50
69
 
data/lib/stomp/version.rb CHANGED
@@ -4,7 +4,7 @@ module Stomp
4
4
  module Version #:nodoc: all
5
5
  MAJOR = 1
6
6
  MINOR = 2
7
- PATCH = 1
7
+ PATCH = 2
8
8
  STRING = "#{MAJOR}.#{MINOR}.#{PATCH}"
9
9
  end
10
10
  end
data/stomp.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{stomp}
8
- s.version = "1.2.1"
8
+ s.version = "1.2.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Brian McCallister", "Marius Mathiesen", "Thiago Morello", "Guy M. Allard"]
12
- s.date = %q{2012-03-13}
12
+ s.date = %q{2012-03-24}
13
13
  s.description = %q{Ruby client for the Stomp messaging protocol. Note that this gem is no longer supported on rubyforge.}
14
14
  s.email = ["brianm@apache.org", "marius@stones.com", "morellon@gmail.com", "allard.guy.m@gmail.com"]
15
15
  s.executables = ["catstomp", "stompcat"]
@@ -23,7 +23,7 @@ class TestConnection < Test::Unit::TestCase
23
23
  end
24
24
 
25
25
  def test_poll_async
26
- @conn.subscribe("/queue/do.not.put.messages.on.this.queue")
26
+ @conn.subscribe("/queue/do.not.put.messages.on.this.queue", :id => "a.no.messages.queue")
27
27
  # If the test 'hangs' here, Connection#poll is broken.
28
28
  m = @conn.poll
29
29
  assert m.nil?
data/test/test_helper.rb CHANGED
@@ -56,8 +56,9 @@ module TestBase
56
56
 
57
57
  def get_ssl_connection()
58
58
  ch = get_conn_headers()
59
+ ssl_params = Stomp::SSLParams.new # S/B safe for all Ruby versions tested
59
60
  hash = { :hosts => [
60
- {:login => user, :passcode => passcode, :host => host, :port => ssl_port, :ssl => true},
61
+ {:login => user, :passcode => passcode, :host => host, :port => ssl_port, :ssl => ssl_params},
61
62
  ],
62
63
  :connect_headers => ch
63
64
  }
data/test/test_ssl.rb CHANGED
@@ -12,7 +12,7 @@ class TestSSL < Test::Unit::TestCase
12
12
  end
13
13
 
14
14
  def teardown
15
- @conn.disconnect if @conn.open? # allow tests to disconnect
15
+ @conn.disconnect if @conn && @conn.open? # allow tests to disconnect
16
16
  end
17
17
  #
18
18
  def test_ssl_0000
@@ -20,29 +20,50 @@ class TestSSL < Test::Unit::TestCase
20
20
  end
21
21
 
22
22
  #
23
- def test_ssl_0010
23
+ def test_ssl_0010_parms
24
24
  ssl_params = Stomp::SSLParams.new
25
25
  assert ssl_params.ts_files.nil?
26
26
  assert ssl_params.cert_file.nil?
27
27
  assert ssl_params.key_file.nil?
28
+ assert ssl_params.fsck.nil?
28
29
  end
29
30
 
30
31
  #
31
- def test_ssl_0020
32
+ def test_ssl_0020_noraise
33
+ assert_nothing_raised {
34
+ ssl_parms = Stomp::SSLParams.new(:cert_file => "dummy1", :key_file => "dummy2")
35
+ }
36
+ assert_nothing_raised {
37
+ ssl_parms = Stomp::SSLParams.new(:ts_files => "dummyts1")
38
+ }
39
+ assert_nothing_raised {
40
+ ssl_parms = Stomp::SSLParams.new(:ts_files => "dummyts1",
41
+ :cert_file => "dummy1", :key_file => "dummy2")
42
+ }
43
+ end
44
+ #
45
+ def test_ssl_0030_raise
32
46
  assert_raise(Stomp::Error::SSLClientParamsError) {
33
47
  ssl_parms = Stomp::SSLParams.new(:cert_file => "dummy1")
34
48
  }
35
49
  assert_raise(Stomp::Error::SSLClientParamsError) {
36
50
  ssl_parms = Stomp::SSLParams.new(:key_file => "dummy2")
37
51
  }
38
- assert_nothing_raised {
39
- ssl_parms = Stomp::SSLParams.new(:cert_file => "dummy1", :key_file => "dummy2")
52
+ end
53
+
54
+ #
55
+ def test_ssl_0040_fsck
56
+ assert_raise(Stomp::Error::SSLNoCertFileError) {
57
+ ssl_parms = Stomp::SSLParams.new(:cert_file => "dummy1",
58
+ :key_file => "dummy2", :fsck => true)
40
59
  }
41
- assert_nothing_raised {
42
- ssl_parms = Stomp::SSLParams.new(:ts_files => "dummyts1")
60
+ assert_raise(Stomp::Error::SSLNoKeyFileError) {
61
+ ssl_parms = Stomp::SSLParams.new(:cert_file => __FILE__,
62
+ :key_file => "dummy2", :fsck => true)
43
63
  }
44
- assert_nothing_raised {
45
- ssl_parms = Stomp::SSLParams.new(:ts_files => "dummyts1", :cert_file => "dummy1", :key_file => "dummy2")
64
+ assert_raise(Stomp::Error::SSLNoTruststoreFileError) {
65
+ ssl_parms = Stomp::SSLParams.new(:ts_files => "/tmp/not-likely-here.txt",
66
+ :fsck => true)
46
67
  }
47
68
  end
48
69
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stomp
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 27
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
8
  - 2
9
- - 1
10
- version: 1.2.1
9
+ - 2
10
+ version: 1.2.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Brian McCallister
@@ -18,7 +18,7 @@ autorequire:
18
18
  bindir: bin
19
19
  cert_chain: []
20
20
 
21
- date: 2012-03-13 00:00:00 -04:00
21
+ date: 2012-03-24 00:00:00 -04:00
22
22
  default_executable:
23
23
  dependencies:
24
24
  - !ruby/object:Gem::Dependency