ffi-rzmq 2.0.0 → 2.0.1

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: a406c4de564eef119c3f303a386546d6bfda94fd
4
- data.tar.gz: 4ef6371ae1029809d302dc7911d0a5a056328428
3
+ metadata.gz: d4e271f6dc0fcbad07111b4b23c969f192eb6d57
4
+ data.tar.gz: d5a508626d471997f3568646cd05a95a70ad19f1
5
5
  SHA512:
6
- metadata.gz: 801813a1a358e60fc0906369c1da88638bdb2c91588da12c50adf2b5869b8542690baa14b3d6098f2ba34e74fcb9468631c5f23ac21dba216782be21a654406d
7
- data.tar.gz: 88e1a7bdc0500f6703e94ace2c145f96420fafa89b0bd39927edd5f4a396ca36a4a0bbb543d57b517b115eae5ffb9c55288b1b568fc4ae11f8acee903ceaa1b1
6
+ metadata.gz: 72b0886538590486c2e8c64e4e03eeab7259c39a9720b0ae763f7c4d0e149cda5926ddbc1710b39ecbf4cfeee0f348d1c85e1816c437764ac99becb7be784286
7
+ data.tar.gz: 0ca81c180fb1a7a8c7dd7767f7200589ec91fb42553c49eac03a2b91c5e51a95f002c64503e2d79fe77cee74adb0331a9adda1107ffd498effaa10ce2b471f01
@@ -1,3 +1,8 @@
1
+ == 2.0.1 / 20140122
2
+ * Fix setsockopt with string parameters for options that have very strict
3
+ requirements (like CURVE_SECRETKEY) (37aed3c)
4
+
5
+ * Provide a wrapper for zmq_curve_keypair for ZeroMQ4
1
6
 
2
7
  == 2.0.0 / 20140108
3
8
  * Split out all of the FFI code to its own gem so other projects can use
@@ -0,0 +1,60 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'ffi-rzmq')
2
+
3
+ # This example shows the basics of a CURVE-secured REP/REQ setup between
4
+ # a Server and Client. This is the minimal required setup for authenticating
5
+ # a connection between a Client and a Server. For validating the Client's authentication
6
+ # once the initial connection has succeeded, you'll need a ZAP handler on the Server.
7
+
8
+ # Build the Server's keys
9
+ server_public_key, server_private_key = ZMQ::Util.curve_keypair
10
+
11
+ # Build the Client's keys
12
+ client_public_key, client_private_key = ZMQ::Util.curve_keypair
13
+
14
+ context = ZMQ::Context.new
15
+ bind_point = "tcp://127.0.0.1:4455"
16
+
17
+ ##
18
+ # Configure the Server
19
+ ##
20
+ server = context.socket ZMQ::REP
21
+
22
+ server.setsockopt(ZMQ::CURVE_SERVER, 1)
23
+ server.setsockopt(ZMQ::CURVE_SECRETKEY, server_private_key)
24
+
25
+ server.bind(bind_point)
26
+
27
+ ##
28
+ # Configure the Client to talk to the Server
29
+ ##
30
+ client = context.socket ZMQ::REQ
31
+
32
+ client.setsockopt(ZMQ::CURVE_SERVERKEY, server_public_key)
33
+ client.setsockopt(ZMQ::CURVE_PUBLICKEY, client_public_key)
34
+ client.setsockopt(ZMQ::CURVE_SECRETKEY, client_private_key)
35
+
36
+ client.connect(bind_point)
37
+
38
+ ##
39
+ # Show that communication still works
40
+ ##
41
+
42
+ client_message = "Hello Server!"
43
+ server_response = "Hello Client!"
44
+
45
+ puts "Client sending: #{client_message}"
46
+ client.send_string client_message
47
+
48
+ server.recv_string(server_message = '')
49
+ puts "Server received: #{server_message}, replying with #{server_response}"
50
+
51
+ server.send_string(server_response)
52
+
53
+ client.recv_string(response = '')
54
+ puts "Client has received: #{response}"
55
+
56
+ puts "Finished"
57
+
58
+ client.close
59
+ server.close
60
+ context.terminate
@@ -13,6 +13,9 @@ module ZMQ
13
13
  end
14
14
  end # call ZeroMQError
15
15
 
16
+ class NotSupportedError < ZeroMQError
17
+ end
18
+
16
19
 
17
20
  class ContextError < ZeroMQError
18
21
  # True when the exception was raised due to the library
@@ -135,15 +135,14 @@ module ZMQ
135
135
  pointer.write_int value
136
136
 
137
137
  elsif 2 == @option_lookup[name]
138
+ # Strings are treated as pointers by FFI so we'll just pass it through
138
139
  length ||= value.size
140
+ pointer = value
139
141
 
140
- # note: not checking errno for failed memory allocations :(
141
- pointer = LibC.malloc length
142
- pointer.write_string value
143
142
  end
144
143
 
145
144
  rc = LibZMQ.zmq_setsockopt @socket, name, pointer, length
146
- LibC.free(pointer) unless pointer.nil? || pointer.null?
145
+ LibC.free(pointer) unless pointer.is_a?(String) || pointer.nil? || pointer.null?
147
146
  rc
148
147
  end
149
148
 
@@ -5,6 +5,23 @@ module ZMQ
5
5
  #
6
6
  class Util
7
7
 
8
+ # Generate and return a CURVE public/private keypair
9
+ #
10
+ # Raises an error if ZeroMQ is not configured for CURVE connections.
11
+ # Install libsodium if this is the case.
12
+ def self.curve_keypair
13
+ public_key = FFI::MemoryPointer.from_string(' ' * 41)
14
+ private_key = FFI::MemoryPointer.from_string(' ' * 41)
15
+ rc = LibZMQ.zmq_curve_keypair public_key, private_key
16
+
17
+ if rc < 0
18
+ raise NotSupportedError.new "zmq_curve_keypair" , rc, ZMQ::Util.errno,
19
+ "Rebuild zeromq with libsodium to enable CURVE security options."
20
+ end
21
+
22
+ [public_key.read_string, private_key.read_string]
23
+ end
24
+
8
25
  # Returns true when +rc+ is greater than or equal to 0, false otherwise.
9
26
  #
10
27
  # We use the >= test because zmq_poll() returns the number of sockets
@@ -1,3 +1,3 @@
1
1
  module ZMQ
2
- VERSION = "2.0.0"
2
+ VERSION = "2.0.1"
3
3
  end
@@ -0,0 +1,28 @@
1
+ require File.join(File.dirname(__FILE__), %w[spec_helper])
2
+
3
+ module ZMQ
4
+ describe Util do
5
+
6
+ if LibZMQ.version4?
7
+ describe "curve_keypair" do
8
+
9
+ it "returns a set of public and private keys" do
10
+ public_key, private_key = ZMQ::Util.curve_keypair
11
+
12
+ public_key.should_not == private_key
13
+ public_key.should_not be_nil
14
+ private_key.should_not be_nil
15
+ end
16
+
17
+ it "raises if zmq does not support CURVE (libsodium not linked)" do
18
+ lambda {
19
+ LibZMQ.should_receive(:zmq_curve_keypair).and_return(-1)
20
+ ZMQ::Util.curve_keypair
21
+ }.should raise_exception(ZMQ::NotSupportedError)
22
+ end
23
+
24
+ end
25
+ end
26
+
27
+ end
28
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ffi-rzmq
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chuck Remes
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-08 00:00:00.000000000 Z
11
+ date: 2014-01-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi-rzmq-core
@@ -79,6 +79,7 @@ files:
79
79
  - examples/publish_subscribe.rb
80
80
  - examples/remote_lat.rb
81
81
  - examples/remote_throughput.rb
82
+ - examples/repreq_over_curve.rb
82
83
  - examples/reqrep_poll.rb
83
84
  - examples/request_response.rb
84
85
  - examples/sub.rb
@@ -110,6 +111,7 @@ files:
110
111
  - spec/spec_helper.rb
111
112
  - spec/support/test.crt
112
113
  - spec/support/test.key
114
+ - spec/util_spec.rb
113
115
  homepage: http://github.com/chuckremes/ffi-rzmq
114
116
  licenses:
115
117
  - MIT
@@ -130,7 +132,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
130
132
  version: '0'
131
133
  requirements: []
132
134
  rubyforge_project: ffi-rzmq
133
- rubygems_version: 2.0.3
135
+ rubygems_version: 2.0.14
134
136
  signing_key:
135
137
  specification_version: 4
136
138
  summary: This gem wraps the ZeroMQ (0mq) networking library using Ruby FFI (foreign
@@ -148,3 +150,4 @@ test_files:
148
150
  - spec/spec_helper.rb
149
151
  - spec/support/test.crt
150
152
  - spec/support/test.key
153
+ - spec/util_spec.rb