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}