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