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)
16
17var (
18	bridgeAuthAddTokenTarget string
19)
20
21func runBridgeTokenAdd(cmd *cobra.Command, args []string) error {
22	var value string
23
24	if bridgeAuthAddTokenTarget == "" {
25		return fmt.Errorf("auth target is required")
26	}
27
28	if !core.TargetExist(bridgeAuthAddTokenTarget) {
29		return fmt.Errorf("unknown target")
30	}
31
32	if len(args) == 1 {
33		value = args[0]
34	} else {
35		// Read from Stdin
36		if isatty.IsTerminal(os.Stdin.Fd()) {
37			fmt.Println("Enter the token:")
38		}
39		reader := bufio.NewReader(os.Stdin)
40		raw, err := reader.ReadString('\n')
41		if err != nil {
42			return fmt.Errorf("reading from stdin: %v", err)
43		}
44		value = strings.TrimSuffix(raw, "\n")
45	}
46
47	token := core.NewToken(value, bridgeAuthAddTokenTarget)
48	if err := token.Validate(); err != nil {
49		return errors.Wrap(err, "invalid token")
50	}
51
52	err := core.StoreToken(repo, token)
53	if err != nil {
54		return err
55	}
56
57	fmt.Printf("token %s added\n", token.ID())
58	return nil
59}
60
61var bridgeAuthAddTokenCmd = &cobra.Command{
62	Use:     "add-token [<token>]",
63	Short:   "Store a new token",
64	PreRunE: loadRepo,
65	RunE:    runBridgeTokenAdd,
66	Args:    cobra.MaximumNArgs(1),
67}
68
69func init() {
70	bridgeAuthCmd.AddCommand(bridgeAuthAddTokenCmd)
71	bridgeAuthAddTokenCmd.Flags().StringVarP(&bridgeAuthAddTokenTarget, "target", "t", "",
72		fmt.Sprintf("The target of the bridge. Valid values are [%s]", strings.Join(bridge.Targets(), ",")))
73	bridgeAuthAddTokenCmd.Flags().SortFlags = false
74}