From 96589d1b5a9b6c4ec8298c3e5c00cf9333dde0b9 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Sun, 13 Sep 2020 01:20:47 +0200 Subject: [PATCH 1/4] add BasicAuth as login method --- cmd/login.go | 113 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 87 insertions(+), 26 deletions(-) diff --git a/cmd/login.go b/cmd/login.go index 5a70626..a0baf0d 100644 --- a/cmd/login.go +++ b/cmd/login.go @@ -10,6 +10,10 @@ import ( "log" "net/http" "net/http/cookiejar" + "net/url" + "os" + "strings" + "time" "code.gitea.io/sdk/gitea" @@ -35,10 +39,9 @@ var cmdLoginAdd = cli.Command{ Description: `Add a Gitea login`, Flags: []cli.Flag{ &cli.StringFlag{ - Name: "name", - Aliases: []string{"n"}, - Usage: "Login name", - Required: true, + Name: "name", + Aliases: []string{"n"}, + Usage: "Login name", }, &cli.StringFlag{ Name: "url", @@ -49,12 +52,24 @@ var cmdLoginAdd = cli.Command{ Required: true, }, &cli.StringFlag{ - Name: "token", - Aliases: []string{"t"}, - Value: "", - EnvVars: []string{"GITEA_SERVER_TOKEN"}, - Usage: "Access token. Can be obtained from Settings > Applications", - Required: true, + Name: "token", + Aliases: []string{"t"}, + Value: "", + EnvVars: []string{"GITEA_SERVER_TOKEN"}, + Usage: "Access token. Can be obtained from Settings > Applications", + }, + &cli.StringFlag{ + Name: "user", + Value: "", + EnvVars: []string{"GITEA_SERVER_USER"}, + Usage: "User for basic auth (will create token)", + }, + &cli.StringFlag{ + Name: "password", + Aliases: []string{"pwd"}, + Value: "", + EnvVars: []string{"GITEA_SERVER_PASSWORD"}, + Usage: "Password for basic auth (will create token)", }, &cli.StringFlag{ Name: "ssh-key", @@ -71,23 +86,38 @@ var cmdLoginAdd = cli.Command{ } func runLoginAdd(ctx *cli.Context) error { - if !ctx.IsSet("url") { - log.Fatal("You have to input Gitea server URL") - } - if !ctx.IsSet("token") { - log.Fatal("No token found") - } - if !ctx.IsSet("name") { - log.Fatal("You have to set a name for the login") + name := ctx.String("name") + token := ctx.String("token") + user := ctx.String("user") + passwd := ctx.String("password") + insecure := ctx.Bool("insecure") + sshKey := ctx.String("ssh-key") + giteaURL, err := url.Parse(ctx.String("url")) + if err != nil { + return err } - err := loadConfig(yamlConfigPath) + if len(giteaURL.String()) == 0 { + log.Fatal("You have to input Gitea server URL") + } + if len(token) == 0 && (len(user)+len(passwd)) == 0 { + log.Fatal("No token set") + } else if len(user) != 0 && len(passwd) == 0 { + log.Fatal("No password set") + } else if len(user) == 0 && len(passwd) != 0 { + log.Fatal("No user set") + } + + err = loadConfig(yamlConfigPath) if err != nil { log.Fatal("Unable to load config file " + yamlConfigPath) } - client := gitea.NewClient(ctx.String("url"), ctx.String("token")) - if ctx.Bool("insecure") { + client := gitea.NewClient(giteaURL.String(), token) + if len(token) == 0 { + client.SetBasicAuth(user, passwd) + } + if insecure { cookieJar, _ := cookiejar.New(nil) client.SetHTTPClient(&http.Client{ @@ -102,14 +132,45 @@ func runLoginAdd(ctx *cli.Context) error { log.Fatal(err) } + if len(token) == 0 { + // create token + host, _ := os.Hostname() + tl, err := client.ListAccessTokens(gitea.ListAccessTokensOptions{}) + if err != nil { + return err + } + tokenName := host + "-tea" + for i := range tl { + if tl[i].Name == tokenName { + tokenName += time.Now().Format("2006-01-02_15-04-05") + break + } + } + t, err := client.CreateAccessToken(gitea.CreateAccessTokenOption{Name: tokenName}) + if err != nil { + return err + } + token = t.Token + } + + if len(name) == 0 { + name = strings.ReplaceAll(strings.Title(giteaURL.Host), ".", "") + for _, l := range config.Logins { + if l.Name == name { + name += "_" + u.UserName + break + } + } + } + fmt.Println("Login successful! Login name " + u.UserName) err = addLogin(Login{ - Name: ctx.String("name"), - URL: ctx.String("url"), - Token: ctx.String("token"), - Insecure: ctx.Bool("insecure"), - SSHKey: ctx.String("ssh-key"), + Name: name, + URL: giteaURL.String(), + Token: token, + Insecure: insecure, + SSHKey: sshKey, User: u.UserName, }) if err != nil { -- 2.40.1 From 895b273dc0ce4ea5c759576b606286f8aff45c4c Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Sun, 13 Sep 2020 01:37:44 +0200 Subject: [PATCH 2/4] move login logick int it's own func --- cmd/login.go | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/cmd/login.go b/cmd/login.go index a0baf0d..077533f 100644 --- a/cmd/login.go +++ b/cmd/login.go @@ -86,18 +86,19 @@ var cmdLoginAdd = cli.Command{ } func runLoginAdd(ctx *cli.Context) error { - name := ctx.String("name") - token := ctx.String("token") - user := ctx.String("user") - passwd := ctx.String("password") - insecure := ctx.Bool("insecure") - sshKey := ctx.String("ssh-key") - giteaURL, err := url.Parse(ctx.String("url")) - if err != nil { - return err - } + return runLoginAddMain( + ctx.String("name"), + ctx.String("token"), + ctx.String("user"), + ctx.String("password"), + ctx.String("ssh-key"), + ctx.String("url"), + ctx.Bool("insecure")) +} - if len(giteaURL.String()) == 0 { +func runLoginAddMain(name, token, user, passwd, sshKey, giteaURL string, insecure bool) error { + + if len(giteaURL) == 0 { log.Fatal("You have to input Gitea server URL") } if len(token) == 0 && (len(user)+len(passwd)) == 0 { @@ -108,12 +109,12 @@ func runLoginAdd(ctx *cli.Context) error { log.Fatal("No user set") } - err = loadConfig(yamlConfigPath) + err := loadConfig(yamlConfigPath) if err != nil { log.Fatal("Unable to load config file " + yamlConfigPath) } - client := gitea.NewClient(giteaURL.String(), token) + client := gitea.NewClient(giteaURL, token) if len(token) == 0 { client.SetBasicAuth(user, passwd) } @@ -127,6 +128,7 @@ func runLoginAdd(ctx *cli.Context) error { }, }) } + u, err := client.GetMyUserInfo() if err != nil { log.Fatal(err) @@ -153,8 +155,14 @@ func runLoginAdd(ctx *cli.Context) error { token = t.Token } + fmt.Println("Login successful! Login name " + u.UserName) + if len(name) == 0 { - name = strings.ReplaceAll(strings.Title(giteaURL.Host), ".", "") + parsedURL, err := url.Parse(giteaURL) + if err != nil { + return err + } + name = strings.ReplaceAll(strings.Title(parsedURL.Host), ".", "") for _, l := range config.Logins { if l.Name == name { name += "_" + u.UserName @@ -163,11 +171,9 @@ func runLoginAdd(ctx *cli.Context) error { } } - fmt.Println("Login successful! Login name " + u.UserName) - err = addLogin(Login{ Name: name, - URL: giteaURL.String(), + URL: giteaURL, Token: token, Insecure: insecure, SSHKey: sshKey, -- 2.40.1 From f9e114044e6d7cf7bc292c4b921b5edb1e65f622 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Sun, 13 Sep 2020 02:24:27 +0200 Subject: [PATCH 3/4] Add Interactive login --- cmd/login.go | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 1 deletion(-) diff --git a/cmd/login.go b/cmd/login.go index 077533f..3a39f3b 100644 --- a/cmd/login.go +++ b/cmd/login.go @@ -25,7 +25,7 @@ var CmdLogin = cli.Command{ Name: "login", Usage: "Log in to a Gitea server", Description: `Log in to a Gitea server`, - Action: runLoginList, + Action: runLoginAddInteractive, Subcommands: []*cli.Command{ &cmdLoginList, &cmdLoginAdd, @@ -96,6 +96,79 @@ func runLoginAdd(ctx *cli.Context) error { ctx.Bool("insecure")) } +func runLoginAddInteractive(ctx *cli.Context) error { + var stdin, name, token, user, passwd, sshKey, giteaURL string + var insecure = false + + fmt.Print("URL of Gitea instance: ") + if _, err := fmt.Scanln(&stdin); err != nil { + stdin = "" + } + giteaURL = strings.TrimSpace(stdin) + if len(giteaURL) == 0 { + fmt.Println("URL is required!") + return nil + } + + parsedURL, err := url.Parse(giteaURL) + if err != nil { + return err + } + name = strings.ReplaceAll(strings.Title(parsedURL.Host), ".", "") + + fmt.Print("Name of new Login [" + name + "]: ") + if _, err := fmt.Scanln(&stdin); err != nil { + stdin = "" + } + if len(strings.TrimSpace(stdin)) != 0 { + name = strings.TrimSpace(stdin) + } + + fmt.Print("Do you have a token [Yes/no]: ") + if _, err := fmt.Scanln(&stdin); err != nil { + stdin = "" + } + if len(stdin) != 0 && strings.ToLower(stdin[:1]) == "n" { + fmt.Print("Username: ") + if _, err := fmt.Scanln(&stdin); err != nil { + stdin = "" + } + user = strings.TrimSpace(stdin) + + fmt.Print("Password: ") + if _, err := fmt.Scanln(&stdin); err != nil { + stdin = "" + } + passwd = strings.TrimSpace(stdin) + } else { + fmt.Print("Token: ") + if _, err := fmt.Scanln(&stdin); err != nil { + stdin = "" + } + token = strings.TrimSpace(stdin) + } + + fmt.Print("Set Optional settings [yes/No]: ") + if _, err := fmt.Scanln(&stdin); err != nil { + stdin = "" + } + if len(stdin) != 0 && strings.ToLower(stdin[:1]) == "y" { + fmt.Print("SSH Key Path: ") + if _, err := fmt.Scanln(&stdin); err != nil { + stdin = "" + } + sshKey = strings.TrimSpace(stdin) + + fmt.Print("Allow Insecure connections [yes/No]: ") + if _, err := fmt.Scanln(&stdin); err != nil { + stdin = "" + } + insecure = len(stdin) != 0 && strings.ToLower(stdin[:1]) == "y" + } + + return runLoginAddMain(name, token, user, passwd, sshKey, giteaURL, insecure) +} + func runLoginAddMain(name, token, user, passwd, sshKey, giteaURL string, insecure bool) error { if len(giteaURL) == 0 { -- 2.40.1