libuv 0.11.1 → 0.11.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5aadb10cd3940b1506f9a898a5cb36fe41ee4929
4
- data.tar.gz: 44e8623b2b204756fd7bfdb915fe6012e7e30892
3
+ metadata.gz: 6b1083a5f79f1e3c76247f6871cb52a299362315
4
+ data.tar.gz: 86311c897d2e2da79fd28d8a756236cfbd5a3f12
5
5
  SHA512:
6
- metadata.gz: f0945989ee594cc8bc78969f8b20d728c32875d302476cd49dac9059e69e3cd46ff171fdfd1040d80854354b0a09d1d2328a0b694aec4f91cf3f8327e9776960
7
- data.tar.gz: 08f642c3abdbf20df9bbcd4dfd5a19172fda8314b4a6a82bebe20a04bb3ace010404dc0f4ccd346b1507e06277d55f34678d8af53940796d12df0f8dfc096665
6
+ metadata.gz: 78c74f51d1a890826f005654693b0b9c92a97ea0d9aecee10b91f877ec6ca98880400f0fbf2770286198397006d2d4bb52ef97667a299d526cc88de40e448fe1
7
+ data.tar.gz: 30440c1b0b077e34b8a7519ab2a34e4a4dcbd04004158716f8fe8151ae9d5150002eb0e28887a128308d2a31f9a0e7dfc5430d4a4348b507dd658a6bf8e8d2b7
data/README.md CHANGED
@@ -64,7 +64,7 @@ or
64
64
 
65
65
  ## Libuv features supported
66
66
 
67
- * TCP
67
+ * TCP (with TLS support)
68
68
  * UDP
69
69
  * TTY
70
70
  * Pipe
@@ -13,7 +13,9 @@ file 'ext/libuv/build' do
13
13
  end
14
14
 
15
15
  file 'ext/libuv/build/gyp' => 'ext/libuv/build' do
16
- system "svn", "export", "-r1214", "http://gyp.googlecode.com/svn/trunk", "ext/libuv/build/gyp"
16
+ if not File.directory?('ext/libuv/build/gyp')
17
+ system "svn", "export", "-r1214", "http://gyp.googlecode.com/svn/trunk", "ext/libuv/build/gyp"
18
+ end
17
19
  end
18
20
 
19
21
  CLEAN.include('ext/libuv/build/gyp')
@@ -134,10 +134,14 @@ module Libuv
134
134
  data = base.read_string(nread)
135
135
  ::Libuv::Ext.free(base)
136
136
 
137
- begin
138
- @progress.call data, self
139
- rescue Exception => e
140
- @loop.log :error, :stream_progress_cb, e
137
+ if @tls.nil?
138
+ begin
139
+ @progress.call data, self
140
+ rescue Exception => e
141
+ @loop.log :error, :stream_progress_cb, e
142
+ end
143
+ else
144
+ @tls.decrypt(data)
141
145
  end
142
146
  end
143
147
  end
data/lib/libuv/tcp.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'ipaddr'
2
+ require 'ruby-tls'
2
3
 
3
4
 
4
5
  module Libuv
@@ -7,6 +8,7 @@ module Libuv
7
8
 
8
9
 
9
10
  KEEPALIVE_ARGUMENT_ERROR = "delay must be an Integer".freeze
11
+ TLS_ERROR = "TLS write failed".freeze
10
12
 
11
13
 
12
14
  def initialize(loop, acceptor = nil)
@@ -19,6 +21,101 @@ module Libuv
19
21
  super(tcp_ptr, error)
20
22
  end
21
23
 
24
+
25
+ #
26
+ # TLS Abstraction ----------------------
27
+ # --------------------------------------
28
+ #
29
+ def start_tls(args = {})
30
+ @handshake = false
31
+ @pending_writes = []
32
+ @tls = ::RubyTls::Connection.new(self)
33
+ @tls.start(args)
34
+ end
35
+
36
+ # Push through any pending writes when handshake has completed
37
+ def handshake_cb
38
+ @handshake = true
39
+ writes = @pending_writes
40
+ @pending_writes = nil
41
+ writes.each do |deferred, data|
42
+ @pending_write = deferred
43
+ @tls.encrypt(data)
44
+ end
45
+ end
46
+
47
+ # This is clear text data that has been decrypted
48
+ # Same as stream.rb on_read for clear text
49
+ def dispatch_cb(data)
50
+ begin
51
+ @progress.call data, self
52
+ rescue Exception => e
53
+ @loop.log :error, :stream_progress_cb, e
54
+ end
55
+ end
56
+
57
+ # We resolve the existing tls write promise with a the
58
+ # real writes promise (a close may have occurred)
59
+ def transmit_cb(data)
60
+ if not @pending_write.nil?
61
+ @pending_write.resolve(direct_write(data))
62
+ @pending_write = nil
63
+ else
64
+ direct_write(data)
65
+ end
66
+ end
67
+
68
+ # Close can be called multiple times
69
+ def close_cb
70
+ if not @pending_write.nil?
71
+ @pending_write.reject(TLS_ERROR)
72
+ @pending_write = nil
73
+ end
74
+
75
+ # Shutdown the stream
76
+ close
77
+ end
78
+
79
+ # overwrite the default close to ensure
80
+ # pending writes are rejected
81
+ def close
82
+ if not @pending_writes.nil?
83
+ @pending_writes.each do |deferred, data|
84
+ deferred.reject(TLS_ERROR)
85
+ end
86
+ @pending_writes = nil
87
+ end
88
+
89
+ super
90
+ end
91
+
92
+ # Verify peers will be called for each cert in the chain
93
+ def verify_peer(&block)
94
+ @tls.verify_cb &block
95
+ end
96
+
97
+ alias_method :direct_write, :write
98
+ def write(data)
99
+ if @tls.nil?
100
+ direct_write(data)
101
+ else
102
+ deferred = @loop.defer
103
+
104
+ if @handshake == true
105
+ @pending_write = deferred
106
+ @tls.encrypt(data)
107
+ else
108
+ @pending_writes << [deferred, data]
109
+ end
110
+
111
+ deferred.promise
112
+ end
113
+ end
114
+ #
115
+ # END TLS Abstraction ------------------
116
+ # --------------------------------------
117
+ #
118
+
22
119
  def bind(ip, port, callback = nil, &blk)
23
120
  return if @closed
24
121
  @on_listen = callback || blk
data/lib/libuv/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Libuv
2
- VERSION = '0.11.1'
2
+ VERSION = '0.11.2'
3
3
  end
data/libuv.gemspec CHANGED
@@ -17,6 +17,7 @@ Gem::Specification.new do |gem|
17
17
 
18
18
  gem.add_runtime_dependency 'ffi', '>= 1.9'
19
19
  gem.add_runtime_dependency 'thread_safe'
20
+ gem.add_runtime_dependency 'ruby-tls'
20
21
  gem.add_development_dependency 'rspec', '>= 2.14'
21
22
  gem.add_development_dependency 'rake', '>= 10.1'
22
23
  gem.add_development_dependency 'yard'
data/spec/tcp_spec.rb CHANGED
@@ -200,4 +200,68 @@ describe Libuv::TCP do
200
200
  @log.should == ['ping', 'pong']
201
201
  end
202
202
 
203
+ describe 'basic TLS client and server' do
204
+ it "should send a ping and return a pong", :network => true do
205
+ @loop.run { |logger|
206
+ logger.progress do |level, errorid, error|
207
+ begin
208
+ @general_failure << "Log called: #{level}: #{errorid}\n#{error.message}\n#{error.backtrace.join("\n")}\n"
209
+ rescue Exception
210
+ @general_failure << 'error in logger'
211
+ end
212
+ end
213
+
214
+
215
+ @server.bind('127.0.0.1', 34567) do |server|
216
+ server.accept do |client|
217
+ client.start_tls(server: true)
218
+ client.progress do |data|
219
+ @log << data
220
+
221
+ client.write('pong')
222
+ end
223
+ client.start_read
224
+ end
225
+ end
226
+
227
+ # catch errors
228
+ @server.catch do |reason|
229
+ @general_failure << reason.inspect
230
+ end
231
+
232
+ # start listening
233
+ @server.listen(1024)
234
+
235
+
236
+
237
+ # connect client to server
238
+ @client.connect('127.0.0.1', 34567) do |client|
239
+ client.start_tls
240
+ client.progress do |data|
241
+ @log << data
242
+
243
+ @client.shutdown
244
+ end
245
+
246
+ @client.start_read
247
+ @client.write('ping')
248
+ end
249
+
250
+ # catch errors
251
+ @client.catch do |reason|
252
+ @general_failure << reason.inspect
253
+ end
254
+
255
+ # close the handle
256
+ @client.finally do
257
+ @server.close
258
+ @loop.stop
259
+ end
260
+ }
261
+
262
+ @general_failure.should == []
263
+ @log.should == ['ping', 'pong']
264
+ end
265
+ end
266
+
203
267
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: libuv
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.1
4
+ version: 0.11.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bulat Shakirzyanov
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-11-11 00:00:00.000000000 Z
12
+ date: 2013-11-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ffi
@@ -39,6 +39,20 @@ dependencies:
39
39
  - - ">="
40
40
  - !ruby/object:Gem::Version
41
41
  version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: ruby-tls
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
42
56
  - !ruby/object:Gem::Dependency
43
57
  name: rspec
44
58
  requirement: !ruby/object:Gem::Requirement
@@ -173,6 +187,19 @@ files:
173
187
  - ext/libuv/include/uv.h
174
188
  - ext/libuv/m4/.gitignore
175
189
  - ext/libuv/m4/dtrace.m4
190
+ - ext/libuv/samples/.gitignore
191
+ - ext/libuv/samples/socks5-proxy/.gitignore
192
+ - ext/libuv/samples/socks5-proxy/LICENSE
193
+ - ext/libuv/samples/socks5-proxy/Makefile
194
+ - ext/libuv/samples/socks5-proxy/build.gyp
195
+ - ext/libuv/samples/socks5-proxy/client.c
196
+ - ext/libuv/samples/socks5-proxy/defs.h
197
+ - ext/libuv/samples/socks5-proxy/getopt.c
198
+ - ext/libuv/samples/socks5-proxy/main.c
199
+ - ext/libuv/samples/socks5-proxy/s5.c
200
+ - ext/libuv/samples/socks5-proxy/s5.h
201
+ - ext/libuv/samples/socks5-proxy/server.c
202
+ - ext/libuv/samples/socks5-proxy/util.c
176
203
  - ext/libuv/src/fs-poll.c
177
204
  - ext/libuv/src/inet.c
178
205
  - ext/libuv/src/queue.h
@@ -285,6 +312,7 @@ files:
285
312
  - ext/libuv/test/test-barrier.c
286
313
  - ext/libuv/test/test-callback-order.c
287
314
  - ext/libuv/test/test-callback-stack.c
315
+ - ext/libuv/test/test-close-fd.c
288
316
  - ext/libuv/test/test-close-order.c
289
317
  - ext/libuv/test/test-condvar.c
290
318
  - ext/libuv/test/test-connection-fail.c
@@ -333,6 +361,7 @@ files:
333
361
  - ext/libuv/test/test-stdio-over-pipes.c
334
362
  - ext/libuv/test/test-tcp-bind-error.c
335
363
  - ext/libuv/test/test-tcp-bind6-error.c
364
+ - ext/libuv/test/test-tcp-close-accept.c
336
365
  - ext/libuv/test/test-tcp-close-while-connecting.c
337
366
  - ext/libuv/test/test-tcp-close.c
338
367
  - ext/libuv/test/test-tcp-connect-error-after-write.c
@@ -361,6 +390,7 @@ files:
361
390
  - ext/libuv/test/test-udp-options.c
362
391
  - ext/libuv/test/test-udp-send-and-recv.c
363
392
  - ext/libuv/test/test-walk-handles.c
393
+ - ext/libuv/test/test-watcher-cross-stop.c
364
394
  - ext/libuv/uv.gyp
365
395
  - ext/libuv/vcbuild.bat
366
396
  homepage: https://github.com/cotag/libuv