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
|
#!/usr/bin/env bash
# -*- Mode: Go -*-
requests=$1
cat <<EOF
package nslcd_proto
import (
"fmt"
"io"
"os"
)
func handleRequest(backend Backend, in io.Reader, out io.Writer, cred Ucred) {
var version int32
read(in, &version)
if version != NSLCD_VERSION {
panic(NslcdError(fmt.Sprintf("Version mismatch: server=%#08x client=%#08x", NSLCD_VERSION, version)))
}
var action int32
read(in, &action)
res := make(chan interface{})
switch action {
$(
while read -r request; do
cat <<EOT
case NSLCD_ACTION_${request^^}:
var req Request_${request}
read(in, &req)
$(
if [[ $request == PAM_Authentication ]]; then
echo '_req := req'
echo '_req.Password = "<omitted-from-log>"'
echo 'fmt.Fprintf(os.Stderr, "Request: %#v\n", _req)'
else
echo 'fmt.Fprintf(os.Stderr, "Request: %#v\n", req)'
fi
)
_res := backend.${request}(cred, req)
go func() {
o, ok := <-_res
if ok {
res <- o
} else {
close(res)
}
}()
EOT
done < "$requests"
)
default:
panic(NslcdError(fmt.Sprintf("unknown request action: %#08x", action)))
}
if res == nil {
return
}
write(out, NSLCD_VERSION)
write(out, action)
for result, ok := <-res; ok; result, ok = <-res {
write(out, NSLCD_RESULT_BEGIN)
write(out, result)
}
write(out, NSLCD_RESULT_END)
}
EOF
|