forked from pebbe/zmq4
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathauth_test.go
117 lines (103 loc) · 2.69 KB
/
auth_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package zmq4_test
import (
zmq "github.com/pebbe/zmq4"
"fmt"
"log"
)
func ExampleAuthStart() {
checkErr := func(err error) bool {
if err == nil {
return false
}
log.Println(err)
return true
}
zmq.AuthSetVerbose(false)
// Start authentication engine
err := zmq.AuthStart()
if checkErr(err) {
return
}
defer zmq.AuthStop()
zmq.AuthSetMetadataHandler(
func(version, request_id, domain, address, identity, mechanism string, credentials ...string) (metadata map[string]string) {
return map[string]string{
"Identity": identity,
"User-Id": "anonymous",
"Hello": "World!",
"Foo": "Bar",
}
})
zmq.AuthAllow("domain1", "127.0.0.1")
// We need two certificates, one for the client and one for
// the server. The client must know the server's public key
// to make a CURVE connection.
client_public, client_secret, err := zmq.NewCurveKeypair()
if checkErr(err) {
return
}
server_public, server_secret, err := zmq.NewCurveKeypair()
if checkErr(err) {
return
}
// Tell authenticator to use this public client key
zmq.AuthCurveAdd("domain1", client_public)
// Create and bind server socket
server, err := zmq.NewSocket(zmq.DEALER)
if checkErr(err) {
return
}
defer server.Close()
server.SetIdentity("Server1")
server.ServerAuthCurve("domain1", server_secret)
err = server.Bind("tcp://*:9000")
if checkErr(err) {
return
}
// Create and connect client socket
client, err := zmq.NewSocket(zmq.DEALER)
if checkErr(err) {
return
}
defer client.Close()
server.SetIdentity("Client1")
client.ClientAuthCurve(server_public, client_public, client_secret)
err = client.Connect("tcp://127.0.0.1:9000")
if checkErr(err) {
return
}
// Send a message from client to server
_, err = client.SendMessage("Greatings", "Earthlings!")
if checkErr(err) {
return
}
// Receive message and metadata on the server
keys := []string{"Identity", "User-Id", "Socket-Type", "Hello", "Foo", "Fuz"}
message, metadata, err := server.RecvMessageWithMetadata(0, keys...)
if checkErr(err) {
return
}
fmt.Println(message)
if _, minor, _ := zmq.Version(); minor < 1 {
// Metadata requires at least ZeroMQ version 4.1
fmt.Println(`Identity: "Server1" true`)
fmt.Println(`User-Id: "anonymous" true`)
fmt.Println(`Socket-Type: "DEALER" true`)
fmt.Println(`Hello: "World!" true`)
fmt.Println(`Foo: "Bar" true`)
fmt.Println(`Fuz: "" false`)
} else {
for _, key := range keys {
value, ok := metadata[key]
fmt.Printf("%v: %q %v\n", key, value, ok)
}
}
// Output:
// [Greatings Earthlings!]
// Identity: "Server1" true
// User-Id: "anonymous" true
// Socket-Type: "DEALER" true
// Hello: "World!" true
// Foo: "Bar" true
// Fuz: "" false
}