cheddar
·
2025-02-22
main.go
1package main
2
3import (
4 "crypto"
5 "encoding/json"
6 "flag"
7 "fmt"
8 "io"
9 "log"
10 "net/url"
11 "os"
12
13 "crispbyte.dev/sig-auth/client"
14 "crispbyte.dev/sig-auth/keydirectory"
15 "crispbyte.dev/sig-auth/server"
16 "golang.org/x/crypto/ssh"
17)
18
19func main() {
20 useClient := flag.Bool("c", false, "Run client")
21 keyId := flag.String("id", "", "The key id to pass")
22 register := flag.Bool("r", false, "Register a key")
23 user := flag.String("user", "", "Username to register")
24 keyPath := flag.String("key", "", "Path to the private key (client mode) or public key (registration mode) to use")
25 baseUrlString := flag.String("base-url", "http://localhost:8001", "Base URL of the server")
26 useTempDb := flag.Bool("temp-db", false, "Use a temporary in-memory database")
27 dbPath := flag.String("db", "", "Path to the sqlite database file")
28
29 flag.Parse()
30
31 baseUrl, err := url.Parse(*baseUrlString)
32
33 if err != nil {
34 flag.PrintDefaults()
35 return
36 }
37
38 if *useClient {
39 if *keyPath == "" || *keyId == "" {
40 flag.PrintDefaults()
41 return
42 }
43
44 runClient(baseUrl, *keyPath, *keyId)
45 } else if *register {
46 if *keyPath == "" || *user == "" {
47 flag.PrintDefaults()
48 return
49 }
50
51 registerKey(baseUrl, *keyPath, *user)
52 } else {
53 if !*useTempDb && *dbPath == "" {
54 flag.PrintDefaults()
55 return
56 }
57
58 runServer(*useTempDb, *dbPath)
59 }
60}
61
62func runClient(baseUrl *url.URL, keyFile string, keyId string) {
63 testData := map[string]string{"hello": "world"}
64 json_data, _ := json.Marshal(testData)
65
66 key, err := loadPrivateKey(keyFile)
67
68 if err != nil {
69 log.Fatal(err)
70 }
71
72 resp, err := client.Post(baseUrl, key, keyId, json_data)
73
74 if err != nil {
75 log.Fatal(err)
76 }
77
78 defer resp.Body.Close()
79
80 out, err := io.ReadAll(resp.Body)
81
82 if err != nil {
83 log.Fatal(err)
84 }
85
86 fmt.Println(resp.StatusCode)
87 fmt.Println(resp.Header)
88 fmt.Println(string(out[:]))
89}
90
91func loadPrivateKey(keyFile string) (crypto.PrivateKey, error) {
92 keyBytes, err := os.ReadFile(keyFile)
93
94 if err != nil {
95 return nil, err
96 }
97
98 return ssh.ParseRawPrivateKey(keyBytes)
99}
100
101func registerKey(baseUrl *url.URL, keyFile string, userId string) {
102 keyBytes, err := os.ReadFile(keyFile)
103
104 if err != nil {
105 log.Fatal(err)
106 }
107
108 keyText := string(keyBytes)
109
110 keyId, err := client.RegisterKey(baseUrl, keyText, userId)
111
112 if err != nil {
113 log.Fatal(err)
114 }
115
116 fmt.Printf("Registered key id: %s\n", keyId)
117}
118
119func runServer(useTempDb bool, dbPath string) {
120 var keyDir keydirectory.RegistrationDirectory
121
122 if useTempDb {
123 keyDir = keydirectory.CreateMemoryDirectory()
124 } else {
125 var err error
126 keyDir, err = keydirectory.InitSqlite(dbPath)
127
128 if err != nil {
129 log.Fatal(err)
130 }
131 }
132
133 server.Start(keyDir)
134}