pubkey.go

 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}