README | 14 ++++++++++++++ go.mod | 3 +++ main.go | 40 ++++++++++++++++++++++++++++++++++++++++ diff --git a/README b/README new file mode 100644 index 0000000000000000000000000000000000000000..08ecbcd7692b61641cf64adfdb4da7e12c6ab3ba770e79d73ce66887c336c6b6 --- /dev/null +++ b/README @@ -0,0 +1,14 @@ +Trivial finger service for running as UCSPI-TCP server. + + $ mkdir fingers + $ cat > fingers/@ <&1 diff --git a/go.mod b/go.mod new file mode 100644 index 0000000000000000000000000000000000000000..fcdeff554939f2a39f1864e336b100acc00de7d6b7d7c5b40ceff9481d4f098e --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module go.stargrave.org/gofingerd + +go 1.19 diff --git a/main.go b/main.go new file mode 100644 index 0000000000000000000000000000000000000000..2749f2366a90f112c322f0115523392d1f310a33c07d0f88d498ac6077bad1af --- /dev/null +++ b/main.go @@ -0,0 +1,40 @@ +package main + +import ( + "bufio" + "fmt" + "io" + "log" + "net/textproto" + "os" + "regexp" +) + +func main() { + log.SetFlags(log.Lshortfile) + log.SetPrefix(fmt.Sprintf( + "[%s]:%s ", os.Getenv("TCPREMOTEIP"), os.Getenv("TCPREMOTEPORT"), + )) + br := bufio.NewReaderSize(os.Stdin, 1<<10) + tr := textproto.NewReader(br) + q, err := tr.ReadLine() + if err != nil { + log.Fatalln(err) + } + if q == "" { + q = "@" + } else { + re := regexp.MustCompile("^[a-z0-9-.]+$") + if !re.MatchString(q) { + log.Fatalln("bad query") + } + } + fd, err := os.Open(q) + if err != nil { + log.Fatalln(err) + } + if _, err = io.Copy(os.Stdout, fd); err != nil { + log.Fatalln(err) + } + log.Print(q) +}