eventmachine-le 1.1.3 → 1.1.4.beta.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.8.7
4
+ - 1.9.3
5
+
6
+ before_install:
7
+ - sudo apt-get install libssl-dev
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ group :test do
6
+ gem "rake", "~> 0.9.2"
7
+ end
8
+
data/README.md CHANGED
@@ -59,6 +59,7 @@ the following features/fixes have been applied in EventMachine-LE:
59
59
  * `EM::Protocols::SmtpServer`: support multiple messages per one connection and login auth type ([bogdan](https://github.com/eventmachine/eventmachine/pull/288)).
60
60
  * Reimplement `EM::Queue` to avoid shift/push performance problem ([grddev](https://github.com/eventmachine/eventmachine/pull/311)).
61
61
  * Many code cleanups.
62
+ * New `EM::Connection` option for the `start_tls()` method: `:use_tls` (when true TLS version is used, SSL otherwise).
62
63
 
63
64
 
64
65
  ## Installation ##
@@ -453,12 +453,12 @@ extern "C" void evma_start_tls (const unsigned long binding)
453
453
  evma_set_tls_parms
454
454
  ******************/
455
455
 
456
- extern "C" void evma_set_tls_parms (const unsigned long binding, const char *privatekey_filename, const char *certchain_filename, int verify_peer, int use_tls)
456
+ extern "C" void evma_set_tls_parms (const unsigned long binding, const char *privatekey_filename, const char *certchain_filename, int verify_peer, int ssl_version, const char *cipherlist)
457
457
  {
458
458
  ensure_eventmachine("evma_set_tls_parms");
459
459
  EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
460
460
  if (ed)
461
- ed->SetTlsParms (privatekey_filename, certchain_filename, (verify_peer == 1 ? true : false), (use_tls == 1 ? true : false));
461
+ ed->SetTlsParms (privatekey_filename, certchain_filename, (verify_peer == 1 ? true : false), ssl_version, cipherlist);
462
462
  }
463
463
 
464
464
  /******************
data/ext/ed.cpp CHANGED
@@ -384,7 +384,7 @@ ConnectionDescriptor::ConnectionDescriptor (int sd, EventMachine_t *em):
384
384
  SslBox (NULL),
385
385
  bHandshakeSignaled (false),
386
386
  bSslVerifyPeer (false),
387
- bSslUseTls (false),
387
+ bSslVersion (0),
388
388
  bSslPeerAccepted(false),
389
389
  #endif
390
390
  #ifdef HAVE_KQUEUE
@@ -1136,7 +1136,7 @@ void ConnectionDescriptor::StartTls()
1136
1136
  if (SslBox)
1137
1137
  throw std::runtime_error ("SSL/TLS already running on connection");
1138
1138
 
1139
- SslBox = new SslBox_t (bIsServer, PrivateKeyFilename, CertChainFilename, bSslVerifyPeer, bSslUseTls, GetBinding());
1139
+ SslBox = new SslBox_t (bIsServer, PrivateKeyFilename, CertChainFilename, bSslVerifyPeer, bSslVersion, CipherList, GetBinding());
1140
1140
  _DispatchCiphertext();
1141
1141
  #endif
1142
1142
 
@@ -1150,7 +1150,7 @@ void ConnectionDescriptor::StartTls()
1150
1150
  ConnectionDescriptor::SetTlsParms
1151
1151
  *********************************/
1152
1152
 
1153
- void ConnectionDescriptor::SetTlsParms (const char *privkey_filename, const char *certchain_filename, bool verify_peer, bool use_tls)
1153
+ void ConnectionDescriptor::SetTlsParms (const char *privkey_filename, const char *certchain_filename, bool verify_peer, int ssl_version, const char *cipherlist)
1154
1154
  {
1155
1155
  #ifdef WITH_SSL
1156
1156
  if (SslBox)
@@ -1160,7 +1160,9 @@ void ConnectionDescriptor::SetTlsParms (const char *privkey_filename, const char
1160
1160
  if (certchain_filename && *certchain_filename)
1161
1161
  CertChainFilename = certchain_filename;
1162
1162
  bSslVerifyPeer = verify_peer;
1163
- bSslUseTls = use_tls;
1163
+ bSslVersion = ssl_version;
1164
+ if (cipherlist && *cipherlist)
1165
+ CipherList = cipherlist;
1164
1166
  #endif
1165
1167
 
1166
1168
  #ifdef WITHOUT_SSL
data/ext/ed.h CHANGED
@@ -70,7 +70,7 @@ class EventableDescriptor: public Bindable_t
70
70
  virtual bool GetSubprocessPid (pid_t*) {return false;}
71
71
 
72
72
  virtual void StartTls() {}
73
- virtual void SetTlsParms (const char *privkey_filename, const char *certchain_filename, bool verify_peer, bool use_tls) {}
73
+ virtual void SetTlsParms (const char *privkey_filename, const char *certchain_filename, bool verify_peer, int ssl_version, const char *cipherlist) {}
74
74
 
75
75
  #ifdef WITH_SSL
76
76
  virtual X509 *GetPeerCert() {return NULL;}
@@ -195,7 +195,7 @@ class ConnectionDescriptor: public EventableDescriptor
195
195
  virtual int GetOutboundDataSize() {return OutboundDataSize;}
196
196
 
197
197
  virtual void StartTls();
198
- virtual void SetTlsParms (const char *privkey_filename, const char *certchain_filename, bool verify_peer, bool use_tls);
198
+ virtual void SetTlsParms (const char *privkey_filename, const char *certchain_filename, bool verify_peer, int ssl_version, const char *cipherlist);
199
199
 
200
200
  #ifdef WITH_SSL
201
201
  virtual X509 *GetPeerCert();
@@ -241,7 +241,8 @@ class ConnectionDescriptor: public EventableDescriptor
241
241
  std::string PrivateKeyFilename;
242
242
  bool bHandshakeSignaled;
243
243
  bool bSslVerifyPeer;
244
- bool bSslUseTls;
244
+ int bSslVersion;
245
+ std::string CipherList;
245
246
  bool bSslPeerAccepted;
246
247
  #endif
247
248
 
@@ -69,7 +69,7 @@ extern "C" {
69
69
  const unsigned long evma_create_unix_domain_server (const char *filename);
70
70
  const unsigned long evma_open_datagram_socket (const char *server, int port);
71
71
  const unsigned long evma_open_keyboard();
72
- void evma_set_tls_parms (const unsigned long binding, const char *privatekey_filename, const char *certchain_filenane, int verify_peer, int use_tls);
72
+ void evma_set_tls_parms (const unsigned long binding, const char *privatekey_filename, const char *certchain_filenane, int verify_peer, int ssl_version, const char *cipherlist);
73
73
  void evma_start_tls (const unsigned long binding);
74
74
 
75
75
  #ifdef WITH_SSL
@@ -40,7 +40,8 @@ def manual_ssl_config
40
40
  end
41
41
 
42
42
  if ENV['CROSS_COMPILING']
43
- openssl_dir = File.expand_path("~/.rake-compiler/builds/openssl-1.0.0a/")
43
+ openssl_version = ENV.fetch("OPENSSL_VERSION", "1.0.0j")
44
+ openssl_dir = File.expand_path("~/.rake-compiler/builds/openssl-#{openssl_version}/")
44
45
  if File.exists?(openssl_dir)
45
46
  FileUtils.mkdir_p Dir.pwd+"/openssl/"
46
47
  FileUtils.cp Dir[openssl_dir+"/include/openssl/*.h"], Dir.pwd+"/openssl/", :verbose => true
@@ -163,4 +164,4 @@ add_define 'HAVE_MAKE_PAIR' if try_link(<<SRC, '-lstdc++')
163
164
  SRC
164
165
  TRY_LINK.sub!('$(CXX)', '$(CC)')
165
166
 
166
- create_makefile "rubyeventmachine"
167
+ create_makefile "rubyeventmachine"
@@ -307,14 +307,14 @@ static VALUE t_start_tls (VALUE self, VALUE signature)
307
307
  t_set_tls_parms
308
308
  ***************/
309
309
 
310
- static VALUE t_set_tls_parms (VALUE self, VALUE signature, VALUE privkeyfile, VALUE certchainfile, VALUE verify_peer, VALUE use_tls)
310
+ static VALUE t_set_tls_parms (VALUE self, VALUE signature, VALUE privkeyfile, VALUE certchainfile, VALUE verify_peer, VALUE ssl_version, VALUE cipherlist)
311
311
  {
312
312
  /* set_tls_parms takes a series of positional arguments for specifying such things
313
313
  * as private keys and certificate chains.
314
314
  * It's expected that the parameter list will grow as we add more supported features.
315
315
  * ALL of these parameters are optional, and can be specified as empty or NULL strings.
316
316
  */
317
- evma_set_tls_parms (NUM2ULONG (signature), StringValuePtr (privkeyfile), StringValuePtr (certchainfile), (verify_peer == Qtrue ? 1 : 0), (use_tls == Qtrue ? 1 : 0));
317
+ evma_set_tls_parms (NUM2ULONG(signature), StringValuePtr(privkeyfile), StringValuePtr(certchainfile), (verify_peer == Qtrue ? 1 : 0), FIX2INT(ssl_version), StringValuePtr(cipherlist));
318
318
  return Qnil;
319
319
  }
320
320
 
@@ -1216,7 +1216,7 @@ extern "C" void Init_rubyeventmachine()
1216
1216
  rb_define_module_function (EmModule, "start_tcp_server", (VALUE(*)(...))t_start_server, 2);
1217
1217
  rb_define_module_function (EmModule, "stop_tcp_server", (VALUE(*)(...))t_stop_server, 1);
1218
1218
  rb_define_module_function (EmModule, "start_unix_server", (VALUE(*)(...))t_start_unix_server, 1);
1219
- rb_define_module_function (EmModule, "set_tls_parms", (VALUE(*)(...))t_set_tls_parms, 5);
1219
+ rb_define_module_function (EmModule, "set_tls_parms", (VALUE(*)(...))t_set_tls_parms, 6);
1220
1220
  rb_define_module_function (EmModule, "start_tls", (VALUE(*)(...))t_start_tls, 1);
1221
1221
  rb_define_module_function (EmModule, "get_peer_cert", (VALUE(*)(...))t_get_peer_cert, 1);
1222
1222
  rb_define_module_function (EmModule, "send_data", (VALUE(*)(...))t_send_data, 3);
@@ -120,7 +120,7 @@ static void InitializeDefaultCredentials()
120
120
  SslContext_t::SslContext_t
121
121
  **************************/
122
122
 
123
- SslContext_t::SslContext_t (bool is_server, const string &privkeyfile, const string &certchainfile, bool use_tls):
123
+ SslContext_t::SslContext_t (bool is_server, const string &privkeyfile, const string &certchainfile, int ssl_version, const string &cipherlist):
124
124
  pCtx (NULL),
125
125
  PrivateKey (NULL),
126
126
  Certificate (NULL)
@@ -145,10 +145,21 @@ SslContext_t::SslContext_t (bool is_server, const string &privkeyfile, const str
145
145
  }
146
146
 
147
147
  bIsServer = is_server;
148
- if (use_tls)
149
- pCtx = SSL_CTX_new (is_server ? TLSv1_server_method() : TLSv1_client_method());
150
- else
151
- pCtx = SSL_CTX_new (is_server ? SSLv23_server_method() : SSLv23_client_method());
148
+
149
+ switch(ssl_version) {
150
+ /* SSLv23 */
151
+ case 0:
152
+ pCtx = SSL_CTX_new (is_server ? SSLv23_server_method() : SSLv23_client_method());
153
+ break;
154
+ /* SSLv3 */
155
+ case 1:
156
+ pCtx = SSL_CTX_new (is_server ? SSLv3_server_method() : SSLv3_client_method());
157
+ break;
158
+ /* TLSv1 */
159
+ case 2:
160
+ pCtx = SSL_CTX_new (is_server ? TLSv1_server_method() : TLSv1_client_method());
161
+ break;
162
+ };
152
163
 
153
164
  if (!pCtx)
154
165
  throw std::runtime_error ("no SSL context");
@@ -177,7 +188,10 @@ SslContext_t::SslContext_t (bool is_server, const string &privkeyfile, const str
177
188
  assert (e > 0);
178
189
  }
179
190
 
180
- SSL_CTX_set_cipher_list (pCtx, "ALL:!ADH:!LOW:!EXP:!DES-CBC3-SHA:@STRENGTH");
191
+ if (cipherlist.length() > 0)
192
+ SSL_CTX_set_cipher_list (pCtx, cipherlist.c_str());
193
+ else
194
+ SSL_CTX_set_cipher_list (pCtx, "ALL:!ADH:!LOW:!EXP:!DES-CBC3-SHA:@STRENGTH");
181
195
 
182
196
  if (is_server) {
183
197
  SSL_CTX_sess_set_cache_size (pCtx, 128);
@@ -220,11 +234,11 @@ SslContext_t::~SslContext_t()
220
234
  SslBox_t::SslBox_t
221
235
  ******************/
222
236
 
223
- SslBox_t::SslBox_t (bool is_server, const string &privkeyfile, const string &certchainfile, bool verify_peer, bool use_tls, const unsigned long binding):
237
+ SslBox_t::SslBox_t (bool is_server, const string &privkeyfile, const string &certchainfile, bool verify_peer, int ssl_version, const string &cipherlist, const unsigned long binding):
224
238
  bIsServer (is_server),
225
239
  bHandshakeCompleted (false),
226
240
  bVerifyPeer (verify_peer),
227
- bUseTls (use_tls),
241
+ bSslVersion (ssl_version),
228
242
  pSSL (NULL),
229
243
  pbioRead (NULL),
230
244
  pbioWrite (NULL)
@@ -233,7 +247,7 @@ SslBox_t::SslBox_t (bool is_server, const string &privkeyfile, const string &cer
233
247
  * a new one every time we come here.
234
248
  */
235
249
 
236
- Context = new SslContext_t (bIsServer, privkeyfile, certchainfile, use_tls);
250
+ Context = new SslContext_t (bIsServer, privkeyfile, certchainfile, ssl_version, cipherlist);
237
251
  assert (Context);
238
252
 
239
253
  pbioRead = BIO_new (BIO_s_mem());
data/ext/ssl.h CHANGED
@@ -33,7 +33,7 @@ class SslContext_t
33
33
  class SslContext_t
34
34
  {
35
35
  public:
36
- SslContext_t (bool is_server, const string &privkeyfile, const string &certchainfile, bool use_tls);
36
+ SslContext_t (bool is_server, const string &privkeyfile, const string &certchainfile, int ssl_version, const string &cipherlist);
37
37
  virtual ~SslContext_t();
38
38
 
39
39
  private:
@@ -57,7 +57,7 @@ class SslBox_t
57
57
  class SslBox_t
58
58
  {
59
59
  public:
60
- SslBox_t (bool is_server, const string &privkeyfile, const string &certchainfile, bool verify_peer, bool use_tls, const unsigned long binding);
60
+ SslBox_t (bool is_server, const string &privkeyfile, const string &certchainfile, bool verify_peer, int ssl_version, const string &cipherlist, const unsigned long binding);
61
61
  virtual ~SslBox_t();
62
62
 
63
63
  int PutPlaintext (const char*, int);
@@ -78,7 +78,7 @@ class SslBox_t
78
78
  bool bIsServer;
79
79
  bool bHandshakeCompleted;
80
80
  bool bVerifyPeer;
81
- bool bUseTls;
81
+ int bSslVersion;
82
82
  SSL *pSSL;
83
83
  BIO *pbioRead;
84
84
  BIO *pbioWrite;
@@ -393,7 +393,9 @@ module EventMachine
393
393
  # If true, the {#ssl_verify_peer} callback on the {EventMachine::Connection} object is called with each certificate
394
394
  # in the certificate chain provided by the peer. See documentation on {#ssl_verify_peer} for how to use this.
395
395
  #
396
- # @option args [Boolean] :use_tls (false) indicates whether TLS or SSL must be offered to the peer. If true TLS is used, SSL otherwise.
396
+ # @option args [Symbol] :ssl_version (:SSLv23) indicates the version of SSL to use. Valid values are :SSLv23, :SSLv3 and TLSv1. Default value is :SSLv23.
397
+ #
398
+ # @option args [String] :cipher_list ("ALL:!ADH:!LOW:!EXP:!DES-CBC3-SHA:@STRENGTH") indicates the available SSL cipher values. Default value is "ALL:!ADH:!LOW:!EXP:!DES-CBC3-SHA:@STRENGTH". Check the format of the OpenSSL cipher string at http://www.openssl.org/docs/apps/ciphers.html#CIPHER_LIST_FORMAT.
397
399
  #
398
400
  # @example Using TLS with EventMachine
399
401
  #
@@ -419,7 +421,7 @@ module EventMachine
419
421
  #
420
422
  # @see #ssl_verify_peer
421
423
  def start_tls args={}
422
- priv_key, cert_chain, verify_peer, use_tls = args.values_at(:private_key_file, :cert_chain_file, :verify_peer, :use_tls)
424
+ priv_key, cert_chain, verify_peer, ssl_version, cipher_list = args.values_at(:private_key_file, :cert_chain_file, :verify_peer, :ssl_version, :cipher_list)
423
425
 
424
426
  [priv_key, cert_chain].each do |file|
425
427
  next if file.nil? or file.empty?
@@ -427,7 +429,18 @@ module EventMachine
427
429
  "Could not find #{file} for start_tls" unless File.exists? file
428
430
  end
429
431
 
430
- EventMachine::set_tls_parms(@signature, priv_key || '', cert_chain || '', verify_peer, (use_tls ? true : false))
432
+ # Backward compatibility with version 1.1.3:
433
+ ssl_version = :TLSv1 if args[:use_tls] and not ssl_version
434
+
435
+ ssl_version = case ssl_version
436
+ when nil ; 0
437
+ when :SSLv23 ; 0
438
+ when :SSLv3 ; 1
439
+ when :TLSv1 ; 2
440
+ else ; raise "invalid value #{ssl_version.inspect} for :ssl_version"
441
+ end
442
+
443
+ EventMachine::set_tls_parms(@signature, priv_key || '', cert_chain || '', verify_peer, ssl_version, cipher_list || '')
431
444
  EventMachine::start_tls @signature
432
445
  end
433
446
 
@@ -271,7 +271,7 @@ module EventMachine
271
271
  psw = psw.call
272
272
  end
273
273
  #str = Base64::encode64("\0#{@args[:auth][:username]}\0#{psw}").chomp
274
- str = ["\0#{@args[:auth][:username]}\0#{psw}"].pack("m").chomp
274
+ str = ["\0#{@args[:auth][:username]}\0#{psw}"].pack("m").gsub(/\n/, '')
275
275
  send_data "AUTH PLAIN #{str}\r\n"
276
276
  @responder = :receive_auth_response
277
277
  else
@@ -564,7 +564,7 @@ module EventMachine
564
564
  @state -= [:data, :mail_from, :rcpt]
565
565
  else
566
566
  # slice off leading . if any
567
- ln.slice!(0...1) if ln[0] == 46
567
+ ln.slice!(0...1) if ln[0] && ln[0].ord == 46
568
568
  @databuffer << ln
569
569
  if @databuffer.length > @@parms[:chunksize]
570
570
  receive_data_chunk @databuffer
@@ -1,3 +1,3 @@
1
1
  module EventMachine
2
- VERSION = "1.1.3"
2
+ VERSION = "1.1.4.beta.2"
3
3
  end
@@ -0,0 +1,62 @@
1
+ require 'em_test_helper'
2
+
3
+ class TestSSLCipherList < Test::Unit::TestCase
4
+
5
+ module ServerHandler
6
+
7
+ def post_init
8
+ start_tls({:cipher_list => $server_cipher_list})
9
+ end
10
+
11
+ def ssl_handshake_completed
12
+ $server_called_back = true
13
+ end
14
+
15
+ end
16
+
17
+ module ClientHandler
18
+
19
+ def post_init
20
+ start_tls({:cipher_list => $client_cipher_list})
21
+ end
22
+
23
+ def ssl_handshake_completed
24
+ $client_called_back = true
25
+ EM.stop_event_loop
26
+ end
27
+
28
+ end
29
+
30
+ def test_ssl_compatible_cipher_list
31
+ $server_called_back, $client_called_back = false, false
32
+
33
+ $server_cipher_list = "ALL"
34
+ $client_cipher_list = "DES-CBC3-SHA"
35
+
36
+ EM.run {
37
+ EM.start_server("127.0.0.1", 9999, ServerHandler)
38
+ EM.connect("127.0.0.1", 9999, ClientHandler)
39
+ EM.add_timer(0.5) { EM.stop }
40
+ }
41
+
42
+ assert($server_called_back, "server ssl handshake NOT completed in 0.5 seconds")
43
+ assert($client_called_back, "client ssl handshake NOT completed in 0.5 seconds")
44
+ end
45
+
46
+ def test_ssl_non_compatible_cipher_list
47
+ $server_called_back, $client_called_back = false, false
48
+
49
+ $server_cipher_list = "" # Use EM default cipher which does not include "DES-CBC3-SHA"
50
+ $client_cipher_list = "DES-CBC3-SHA"
51
+
52
+ EM.run {
53
+ EM.start_server("127.0.0.1", 19999, ServerHandler)
54
+ EM.connect("127.0.0.1", 19999, ClientHandler)
55
+ EM.add_timer(0.5) { EM.stop }
56
+ }
57
+
58
+ assert_equal(false, $server_called_back)
59
+ assert_equal(false, $client_called_back)
60
+ end
61
+
62
+ end if EM.ssl?
metadata CHANGED
@@ -1,8 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eventmachine-le
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.3
5
- prerelease:
4
+ version: 1.1.4.beta.2
5
+ prerelease: 6
6
6
  platform: ruby
7
7
  authors:
8
8
  - Francis Cianfrocca
@@ -11,11 +11,11 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2012-08-28 00:00:00.000000000 Z
14
+ date: 2012-10-09 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: rake-compiler
18
- requirement: &17526700 !ruby/object:Gem::Requirement
18
+ requirement: &15942320 !ruby/object:Gem::Requirement
19
19
  none: false
20
20
  requirements:
21
21
  - - ! '>='
@@ -23,10 +23,10 @@ dependencies:
23
23
  version: 0.7.9
24
24
  type: :development
25
25
  prerelease: false
26
- version_requirements: *17526700
26
+ version_requirements: *15942320
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: yard
29
- requirement: &17526220 !ruby/object:Gem::Requirement
29
+ requirement: &15931040 !ruby/object:Gem::Requirement
30
30
  none: false
31
31
  requirements:
32
32
  - - ! '>='
@@ -34,10 +34,10 @@ dependencies:
34
34
  version: 0.7.2
35
35
  type: :development
36
36
  prerelease: false
37
- version_requirements: *17526220
37
+ version_requirements: *15931040
38
38
  - !ruby/object:Gem::Dependency
39
39
  name: bluecloth
40
- requirement: &17525820 !ruby/object:Gem::Requirement
40
+ requirement: &15929420 !ruby/object:Gem::Requirement
41
41
  none: false
42
42
  requirements:
43
43
  - - ! '>='
@@ -45,7 +45,7 @@ dependencies:
45
45
  version: '0'
46
46
  type: :development
47
47
  prerelease: false
48
- version_requirements: *17525820
48
+ version_requirements: *15929420
49
49
  description: ! 'EventMachine-LE (Live Edition) is a branch of EventMachine (https://github.com/eventmachine/eventmachine).
50
50
 
51
51
 
@@ -89,8 +89,10 @@ extensions:
89
89
  extra_rdoc_files:
90
90
  - README.md
91
91
  - .gitignore
92
+ - .travis.yaml
92
93
  - .yardopts
93
94
  - GNU
95
+ - Gemfile
94
96
  - LICENSE
95
97
  - Rakefile
96
98
  - eventmachine-le.gemspec
@@ -208,6 +210,7 @@ extra_rdoc_files:
208
210
  - tests/test_smtpserver.rb
209
211
  - tests/test_spawn.rb
210
212
  - tests/test_ssl_args.rb
213
+ - tests/test_ssl_cipher_list.rb
211
214
  - tests/test_ssl_methods.rb
212
215
  - tests/test_ssl_verify.rb
213
216
  - tests/test_threaded_resource.rb
@@ -218,8 +221,10 @@ extra_rdoc_files:
218
221
  - tests/test_unbind_reason.rb
219
222
  files:
220
223
  - .gitignore
224
+ - .travis.yaml
221
225
  - .yardopts
222
226
  - GNU
227
+ - Gemfile
223
228
  - LICENSE
224
229
  - README.md
225
230
  - Rakefile
@@ -338,6 +343,7 @@ files:
338
343
  - tests/test_smtpserver.rb
339
344
  - tests/test_spawn.rb
340
345
  - tests/test_ssl_args.rb
346
+ - tests/test_ssl_cipher_list.rb
341
347
  - tests/test_ssl_methods.rb
342
348
  - tests/test_ssl_verify.rb
343
349
  - tests/test_threaded_resource.rb
@@ -367,9 +373,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
367
373
  required_rubygems_version: !ruby/object:Gem::Requirement
368
374
  none: false
369
375
  requirements:
370
- - - ! '>='
376
+ - - ! '>'
371
377
  - !ruby/object:Gem::Version
372
- version: '0'
378
+ version: 1.3.1
373
379
  requirements: []
374
380
  rubyforge_project:
375
381
  rubygems_version: 1.8.11