summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config.go13
-rw-r--r--go.mod2
-rw-r--r--go.sum4
-rw-r--r--main.go49
-rw-r--r--routes.go26
5 files changed, 89 insertions, 5 deletions
diff --git a/config.go b/config.go
index 4be0790..6af9808 100644
--- a/config.go
+++ b/config.go
@@ -21,11 +21,22 @@ type config struct {
tlsCertFile string
uploaderFingerprints []string
+
+ fingerResponses map[string]string
}
func configure() config {
fingerprints := strings.Split(os.Getenv("UPLOADER_FINGERPRINTS"), ",")
+ fingers := map[string]string{}
+ for _, pair := range os.Environ() {
+ key, val, _ := strings.Cut(pair, "=")
+ if !strings.HasPrefix(key, "FINGER_") {
+ continue
+ }
+ fingers[strings.ToLower(key[7:])] = val
+ }
+
return config{
hostname: os.Getenv("HOST_NAME"),
geminiRoot: os.Getenv("GEMINI_ROOT"),
@@ -33,6 +44,8 @@ func configure() config {
tlsCertFile: os.Getenv("TLS_CERT_FILE"),
uploaderFingerprints: fingerprints,
+
+ fingerResponses: fingers,
}
}
diff --git a/go.mod b/go.mod
index 4fa4c11..07ea11d 100644
--- a/go.mod
+++ b/go.mod
@@ -2,7 +2,7 @@ module tildegit.org/tjp/sr-71
go 1.19
-require tildegit.org/tjp/sliderule v1.0.1-0.20230504015056-91218665d27e
+require tildegit.org/tjp/sliderule v1.0.1-0.20230504031331-11b693e72fc5
require (
github.com/go-kit/log v0.2.1 // indirect
diff --git a/go.sum b/go.sum
index 30b86b1..71cf7c3 100644
--- a/go.sum
+++ b/go.sum
@@ -6,5 +6,5 @@ github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KE
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
-tildegit.org/tjp/sliderule v1.0.1-0.20230504015056-91218665d27e h1:OBvg5cr5U9C9r9FFo2rhnck6M69IOE8ffTF7LY0wZvE=
-tildegit.org/tjp/sliderule v1.0.1-0.20230504015056-91218665d27e/go.mod h1:opdo8E25iS9X9pNismM8U7pCH8XO0PdRIIhdADn8Uik=
+tildegit.org/tjp/sliderule v1.0.1-0.20230504031331-11b693e72fc5 h1:psd8MmCrj3/LreDmXGnr1/heRbtyKdzatmx5PsK0Q70=
+tildegit.org/tjp/sliderule v1.0.1-0.20230504031331-11b693e72fc5/go.mod h1:opdo8E25iS9X9pNismM8U7pCH8XO0PdRIIhdADn8Uik=
diff --git a/main.go b/main.go
index abdb907..1d6efc0 100644
--- a/main.go
+++ b/main.go
@@ -1,9 +1,13 @@
package main
import (
+ "context"
+ "crypto/tls"
"log"
"os"
+ "sync"
+ "tildegit.org/tjp/sliderule/finger"
"tildegit.org/tjp/sliderule/gemini"
"tildegit.org/tjp/sliderule/logging"
)
@@ -26,12 +30,31 @@ func main() {
_ = warn.Log("msg", "dropping privileges to 'nobody' failed")
}
- handler := logging.LogRequests(info)(geminiRouter(conf))
+ wg := &sync.WaitGroup{}
+
+ go startGemini(ctx, conf, wg, gemTLS, info, errlog)
+ go startFinger(ctx, conf, wg, info, errlog)
+ wg.Add(2)
+
+ wg.Wait()
+}
+
+func startGemini(
+ ctx context.Context,
+ conf config,
+ wg *sync.WaitGroup,
+ gemTLS *tls.Config,
+ infolog logging.Logger,
+ errlog logging.Logger,
+) {
+ defer wg.Done()
+
+ handler := logging.LogRequests(infolog)(geminiRouter(conf))
server, err := gemini.NewServer(
ctx,
conf.hostname,
"tcp",
- "127.0.0.1:1965",
+ "",
handler,
errlog,
gemTLS,
@@ -46,3 +69,25 @@ func main() {
os.Exit(1)
}
}
+
+func startFinger(
+ ctx context.Context,
+ conf config,
+ wg *sync.WaitGroup,
+ infolog logging.Logger,
+ errlog logging.Logger,
+) {
+ defer wg.Done()
+
+ handler := logging.LogRequests(infolog)(fingerHandler(conf))
+ server, err := finger.NewServer(ctx, conf.hostname, "tcp", "", handler, errlog)
+ if err != nil {
+ _ = errlog.Log("msg", "error building server", "error", err)
+ os.Exit(1)
+ }
+
+ if err := server.Serve(); err != nil {
+ _ = errlog.Log("msg", "error serving finger", "error", err)
+ os.Exit(1)
+ }
+}
diff --git a/routes.go b/routes.go
index 0683924..35bdfc1 100644
--- a/routes.go
+++ b/routes.go
@@ -13,7 +13,9 @@ import (
"tildegit.org/tjp/sliderule/contrib/cgi"
"tildegit.org/tjp/sliderule/contrib/fs"
"tildegit.org/tjp/sliderule/contrib/tlsauth"
+ "tildegit.org/tjp/sliderule/finger"
"tildegit.org/tjp/sliderule/gemini"
+ "tildegit.org/tjp/sliderule/logging"
)
func geminiRouter(conf config) sr.Handler {
@@ -66,3 +68,27 @@ func tlsAuth(uploaders []string) tlsauth.Approver {
return found
}
}
+
+func fingerHandler(conf config) sr.Handler {
+ return sr.HandlerFunc(func(ctx context.Context, request *sr.Request) *sr.Response {
+ name := strings.TrimPrefix(request.Path, "/")
+ if name == "" {
+ return finger.Error("listings not permitted")
+ }
+
+ path, ok := conf.fingerResponses[strings.ToLower(name)]
+ if !ok {
+ return finger.Error("user not found")
+ }
+
+ file, err := os.Open(path)
+ if err != nil {
+ ctx.Value("errorlog").(logging.Logger).Log(
+ "msg", "finger response file open error",
+ "error", err,
+ )
+ }
+
+ return finger.Success(file)
+ })
+}