Skip to content

Commit

Permalink
Allow to bind a specific port for login command (#121)
Browse files Browse the repository at this point in the history
  • Loading branch information
tomasmik committed Mar 2, 2023
1 parent 5d7e647 commit 564ec32
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 10 deletions.
9 changes: 9 additions & 0 deletions internal/cmd/profile/flags.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package profile

import "github.com/urfave/cli/v2"

var flagBindPort = &cli.IntFlag{
Name: "bind",
Usage: "[Optional] specify the port used for binding the server when logging in through a browser",
Required: false,
}
34 changes: 24 additions & 10 deletions internal/cmd/profile/login_command.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,13 @@ func loginCommand() *cli.Command {
Before: getAliasWithAPITokenProfile,
ArgsUsage: "<account-alias>",
Action: loginAction,
Flags: []cli.Flag{
flagBindPort,
},
}
}

func loginAction(*cli.Context) error {
func loginAction(ctx *cli.Context) error {
var storedCredentials session.StoredCredentials

// Let's try to re-authenticate user.
Expand All @@ -48,7 +51,7 @@ func loginAction(*cli.Context) error {
storedCredentials.Type = apiTokenProfile.Credentials.Type
profileAlias = apiTokenProfile.Alias

return loginUsingWebBrowser(&storedCredentials)
return loginUsingWebBrowser(ctx, &storedCredentials)
}

reader := bufio.NewReader(os.Stdin)
Expand Down Expand Up @@ -105,7 +108,7 @@ Loop:
}
break Loop
case session.CredentialsTypeAPIToken:
return loginUsingWebBrowser(&storedCredentials)
return loginUsingWebBrowser(ctx, &storedCredentials)
default:
fmt.Printf("Invalid selection (%s), please try again", credentialsType)
continue
Expand Down Expand Up @@ -154,7 +157,7 @@ func loginUsingGitHubAccessToken(creds *session.StoredCredentials) error {
return nil
}

func loginUsingWebBrowser(creds *session.StoredCredentials) error {
func loginUsingWebBrowser(ctx *cli.Context, creds *session.StoredCredentials) error {
pubKey, privKey, err := internal.GenerateRSAKeyPair()
if err != nil {
return errors.Wrap(err, "could not generate RSA key pair")
Expand Down Expand Up @@ -218,7 +221,13 @@ func loginUsingWebBrowser(creds *session.StoredCredentials) error {
done <- true
}

server, port, err := serveOnOpenPort(handler)
var bindOn *int
if ctx.IsSet(flagBindPort.Name) {
port := ctx.Int(flagBindPort.Name)
bindOn = &port
}

server, port, err := serveOnOpenPort(bindOn, handler)
if err != nil {
return err
}
Expand Down Expand Up @@ -273,8 +282,13 @@ func persistAccessCredentials(creds *session.StoredCredentials) error {
})
}

func serveOnOpenPort(handler func(w http.ResponseWriter, r *http.Request)) (*http.Server, int, error) {
addr, err := net.ResolveTCPAddr("tcp", ":0")
func serveOnOpenPort(port *int, handler func(w http.ResponseWriter, r *http.Request)) (*http.Server, int, error) {
bindOn := ":0"
if port != nil {
bindOn = fmt.Sprintf(":%d", *port)
}

addr, err := net.ResolveTCPAddr("tcp", bindOn)
if err != nil {
return nil, 0, errors.Wrap(err, "failed to resolve tcp address")
}
Expand All @@ -287,8 +301,8 @@ func serveOnOpenPort(handler func(w http.ResponseWriter, r *http.Request)) (*htt
m := http.NewServeMux()
m.HandleFunc("/", handler)

port := l.Addr().(*net.TCPAddr).Port
fmt.Printf("Will use port %d to receive responses\n", port)
binded := l.Addr().(*net.TCPAddr).Port
fmt.Printf("Will use port %d to receive responses\n", binded)

server := &http.Server{Handler: m, ReadHeaderTimeout: 5 * time.Second}
go func() {
Expand All @@ -299,5 +313,5 @@ func serveOnOpenPort(handler func(w http.ResponseWriter, r *http.Request)) (*htt
}
}()

return server, port, nil
return server, binded, nil
}

0 comments on commit 564ec32

Please sign in to comment.