diff options
| author | Max Resnick <max@ofmax.li> | 2025-04-08 21:41:59 -0700 |
|---|---|---|
| committer | Max Resnick <max@ofmax.li> | 2025-05-26 21:57:12 -0700 |
| commit | 78098f23e9a910f3b37fbd3f7c1939ad10ec40ad (patch) | |
| tree | 6432695fcc218089a90e1c32f4e1601a14124de4 /cmd/tokentool | |
| parent | 7f3b59980e3b9d8d878aa57f4b01b9d4cc1eab0c (diff) | |
| download | go-git-server-78098f23e9a910f3b37fbd3f7c1939ad10ec40ad.tar.gz | |
feat: refactor of authenticaitonrefactor-authz-scheme
Diffstat (limited to 'cmd/tokentool')
| -rw-r--r-- | cmd/tokentool/main.go | 96 |
1 files changed, 96 insertions, 0 deletions
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() +} |