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}