bridge_auth_addtoken.go

 1package commands
 2
 3import (
 4	"bufio"
 5	"fmt"
 6	"os"
 7	"strings"
 8
 9	"github.com/mattn/go-isatty"
10	"github.com/pkg/errors"
11	"github.com/spf13/cobra"
12
13	"github.com/MichaelMure/git-bug/bridge"
14	"github.com/MichaelMure/git-bug/bridge/core"
15	"github.com/MichaelMure/git-bug/bridge/core/auth"
16	"github.com/MichaelMure/git-bug/identity"
17)
18
19var (
20	bridgeAuthAddTokenTarget string
21)
22
23func runBridgeTokenAdd(cmd *cobra.Command, args []string) error {
24	var value string
25
26	if bridgeAuthAddTokenTarget == "" {
27		return fmt.Errorf("flag --target is required")
28	}
29
30	if !core.TargetExist(bridgeAuthAddTokenTarget) {
31		return fmt.Errorf("unknown target")
32	}
33
34	if len(args) == 1 {
35		value = args[0]
36	} else {
37		// Read from Stdin
38		if isatty.IsTerminal(os.Stdin.Fd()) {
39			fmt.Println("Enter the token:")
40		}
41		reader := bufio.NewReader(os.Stdin)
42		raw, err := reader.ReadString('\n')
43		if err != nil {
44			return fmt.Errorf("reading from stdin: %v", err)
45		}
46		value = strings.TrimSuffix(raw, "\n")
47	}
48
49	user, err := identity.GetUserIdentity(repo)
50	if err != nil {
51		return err
52	}
53
54	token := auth.NewToken(user.Id(), value, bridgeAuthAddTokenTarget)
55	if err := token.Validate(); err != nil {
56		return errors.Wrap(err, "invalid token")
57	}
58
59	err = auth.Store(repo, token)
60	if err != nil {
61		return err
62	}
63
64	fmt.Printf("token %s added\n", token.ID())
65	return nil
66}
67
68var bridgeAuthAddTokenCmd = &cobra.Command{
69	Use:     "add-token [<token>]",
70	Short:   "Store a new token",
71	PreRunE: loadRepoEnsureUser,
72	RunE:    runBridgeTokenAdd,
73	Args:    cobra.MaximumNArgs(1),
74}
75
76func init() {
77	bridgeAuthCmd.AddCommand(bridgeAuthAddTokenCmd)
78	bridgeAuthAddTokenCmd.Flags().StringVarP(&bridgeAuthAddTokenTarget, "target", "t", "",
79		fmt.Sprintf("The target of the bridge. Valid values are [%s]", strings.Join(bridge.Targets(), ",")))
80	bridgeAuthAddTokenCmd.Flags().SortFlags = false
81}