From 9c55cc9d1aeaac0a165a4c8abe484eb28c6b297a Mon Sep 17 00:00:00 2001 From: Mmx <1624045573@qq.com> Date: Thu, 25 Nov 2021 08:57:54 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E4=BD=9C=E4=B8=BAmod?= =?UTF-8?q?ule=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/login.go | 112 +++++-------------------------------------- models/config.go | 14 ------ util/config.go | 17 +++++++ v1/login.go | 112 +++++++++++++++++++++++++++++++++++++++++++ v1/transfer/login.go | 21 ++++++++ 5 files changed, 162 insertions(+), 114 deletions(-) create mode 100644 util/config.go create mode 100644 v1/login.go create mode 100644 v1/transfer/login.go diff --git a/controllers/login.go b/controllers/login.go index 5b8be6e..2008867 100644 --- a/controllers/login.go +++ b/controllers/login.go @@ -1,108 +1,20 @@ package controllers import ( - "encoding/json" - "errors" "github.com/Mmx233/BitSrunLoginGo/global" - "github.com/Mmx233/BitSrunLoginGo/util" - "github.com/Mmx233/tool" - "time" + BitSrun "github.com/Mmx233/BitSrunLoginGo/v1" + "github.com/Mmx233/BitSrunLoginGo/v1/transfer" ) func Login(output bool, skipCheck bool) error { - util.Log.OutPut = output - G := global.Config.Generate() - if !skipCheck { - util.Log.Println("Step0: 检查状态…") - if util.Checker.NetOk(global.Config.Settings.Timeout) { - util.Log.Println("网络 ok") - return nil - } - } - - util.Log.Println("Step1: 正在获取客户端ip") - { - if _, body, e := tool.HTTP.GetString(&tool.GetRequest{ - Url: G.UrlLoginPage, - Redirect: true, - }); e != nil { - return e - } else if G.Ip, e = util.GetIp(body); e != nil { - return e - } - } - util.Log.Println("Step2: 正在获取Token") - { - if _, data, e := tool.HTTP.GetString(&tool.GetRequest{ - Url: G.UrlGetChallengeApi, - Query: map[string]interface{}{ - "callback": "jsonp1583251661367", - "username": G.Form.UserName, - "ip": G.Ip, - }, - Redirect: true, - }); e != nil { - return e - } else if G.Token, e = util.GetToken(data); e != nil { - return e - } - } - util.Log.Println("Step3: 执行登录…") - { - info, e := json.Marshal(map[string]string{ - "username": G.Form.UserName, - "password": G.Form.PassWord, - "ip": G.Ip, - "acid": G.Meta.Acid, - "enc_ver": G.Meta.Enc, - }) - if e != nil { - return e - } - G.EncryptedInfo = "{SRBX1}" + util.Base64(util.XEncode(string(info), G.Token)) - G.Md5 = util.Md5(G.Token) - G.EncryptedMd5 = "{MD5}" + G.Md5 - - var chkstr = G.Token + G.Form.UserName + G.Token + G.Md5 - chkstr += G.Token + G.Meta.Acid + G.Token + G.Ip - chkstr += G.Token + G.Meta.N + G.Token + G.Meta.Type - chkstr += G.Token + G.EncryptedInfo - G.EncryptedChkstr = util.Sha1(chkstr) - - if _, res, e := tool.HTTP.GetString(&tool.GetRequest{ - Url: G.UrlLoginApi, - Query: map[string]interface{}{ - "callback": "jQuery112401157665", - "action": "login", - "username": G.Form.UserName, - "password": G.EncryptedMd5, - "ac_id": G.Meta.Acid, - "ip": G.Ip, - "info": G.EncryptedInfo, - "chksum": G.EncryptedChkstr, - "n": G.Meta.N, - "type": G.Meta.Type, - "os": "Windows 10", - "name": "windows", - "double_stack": 0, - "_": time.Now().UnixNano(), - }, - Redirect: true, - }); e != nil { - return e - } else if G.LoginResult, e = util.GetResult(res); e != nil { - return e - } else { - util.Log.Println("登录结果: " + G.LoginResult) - if global.Config.Settings.DemoMode { - util.Log.Println(res) - } - } - - if G.LoginResult != "ok" { - return errors.New(G.LoginResult) - } - } - - return nil + return BitSrun.Login(&transfer.Login{ + Demo: global.Config.Settings.DemoMode, + OutPut: output, + CheckNet: !skipCheck, + Timeout: global.Config.Settings.Timeout, + LoginInfo: transfer.LoginInfo{ + Form: &global.Config.Form, + Meta: &global.Config.Meta, + }, + }) } diff --git a/models/config.go b/models/config.go index 7e0533e..06642ba 100644 --- a/models/config.go +++ b/models/config.go @@ -22,17 +22,3 @@ type Config struct { Meta LoginMeta `json:"meta"` Settings Settings `json:"settings"` } - -func (a *Config) Generate() *LoginInfo { - return &LoginInfo{ - UrlLoginPage: "http://" + a.Form.Domain + "/srun_portal_success", - UrlGetChallengeApi: "http://" + a.Form.Domain + "/cgi-bin/get_challenge", - UrlLoginApi: "http://" + a.Form.Domain + "/cgi-bin/srun_portal", - UrlCheckApi: "http://" + a.Form.Domain + "/cgi-bin/rad_user_info", - Meta: &a.Meta, - Form: &LoginForm{ - UserName: a.Form.UserName + "@" + a.Form.UserType, - PassWord: a.Form.PassWord, - }, - } -} diff --git a/util/config.go b/util/config.go new file mode 100644 index 0000000..f20fd85 --- /dev/null +++ b/util/config.go @@ -0,0 +1,17 @@ +package util + +import "github.com/Mmx233/BitSrunLoginGo/models" + +func GenerateLoginInfo(Form *models.LoginForm, Meta *models.LoginMeta) *models.LoginInfo { + return &models.LoginInfo{ + UrlLoginPage: "http://" + Form.Domain + "/srun_portal_success", + UrlGetChallengeApi: "http://" + Form.Domain + "/cgi-bin/get_challenge", + UrlLoginApi: "http://" + Form.Domain + "/cgi-bin/srun_portal", + UrlCheckApi: "http://" + Form.Domain + "/cgi-bin/rad_user_info", + Meta: Meta, + Form: &models.LoginForm{ + UserName: Form.UserName + "@" + Form.UserType, + PassWord: Form.PassWord, + }, + } +} diff --git a/v1/login.go b/v1/login.go new file mode 100644 index 0000000..1640847 --- /dev/null +++ b/v1/login.go @@ -0,0 +1,112 @@ +package BitSrun + +import ( + "encoding/json" + "errors" + "github.com/Mmx233/BitSrunLoginGo/util" + "github.com/Mmx233/BitSrunLoginGo/v1/transfer" + "github.com/Mmx233/tool" + "time" +) + +func Login(c *transfer.Login) error { + util.Log.Demo = c.Demo + util.Log.OutPut = c.OutPut + + G := util.GenerateLoginInfo(c.LoginInfo.Form, c.LoginInfo.Meta) + if c.CheckNet { + util.Log.Println("Step0: 检查状态…") + if util.Checker.NetOk(c.Timeout) { + util.Log.Println("网络 ok") + return nil + } + } + + util.Log.Println("Step1: 正在获取客户端ip") + { + if _, body, e := tool.HTTP.GetString(&tool.GetRequest{ + Url: G.UrlLoginPage, + Redirect: true, + }); e != nil { + return e + } else if G.Ip, e = util.GetIp(body); e != nil { + return e + } + } + + util.Log.Println("Step2: 正在获取Token") + { + if _, data, e := tool.HTTP.GetString(&tool.GetRequest{ + Url: G.UrlGetChallengeApi, + Query: map[string]interface{}{ + "callback": "jsonp1583251661367", + "username": G.Form.UserName, + "ip": G.Ip, + }, + Redirect: true, + }); e != nil { + return e + } else if G.Token, e = util.GetToken(data); e != nil { + return e + } + } + + util.Log.Println("Step3: 执行登录…") + { + info, e := json.Marshal(map[string]string{ + "username": G.Form.UserName, + "password": G.Form.PassWord, + "ip": G.Ip, + "acid": G.Meta.Acid, + "enc_ver": G.Meta.Enc, + }) + if e != nil { + return e + } + G.EncryptedInfo = "{SRBX1}" + util.Base64(util.XEncode(string(info), G.Token)) + G.Md5 = util.Md5(G.Token) + G.EncryptedMd5 = "{MD5}" + G.Md5 + + var chkstr = G.Token + G.Form.UserName + G.Token + G.Md5 + chkstr += G.Token + G.Meta.Acid + G.Token + G.Ip + chkstr += G.Token + G.Meta.N + G.Token + G.Meta.Type + chkstr += G.Token + G.EncryptedInfo + G.EncryptedChkstr = util.Sha1(chkstr) + + if _, res, e := tool.HTTP.GetString(&tool.GetRequest{ + Url: G.UrlLoginApi, + Query: map[string]interface{}{ + "callback": "jQuery112401157665", + "action": "login", + "username": G.Form.UserName, + "password": G.EncryptedMd5, + "ac_id": G.Meta.Acid, + "ip": G.Ip, + "info": G.EncryptedInfo, + "chksum": G.EncryptedChkstr, + "n": G.Meta.N, + "type": G.Meta.Type, + "os": "Windows 10", + "name": "windows", + "double_stack": 0, + "_": time.Now().UnixNano(), + }, + Redirect: true, + }); e != nil { + return e + } else if G.LoginResult, e = util.GetResult(res); e != nil { + return e + } else { + util.Log.Println("登录结果: " + G.LoginResult) + if c.Demo { + util.Log.Println(res) + } + } + + if G.LoginResult != "ok" { + return errors.New(G.LoginResult) + } + } + + return nil +} diff --git a/v1/transfer/login.go b/v1/transfer/login.go new file mode 100644 index 0000000..7112d06 --- /dev/null +++ b/v1/transfer/login.go @@ -0,0 +1,21 @@ +package transfer + +import "github.com/Mmx233/BitSrunLoginGo/models" + +type LoginInfo struct { + Form *models.LoginForm + Meta *models.LoginMeta +} + +type Login struct { + //文件日志输出开关 + Demo bool + //控制台日志打印开关 + OutPut bool + //登陆前是否检查网络,只在离线时登录 + CheckNet bool + //网络检查超时时间 + Timeout uint + //登录参数,不可缺省 + LoginInfo LoginInfo +}