summaryrefslogtreecommitdiff
path: root/nslcd_server
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@sbcglobal.net>2016-12-18 03:59:10 -0500
committerLuke Shumaker <lukeshu@sbcglobal.net>2016-12-18 03:59:10 -0500
commit5aa2dc8085d65c8cfcc46a02ee74ddb9d9032e62 (patch)
tree7ffa48eea1cd99655413a18b83144c8ca2ddf5bb /nslcd_server
parent321e6c8958823f64fa2464497f9d217712f93530 (diff)
Rename packages to make goimports happy. BREAKING CHANGE.
Diffstat (limited to 'nslcd_server')
-rw-r--r--nslcd_server/.gitignore3
-rw-r--r--nslcd_server/Makefile37
-rw-r--r--nslcd_server/doc.go25
-rwxr-xr-xnslcd_server/func_handlerequest.go.gen120
-rwxr-xr-xnslcd_server/interface_backend.go.gen40
-rwxr-xr-xnslcd_server/type_nilbackend.go.gen41
6 files changed, 266 insertions, 0 deletions
diff --git a/nslcd_server/.gitignore b/nslcd_server/.gitignore
new file mode 100644
index 0000000..ff46733
--- /dev/null
+++ b/nslcd_server/.gitignore
@@ -0,0 +1,3 @@
+/func_handlerequest.go
+/interface_backend.go
+/type_nilbackend.go
diff --git a/nslcd_server/Makefile b/nslcd_server/Makefile
new file mode 100644
index 0000000..f1ff20f
--- /dev/null
+++ b/nslcd_server/Makefile
@@ -0,0 +1,37 @@
+# Copyright (C) 2015-2016 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
+
+files.src.gen += interface_backend.go
+files.src.gen += func_handlerequest.go
+files.src.gen += type_nilbackend.go
+
+files.generate: $(files.src.gen)
+maintainer-clean:
+ rm -f -- $(files.src.gen)
+.PHONY: files.generate maintainer-clean
+
+%.go: %.go.gen
+ ./$^ > $@
+
+interface_backend.go: ../nslcd_proto/requests.txt
+func_handlerequest.go: ../nslcd_proto/requests.txt
+type_nilbackend.go: interface_backend.go
+
+../nslcd_proto/requests.txt:
+ $(MAKE) -C $(@D) $(@F)
+
+.DELETE_ON_ERROR:
diff --git a/nslcd_server/doc.go b/nslcd_server/doc.go
new file mode 100644
index 0000000..1cf7552
--- /dev/null
+++ b/nslcd_server/doc.go
@@ -0,0 +1,25 @@
+// Copyright (C) 2015-2016 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
+
+//go:generate make
+
+// 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/nslcd_server/func_handlerequest.go.gen b/nslcd_server/func_handlerequest.go.gen
new file mode 100755
index 0000000..4c58ae0
--- /dev/null
+++ b/nslcd_server/func_handlerequest.go.gen
@@ -0,0 +1,120 @@
+#!/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"
+ "os"
+ s "syscall"
+
+ p "lukeshu.com/git/go/libnslcd.git/nslcd_proto"
+)
+
+var sensitive = "<omitted-from-log>"
+
+// 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)
+ $(
+ case "$request" in
+ PAM_Authentication)
+ echo '_req := req'
+ echo '_req.Password = sensitive'
+ echo 'fmt.Fprintf(os.Stderr, "Request: %#v\n", _req)'
+ ;;
+ PAM_PwMod)
+ echo '_req := req'
+ echo 'if len(_req.OldPassword) > 0 {'
+ echo ' _req.OldPassword = sensitive'
+ echo '}'
+ echo '_req.NewPassword = sensitive'
+ echo 'fmt.Fprintf(os.Stderr, "Request: %#v\n", _req)'
+ ;;
+ PAM_UserMod)
+ echo '_req := req'
+ echo '_req.Password = sensitive'
+ echo 'fmt.Fprintf(os.Stderr, "Request: %#v\n", _req)'
+ ;;
+ *)
+ echo 'fmt.Fprintf(os.Stderr, "Request: %#v\n", req)'
+ ;;
+ esac
+ )
+ _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/nslcd_server/interface_backend.go.gen b/nslcd_server/interface_backend.go.gen
new file mode 100755
index 0000000..94a0433
--- /dev/null
+++ b/nslcd_server/interface_backend.go.gen
@@ -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
+
+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 "lukeshu.com/git/go/libnslcd.git/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/nslcd_server/type_nilbackend.go.gen b/nslcd_server/type_nilbackend.go.gen
new file mode 100755
index 0000000..0127e51
--- /dev/null
+++ b/nslcd_server/type_nilbackend.go.gen
@@ -0,0 +1,41 @@
+#!/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 (
+ s "syscall"
+
+ p "lukeshu.com/git/go/libnslcd.git/nslcd_proto"
+)
+
+// 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