summaryrefslogtreecommitdiff
path: root/routes.go
diff options
context:
space:
mode:
Diffstat (limited to 'routes.go')
-rw-r--r--routes.go27
1 files changed, 26 insertions, 1 deletions
diff --git a/routes.go b/routes.go
index 59e6ff4..0683924 100644
--- a/routes.go
+++ b/routes.go
@@ -2,7 +2,11 @@ package main
import (
"context"
+ "crypto/sha256"
+ "crypto/x509"
+ "encoding/hex"
"os"
+ "sort"
"strings"
sr "tildegit.org/tjp/sliderule"
@@ -20,7 +24,7 @@ func geminiRouter(conf config) sr.Handler {
router.Route(
"/*",
gemini.GeminiOnly(true)(sr.FallthroughHandler(
- fs.TitanUpload(tlsauth.Allow, conf.geminiRoot)(postUploadRedirect),
+ fs.TitanUpload(tlsAuth(conf.uploaderFingerprints), conf.geminiRoot)(postUploadRedirect),
fs.GeminiFileHandler(fsys),
fs.GeminiDirectoryDefault(fsys, "index.gmi"),
fs.GeminiDirectoryListing(fsys, nil),
@@ -41,3 +45,24 @@ var postUploadRedirect = sr.HandlerFunc(func(ctx context.Context, request *sr.Re
u.Scheme = "gemini"
return gemini.Redirect(u.String())
})
+
+func tlsAuth(uploaders []string) tlsauth.Approver {
+ sort.Strings(uploaders)
+
+ return func(cert *x509.Certificate) bool {
+ raw := sha256.Sum256(cert.Raw)
+ user := hex.EncodeToString(raw[:])
+
+ _, found := sort.Find(len(uploaders), func(i int) int {
+ switch {
+ case uploaders[i] < user:
+ return 1
+ case uploaders[i] == user:
+ return 0
+ default:
+ return -1
+ }
+ })
+ return found
+ }
+}