From cbe6c7d454034718fbc62e069e43b7da6ffdc033 Mon Sep 17 00:00:00 2001 From: dawn Date: Tue, 18 Aug 2026 06:55:38 +0000 Subject: [PATCH] cmd/spindle: ban, unban, and bans commands Signed-off-by: dawn --- cmd/spindle/main.go | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file(s) changed, 88 insertion(s)(+), 0 deletion(s)(-) diff --git a/cmd/spindle/main.go b/cmd/spindle/main.go --- a/cmd/spindle/main.go +++ b/cmd/spindle/main.go @@ -34,6 +34,9 @@ millCommand(), executorCommand(), quotaCommand(), + banCommand(), + unbanCommand(), + bansCommand(), }, DefaultCommand: "run", } @@ -585,4 +588,89 @@ default: return fmt.Sprintf("%d", limit) } +} + +func banCommand() *cli.Command { + return &cli.Command{ + Name: "ban", + ArgsUsage: "", + Usage: "ban a repo or user and wipe their existing data on next startup", + Flags: []cli.Flag{dbFlag}, + Action: func(ctx context.Context, cmd *cli.Command) error { + did, err := banArg(cmd) + if err != nil { + return err + } + d, err := openDB(ctx, cmd) + if err != nil { + return err + } + defer d.Close() + return d.PutBan(db.BanEntry{SubjectDid: did}) + }, + } +} + +func unbanCommand() *cli.Command { + return &cli.Command{ + Name: "unban", + ArgsUsage: "", + Usage: "unban a repo or user", + Flags: []cli.Flag{dbFlag}, + Action: func(ctx context.Context, cmd *cli.Command) error { + did, err := banArg(cmd) + if err != nil { + return err + } + d, err := openDB(ctx, cmd) + if err != nil { + return err + } + defer d.Close() + removed, err := d.DeleteBan(did) + if err != nil { + return err + } + if !removed { + return fmt.Errorf("%s is not banned", did) + } + return nil + }, + } +} + +func bansCommand() *cli.Command { + return &cli.Command{ + Name: "bans", + Usage: "list all bans", + Flags: []cli.Flag{dbFlag}, + Action: func(ctx context.Context, cmd *cli.Command) error { + d, err := openDB(ctx, cmd) + if err != nil { + return err + } + defer d.Close() + bans, err := d.BanList() + if err != nil { + return err + } + w := tabwriter.NewWriter(os.Stdout, 0, 4, 2, ' ', 0) + fmt.Fprintln(w, "DID\tSINCE") + for _, b := range bans { + fmt.Fprintf(w, "%s\t%s\n", b.SubjectDid, b.CreatedAt) + } + return w.Flush() + }, + } +} + +func banArg(cmd *cli.Command) (syntax.DID, error) { + if cmd.Args().Len() != 1 { + return "", fmt.Errorf("expected ") + } + did, err := syntax.ParseDID(cmd.Args().Get(0)) + if err != nil { + return "", fmt.Errorf("invalid did: %w", err) + } + return did, nil } -- tangled.sh