Refactor addLoginMain() #201

Merged
6543 merged 10 commits from noerw/tea:refactor-loginMain into master 2020-09-30 19:44:25 +00:00
6 changed files with 111 additions and 92 deletions

View File

@ -13,6 +13,7 @@ import (
"code.gitea.io/tea/modules/config"
local_git "code.gitea.io/tea/modules/git"
"code.gitea.io/tea/modules/print"
"code.gitea.io/tea/modules/utils"
"code.gitea.io/sdk/gitea"
"github.com/go-git/go-git/v5"
@ -106,7 +107,7 @@ func runPullsCreate(ctx *cli.Context) error {
if err != nil {
log.Fatal(err)
}
owner, _ := config.GetOwnerAndRepo(strings.TrimLeft(url.Path, "/"), "")
owner, _ := utils.GetOwnerAndRepo(strings.TrimLeft(url.Path, "/"), "")
head = fmt.Sprintf("%s:%s", owner, branchName)
}

View File

@ -9,6 +9,7 @@ import (
"code.gitea.io/tea/cmd/repos"
"code.gitea.io/tea/modules/config"
"code.gitea.io/tea/modules/print"
"code.gitea.io/tea/modules/utils"
"code.gitea.io/sdk/gitea"
"github.com/urfave/cli/v2"
@ -38,7 +39,7 @@ func runRepos(ctx *cli.Context) error {
func runRepoDetail(path string) error {
login := config.InitCommandLoginOnly(flags.GlobalLoginValue)
client := login.Client()
repoOwner, repoName := config.GetOwnerAndRepo(path, login.User)
repoOwner, repoName := utils.GetOwnerAndRepo(path, login.User)
repo, _, err := client.GetRepo(repoOwner, repoName)
if err != nil {
return err

View File

@ -56,7 +56,6 @@ func LoadConfig() error {
ymlPath := GetConfigPath()
exist, _ := utils.FileExist(ymlPath)
if exist {
fmt.Println("Found config file", ymlPath)
bs, err := ioutil.ReadFile(ymlPath)
if err != nil {
return err
@ -145,16 +144,3 @@ func curGitRepoPath(repoValue, remoteValue string) (*Login, string, error) {
return nil, "", errors.New("No Gitea login found. You might want to specify --repo (and --login) to work outside of a repository")
}
// GetOwnerAndRepo return repoOwner and repoName
// based on relative path and default owner (if not in path)
func GetOwnerAndRepo(repoPath, user string) (string, string) {
if len(repoPath) == 0 {
return "", ""
}
p := strings.Split(repoPath, "/")
if len(p) >= 2 {
return p[0], p[1]
}
return user, repoPath
}

View File

@ -13,7 +13,6 @@ import (
"net/http/cookiejar"
"net/url"
"os"
"strings"
"time"
"code.gitea.io/tea/modules/utils"
@ -72,6 +71,29 @@ func (l *Login) GetSSHHost() string {
return u.Hostname()
}
// GenerateToken creates a new token when given BasicAuth credentials
func (l *Login) GenerateToken(user, pass string) (string, error) {
client := l.Client()
gitea.SetBasicAuth(user, pass)(client)
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})
return t.Token, err
}
// GetDefaultLogin return the default login
func GetDefaultLogin() (*Login, error) {
if len(Config.Logins) == 0 {
@ -98,7 +120,6 @@ func GetLoginByName(name string) *Login {
// AddLogin add login to config ( global var & file)
func AddLogin(name, token, user, passwd, sshKey, giteaURL string, insecure bool) error {
if len(giteaURL) == 0 {
log.Fatal("You have to input Gitea server URL")
}
@ -110,79 +131,45 @@ func AddLogin(name, token, user, passwd, sshKey, giteaURL string, insecure bool)
log.Fatal("No user set")
}
err := LoadConfig()
serverURL, err := utils.NormalizeURL(giteaURL)
if err != nil {
log.Fatal(err)
log.Fatal("Unable to parse URL", err)
}
httpClient := &http.Client{}
if insecure {
cookieJar, _ := cookiejar.New(nil)
httpClient = &http.Client{
Jar: cookieJar,
Transport: &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}}
}
client, err := gitea.NewClient(giteaURL,
gitea.SetToken(token),
gitea.SetBasicAuth(user, passwd),
gitea.SetHTTPClient(httpClient),
)
err = LoadConfig()
if err != nil {
log.Fatal(err)
log.Fatal("Unable to load config file " + yamlConfigPath)
}
u, _, err := client.GetMyUserInfo()
if err != nil {
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
}
fmt.Println("Login successful! Login name " + u.UserName)
if len(name) == 0 {
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
break
}
}
}
err = addLoginToConfig(Login{
login := Login{
Name: name,
URL: giteaURL,
URL: serverURL.String(),
Token: token,
Insecure: insecure,
SSHKey: sshKey,
User: u.UserName,
})
}
if len(token) == 0 {
login.Token, err = login.GenerateToken(user, passwd)
if err != nil {
log.Fatal(err)
}
}
u, _, err := login.Client().GetMyUserInfo()
if err != nil {
log.Fatal(err)
}
login.User = u.UserName
if len(login.Name) == 0 {
login.Name, err = GenerateLoginName(giteaURL, login.User)
if err != nil {
log.Fatal(err)
}
}
err = addLoginToConfig(login)
if err != nil {
log.Fatal(err)
}
@ -192,9 +179,32 @@ func AddLogin(name, token, user, passwd, sshKey, giteaURL string, insecure bool)
log.Fatal(err)
}
fmt.Printf("Login as %s on %s successful. Added this login as %s\n", login.User, login.URL, login.Name)
return nil
}
// GenerateLoginName generates a name string based on instance URL & adds username if the result is not unique
func GenerateLoginName(url, user string) (string, error) {
parsedURL, err := utils.NormalizeURL(url)
if err != nil {
return "", err
}
name := parsedURL.Host
// append user name if login name already exists
if len(user) != 0 {
for _, l := range Config.Logins {
if l.Name == name {
name += "_" + user
break
}
}
}
return name, nil
}
// addLoginToConfig add a login to global Config var
func addLoginToConfig(login Login) error {
for _, l := range Config.Logins {
@ -205,18 +215,18 @@ func addLoginToConfig(login Login) error {
return errors.New("Login name has already been used")
}
if l.URL == login.URL && l.Token == login.Token {
return errors.New("URL has been added")
return errors.New("Login for this URL and token already exists")
}
}
u, err := url.Parse(login.URL)
if err != nil {
return err
}
if login.SSHHost == "" {
if len(login.SSHHost) == 0 {
u, err := url.Parse(login.URL)
if err != nil {
return err
}
login.SSHHost = u.Hostname()
}
Config.Logins = append(Config.Logins, login)
return nil
@ -254,7 +264,7 @@ func InitCommand(repoValue, loginValue, remoteValue string) (*Login, string, str
}
}
owner, repo := GetOwnerAndRepo(repoValue, login.User)
owner, repo := utils.GetOwnerAndRepo(repoValue, login.User)
return login, owner, repo
}

View File

@ -6,7 +6,6 @@ package interact
import (
"fmt"
"net/url"
"strings"
"code.gitea.io/tea/modules/config"
@ -27,11 +26,10 @@ func CreateLogin() error {
return nil
}
parsedURL, err := url.Parse(giteaURL)
name, err := config.GenerateLoginName(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 {

View File

@ -5,6 +5,7 @@
package utils
import (
"net/url"
"strconv"
"strings"
)
@ -16,3 +17,25 @@ func ArgToIndex(arg string) (int64, error) {
}
return strconv.ParseInt(arg, 10, 64)
}
// NormalizeURL normalizes the input with a protocol
func NormalizeURL(raw string) (*url.URL, error) {
Outdated
Review

insecure mean to accept self-signed certificates, it's NOT about http vs https

insecure mean to accept self-signed certificates, it's NOT about http vs https
Outdated
Review

ok, I'd fall back to https then. If user wants http, they need to enter the url with protocol.

ok, I'd fall back to https then. If user wants `http`, they need to enter the url with protocol.
Outdated
Review

ok, I'd fall back to https then. If user wants http, they need to enter the url with protocol.

ok, I'd fall back to https then. If user wants `http`, they need to enter the url with protocol.
var prefix string
if !strings.HasPrefix(raw, "http") {
prefix = "https://"
}
return url.Parse(prefix + raw)
}
// GetOwnerAndRepo return repoOwner and repoName
// based on relative path and default owner (if not in path)
func GetOwnerAndRepo(repoPath, user string) (string, string) {
if len(repoPath) == 0 {
return "", ""
}
p := strings.Split(repoPath, "/")
if len(p) >= 2 {
return p[0], p[1]
}
return user, repoPath
}