gemini.go (view raw)
1package main
2
3import (
4 "crypto/tls"
5 "strings"
6 // "fmt"
7 gmi "git.sr.ht/~adnano/go-gemini"
8 "log"
9 "path"
10 "path/filepath"
11 "text/template"
12 "time"
13)
14
15func gmiIndex(w *gmi.ResponseWriter, r *gmi.Request) {
16 log.Println("Index request")
17 t, err := template.ParseFiles("templates/index.gmi")
18 if err != nil {
19 log.Fatal(err)
20 }
21 files, err := getIndexFiles()
22 users, err := getActiveUserNames()
23 if err != nil {
24 log.Println(err)
25 w.WriteHeader(40, "Internal server error")
26 }
27 data := struct {
28 Host string
29 SiteTitle string
30 Files []*File
31 Users []string
32 }{
33 Host: c.Host,
34 SiteTitle: c.SiteTitle,
35 Files: files,
36 Users: users,
37 }
38 t.Execute(w, data)
39}
40
41func gmiPage(w *gmi.ResponseWriter, r *gmi.Request) {
42 userName := filepath.Clean(strings.Split(r.URL.Host, ".")[0]) // clean probably unnecessary
43 fileName := filepath.Clean(r.URL.Path)
44 if fileName == "/" {
45 fileName = "index.gmi"
46 }
47 log.Println("Request for gemini file", fileName, "for user", userName)
48
49 gmi.ServeFile(w, gmi.Dir(path.Join(c.FilesDirectory, userName)), fileName)
50}
51
52func runGeminiServer() {
53 log.Println("Starting gemini server")
54 var server gmi.Server
55 server.ReadTimeout = 1 * time.Minute
56 server.WriteTimeout = 2 * time.Minute
57
58 hostname := strings.SplitN(c.Host, ":", 2)[0]
59 // is this necc?
60 server.CreateCertificate = func(h string) (tls.Certificate, error) {
61 wildcard := strings.SplitN(h, ".", 2)
62 if len(wildcard) == 2 {
63 h = "*." + wildcard[1]
64 }
65 log.Println("Generating certificate for", h)
66 cert, err := gmi.CreateCertificate(gmi.CertificateOptions{
67 DNSNames: []string{h},
68 Duration: time.Minute * 43200, // one month
69 })
70 if err == nil {
71 // Write the new certificate to disk
72 err = writeCertificate(path.Join(c.GeminiCertStore, h), cert)
73 }
74 return cert, err
75 }
76
77 var mux gmi.ServeMux
78 // replace with wildcard cert
79 mux.HandleFunc("/", gmiIndex)
80
81 var wildcardMux gmi.ServeMux
82 wildcardMux.HandleFunc("/", gmiPage)
83 server.Register(hostname, &mux)
84 server.Register("*."+hostname, &wildcardMux)
85
86 err := server.ListenAndServe()
87 if err != nil {
88 log.Fatal(err)
89 }
90}