From c235a501b199cf85eb3244d036ecd8395f6c2f6e Mon Sep 17 00:00:00 2001 From: shy Date: Sun, 14 Jan 2024 19:51:16 +0800 Subject: [PATCH] add spide token --- base/web/space.go | 31 ++++++++++++++++++------------- base/web/spide.go | 22 +++++++++++++++++++++- base/web/token.go | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 14 deletions(-) diff --git a/base/web/space.go b/base/web/space.go index c78233df..a653daad 100644 --- a/base/web/space.go +++ b/base/web/space.go @@ -4,6 +4,7 @@ import ( "math/rand" "net" "net/http" + "path" "runtime" "strings" "sync" @@ -35,15 +36,18 @@ func _space_dial(m *ice.Message, dev, name string, arg ...string) { gdb.Go(m, func() { once := sync.Once{} redial := kit.Dict(mdb.Configv(m, REDIAL)) - a, b, c := kit.Int(redial["a"]), kit.Int(redial["b"]), kit.Int(redial["c"]) - for i := 1; i < c; i++ { + a, b, _c := kit.Int(redial["a"]), kit.Int(redial["b"]), kit.Int(redial["c"]) + for i := 1; i < _c; i++ { next := time.Duration(rand.Intn(a*(i+1))+b*i) * time.Millisecond m.Cmd(tcp.CLIENT, tcp.DIAL, args, func(c net.Conn) { if c, e := websocket.NewClient(c, u); !m.Warn(e, tcp.DIAL, dev, SPACE, u.String()) { defer mdb.HashCreateDeferRemove(m, kit.SimpleKV("", MASTER, dev, u.Host), kit.Dict(mdb.TARGET, c))() kit.If(ice.Info.Colors, func() { once.Do(func() { m.Go(func() { _space_qrcode(m, dev) }) }) }) - _space_handle(m.Spawn(), true, dev, c) - i = 0 + if _space_handle(m.Spawn(), true, dev, c); mdb.HashSelect(m, mdb.NAME, dev).Length() == 0 { + i = _c + } else { + i = 0 + } } }).Cost(mdb.COUNT, i, mdb.NEXT, next, tcp.DIAL, dev, LINK, u.String()).Sleep(next) } @@ -69,8 +73,11 @@ func _space_fork(m *ice.Message) { addr := kit.Select(m.R.RemoteAddr, m.R.Header.Get(ice.MSG_USERADDR)) text := strings.ReplaceAll(kit.Select(addr, m.Option(mdb.TEXT)), "%2F", nfs.PS) name := kit.ReplaceAll(kit.Select(addr, m.Option(mdb.NAME)), "[", "_", "]", "_", nfs.DF, "_", nfs.PT, "_") + if m.OptionDefault(mdb.TYPE, SERVER) == WORKER && (!nfs.Exists(m, path.Join(ice.USR_LOCAL_WORK, name)) || !tcp.IsLocalHost(m, m.Option(ice.MSG_USERIP))) { + m.Option(mdb.TYPE, SERVER) + } if kit.IsIn(m.Option(mdb.TYPE), WORKER) && IsLocalHost(m) { - + text = nfs.USR_LOCAL_WORK + name } else if kit.IsIn(m.Option(mdb.TYPE), PORTAL, aaa.LOGIN) && len(name) == 32 && kit.IsIn(mdb.HashSelects(m.Spawn(), name).Append(aaa.IP), "", m.Option(ice.MSG_USERIP)) { } else { @@ -81,17 +88,12 @@ func _space_fork(m *ice.Message) { aaa.SessAuth(m, kit.Dict(m.Cmd(aaa.USER, m.Option(ice.MSG_USERNAME, ice.Info.Username)).AppendSimple())) } } else if m.Option(TOKEN) != "" { - if msg := m.Cmd(TOKEN, m.Option(TOKEN)); msg.Append(mdb.TIME) > m.Time() && msg.Append(mdb.TYPE) == SERVER { + if msg := m.Cmd(TOKEN, m.Option(TOKEN)); msg.Append(mdb.TIME) > m.Time() && kit.IsIn(msg.Append(mdb.TYPE), SERVER, SPIDE) { aaa.SessAuth(m, kit.Dict(m.Cmd(aaa.USER, m.Option(ice.MSG_USERNAME, msg.Append(mdb.NAME))).AppendSimple())) name = kit.Select(name, msg.Append(mdb.TEXT)) } } - if m.Option(mdb.TYPE) == WORKER { - if p := nfs.USR_LOCAL_WORK + m.Option(mdb.NAME); nfs.Exists(m, p) { - text = p - } - } - args := kit.Simple(mdb.TYPE, kit.Select(WORKER, m.Option(mdb.TYPE)), mdb.NAME, name, mdb.TEXT, text, m.OptionSimple(nfs.MODULE, nfs.VERSION, cli.DAEMON)) + args := kit.Simple(mdb.TYPE, m.Option(mdb.TYPE), mdb.NAME, name, mdb.TEXT, text, m.OptionSimple(nfs.MODULE, nfs.VERSION, cli.DAEMON)) args = append(args, aaa.USERNICK, m.Option(ice.MSG_USERNICK), aaa.USERNAME, m.Option(ice.MSG_USERNAME), aaa.USERROLE, m.Option(ice.MSG_USERROLE)) args = append(args, aaa.UA, m.Option(ice.MSG_USERUA), aaa.IP, m.Option(ice.MSG_USERIP)) args = _space_agent(m, args...) @@ -350,6 +352,9 @@ func init() { } _space_dial(m, m.Option(ice.DEV), kit.Select(ice.Info.NodeName, m.Option(mdb.NAME)), arg...) }}, + cli.CLOSE: {Hand: func(m *ice.Message, arg ...string) { + mdb.HashRemove(m, m.OptionSimple(mdb.NAME)) + }}, mdb.REMOVE: {Hand: func(m *ice.Message, arg ...string) { defer ToastProcess(m)() mdb.HashModify(m, m.OptionSimple(mdb.NAME), mdb.STATUS, cli.STOP) @@ -397,7 +402,7 @@ func init() { } m.PushButton(kit.Select(OPEN, LOGIN, value[mdb.TYPE] == LOGIN), mdb.REMOVE) }) - m.Sort("", kit.Simple(WEIXIN, PORTAL, WORKER, SERVER)) + m.Sort("", kit.Simple(WEIXIN, PORTAL, MASTER, WORKER, SERVER)) } else { _space_send(m, arg[0], kit.Simple(kit.Split(arg[1]), arg[2:])...) } diff --git a/base/web/spide.go b/base/web/spide.go index cf4a4696..976418dd 100644 --- a/base/web/spide.go +++ b/base/web/spide.go @@ -301,6 +301,9 @@ func init() { m.Cmd("", mdb.CREATE, ice.DEMO, kit.Select("http://localhost:20000", conf[cli.CTX_DEMO])) m.Cmd("", mdb.CREATE, ice.MAIL, kit.Select("https://mail.shylinux.com", conf[cli.CTX_MAIL])) m.Cmd("", mdb.CREATE, nfs.REPOS, kit.Select("https://repos.shylinux.com", conf[cli.CTX_HUB])) + mdb.HashSelects(m.Spawn()).Table(func(value ice.Maps) { + kit.If(value[TOKEN], func() { m.Cmd(SPACE, tcp.DIAL, ice.DEV, value[CLIENT_NAME], TOKEN, value[TOKEN], mdb.TYPE, SERVER) }) + }) }}, mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) { if mdb.IsSearchPreview(m, arg) { @@ -338,9 +341,26 @@ func init() { PROXY: {Name: "proxy url size cache upload", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(SPIDE, ice.DEV, SPIDE_RAW, http.MethodPost, m.Option(URL), SPIDE_PART, arg[2:]) }}, - }, mdb.HashAction(mdb.SHORT, CLIENT_NAME, mdb.FIELD, "time,client.name,client.url")), Hand: func(m *ice.Message, arg ...string) { + "dev.create.token": {Hand: func(m *ice.Message, arg ...string) { + m.Cmd(SPACE, tcp.DIAL, ice.DEV, m.Option(CLIENT_NAME), m.OptionSimple(TOKEN)) + }}, + "disconn": {Name: "断连", Hand: func(m *ice.Message, arg ...string) { + m.Cmd(SPACE, cli.CLOSE, kit.Dict(mdb.NAME, m.Option(CLIENT_NAME))) + mdb.HashModify(m, mdb.NAME, m.Option(CLIENT_NAME), TOKEN, "") + }}, + }, devTokenAction(CLIENT_NAME, CLIENT_URL), mdb.HashAction(mdb.SHORT, CLIENT_NAME, mdb.FIELD, "time,client.name,client.url,token")), Hand: func(m *ice.Message, arg ...string) { if len(arg) < 2 || arg[0] == "" || (len(arg) > 3 && arg[3] == "") { + list := m.CmdMap(SPACE, mdb.NAME) mdb.HashSelect(m, kit.Slice(arg, 0, 1)...).Sort(CLIENT_NAME) + m.Table(func(value ice.Maps) { + if _, ok := list[value[CLIENT_NAME]]; ok { + m.Push(mdb.STATUS, "online") + m.PushButton("disconn", mdb.REMOVE) + } else { + m.Push(mdb.STATUS, "") + m.PushButton(mdb.DEV_REQUEST, mdb.REMOVE) + } + }) kit.If(len(arg) > 0 && arg[0] != "", func() { m.Action(COOKIE, HEADER) }) } else { _spide_show(m, arg[0], arg[1:]...) diff --git a/base/web/token.go b/base/web/token.go index 6a0e1843..a3455392 100644 --- a/base/web/token.go +++ b/base/web/token.go @@ -11,6 +11,7 @@ import ( "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" "shylinux.com/x/icebergs/base/tcp" + "shylinux.com/x/icebergs/base/web/html" kit "shylinux.com/x/toolkits" ) @@ -53,3 +54,35 @@ func init() { }}, }) } + +func devTokenAction(name, origin string) ice.Actions { + return ice.Actions{ + "dev.request.text": {Hand: func(m *ice.Message, arg ...string) { m.Echo(ice.Info.NodeName) }}, + "dev.create.token": {Hand: func(m *ice.Message, arg ...string) {}}, + mdb.DEV_REQUEST: {Name: "request", Help: "连接", Hand: func(m *ice.Message, arg ...string) { + m.ProcessOpen(m.Options(ice.MSG_USERWEB, m.Option(origin)).MergePodCmd("", m.PrefixKey(), ctx.ACTION, mdb.DEV_CHOOSE, cli.BACK, m.Option(ice.MSG_USERHOST), cli.DAEMON, m.Option(ice.MSG_DAEMON), + m.OptionSimple(name), mdb.TEXT, m.Cmdx("", "dev.request.text"), + )) + }}, + mdb.DEV_CHOOSE: {Hand: func(m *ice.Message, arg ...string) { + m.EchoInfoButton(kit.Format("save token to %s", m.Option(cli.BACK)), mdb.DEV_RESPONSE) + }}, + mdb.DEV_RESPONSE: {Help: "确认", Hand: func(m *ice.Message, arg ...string) { + if !m.Warn(m.Option(ice.MSG_METHOD) != http.MethodPost, ice.ErrNotAllow) { + m.ProcessReplace(m.Options(ice.MSG_USERWEB, m.Option(cli.BACK)).MergePodCmd("", m.PrefixKey(), ctx.ACTION, mdb.DEV_CONFIRM, m.OptionSimple(cli.DAEMON), + m.OptionSimple(name), TOKEN, m.Cmdx(TOKEN, mdb.CREATE, mdb.TYPE, m.CommandKey(), mdb.NAME, m.Option(ice.MSG_USERNAME), m.OptionSimple(mdb.TEXT)))) + } + }}, + mdb.DEV_CONFIRM: {Hand: func(m *ice.Message, arg ...string) { + m.EchoInfoButton(kit.JoinWord(m.PrefixKey(), "save token for", m.Option(name)), mdb.DEV_CREATE) + }}, + mdb.DEV_CREATE: {Help: "创建", Hand: func(m *ice.Message, arg ...string) { + if !m.Warn(m.Option(ice.MSG_METHOD) != http.MethodPost, ice.ErrNotAllow) { + defer kit.If(m.Option(cli.DAEMON), func(p string) { m.Cmd(SPACE, p, html.REFRESH) }) + mdb.HashModify(m, m.OptionSimple(name, TOKEN)) + m.Cmd("", "dev.create.token") + m.ProcessClose() + } + }}, + } +}