mirror of Walter-Sparrow / lunar-tear
1package main
2
3import (
4 "crypto/rand"
5 "database/sql"
6 "encoding/hex"
7 "flag"
8 "log"
9 "net/http"
10
11 "lunar-tear/server/internal/auth"
12
13 _ "modernc.org/sqlite"
14)
15
16func main() {
17 listen := flag.String("listen", "0.0.0.0:3000", "HTTP listen address (host:port)")
18 dbPath := flag.String("db", "db/auth.db", "SQLite database path for auth users")
19 secret := flag.String("secret", "", "HMAC secret for tokens (auto-generated if empty)")
20 noRegister := flag.Bool("no-register", false, "Disallow new account registrations for clients, when present. Default = false")
21 flag.Parse()
22
23 hmacSecret := []byte(*secret)
24 if len(hmacSecret) == 0 {
25 hmacSecret = make([]byte, 32)
26 if _, err := rand.Read(hmacSecret); err != nil {
27 log.Fatalf("generate secret: %v", err)
28 }
29 log.Printf("generated HMAC secret: %s", hex.EncodeToString(hmacSecret))
30 log.Printf("pass --secret=%s to reuse across restarts", hex.EncodeToString(hmacSecret))
31 }
32
33 db, err := sql.Open("sqlite", *dbPath)
34 if err != nil {
35 log.Fatalf("open database: %v", err)
36 }
37 defer db.Close()
38
39 store, err := auth.NewAuthStore(db)
40 if err != nil {
41 log.Fatalf("init auth store: %v", err)
42 }
43
44 tok := auth.NewTokenService(hmacSecret)
45 h := NewHandlers(store, tok, *noRegister)
46
47 mux := http.NewServeMux()
48 mux.HandleFunc("/", h.HandleOAuth)
49 mux.HandleFunc("/me", h.HandleMe)
50 mux.HandleFunc("/check-username", h.HandleCheckUsername)
51
52 log.Printf("auth server listening on %s", *listen)
53 if err := http.ListenAndServe(*listen, mux); err != nil {
54 log.Fatalf("listen: %v", err)
55 }
56}