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.
- 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
|