diff options
author | Amine Hilaly <hilalyamine@gmail.com> | 2019-08-21 14:24:48 +0200 |
---|---|---|
committer | Amine Hilaly <hilalyamine@gmail.com> | 2019-08-31 23:02:20 +0200 |
commit | 0381400bfda16f910ca87b0258ddda1c1732fbc7 (patch) | |
tree | 54a271f43bafbbc238e2fc26bb6fa67d6403c4af | |
parent | c7792a5d1279a92c8d0caf67a0cf688cc9e32e09 (diff) | |
download | git-bug-0381400bfda16f910ca87b0258ddda1c1732fbc7.tar.gz |
commands: read token from stdin in bridge configuration
bridge: improve bridge config validation
-rw-r--r-- | bridge/github/config.go | 12 | ||||
-rw-r--r-- | bridge/gitlab/config.go | 13 | ||||
-rw-r--r-- | bridge/launchpad/config.go | 8 | ||||
-rw-r--r-- | commands/bridge_configure.go | 22 |
4 files changed, 40 insertions, 15 deletions
diff --git a/bridge/github/config.go b/bridge/github/config.go index 45c078f6..f55ea1b4 100644 --- a/bridge/github/config.go +++ b/bridge/github/config.go @@ -37,13 +37,18 @@ var ( ErrBadProjectURL = errors.New("bad project url") ) -func (*Github) Configure(repo repository.RepoCommon, params core.BridgeParams) (core.Configuration, error) { +func (g *Github) Configure(repo repository.RepoCommon, params core.BridgeParams) (core.Configuration, error) { conf := make(core.Configuration) var err error var token string var owner string var project string + if params.Token != "" && + !(params.URL != "" || (params.Project != "" && params.Owner != "")) { + return nil, fmt.Errorf("you must provide a project URL or Owner/Name to configure this bridge with a token") + } + // getting owner and project name if params.Owner != "" && params.Project != "" { // first try to use params if both or project and owner are provided @@ -106,6 +111,11 @@ func (*Github) Configure(repo repository.RepoCommon, params core.BridgeParams) ( conf[keyOwner] = owner conf[keyProject] = project + err = g.ValidateConfig(conf) + if err != nil { + return nil, err + } + return conf, nil } diff --git a/bridge/gitlab/config.go b/bridge/gitlab/config.go index 15172871..d1d85030 100644 --- a/bridge/gitlab/config.go +++ b/bridge/gitlab/config.go @@ -20,7 +20,7 @@ var ( ErrBadProjectURL = errors.New("bad project url") ) -func (*Gitlab) Configure(repo repository.RepoCommon, params core.BridgeParams) (core.Configuration, error) { +func (g *Gitlab) Configure(repo repository.RepoCommon, params core.BridgeParams) (core.Configuration, error) { if params.Project != "" { fmt.Println("warning: --project is ineffective for a gitlab bridge") } @@ -33,6 +33,10 @@ func (*Gitlab) Configure(repo repository.RepoCommon, params core.BridgeParams) ( var url string var token string + if params.Token != "" && params.URL == "" { + return nil, fmt.Errorf("you must provide a project URL to configure this bridge with a token") + } + // get project url if params.URL != "" { url = params.URL @@ -71,10 +75,15 @@ func (*Gitlab) Configure(repo repository.RepoCommon, params core.BridgeParams) ( conf[keyToken] = token conf[core.KeyTarget] = target + err = g.ValidateConfig(conf) + if err != nil { + return nil, err + } + return conf, nil } -func (*Gitlab) ValidateConfig(conf core.Configuration) error { +func (g *Gitlab) ValidateConfig(conf core.Configuration) error { if v, ok := conf[core.KeyTarget]; !ok { return fmt.Errorf("missing %s key", core.KeyTarget) } else if v != target { diff --git a/bridge/launchpad/config.go b/bridge/launchpad/config.go index 1d6c8aba..6669d0fa 100644 --- a/bridge/launchpad/config.go +++ b/bridge/launchpad/config.go @@ -22,7 +22,7 @@ const ( defaultTimeout = 60 * time.Second ) -func (*Launchpad) Configure(repo repository.RepoCommon, params core.BridgeParams) (core.Configuration, error) { +func (l *Launchpad) Configure(repo repository.RepoCommon, params core.BridgeParams) (core.Configuration, error) { if params.Token != "" { fmt.Println("warning: --token is ineffective for a Launchpad bridge") } @@ -63,6 +63,12 @@ func (*Launchpad) Configure(repo repository.RepoCommon, params core.BridgeParams conf[keyProject] = project conf[core.KeyTarget] = target + + err = l.ValidateConfig(conf) + if err != nil { + return nil, err + } + return conf, nil } diff --git a/commands/bridge_configure.go b/commands/bridge_configure.go index 6bebc262..4cfe0ed5 100644 --- a/commands/bridge_configure.go +++ b/commands/bridge_configure.go @@ -6,10 +6,8 @@ import ( "os" "strconv" "strings" - "syscall" "github.com/spf13/cobra" - "golang.org/x/crypto/ssh/terminal" "github.com/MichaelMure/git-bug/bridge" "github.com/MichaelMure/git-bug/bridge/core" @@ -23,6 +21,7 @@ const ( ) var ( + tokenStdin bool bridgeConfigureName string bridgeConfigureTarget string bridgeParams core.BridgeParams @@ -36,15 +35,6 @@ func runBridgeConfigure(cmd *cobra.Command, args []string) error { defer backend.Close() interrupt.RegisterCleaner(backend.Close) - termState, err := terminal.GetState(int(syscall.Stdin)) - if err != nil { - return err - } - - interrupt.RegisterCleaner(func() error { - return terminal.Restore(int(syscall.Stdin), termState) - }) - if bridgeConfigureTarget == "" { bridgeConfigureTarget, err = promptTarget() if err != nil { @@ -64,6 +54,15 @@ func runBridgeConfigure(cmd *cobra.Command, args []string) error { return err } + if tokenStdin { + reader := bufio.NewReader(os.Stdin) + token, err := reader.ReadString('\n') + if err != nil { + return fmt.Errorf("reading from stdin: %v", err) + } + bridgeParams.Token = strings.TrimSuffix(token, "\n") + } + err = b.Configure(bridgeParams) if err != nil { return err @@ -192,6 +191,7 @@ func init() { bridgeConfigureCmd.Flags().StringVarP(&bridgeParams.URL, "url", "u", "", "The URL of the target repository") bridgeConfigureCmd.Flags().StringVarP(&bridgeParams.Owner, "owner", "o", "", "The owner of the target repository") bridgeConfigureCmd.Flags().StringVarP(&bridgeParams.Token, "token", "T", "", "The authentication token for the API") + bridgeConfigureCmd.Flags().BoolVar(&tokenStdin, "token-stdin", false, "Expect to receive token from stdin and ignore token flag.") bridgeConfigureCmd.Flags().StringVarP(&bridgeParams.Project, "project", "p", "", "The name of the target repository") bridgeConfigureCmd.Flags().SortFlags = false } |