eventmachine-le 1.1.3 → 1.1.4.beta.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.
@@ -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