sig-auth.git

git clone https://git.crispbyte.dev/sig-auth.git

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}