Skip to content

Commit c49c638

Browse files
committed
支持从改动文件中提取服务列表
1 parent 2200d89 commit c49c638

File tree

10 files changed

+767
-121
lines changed

10 files changed

+767
-121
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
.cookie
2-
vendor
2+
vendor
3+
.idea

cmd/login.go

Lines changed: 27 additions & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -16,53 +16,46 @@ package cmd
1616

1717
import (
1818
"crypto/sha1"
19-
"encoding/json"
2019
"fmt"
2120
"io"
22-
"io/ioutil"
23-
"net/http"
24-
"net/http/cookiejar"
2521
"net/url"
2622
"os"
27-
"strings"
2823
"syscall"
29-
"time"
3024

31-
"e.coding.net/codingcorp/coding-cli/pkg/model"
25+
"e.coding.net/codingcorp/coding-cli/pkg/request"
3226
"github.com/spf13/cobra"
3327
"golang.org/x/crypto/ssh/terminal"
34-
"golang.org/x/net/publicsuffix"
3528
)
3629

3730
const (
38-
// loginURL = "https://codigncorp.coding.net/api/v2/account/login"
39-
loginURL = "http://codingcorp.coding.codingprod.net//api/v2/account/login"
31+
// loginURL = "/api/v2/account/login"
32+
loginURI = "/api/v2/account/login"
4033
minAccountSize = 6
4134
cookieFile = ".cookie"
4235
)
4336

44-
var username string
37+
var account string
4538

4639
// loginCmd represents the login command
4740
var loginCmd = &cobra.Command{
4841
Use: "login",
4942
Short: "登录到企业版",
50-
Long: `使用 Coding 企业版用户名和密码登录。`,
43+
Long: `使用 Coding 企业版用户名(邮箱或手机号)和密码登录。`,
5144
Run: func(cmd *cobra.Command, args []string) {
52-
if len(username) >= 6 {
45+
if len(account) >= 3 {
5346
password, err := readPassword()
5447
if err != nil {
5548
fmt.Fprintf(os.Stderr, "\n登录失败,%v\n", err)
5649
return
5750
}
58-
err = login(username, sha1Password(password))
51+
err = login(account, sha1Password(password))
5952
if err != nil {
6053
fmt.Fprintln(os.Stderr, err)
6154
return
6255
}
6356
return
6457
}
65-
fmt.Fprintf(os.Stderr, "用户名至少 6\n")
58+
fmt.Fprintf(os.Stderr, "用户名至少 3\n")
6659
},
6760
}
6861

@@ -91,9 +84,9 @@ func readPassword() (string, error) {
9184
func init() {
9285
rootCmd.AddCommand(loginCmd)
9386

94-
const userNameFlag = "username"
95-
loginCmd.Flags().StringVarP(&username, userNameFlag, "u", "", "用户名")
96-
loginCmd.MarkFlagRequired(userNameFlag)
87+
const accountFlag = "account"
88+
loginCmd.Flags().StringVarP(&account, accountFlag, "u", "", "用户名(邮箱或手机号)")
89+
loginCmd.MarkFlagRequired(accountFlag)
9790
}
9891

9992
func sha1Password(password string) string {
@@ -102,115 +95,29 @@ func sha1Password(password string) string {
10295
return fmt.Sprintf("%x", h.Sum(nil))
10396
}
10497

105-
func login(username string, sha1Password string) error {
106-
u, err := url.Parse(loginURL)
107-
if err != nil {
108-
return fmt.Errorf("登录请求 URL 错误: %s, %v", loginURL, err)
109-
}
110-
111-
req, err := http.NewRequest(
112-
http.MethodPost,
113-
loginURL,
114-
urlEncodeLoginForm(username, sha1Password),
115-
)
116-
if err != nil {
117-
return fmt.Errorf("创建登录请求失败, 地址: %s, %v", loginURL, err)
118-
}
119-
120-
req = formURLEncoded(req)
121-
jar, err := newCookieJar()
98+
func login(account string, sha1Password string) error {
99+
form := url.Values{}
100+
form.Set("account", account)
101+
form.Set("password", sha1Password)
102+
req := request.NewPostRequest(loginURI, &form)
103+
req.On2fa = get2faCode
104+
_, err := req.Send()
122105
if err != nil {
123106
return err
124107
}
125-
cookie, err := readCookie()
126-
if err != nil {
127-
// 读取失败也不要紧,继续执行
128-
fmt.Println(err)
129-
} else {
130-
jar.SetCookies(u, []*http.Cookie{cookie})
131-
}
132-
client := &http.Client{
133-
Timeout: 10 * time.Second,
134-
Jar: jar,
135-
}
136-
137-
resp, err := client.Do(req)
138-
if err != nil {
139-
return fmt.Errorf("发送登录请求失败, 地址: %s, %v", loginURL, err)
140-
}
141-
defer resp.Body.Close()
142-
143-
err = saveCookie(jar.Cookies(u))
144-
if err != nil {
145-
// 保存失败也不要紧,继续执行
146-
fmt.Println(err)
147-
}
148-
149-
if resp.StatusCode != http.StatusOK {
150-
return fmt.Errorf("登录失败, 地址: %s, 错误码: %d", loginURL, resp.StatusCode)
151-
}
152-
153-
bodyBytes, err := ioutil.ReadAll(resp.Body)
154-
if err != nil {
155-
return fmt.Errorf("读取响应内容失败, %v", err)
156-
}
157-
var result model.Result
158-
json.Unmarshal(bodyBytes, &result)
159-
if result.Code != 0 {
160-
return fmt.Errorf("登录失败 %v", result.Msg)
161-
}
162-
163-
fmt.Printf("登录成功\n")
164-
return nil
165-
}
166-
167-
func formURLEncoded(r *http.Request) *http.Request {
168-
r.Header.Add("Content-Type", "application/x-www-form-URLencoded")
169-
return r
170-
}
171-
172-
func newCookieJar() (http.CookieJar, error) {
173-
jar, err := cookiejar.New(&cookiejar.Options{PublicSuffixList: publicsuffix.List})
174-
if err != nil {
175-
return nil, fmt.Errorf("无法创建用户保存 Session 的 Cookie Jar, %v", err)
176-
}
177-
return jar, nil
178-
}
179-
180-
func urlEncodeLoginForm(u string, p string) io.Reader {
181-
form := url.Values{}
182-
form.Set("account", u)
183-
form.Set("password", p)
184-
return strings.NewReader(form.Encode())
185-
}
186-
187-
func saveCookie(cookies []*http.Cookie) error {
188-
for _, c := range cookies {
189-
if c.Name == "sid" || c.Name == "eid" {
190-
if c == nil {
191-
return fmt.Errorf("Session Cookie 不存在")
192-
}
193-
err := ioutil.WriteFile(cookieFile, []byte(c.Name+"="+c.Value), 0666)
194-
if err != nil {
195-
return fmt.Errorf("保存 Session Cookie 失败,%v", err)
196-
}
197-
return nil
198-
}
199-
}
108+
fmt.Println("登录成功")
200109
return nil
201110
}
202111

203-
func readCookie() (*http.Cookie, error) {
204-
b, err := ioutil.ReadFile(cookieFile)
112+
func get2faCode() (string, error) {
113+
fmt.Print("两步验证码: ")
114+
b, err := terminal.ReadPassword(int(syscall.Stdin))
205115
if err != nil {
206-
return nil, fmt.Errorf("读取 Cookie 文件错误,%v", err)
116+
return "", fmt.Errorf("读取两步验证码失败, %v", err)
207117
}
208-
cookiePair := strings.Split(string(b), "=")
209-
if len(cookiePair) != 2 {
210-
return nil, fmt.Errorf("Cookie 文件内容格式错误,文件:%s,%v", cookieFile, cookiePair)
118+
code := string(b)
119+
if len(code) == 6 {
120+
return code, nil
211121
}
212-
return &http.Cookie{
213-
Name: cookiePair[0],
214-
Value: cookiePair[1],
215-
}, nil
122+
return "", fmt.Errorf("读取两步验为 6 位数字")
216123
}

0 commit comments

Comments
 (0)