diff --git a/base/web/serve.go b/base/web/serve.go index 407b89b7..5d6e6211 100644 --- a/base/web/serve.go +++ b/base/web/serve.go @@ -134,15 +134,7 @@ func _serve_handle(key string, cmd *ice.Command, m *ice.Message, w http.Response m.Options(ice.MSG_USERUA, r.Header.Get(html.UserAgent), ice.MSG_USERIP, r.Header.Get(ice.MSG_USERIP)) m.Options(ice.MSG_SESSID, kit.Select(m.Option(ice.MSG_SESSID), m.Option(CookieName(m.Option(ice.MSG_USERWEB))))) kit.If(m.Optionv(ice.MSG_CMDS) == nil, func() { - kit.If(strings.TrimPrefix(r.URL.Path, key), func(p string) { - arg := strings.Split(p, nfs.PS) - for i, v := range arg { - if p, err := url.PathUnescape(v); err == nil { - arg[i] = p - } - } - m.Optionv(ice.MSG_CMDS, arg) - }) + kit.If(strings.TrimPrefix(r.URL.Path, key), func(p string) { m.Optionv(ice.MSG_CMDS, strings.Split(p, nfs.PS)) }) }) UserHost(m) m.W.Header().Add(strings.ReplaceAll(ice.LOG_TRACEID, ".", "-"), m.Option(ice.LOG_TRACEID)) diff --git a/base/web/spide.go b/base/web/spide.go index 1d039459..bf05e64d 100644 --- a/base/web/spide.go +++ b/base/web/spide.go @@ -47,13 +47,14 @@ func _spide_show(m *ice.Message, name string, arg ...string) { method = kit.Select(http.MethodGet, msg.Append(CLIENT_METHOD), method) uri, arg := arg[0], arg[1:] body, head, arg := _spide_body(m, method, arg...) - if m.Option("_break") == ice.TRUE { + if m.Option("spide.break") == ice.TRUE { return } if c, ok := body.(io.Closer); ok { defer c.Close() } - req, e := http.NewRequest(method, kit.MergeURL2(msg.Append(CLIENT_URL), uri, arg), body) + _uri := kit.MergeURL2(msg.Append(CLIENT_URL), uri, arg) + req, e := http.NewRequest(method, _uri, body) if m.Warn(e, ice.ErrNotValid, uri) { return } @@ -146,10 +147,10 @@ func _spide_part(m *ice.Message, arg ...string) (string, io.Reader) { p := arg[i+1][1:] if s, e := nfs.StatFile(m, p); !m.Warn(e, ice.ErrNotValid) { if s.Size() == size && s.ModTime().Before(cache) { - m.Option("_break", ice.TRUE) + m.Option("spide.break", ice.TRUE) continue } else if s.Size() == size && !nfs.Exists(m.Spawn(kit.Dict(ice.MSG_FILES, nfs.DiskFile)), p) { - m.Option("_break", ice.TRUE) + m.Option("spide.break", ice.TRUE) continue } m.Logs(nfs.FIND, LOCAL, s.ModTime(), nfs.SIZE, s.Size(), CACHE, cache, nfs.SIZE, size) diff --git a/misc.go b/misc.go index 60fddaf5..5c55a5b8 100644 --- a/misc.go +++ b/misc.go @@ -159,3 +159,11 @@ func (m *Message) CmdMap(arg ...string) map[string]map[string]string { func (m *Message) Toast(content string, arg ...string) { // title duration Info.PushNotice(m, "toast", content, arg) } +func (m *Message) Trans(en string, zh string) string { + switch strings.ToLower(kit.Split(m.Option(MSG_LANGUAGE), "_-")[0]) { + case "zh": + return zh + default: + return en + } +} diff --git a/misc/ssh/relay/relay.go b/misc/ssh/relay/relay.go index 53f6a7ab..d9287745 100644 --- a/misc/ssh/relay/relay.go +++ b/misc/ssh/relay/relay.go @@ -1,6 +1,8 @@ package relay import ( + "net/http" + "net/url" "os" "path" "strings" @@ -245,7 +247,7 @@ func (s relay) List(m *ice.Message, arg ...string) *ice.Message { return } m.Push(web.LINK, web.HostPort(m.Message, value[tcp.HOST], value[web.PORTAL])) - m.PushButton(s.Admin, s.Dream, s.Vimer, s.AdminCmd, s.Upgrade, s.Pushbin, s.Xterm, s.Remove) + m.PushButton(s.Admin, s.Dream, s.Vimer, s.AdminCmd, s.Login, s.Upgrade, s.Pushbin, s.Xterm, s.Remove) kit.If(len(arg) > 0, func() { m.PushQRCode(cli.QRCODE, m.Append(web.LINK)) }) }) _stats := kit.Dict(MEM, kit.FmtSize(stats[MEM_FREE], stats[MEM_TOTAL]), DISK, kit.FmtSize(stats[DISK_USED], stats[DISK_TOTAL])) @@ -284,6 +286,23 @@ func (s relay) Pushbin(m *ice.Message, arg ...string) { s.shell(m, m.Template(PUSHBIN_SH), arg...) s.Modify(m, kit.Simple(m.OptionSimple(MACHINE, web.DREAM))...) } +func (s relay) Login(m *ice.Message, arg ...string) { + if m.Options(s.Hash.List(m.Spawn(), m.Option(MACHINE)).AppendSimple()); m.Option(ice.BACK) == "" { + defer web.ToastProcess(m.Message)() + ssh.CombinedOutput(m.Message, s.admins(m, kit.JoinCmds(web.CHAT_HEADER, mdb.CREATE, + "--", mdb.TYPE, "oauth", mdb.NAME, m.CommandKey(), mdb.ICONS, "usr/icons/ssh.png", mdb.ORDER, "100", + web.LINK, m.MergePodCmd("", "", ctx.ACTION, m.ActionKey(), MACHINE, m.Option(MACHINE)), + )), func(res string) { m.ProcessHold() }) + m.ProcessOpen(kit.MergeURL2(m.Option(mdb.LINK), web.C(web.CHAT_HEADER))) + } else if m.Option(ice.MSG_METHOD) == http.MethodGet { + m.EchoInfoButton(kit.JoinLine(m.Trans("please confirm login", "请确认登录"), m.Option(ice.BACK)), m.ActionKey()) + } else { + defer web.ToastProcess(m.Message)() + ssh.CombinedOutput(m.Message, s.admins(m, kit.JoinCmds(web.SHARE, mdb.CREATE, mdb.TYPE, aaa.LOGIN, "--", mdb.TEXT, m.Option(ice.BACK))), func(res string) { + m.ProcessReplace(MergeURL2(m, m.Option(ice.BACK), "/share/"+strings.TrimSpace(res))) + }) + } +} func (s relay) Install(m *ice.Message, arg ...string) { m.Options(web.DOMAIN, "https://shylinux.com", ice.MSG_USERPOD, m.Option(web.DREAM)) m.Options(nfs.SOURCE, kit.Value(kit.UnMarshal(web.AdminCmd(m.Message, cli.RUNTIME)), "make.remote")) @@ -368,3 +387,20 @@ func (s relay) admin(m *ice.Message, arg ...string) string { func (s relay) admins(m *ice.Message, arg ...string) string { return kit.Select(ice.CONTEXTS, m.Option(web.DREAM)) + nfs.PS + s.admin(m, arg...) } +func MergeURL2(m *ice.Message, str string, uri string, arg ...ice.Any) string { + raw, err := url.Parse(str) + m.Debug("what %v", err) + if err != nil { + return kit.MergeURL(uri, arg...) + } + get, err := url.Parse(uri) + m.Debug("what %v", err) + if err != nil { + return kit.MergeURL(str, arg...) + } + p := get.Path + m.Debug("what %v", p) + kit.If(!strings.HasPrefix(p, nfs.PS), func() { p = path.Join(raw.Path, get.Path) }) + kit.If(p == nfs.PS, func() { p = "" }) + return kit.MergeURL(kit.Select(raw.Scheme, get.Scheme)+"://"+kit.Select(raw.Host, get.Host)+p+"?"+kit.Select(raw.RawQuery, get.RawQuery), arg...) +}