1package cmd
2
3import (
4 "strings"
5
6 "github.com/charmbracelet/soft-serve/pkg/backend"
7 "github.com/charmbracelet/soft-serve/pkg/sshutils"
8 "github.com/spf13/cobra"
9)
10
11// PubkeyCommand returns a command that manages user public keys.
12func PubkeyCommand() *cobra.Command {
13 cmd := &cobra.Command{
14 Use: "pubkey",
15 Aliases: []string{"pubkeys", "publickey", "publickeys"},
16 Short: "Manage your public keys",
17 }
18
19 pubkeyAddCommand := &cobra.Command{
20 Use: "add AUTHORIZED_KEY",
21 Short: "Add a public key",
22 Args: cobra.MinimumNArgs(1),
23 RunE: func(cmd *cobra.Command, args []string) error {
24 ctx := cmd.Context()
25 be := backend.FromContext(ctx)
26 pk := sshutils.PublicKeyFromContext(ctx)
27 user, err := be.UserByPublicKey(ctx, pk)
28 if err != nil {
29 return err //nolint:wrapcheck
30 }
31
32 apk, _, err := sshutils.ParseAuthorizedKey(strings.Join(args, " "))
33 if err != nil {
34 return err //nolint:wrapcheck
35 }
36
37 return be.AddPublicKey(ctx, user.Username(), apk)
38 },
39 }
40
41 pubkeyRemoveCommand := &cobra.Command{
42 Use: "remove AUTHORIZED_KEY",
43 Args: cobra.MinimumNArgs(1),
44 Short: "Remove a public key",
45 RunE: func(cmd *cobra.Command, args []string) error {
46 ctx := cmd.Context()
47 be := backend.FromContext(ctx)
48 pk := sshutils.PublicKeyFromContext(ctx)
49 user, err := be.UserByPublicKey(ctx, pk)
50 if err != nil {
51 return err //nolint:wrapcheck
52 }
53
54 apk, _, err := sshutils.ParseAuthorizedKey(strings.Join(args, " "))
55 if err != nil {
56 return err //nolint:wrapcheck
57 }
58
59 return be.RemovePublicKey(ctx, user.Username(), apk)
60 },
61 }
62
63 pubkeyListCommand := &cobra.Command{
64 Use: "list",
65 Aliases: []string{"ls"},
66 Short: "List public keys",
67 Args: cobra.NoArgs,
68 RunE: func(cmd *cobra.Command, _ []string) error {
69 ctx := cmd.Context()
70 be := backend.FromContext(ctx)
71 pk := sshutils.PublicKeyFromContext(ctx)
72 user, err := be.UserByPublicKey(ctx, pk)
73 if err != nil {
74 return err //nolint:wrapcheck
75 }
76
77 pks := user.PublicKeys()
78 for _, pk := range pks {
79 cmd.Println(sshutils.MarshalAuthorizedKey(pk))
80 }
81
82 return nil
83 },
84 }
85
86 cmd.AddCommand(
87 pubkeyAddCommand,
88 pubkeyRemoveCommand,
89 pubkeyListCommand,
90 )
91
92 return cmd
93}