diff options
Diffstat (limited to 'proto/server')
-rw-r--r-- | proto/server/doc.go | 23 | ||||
-rwxr-xr-x | proto/server/func_handlerequest.go.sh | 101 | ||||
-rwxr-xr-x | proto/server/interface_backend.go.sh | 39 | ||||
-rwxr-xr-x | proto/server/type_nilbackend.go.sh | 40 |
4 files changed, 203 insertions, 0 deletions
diff --git a/proto/server/doc.go b/proto/server/doc.go new file mode 100644 index 0000000..72ae2fe --- /dev/null +++ b/proto/server/doc.go @@ -0,0 +1,23 @@ +// Copyright (C) 2015 Luke Shumaker <lukeshu@sbcglobal.net> +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +// 02110-1301 USA + +// Package nslcd_server is a framework for implementing an nslcd +// server. +// +// You write an implementation of the Backend interface, then pass +// that to the HandleRequest function for each connection. +package nslcd_server diff --git a/proto/server/func_handlerequest.go.sh b/proto/server/func_handlerequest.go.sh new file mode 100755 index 0000000..3ef2758 --- /dev/null +++ b/proto/server/func_handlerequest.go.sh @@ -0,0 +1,101 @@ +#!/usr/bin/env bash +# -*- Mode: Go -*- +# Copyright (C) 2015 Luke Shumaker <lukeshu@sbcglobal.net> +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA + +requests=$1 +printf '//' +printf ' %q' "$0" "$@" +printf '\n// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT\n\n' +cat <<EOF | gofmt +package nslcd_server + +import ( + "fmt" + "io" + p "nslcd/proto" + "os" + s "syscall" +) + +// Handle a request to nslcd +func HandleRequest(backend Backend, in io.Reader, out io.Writer, cred s.Ucred) (err error) { + err = nil + defer func() { + if r := recover(); r != nil { + switch r := r.(type) { + case error: + err = r + default: + panic(r) + } + } + }() + handleRequest(backend, in, out, cred) + return +} + +func handleRequest(backend Backend, in io.Reader, out io.Writer, cred s.Ucred) { + var version int32 + p.Read(in, &version) + if version != p.NSLCD_VERSION { + panic(p.NslcdError(fmt.Sprintf("Version mismatch: server=%#08x client=%#08x", p.NSLCD_VERSION, version))) + } + var action int32 + p.Read(in, &action) + + ch := make(chan interface{}) + switch action { +$( +while read -r request; do + cat <<EOT + case p.NSLCD_ACTION_${request^^}: + var req p.Request_${request} + p.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 + ) + _ch := backend.${request}(cred, req) + go func() { + defer close(ch) + for obj := range _ch { + ch <- obj + } + }() +EOT +done < "$requests" +) + default: + close(ch) + panic(p.NslcdError(fmt.Sprintf("Unknown request action: %#08x", action))) + } + p.Write(out, p.NSLCD_VERSION) + p.Write(out, action) + + for result := range ch { + p.Write(out, p.NSLCD_RESULT_BEGIN) + p.Write(out, result) + } + p.Write(out, p.NSLCD_RESULT_END) +} +EOF diff --git a/proto/server/interface_backend.go.sh b/proto/server/interface_backend.go.sh new file mode 100755 index 0000000..e6eeb66 --- /dev/null +++ b/proto/server/interface_backend.go.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash +# Copyright (C) 2015 Luke Shumaker <lukeshu@sbcglobal.net> +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA + +requests=$1 +printf '//' +printf ' %q' "$0" "$@" +printf '\n// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT\n\n' +cat <<EOF | gofmt +package nslcd_server + +import ( + s "syscall" + p "nslcd/proto" +) + +// The Backend interface allows the backend store to be implemented +// separately from the protocol implementation. Each request type +// that the nslcd server may reply to is implemented simply as a +// method that returns a channel of the resulting values. +type Backend interface { + $(sed -rn 's/([^_]+)(.*)/\1\2(s.Ucred, p.Request_\1\2) <-chan p.\1/p' "$requests" | grep -v PAM) + $(sed -rn 's/(PAM)(.*)/\1\2(s.Ucred, p.Request_\1\2) <-chan p.\1\2/p' "$requests") +} +EOF diff --git a/proto/server/type_nilbackend.go.sh b/proto/server/type_nilbackend.go.sh new file mode 100755 index 0000000..17aad63 --- /dev/null +++ b/proto/server/type_nilbackend.go.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash +# Copyright (C) 2015 Luke Shumaker <lukeshu@sbcglobal.net> +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA + +interface=$1 +printf '//' +printf ' %q' "$0" "$@" +printf '\n// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT\n\n' +cat <<EOF | gofmt +package nslcd_server + +import ( + p "nslcd/proto" + s "syscall" +) + +// NilBackend implements the Backend interface, but only returns empty +// responses. It is useful to add as an anonymous member of a backend +// implementation that does not return results for all of the +// databases. +type NilBackend struct{} + +$(< "$interface" sed -rn 's/^\t([^(]+)\(s.Ucred, ([^)]+)\) <-chan (\S+)$/func (o NilBackend) \1(s.Ucred, \2) <-chan \3 { r := make(chan \3); close(r); return r }/p') + +var _ Backend = NilBackend{} +EOF |