From 78098f23e9a910f3b37fbd3f7c1939ad10ec40ad Mon Sep 17 00:00:00 2001 From: Max Resnick Date: Tue, 8 Apr 2025 21:41:59 -0700 Subject: feat: refactor of authenticaiton --- cmd/tokentool/main.go | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 cmd/tokentool/main.go (limited to 'cmd/tokentool/main.go') diff --git a/cmd/tokentool/main.go b/cmd/tokentool/main.go new file mode 100644 index 0000000..f137fb4 --- /dev/null +++ b/cmd/tokentool/main.go @@ -0,0 +1,96 @@ +package main + +import ( + "encoding/csv" + "flag" + "fmt" + "os" + "path/filepath" + "strings" + + "git.ofmax.li/go-git-server/internal/authz" +) + +func main() { + var ( + tokenFile string + generate bool + list bool + name string + ) + + flag.StringVar(&tokenFile, "tokens", "tokens.csv", "Path to tokens CSV file") + flag.BoolVar(&generate, "generate", false, "Generate a new token") + flag.BoolVar(&list, "list", false, "List existing tokens") + flag.StringVar(&name, "name", "", "Friendly name for new token") + flag.Parse() + + if generate { + if name == "" { + fmt.Fprintln(os.Stderr, "Error: -name required when generating token") + os.Exit(1) + } + + // Generate new access ID and token + accessID, err := authz.GenerateAccessID() + if err != nil { + fmt.Fprintf(os.Stderr, "Error generating access ID: %v\n", err) + os.Exit(1) + } + + token, hash, err := authz.GenerateNewToken() + if err != nil { + fmt.Fprintf(os.Stderr, "Error generating token: %v\n", err) + os.Exit(1) + } + + // Ensure directory exists + if err := os.MkdirAll(filepath.Dir(tokenFile), 0755); err != nil { + fmt.Fprintf(os.Stderr, "Error creating directory: %v\n", err) + os.Exit(1) + } + + // Open file in append mode + f, err := os.OpenFile(tokenFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0600) + if err != nil { + fmt.Fprintf(os.Stderr, "Error opening token file: %v\n", err) + os.Exit(1) + } + defer f.Close() + + // Write new entry + w := csv.NewWriter(f) + if err := w.Write([]string{string(accessID), name, hash}); err != nil { + fmt.Fprintf(os.Stderr, "Error writing to CSV: %v\n", err) + os.Exit(1) + } + w.Flush() + + fmt.Printf("Generated new token:\n") + fmt.Printf("Access ID: %s\n", accessID) + fmt.Printf("Name: %s\n", name) + fmt.Printf("Token: %s\n", token) + fmt.Printf("Added to %s\n", tokenFile) + return + } + + if list { + // Load and display existing tokens + _, identities, err := authz.LoadTokensFromFile(tokenFile) + if err != nil { + fmt.Fprintf(os.Stderr, "Error reading tokens: %v\n", err) + os.Exit(1) + } + + fmt.Printf("Existing tokens in %s:\n", tokenFile) + fmt.Printf("%-40s %-30s\n", "ACCESS ID", "NAME") + fmt.Printf("%s %s\n", strings.Repeat("-", 40), strings.Repeat("-", 30)) + + for id, name := range identities.IDToName { + fmt.Printf("%-40s %-30s\n", id, name) + } + return + } + + flag.Usage() +} -- cgit v1.2.3