#!/usr/bin/env bash # -*- Mode: Go -*- # Copyright (C) 2015 Luke Shumaker # # 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 <") // 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 < 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