diff --git a/base/aaa/aaa.go b/base/aaa/aaa.go index 49811a16..4d938456 100644 --- a/base/aaa/aaa.go +++ b/base/aaa/aaa.go @@ -9,7 +9,7 @@ import ( var Index = &ice.Context{Name: "aaa", Help: "认证模块", Caches: map[string]*ice.Cache{}, Configs: map[string]*ice.Config{ - ice.AAA_ROLE: {Name: "role", Help: "角色", Value: kit.Data(kit.MDB_SHORT, "chain")}, + ice.AAA_ROLE: {Name: "role", Help: "角色", Value: kit.Data(kit.MDB_SHORT, "chain", "root", kit.Dict(), "tech", kit.Dict())}, ice.AAA_USER: {Name: "user", Help: "用户", Value: kit.Data(kit.MDB_SHORT, "username")}, ice.AAA_SESS: {Name: "sess", Help: "会话", Value: kit.Data(kit.MDB_SHORT, "uniq", "expire", "720h")}, }, @@ -30,7 +30,7 @@ var Index = &ice.Context{Name: "aaa", Help: "认证模块", switch arg[0] { case "check": // 用户角色 - m.Echo(kit.Select("void", "root", arg[1] == m.Conf(ice.CLI_RUNTIME, "boot.username"))) + m.Echo(kit.Select(kit.Select("void", "tech", m.Confs(ice.AAA_ROLE, kit.Keys("meta.tech", arg[1]))), "root", m.Confs(ice.AAA_ROLE, kit.Keys("meta.root", arg[1])))) case "black", "white": // 黑白名单 @@ -81,6 +81,8 @@ var Index = &ice.Context{Name: "aaa", Help: "认证模块", } // 普通用户 m.Echo("ok") + default: + m.Conf(ice.AAA_ROLE, kit.Keys("meta", arg[0], arg[1]), "true") } }}, ice.AAA_USER: {Name: "user", Help: "用户", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { @@ -120,12 +122,25 @@ var Index = &ice.Context{Name: "aaa", Help: "认证模块", } }}, ice.AAA_SESS: {Name: "sess check|login", Help: "会话", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if len(arg) == 0 { + m.Richs(ice.AAA_SESS, nil, "", func(key string, value map[string]interface{}) { + m.Push(key, value, []string{"key", "time", "username", "userrole"}) + }) + return + } + switch arg[0] { case "check": m.Richs(ice.AAA_SESS, nil, arg[1], func(value map[string]interface{}) { m.Push(arg[1], value, []string{"username", "userrole"}) m.Echo("%s", value["username"]) }) + case "create": + h := m.Rich(ice.AAA_SESS, nil, kit.Dict( + "username", arg[1], "userrole", kit.Select("", arg, 2), + )) + m.Log(ice.LOG_CREATE, "%s: %s", h, arg[1]) + m.Echo(h) } }}, }, diff --git a/base/cli/cli.go b/base/cli/cli.go index 54107fe6..e269ac65 100644 --- a/base/cli/cli.go +++ b/base/cli/cli.go @@ -40,6 +40,8 @@ var Index = &ice.Context{Name: "cli", Help: "命令模块", } if user, e := user.Current(); e == nil { m.Conf(ice.CLI_RUNTIME, "boot.username", path.Base(kit.Select(user.Name, os.Getenv("USER")))) + + m.Cmd(ice.AAA_ROLE, "root", m.Conf(ice.CLI_RUNTIME, "boot.username")) } if name, e := os.Getwd(); e == nil { m.Conf(ice.CLI_RUNTIME, "boot.pathname", path.Base(kit.Select(name, os.Getenv("PWD")))) diff --git a/base/web/web.go b/base/web/web.go index b5be51bc..41e4b8e0 100644 --- a/base/web/web.go +++ b/base/web/web.go @@ -223,6 +223,9 @@ func (web *Frame) HandleCmd(m *ice.Message, key string, cmd *ice.Command) { // 输出响应 switch msg.Append("_output") { case "void": + case "status": + w.WriteHeader(kit.Int(kit.Select("200", msg.Result()))) + case "file": msg.Info("_output: %s %s", msg.Append("_output"), msg.Append("file")) w.Header().Set("Content-Disposition", fmt.Sprintf("filename=%s", kit.Select(msg.Append("name"), msg.Append("story")))) @@ -636,6 +639,16 @@ var Index = &ice.Context{Name: "web", Help: "网页模块", web := m.Target().Server().(*Frame) switch arg[0] { + case "auth": + m.Richs(ice.WEB_SPACE, nil, arg[1], func(key string, value map[string]interface{}) { + sessid := kit.Format(kit.Value(value, "sessid")) + if value["user"] = arg[2]; sessid == "" || m.Cmdx(ice.AAA_SESS, "check", sessid) != arg[1] { + sessid = m.Cmdx(ice.AAA_SESS, "create", arg[2:]) + value["sessid"] = sessid + } + m.Cmd(ice.WEB_SPACE, arg[1], "sessid", sessid) + }) + case "share": switch arg[1] { case "add": @@ -647,18 +660,6 @@ var Index = &ice.Context{Name: "web", Help: "网页模块", }) } - case "upload": - for _, file := range arg[2:] { - msg := m.Cmd(ice.WEB_STORY, "index", file) - m.Cmdy(ice.WEB_SPIDE, arg[1], "/space/upload", "part", - "type", msg.Append("type"), "name", msg.Append("name"), - "text", msg.Append("text"), "upload", "@"+msg.Append("file"), - ) - } - case "download": - m.Cmd(ice.WEB_STORY, "add", arg[1], arg[2], - m.Cmdx(ice.WEB_SPIDE, arg[3], "cache", "/space/download/"+arg[4])) - case "connect": // 基本信息 dev := kit.Select("dev", arg, 1) @@ -1374,11 +1375,11 @@ var Index = &ice.Context{Name: "web", Help: "网页模块", } h := m.Rich(ice.WEB_SHARE, nil, kit.Dict( - kit.MDB_TYPE, arg[0], kit.MDB_NAME, arg[1], kit.MDB_TEXT, arg[2], + kit.MDB_TYPE, arg[0], kit.MDB_NAME, arg[1], kit.MDB_TEXT, kit.Select("", arg, 2), "extra", extra, )) m.Grow(ice.WEB_SHARE, nil, kit.Dict( - kit.MDB_TYPE, arg[0], kit.MDB_NAME, arg[1], kit.MDB_TEXT, arg[2], + kit.MDB_TYPE, arg[0], kit.MDB_NAME, arg[1], kit.MDB_TEXT, kit.Select("", arg, 2), "share", h, )) m.Log(ice.LOG_CREATE, "share: %s extra: %s", h, kit.Format(extra)) @@ -1429,6 +1430,10 @@ var Index = &ice.Context{Name: "web", Help: "网页模块", } } + case "active": + m.Push("_output", "qrcode") + m.Echo(kit.Format(value)) + case "qrcode": m.Push("_output", "qrcode") m.Echo("%s", value["text"]) @@ -1440,7 +1445,6 @@ var Index = &ice.Context{Name: "web", Help: "网页模块", m.Push("_output", "result") } } - }) } @@ -1515,59 +1519,13 @@ var Index = &ice.Context{Name: "web", Help: "网页模块", case "share": m.Cmdy(ice.WEB_SHARE, list[3:]) return - case "pull": - node := m.Cmd(ice.WEB_STORY, "index", list[3]).Append("list") - for i := 0; i < 10 && node != "" && node != list[4]; i++ { - m.Confm(ice.WEB_STORY, kit.Keys("hash", node), func(value map[string]interface{}) { - m.Push("list", node) - m.Push("node", kit.Format(value)) - m.Push("data", value["data"]) - m.Push("save", kit.Format(m.Confm(ice.WEB_CACHE, kit.Keys("hash", value["data"])))) - node = kit.Format(value["prev"]) - }) - } - return - case "push": - if m.Confm(ice.WEB_CACHE, kit.Keys("hash", m.Option("data"))) == nil { - // 导入缓存 - m.Log(ice.LOG_IMPORT, "%v: %v", m.Option("data"), m.Option("save")) - node := kit.UnMarshal(m.Option("save")) - m.Conf(ice.WEB_CACHE, kit.Keys("hash", m.Option("data")), node) - } - - node := kit.UnMarshal(m.Option("node")).(map[string]interface{}) - if m.Confm(ice.WEB_STORY, kit.Keys("hash", m.Option("list"))) == nil { - // 导入节点 - m.Log(ice.LOG_IMPORT, "%v: %v", m.Option("list"), m.Option("node")) - m.Conf(ice.WEB_STORY, kit.Keys("hash", m.Option("list")), node) - } - - if head := m.Richs(ice.WEB_STORY, "head", node["story"], nil); head == nil { - // 自动创建 - h := m.Rich(ice.WEB_STORY, "head", kit.Dict( - "count", node["count"], "scene", node["scene"], "story", node["story"], "list", m.Option("list"), - )) - m.Log(ice.LOG_CREATE, "%v: %v", h, node["story"]) - } else if head["list"] == kit.Format(node["prev"]) || head["list"] == kit.Format(node["pull"]) { - // 更新索引 - head["list"] = m.Option("list") - head["count"] = node["count"] - head["time"] = node["time"] - } else { - // 推送失败 - } - return - case "upload": - m.Cmdy(ice.WEB_CACHE, "upload") - return - case "download": - m.Cmdy(ice.WEB_STORY, "index", list[3]) - m.Push("_output", kit.Select("file", "result", m.Append("file") == "")) - return } if s, e := websocket.Upgrade(m.W, m.R, nil, m.Confi(ice.WEB_SPACE, "meta.buffer.r"), m.Confi(ice.WEB_SPACE, "meta.buffer.w")); m.Assert(e) { m.Option("name", strings.Replace(m.Option("name"), ".", "_", -1)) + if !m.Options("name") { + m.Option("name", kit.Hashs("uniq")) + } // 共享空间 share := m.Option("share") @@ -1580,6 +1538,7 @@ var Index = &ice.Context{Name: "web", Help: "网页模块", kit.MDB_TYPE, m.Option("node"), kit.MDB_NAME, m.Option("name"), kit.MDB_USER, m.Option("user"), + "sessid", m.Option("sessid"), "share", share, "socket", s, )) m.Log(ice.LOG_CREATE, "space: %s share: %s", m.Option(kit.MDB_NAME), share) @@ -1597,6 +1556,7 @@ var Index = &ice.Context{Name: "web", Help: "网页模块", if share != m.Option("share") { m.Cmd(ice.WEB_SPACE, m.Option("name"), ice.WEB_SPACE, "share", share) } + m.Echo(share) } }}, "/static/volcanos/plugin/github.com/": {Name: "/space/", Help: "空间站", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { diff --git a/core/chat/chat.go b/core/chat/chat.go index 3e1c34a4..93a310ba 100644 --- a/core/chat/chat.go +++ b/core/chat/chat.go @@ -97,6 +97,9 @@ var Index = &ice.Context{Name: "chat", Help: "聊天中心", "/login": {Name: "/login", Help: "登录", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { switch arg[0] { case "check": + m.Richs(ice.AAA_USER, nil, m.Option(ice.MSG_USERNAME), func(key string, value map[string]interface{}) { + m.Push("nickname", value["nickname"]) + }) m.Echo(m.Option(ice.MSG_USERNAME)) case "login": m.Echo(m.Option(ice.MSG_SESSID))