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.
- data/.travis.yaml +7 -0
- data/Gemfile +8 -0
- data/README.md +1 -0
- data/ext/cmain.cpp +2 -2
- data/ext/ed.cpp +6 -4
- data/ext/ed.h +4 -3
- data/ext/eventmachine.h +1 -1
- data/ext/extconf.rb +3 -2
- data/ext/rubymain.cpp +3 -3
- data/ext/ssl.cpp +23 -9
- data/ext/ssl.h +3 -3
- data/lib/em/connection.rb +16 -3
- data/lib/em/protocols/smtpclient.rb +1 -1
- data/lib/em/protocols/smtpserver.rb +1 -1
- data/lib/em/version.rb +1 -1
- data/tests/test_ssl_cipher_list.rb +62 -0
- metadata +17 -11
data/.travis.yaml
ADDED
data/Gemfile
ADDED
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 ##
|
data/ext/cmain.cpp
CHANGED
@@ -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
|
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),
|
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
|
-
|
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,
|
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,
|
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
|
-
|
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,
|
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,
|
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
|
-
|
244
|
+
int bSslVersion;
|
245
|
+
std::string CipherList;
|
245
246
|
bool bSslPeerAccepted;
|
246
247
|
#endif
|
247
248
|
|
data/ext/eventmachine.h
CHANGED
@@ -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
|
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
|
data/ext/extconf.rb
CHANGED
@@ -40,7 +40,8 @@ def manual_ssl_config
|
|
40
40
|
end
|
41
41
|
|
42
42
|
if ENV['CROSS_COMPILING']
|
43
|
-
|
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"
|
data/ext/rubymain.cpp
CHANGED
@@ -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
|
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
|
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,
|
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);
|
data/ext/ssl.cpp
CHANGED
@@ -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,
|
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
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
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
|
-
|
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,
|
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
|
-
|
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,
|
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,
|
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,
|
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
|
-
|
81
|
+
int bSslVersion;
|
82
82
|
SSL *pSSL;
|
83
83
|
BIO *pbioRead;
|
84
84
|
BIO *pbioWrite;
|
data/lib/em/connection.rb
CHANGED
@@ -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 [
|
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,
|
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
|
-
|
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").
|
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
|
data/lib/em/version.rb
CHANGED
@@ -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.
|
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-
|
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: &
|
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: *
|
26
|
+
version_requirements: *15942320
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: yard
|
29
|
-
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: *
|
37
|
+
version_requirements: *15931040
|
38
38
|
- !ruby/object:Gem::Dependency
|
39
39
|
name: bluecloth
|
40
|
-
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: *
|
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:
|
378
|
+
version: 1.3.1
|
373
379
|
requirements: []
|
374
380
|
rubyforge_project:
|
375
381
|
rubygems_version: 1.8.11
|