diff options
| author | tjpcc <tjp@ctrl-c.club> | 2023-09-08 14:54:59 -0600 |
|---|---|---|
| committer | tjpcc <tjp@ctrl-c.club> | 2023-09-08 14:54:59 -0600 |
| commit | 4c0e1bc89de2a60baaa098c049cf69bac8537055 (patch) | |
| tree | 69412a5d844aebd706862c9548090c1152a27a8e | |
| parent | ac353033162038a4bf6f837bdfeb869f22e7160b (diff) | |
finger support
| -rw-r--r-- | config.go | 13 | ||||
| -rw-r--r-- | go.mod | 2 | ||||
| -rw-r--r-- | go.sum | 4 | ||||
| -rw-r--r-- | main.go | 49 | ||||
| -rw-r--r-- | routes.go | 26 |
5 files changed, 89 insertions, 5 deletions
@@ -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, } } @@ -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 @@ -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= @@ -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) + } +} @@ -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) + }) +} |
