diff --git a/base/aaa/offer.go b/base/aaa/offer.go index 1977f20a..3e96d962 100644 --- a/base/aaa/offer.go +++ b/base/aaa/offer.go @@ -32,8 +32,9 @@ func init() { } msg := mdb.HashSelect(m.Spawn(), m.Option(mdb.HASH)) if ls := kit.Split(msg.Append(EMAIL), mdb.AT); !m.Warn(msg.Length() == 0 || len(ls) < 2, ice.ErrNotValid, m.Option(mdb.HASH)) { - m.Cmd(USER, mdb.CREATE, USERNICK, ls[0], USERNAME, msg.Append(EMAIL), USERZONE, ls[1]) - m.ProcessLocation(m.MergeLink(ice.PS, ice.MSG_SESSID, SessValid(m.Options(ice.MSG_USERNAME, msg.Append(EMAIL))), mdb.HASH, "")) + ice.Info.AdminCmd(m.Spawn(), USER, mdb.CREATE, USERNICK, ls[0], USERNAME, msg.Append(EMAIL), USERZONE, ls[1]) + // m.Cmd(USER, mdb.CREATE, USERNICK, ls[0], USERNAME, msg.Append(EMAIL), USERZONE, ls[1]) + m.ProcessLocation(m.MergePod("", ice.MSG_SESSID, SessValid(m.Options(ice.MSG_USERNAME, msg.Append(EMAIL))))) mdb.HashModify(m, m.OptionSimple(mdb.HASH), mdb.STATUS, ACCEPT) } }}, diff --git a/base/aaa/sess.go b/base/aaa/sess.go index b6468f0b..0350243a 100644 --- a/base/aaa/sess.go +++ b/base/aaa/sess.go @@ -53,8 +53,8 @@ func SessCheck(m *ice.Message, sessid string) bool { return sessid != "" && m.Cmdy(SESS, CHECK, sessid, logs.FileLineMeta(-1)).Option(ice.MSG_USERNAME) != "" } func SessValid(m *ice.Message) string { - if m.Option(ice.MSG_SESSID) == "" || m.Cmd(SESS, m.Option(ice.MSG_SESSID)).Length() == 0 { - return m.Option(ice.MSG_SESSID, SessCreate(m, m.Option(ice.MSG_USERNAME))) + if m.Option(ice.MSG_SESSID) == "" || ice.Info.AdminCmd(m.Spawn(), SESS, m.Option(ice.MSG_SESSID)).Length() == 0 { + return m.Option(ice.MSG_SESSID, ice.Info.AdminCmd(m.Spawn(), SESS, mdb.CREATE, m.Option(ice.MSG_USERNAME)).Result()) } return m.Option(ice.MSG_SESSID) } diff --git a/base/mdb/hash.go b/base/mdb/hash.go index 051f8b68..c55f0d66 100644 --- a/base/mdb/hash.go +++ b/base/mdb/hash.go @@ -205,14 +205,15 @@ func DevDataAction(fields ...string) ice.Actions { ) return ice.Actions{ DEV_REQUEST: {Name: "request origin*", Help: "请求", Hand: func(m *ice.Message, arg ...string) { - m.ProcessOpen(m.Options(ice.MSG_USERWEB, m.Option(ORIGIN)).MergePodCmd("", m.PrefixKey(), ACTION, DEV_CHOOSE, BACK, m.Option(ice.MSG_USERHOST), DAEMON, m.Option(ice.MSG_DAEMON))) + back := m.Options(ice.MSG_USERWEB, m.Option(ice.MSG_USERHOST)).MergePod("") + m.ProcessOpen(m.Options(ice.MSG_USERWEB, m.Option(ORIGIN), ice.MSG_USERPOD, "").MergePodCmd("", m.PrefixKey(), ACTION, DEV_CHOOSE, BACK, back, DAEMON, m.Option(ice.MSG_DAEMON))) }}, DEV_CHOOSE: {Hand: func(m *ice.Message, arg ...string) { HashSelect(m.Options(ice.MSG_FIELDS, kit.Join(fields))).PushAction(DEV_RESPONSE).Options(ice.MSG_ACTION, "") }}, 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(BACK)).MergePodCmd("", m.PrefixKey(), ACTION, DEV_CONFIRM, m.OptionSimple(DAEMON), m.OptionSimple(fields...))) + m.ProcessReplace(m.ParseLink(m.Option(BACK)).MergePodCmd("", m.PrefixKey(), ACTION, DEV_CONFIRM, m.OptionSimple(DAEMON), m.OptionSimple(fields...))) } }}, DEV_CONFIRM: {Hand: func(m *ice.Message, arg ...string) { diff --git a/base/web/space.go b/base/web/space.go index 3d5c2b71..16ce1bc0 100644 --- a/base/web/space.go +++ b/base/web/space.go @@ -262,6 +262,13 @@ const ( const SPACE = "space" func init() { + ice.Info.AdminCmd = func(m *ice.Message, cmd string, arg ...string) *ice.Message { + if ice.Info.NodeType == WORKER { + return m.Cmdy(SPIDE, ice.OPS, SPIDE_RAW, http.MethodGet, path.Join(C(cmd), path.Join(arg...))) + } else { + return m.Cmdy(cmd, arg) + } + } ice.Info.Inputs = append(ice.Info.Inputs, func(m *ice.Message, arg ...string) { switch kit.TrimPrefix(arg[0], "extra.") { case DREAM: diff --git a/base/web/token.go b/base/web/token.go index 5a107031..34a0adb7 100644 --- a/base/web/token.go +++ b/base/web/token.go @@ -30,8 +30,9 @@ func DevTokenAction(name, origin string) ice.Actions { DEV_REQUEST_TEXT: {Hand: func(m *ice.Message, arg ...string) { m.Echo(UserHost(m)) }}, DEV_CREATE_TOKEN: {Hand: func(m *ice.Message, arg ...string) {}}, mdb.DEV_REQUEST: {Name: "dev.request", Help: "连接", Icon: "bi bi-person-down", Hand: func(m *ice.Message, arg ...string) { + back := m.Options(ice.MSG_USERWEB, m.Option(ice.MSG_USERHOST)).MergePod("") m.ProcessOpen(m.Options(ice.MSG_USERWEB, m.Option(origin), ice.MSG_USERPOD, "").MergePodCmd("", m.PrefixKey(), - ctx.ACTION, mdb.DEV_CHOOSE, cli.BACK, m.Option(ice.MSG_USERHOST), cli.DAEMON, m.Option(ice.MSG_DAEMON), + ctx.ACTION, mdb.DEV_CHOOSE, cli.BACK, back, cli.DAEMON, m.Option(ice.MSG_DAEMON), m.OptionSimple(name), mdb.TEXT, m.Cmdx("", DEV_REQUEST_TEXT), )) }}, @@ -41,13 +42,12 @@ func DevTokenAction(name, origin string) ice.Actions { }}, 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.ProcessReplace(m.ParseLink(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(), - m.Cmdx(nfs.CAT, nfs.SRC_TEMPLATE+"web.token/savefrom.html"), m.Option(name)), mdb.DEV_CREATE) + m.EchoInfoButton(kit.JoinWord(m.PrefixKey(), m.Cmdx(nfs.CAT, nfs.SRC_TEMPLATE+"web.token/savefrom.html"), 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) { diff --git a/conf.go b/conf.go index 52826dda..6627c75a 100644 --- a/conf.go +++ b/conf.go @@ -220,25 +220,26 @@ const ( // MSG MSG_USERZONE = "user.zone" MSG_LANGUAGE = "user.lang" - MSG_BG = "sess.bg" - MSG_FG = "sess.fg" - MSG_COST = "sess.cost" - MSG_MODE = "sess.mode" - MSG_THEME = "sess.theme" - MSG_TITLE = "sess.title" - MSG_RIVER = "sess.river" - MSG_STORM = "sess.storm" - MSG_COUNT = "sess.count" - MSG_DAEMON = "sess.daemon" - MSG_REFERER = "sess.referer" - MSG_FILES = "file.system" - MSG_CHECKER = "aaa.checker" - YAC_MESSAGE = "yac.message" - YAC_STACK = "yac.stack" - SSH_ALIAS = "ssh.alias" - SSH_TARGET = "ssh.target" - LOG_DISABLE = "log.disable" - LOG_TRACEID = "log.id" + MSG_BG = "sess.bg" + MSG_FG = "sess.fg" + MSG_COST = "sess.cost" + MSG_MODE = "sess.mode" + MSG_THEME = "sess.theme" + MSG_TITLE = "sess.title" + MSG_RIVER = "sess.river" + MSG_STORM = "sess.storm" + MSG_COUNT = "sess.count" + MSG_DAEMON = "sess.daemon" + MSG_REFERER = "sess.referer" + MSG_FILES = "file.system" + MSG_CHECKER = "aaa.checker" + YAC_MESSAGE = "yac.message" + YAC_STACK = "yac.stack" + SSH_ALIAS = "ssh.alias" + SSH_TARGET = "ssh.target" + LOG_DISABLE = "log.disable" + LOG_TRACEID = "log.id" + MSG_NODETYPE = "node.type" TOAST_DURATION = "toast.duration" TABLE_CHECKBOX = "table.checkbox" diff --git a/core/chat/header.go b/core/chat/header.go index 9ce635c7..f6f505ae 100644 --- a/core/chat/header.go +++ b/core/chat/header.go @@ -111,6 +111,7 @@ func init() { } }}, }, web.ApiAction(), mdb.ImportantHashAction(mdb.SHORT, mdb.NAME, mdb.FIELD, "time,name,icons,type,link,order,space,index,args")), Hand: func(m *ice.Message, arg ...string) { + kit.If(m.Option(ice.MSG_USERPOD), func(p string) { m.Option(ice.MSG_NODETYPE, m.Cmd(web.SPACE, p, cli.RUNTIME, ice.MSG_NODETYPE)) }) m.Option("language.list", m.Cmd(nfs.DIR, nfs.TemplatePath(m, aaa.LANGUAGE)+nfs.PS, nfs.FILE).Appendv(nfs.FILE)) m.Option("theme.list", m.Cmd(nfs.DIR, nfs.TemplatePath(m, aaa.THEME)+nfs.PS, nfs.FILE).Appendv(nfs.FILE)) m.Option(nfs.REPOS, m.Cmdv(web.SPIDE, nfs.REPOS, web.CLIENT_URL)) diff --git a/info.go b/info.go index 1880d37d..81530a3b 100644 --- a/info.go +++ b/info.go @@ -83,6 +83,7 @@ var Info = struct { PushStream func(m *Message) *Message PushNotice func(m *Message, arg ...Any) Template func(m *Message, p string, data ...Any) string + AdminCmd func(m *Message, cmd string, arg ...string) *Message Save func(m *Message, key ...string) *Message Load func(m *Message, key ...string) *Message Open func(m *Message, p string) (io.ReadCloser, error) diff --git a/option.go b/option.go index bd8a6a5d..c5af83dd 100644 --- a/option.go +++ b/option.go @@ -45,6 +45,15 @@ func (m *Message) OptionCB(key string, cb ...Any) Any { return m.Optionv(kit.Keycb(kit.Select(m.CommandKey(), key))) } +func (m *Message) ParseLink(p string) *Message { + u := kit.ParseURL(p) + switch arg := strings.Split(strings.TrimPrefix(u.Path, PS), PS); arg[0] { + case "s": + m.Option(MSG_USERPOD, kit.Select("", arg, 1)) + } + m.Option(MSG_USERWEB, p) + return m +} func (m *Message) MergePod(pod string, arg ...Any) string { ls := []string{} kit.If(kit.Keys(m.Option(MSG_USERPOD), pod), func(p string) { ls = append(ls, "s", p) })