From cc6d4f8da4afd3051a097edc9ef9b3ddd919fa52 Mon Sep 17 00:00:00 2001 From: Mmx233 Date: Sun, 4 Jun 2023 20:20:58 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20acid=20=E8=87=AA=E5=8A=A8=E5=97=85?= =?UTF-8?q?=E6=8E=A2=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/bitsrun/main.go | 4 ++++ internal/controllers/login.go | 8 +++---- internal/global/config.go | 12 ++++++++-- internal/global/flags.go | 9 ++++++- internal/global/log.go | 3 --- pkg/srun/api.go | 45 ++++++++++++++++++++++++++++++----- pkg/srun/models.go | 4 ++-- 7 files changed, 67 insertions(+), 18 deletions(-) diff --git a/cmd/bitsrun/main.go b/cmd/bitsrun/main.go index c885049..02e52f8 100644 --- a/cmd/bitsrun/main.go +++ b/cmd/bitsrun/main.go @@ -9,6 +9,10 @@ import ( ) func main() { + if global.Flags.AutoAcid { + //todo detect acid + } + if global.Config.Settings.Guardian.Enable { //进入守护模式 controllers.Guardian() diff --git a/internal/controllers/login.go b/internal/controllers/login.go index ead0eae..1c81205 100644 --- a/internal/controllers/login.go +++ b/internal/controllers/login.go @@ -11,18 +11,18 @@ import ( // Login 登录逻辑 func Login(eth *tools.Eth, debugOutput bool) error { - // 登录状态检查 - + // 登录配置初始化 httpClient := tools.HttpPackSelect(eth).Client conf := &srun.Conf{ Https: global.Config.Settings.Basic.Https, LoginInfo: srun.LoginInfo{ - Form: &global.Config.Form, - Meta: &global.Config.Meta, + Form: global.Config.Form, + Meta: global.Config.Meta, }, Client: httpClient, } + // 选择输出函数 var output func(args ...interface{}) if debugOutput { output = log.Debugln diff --git a/internal/global/config.go b/internal/global/config.go index 2d9aa26..1841f68 100644 --- a/internal/global/config.go +++ b/internal/global/config.go @@ -43,7 +43,7 @@ func readConfig() { }, }) - //生成配置文件 + // 生成配置文件 if exist, e := tool.File.Exists(Flags.Path); e != nil { log.Fatalln("[init] 读取配置文件失败:", e) } else if !exist { @@ -55,7 +55,7 @@ func readConfig() { os.Exit(0) } - //读取配置文件 + // 读取配置文件 viper.SetConfigFile(Flags.Path) if e := viper.ReadInConfig(); e != nil { log.Fatalln("[init] 读取配置失败:", e) @@ -63,4 +63,12 @@ func readConfig() { if e := viper.Unmarshal(&Config); e != nil { log.Fatalln("[init] 解析配置失败:", e) } + + // flag 配置覆写 + if Flags.Debug { + Config.Settings.Log.DebugLevel = true + } + if Flags.Acid != "" { + Config.Meta.Acid = Flags.Acid + } } diff --git a/internal/global/flags.go b/internal/global/flags.go index 1f97988..ea1e3a1 100644 --- a/internal/global/flags.go +++ b/internal/global/flags.go @@ -5,16 +5,23 @@ import ( ) var Flags struct { - //配置文件路径 + // 配置文件路径 Path string + // settings overwrite Interface string Debug bool + AutoAcid bool + Acid string } func initFlags() { flag.StringVar(&Flags.Path, "config", "Config.yaml", "config path") + flag.StringVar(&Flags.Interface, "interface", "", "specify the eth name") flag.BoolVar(&Flags.Debug, "debug", false, "enable debug mode") + flag.BoolVar(&Flags.AutoAcid, "auto-acid", false, "auto detect acid") + flag.StringVar(&Flags.Acid, "acid", "", "specify acid value") + flag.Parse() } diff --git a/internal/global/log.go b/internal/global/log.go index 26be3cf..5415340 100644 --- a/internal/global/log.go +++ b/internal/global/log.go @@ -11,9 +11,6 @@ import ( ) func initLog() { - if Flags.Debug { - Config.Settings.Log.DebugLevel = true - } if Config.Settings.Log.DebugLevel { log.SetLevel(log.DebugLevel) } diff --git a/pkg/srun/api.go b/pkg/srun/api.go index e779143..9c0ded2 100644 --- a/pkg/srun/api.go +++ b/pkg/srun/api.go @@ -7,15 +7,18 @@ import ( log "github.com/sirupsen/logrus" "io" "net/http" + "net/url" "strings" "time" ) type Api struct { - inited bool + inited bool + BaseUrl string Client *http.Client - Header http.Header + // 禁用自动重定向 + NoDirect *http.Client } func (a *Api) Init(https bool, domain string, client *http.Client) { @@ -29,7 +32,12 @@ func (a *Api) Init(https bool, domain string, client *http.Client) { } a.BaseUrl = a.BaseUrl + "://" + domain + "/" + // 初始化 http client a.Client = client + a.NoDirect = &(*client) + a.NoDirect.CheckRedirect = func(_ *http.Request, _ []*http.Request) error { + return http.ErrUseLastResponse + } a.inited = true } @@ -53,10 +61,6 @@ func (a *Api) request(path string, query map[string]interface{}) (map[string]int return nil, e } - for k, v := range a.Header { - req.Header[k] = v - } - resp, e := httpTool.Client.Do(req) if e != nil { log.Debugln(e) @@ -83,6 +87,35 @@ func (a *Api) GetUserInfo() (map[string]interface{}, error) { return a.request("cgi-bin/rad_user_info", nil) } +// DetectAcid error 为 nil 的情况下 acid 可能为空 +func (a *Api) DetectAcid() (string, error) { + fmt.Println("开始嗅探 Acid") + addr := a.BaseUrl + for { + log.Debugln("HTTP GET ", addr) + res, e := a.NoDirect.Get(addr) + if e != nil { + return "", e + } + _ = res.Body.Close() + loc := res.Header.Get("location") + if res.StatusCode == 302 && loc != "" { + if strings.HasPrefix(loc, "/") { + addr = a.BaseUrl + strings.TrimPrefix(loc, "/") + } else { + addr = loc + } + continue + } + break + } + u, e := url.Parse(addr) + if e != nil { + return "", e + } + return u.Query().Get(`ac_id`), e +} + func (a *Api) Login( Username, Password, diff --git a/pkg/srun/models.go b/pkg/srun/models.go index 5582dce..bfe8ec0 100644 --- a/pkg/srun/models.go +++ b/pkg/srun/models.go @@ -20,8 +20,8 @@ type LoginMeta struct { } type LoginInfo struct { - Form *LoginForm - Meta *LoginMeta + Form LoginForm + Meta LoginMeta } type Conf struct {