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