-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathassuan.go
88 lines (68 loc) · 1.62 KB
/
assuan.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
package main
import (
"bufio"
"bytes"
"crypto/rand"
"fmt"
"log"
"net"
"os"
)
// StartAssuanListener creates a new assuan listener and accompanying socket wrapper descriptor.
func StartAssuanListener() (l net.Listener, nonce []byte, err error) {
l, err = net.Listen("tcp", "127.0.0.1:0")
if err != nil {
return
}
fn, err := GetLinuxScdaemonSocketFn()
if err != nil {
return
}
log.Printf("Using socket fn: %s", fn)
f, err := os.OpenFile(fn, os.O_WRONLY|os.O_CREATE, 0400)
if err != nil {
return
}
defer f.Close()
port := l.Addr().(*net.TCPAddr).Port
nonce = make([]byte, 16)
_, err = rand.Read(nonce)
if err != nil {
return
}
log.Printf("Listening on port %d protected by nonce %x", port, nonce)
socket := bufio.NewWriter(f)
_, err = socket.WriteString(fmt.Sprintf("%d\n", port))
if err != nil {
return
}
_, err = socket.Write(nonce)
if err != nil {
return
}
err = socket.Flush()
return
}
// ProxyAssuanRequests accepts new assuan requests and opens new relay connections. Additionally,
// it verifies the nonce, simulating a regular assuan server.
func ProxyAssuanRequests(daemon *Scdaemon, l net.Listener, nonce []byte) {
for {
conn, err := l.Accept()
if err != nil {
log.Printf("Could not accept connection: %s", err)
break
}
verify := make([]byte, 16)
n, err := conn.Read(verify)
if err != nil {
log.Printf("Failed to read nonce: %s", err)
continue
}
if bytes.Compare(verify, nonce) != 0 {
log.Printf("Invalid connection nonce: %+v != %+v (len: %d)", verify, nonce, n)
continue
}
log.Printf("Received connection")
go daemon.Connect(conn, conn)
}
}