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() }