1
0
forked from x/icebergs

add m.Right

This commit is contained in:
shaoying 2019-12-28 18:07:12 +08:00
parent bfb8c9adcd
commit ef5b8d7890
6 changed files with 142 additions and 46 deletions

View File

@ -3,18 +3,23 @@ package aaa
import ( import (
"github.com/shylinux/icebergs" "github.com/shylinux/icebergs"
"github.com/shylinux/toolkits" "github.com/shylinux/toolkits"
"strings"
) )
var Index = &ice.Context{Name: "aaa", Help: "认证模块", var Index = &ice.Context{Name: "aaa", Help: "认证模块",
Caches: map[string]*ice.Cache{}, Caches: map[string]*ice.Cache{},
Configs: map[string]*ice.Config{ Configs: map[string]*ice.Config{
ice.AAA_ROLE: {Name: "role", Help: "角色", Value: kit.Data()}, ice.AAA_ROLE: {Name: "role", Help: "角色", Value: kit.Data(kit.MDB_SHORT, "chain")},
ice.AAA_USER: {Name: "user", Help: "用户", Value: kit.Data(kit.MDB_SHORT, "username")}, 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")}, ice.AAA_SESS: {Name: "sess", Help: "会话", Value: kit.Data(kit.MDB_SHORT, "uniq", "expire", "720h")},
}, },
Commands: map[string]*ice.Command{ Commands: map[string]*ice.Command{
ice.ICE_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { ice.ICE_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Cmd(ice.CTX_CONFIG, "load", "aaa.json") m.Cmd(ice.CTX_CONFIG, "load", "aaa.json")
m.Conf(ice.AAA_ROLE, "black.tech.meta.short", "chain")
m.Conf(ice.AAA_ROLE, "white.tech.meta.short", "chain")
m.Conf(ice.AAA_ROLE, "black.void.meta.short", "chain")
m.Conf(ice.AAA_ROLE, "white.void.meta.short", "chain")
}}, }},
ice.ICE_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { ice.ICE_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Cmd(ice.CTX_CONFIG, "save", "aaa.json", ice.AAA_ROLE, ice.AAA_USER, ice.AAA_SESS) m.Cmd(ice.CTX_CONFIG, "save", "aaa.json", ice.AAA_ROLE, ice.AAA_USER, ice.AAA_SESS)
@ -23,6 +28,58 @@ var Index = &ice.Context{Name: "aaa", Help: "认证模块",
switch arg[0] { switch arg[0] {
case "check": case "check":
m.Echo(kit.Select("void", "root", arg[1] == m.Conf(ice.CLI_RUNTIME, "boot.username"))) m.Echo(kit.Select("void", "root", arg[1] == m.Conf(ice.CLI_RUNTIME, "boot.username")))
case "black", "white":
m.Rich(ice.AAA_ROLE, kit.Keys(arg[0], arg[1]), kit.Dict(
"chain", kit.Keys(arg[3:]),
"status", arg[2],
))
case "right":
if m.Option(ice.MSG_USERROLE) == ice.ROLE_ROOT {
// 超级用户
m.Echo("ok")
break
}
ok := true
keys := strings.Split(kit.Keys(arg[2:]), ".")
for i := 0; i < len(keys); i++ {
if !ok {
break
}
// 黑名单
m.Richs(ice.AAA_ROLE, kit.Keys("black", arg[1]), kit.Keys(keys[:i+1]), func(key string, value map[string]interface{}) {
ok = value["status"] != "enable"
})
}
if m.Warn(!ok, "no right %s", keys) {
break
}
if m.Option(ice.MSG_USERROLE) == ice.ROLE_TECH {
// 管理用户
m.Echo("ok")
break
}
ok = false
keys = strings.Split(kit.Keys(arg[2:]), ".")
m.Info("keys: %s", keys)
for i := 0; i < len(keys); i++ {
if ok {
break
}
// 白名单
m.Richs(ice.AAA_ROLE, kit.Keys("white", arg[1]), kit.Keys(keys[:i+1]), func(key string, value map[string]interface{}) {
m.Info("value: %s", value)
ok = value["status"] == "enable"
})
}
if m.Warn(!ok, "no right %s", keys) {
break
}
// 普通用户
m.Echo("ok")
} }
}}, }},
ice.AAA_USER: {Name: "user", Help: "用户", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { ice.AAA_USER: {Name: "user", Help: "用户", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
@ -37,6 +94,7 @@ var Index = &ice.Context{Name: "aaa", Help: "认证模块",
)) ))
user = m.Richs(ice.AAA_USER, nil, arg[1], nil) user = m.Richs(ice.AAA_USER, nil, arg[1], nil)
m.Info("create user: %s %s", arg[1], kit.Format(user)) m.Info("create user: %s %s", arg[1], kit.Format(user))
m.Event(ice.USER_CREATE, arg[1])
} else if kit.Format(user["password"]) != arg[2] { } else if kit.Format(user["password"]) != arg[2] {
m.Info("login fail user: %s", arg[1]) m.Info("login fail user: %s", arg[1])
break break

View File

@ -39,6 +39,9 @@ var Index = &ice.Context{Name: "cli", Help: "命令模块",
} }
m.Conf(ice.CLI_RUNTIME, "boot.time", m.Time()) m.Conf(ice.CLI_RUNTIME, "boot.time", m.Time())
count := m.Confi(ice.CLI_RUNTIME, "boot.count") + 1
m.Conf(ice.CLI_RUNTIME, "boot.count", count)
m.Conf(ice.CLI_RUNTIME, "node.type", kit.MIME_WORKER) m.Conf(ice.CLI_RUNTIME, "node.type", kit.MIME_WORKER)
m.Conf(ice.CLI_RUNTIME, "node.name", m.Conf(ice.CLI_RUNTIME, "boot.pathname")) m.Conf(ice.CLI_RUNTIME, "node.name", m.Conf(ice.CLI_RUNTIME, "boot.pathname"))
m.Log("info", "runtime %v", kit.Formats(m.Confv(ice.CLI_RUNTIME))) m.Log("info", "runtime %v", kit.Formats(m.Confv(ice.CLI_RUNTIME)))

View File

@ -573,6 +573,9 @@ var Index = &ice.Context{Name: "web", Help: "网页模块",
if _, e := os.Stat("usr/volcanos"); e != nil { if _, e := os.Stat("usr/volcanos"); e != nil {
m.Cmd("cli.system", "git", "clone", "https://github.com/shylinux/volcanos", "usr/volcanos") m.Cmd("cli.system", "git", "clone", "https://github.com/shylinux/volcanos", "usr/volcanos")
} }
if m.Conf(ice.CLI_RUNTIME, "boot.count") == "1" {
m.Event(ice.SYSTEM_INIT)
}
m.Target().Start(m, kit.Select("self", arg, 0)) m.Target().Start(m, kit.Select("self", arg, 0))
}}, }},
ice.WEB_SPACE: {Name: "space", Help: "空间站", Meta: kit.Dict("exports", []string{"pod", "name"}), List: kit.List( ice.WEB_SPACE: {Name: "space", Help: "空间站", Meta: kit.Dict("exports", []string{"pod", "name"}), List: kit.List(
@ -686,8 +689,11 @@ var Index = &ice.Context{Name: "web", Help: "网页模块",
), List: kit.List( ), List: kit.List(
kit.MDB_INPUT, "text", "value", "", "name", "name", kit.MDB_INPUT, "text", "value", "", "name", "name",
kit.MDB_INPUT, "button", "value", "创建", "action", "auto", kit.MDB_INPUT, "button", "value", "创建", "action", "auto",
), Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) { ), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) > 1 { if len(arg) > 1 {
if !m.Right(cmd, arg[1]) {
return
}
switch arg[1] { switch arg[1] {
case "启动": case "启动":
arg = arg[:1] arg = arg[:1]

View File

@ -81,12 +81,16 @@ const ( // GDB
GDB_TIMER = "timer" GDB_TIMER = "timer"
GDB_EVENT = "event" GDB_EVENT = "event"
SYSTEM_INIT = "system.init"
SERVE_START = "serve.start" SERVE_START = "serve.start"
SERVE_CLOSE = "serve.close" SERVE_CLOSE = "serve.close"
SPACE_START = "space.start" SPACE_START = "space.start"
SPACE_CLOSE = "space.close" SPACE_CLOSE = "space.close"
DREAM_START = "dream.start" DREAM_START = "dream.start"
DREAM_CLOSE = "dream.close" DREAM_CLOSE = "dream.close"
USER_CREATE = "user.create"
) )
const ( // MDB const ( // MDB
MDB_REDIS = "redis" MDB_REDIS = "redis"
@ -106,6 +110,11 @@ const ( // APP
APP_NOTE = "note" APP_NOTE = "note"
APP_MISS = "miss" APP_MISS = "miss"
) )
const ( // ROLE
ROLE_ROOT = "root"
ROLE_TECH = "tech"
ROLE_VOID = "void"
)
const ( // CHAT const ( // CHAT
CHAT_RIVER = "river" CHAT_RIVER = "river"
) )

View File

@ -15,18 +15,34 @@ var Index = &ice.Context{Name: "chat", Help: "聊天模块",
Commands: map[string]*ice.Command{ Commands: map[string]*ice.Command{
ice.ICE_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { ice.ICE_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Cmd(ice.CTX_CONFIG, "load", "chat.json") m.Cmd(ice.CTX_CONFIG, "load", "chat.json")
if m.Richs(ice.WEB_FAVOR, nil, ice.FAVOR_RIVER, nil) == nil {
// 群组模板 if m.Conf(ice.CLI_RUNTIME, "boot.count") == "1" {
m.Cmd(ice.WEB_FAVOR, ice.FAVOR_RIVER, "river", "meet", "root") // 系统群组
m.Cmd(ice.WEB_FAVOR, ice.FAVOR_RIVER, "user", m.Conf(ice.CLI_RUNTIME, "boot.username"), "root") m.Option(ice.MSG_USERNAME, m.Conf(ice.CLI_RUNTIME, "boot.username"))
m.Cmd(ice.WEB_FAVOR, ice.FAVOR_RIVER, "storm", "miss", "root") m.Option(ice.MSG_USERROLE, ice.ROLE_ROOT)
m.Cmd(ice.WEB_FAVOR, ice.FAVOR_RIVER, "action", "spide", "root") river := m.Cmdx("web.chat./ocean", "spawn", "meet", m.Conf(ice.CLI_RUNTIME, "boot.username"))
m.Cmd(ice.WEB_FAVOR, ice.FAVOR_RIVER, "action", "space", "root") river = m.Cmdx("web.chat./steam", river, "spawn", "miss",
m.Cmd(ice.WEB_FAVOR, ice.FAVOR_RIVER, "action", "dream", "root") "", "", "spide", "",
m.Cmd(ice.WEB_FAVOR, ice.FAVOR_RIVER, "action", "favor", "root") "", "", "space", "",
m.Cmd(ice.WEB_FAVOR, ice.FAVOR_RIVER, "action", "story", "root") "", "", "dream", "",
m.Cmd(ice.WEB_FAVOR, ice.FAVOR_RIVER, "action", "share", "root") "", "", "favor", "",
"", "", "story", "",
"", "", "share", "",
)
// 用户权限
m.Cmd(ice.AAA_ROLE, "white", ice.ROLE_VOID, "enable", "/river")
m.Cmd(ice.AAA_ROLE, "white", ice.ROLE_VOID, "enable", "/storm")
m.Cmd(ice.AAA_ROLE, "black", ice.ROLE_VOID, "enable", "/storm", "rename")
m.Cmd(ice.AAA_ROLE, "black", ice.ROLE_VOID, "enable", "/storm", "remove")
m.Cmd(ice.AAA_ROLE, "white", ice.ROLE_VOID, "enable", "/action")
m.Cmd(ice.AAA_ROLE, "white", ice.ROLE_VOID, "enable", "dream")
m.Cmd(ice.AAA_ROLE, "black", ice.ROLE_VOID, "enable", "dream.停止")
} }
// 用户群组
m.Watch(ice.USER_CREATE, "web.chat./ocean", "spawn", "")
}}, }},
ice.ICE_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { ice.ICE_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Cmd(ice.CTX_CONFIG, "save", "chat.json", ice.CHAT_RIVER) m.Cmd(ice.CTX_CONFIG, "save", "chat.json", ice.CHAT_RIVER)
@ -39,28 +55,9 @@ var Index = &ice.Context{Name: "chat", Help: "聊天模块",
// 用户登录 // 用户登录
m.Option(ice.MSG_SESSID, web.Cookie(m, m.Cmdx(ice.AAA_USER, "login", m.Option(ice.MSG_USERNAME, arg[1]), arg[2]))) m.Option(ice.MSG_SESSID, web.Cookie(m, m.Cmdx(ice.AAA_USER, "login", m.Option(ice.MSG_USERNAME, arg[1]), arg[2])))
default: default:
// 默认群组
if m.Richs(ice.CHAT_RIVER, nil, "%", nil) == nil {
m.Richs(ice.WEB_FAVOR, nil, ice.FAVOR_RIVER, func(key string, value map[string]interface{}) {
m.Grows(ice.WEB_FAVOR, kit.Keys(kit.MDB_HASH, key), "", "", func(index int, value map[string]interface{}) {
switch kit.Format(value["type"]) {
case ice.TYPE_RIVER:
m.Option("river", m.Cmdx("/ocean", "spawn", value["name"]))
case "user":
m.Cmd("/river", m.Option("river"), "add", value["name"])
case ice.TYPE_STORM:
m.Option("storm", m.Cmdx("/steam", m.Option("river"), "spawn", value["name"]))
case "action":
m.Cmd("/storm", m.Option("river"), m.Option("storm"), "add", m.Conf(ice.CLI_RUNTIME, "node.name"), "", value["name"], value["text"])
}
})
})
}
// 用户群组 // 用户群组
m.Richs(ice.CHAT_RIVER, nil, arg[0], func(value map[string]interface{}) { m.Richs(ice.CHAT_RIVER, nil, arg[0], func(value map[string]interface{}) {
m.Option(ice.MSG_RIVER, arg[0]) if m.Option(ice.MSG_RIVER, arg[0]); len(arg) > 1 {
if len(arg) > 1 {
m.Richs(ice.CHAT_RIVER, kit.Keys(kit.MDB_HASH, arg[0], "tool"), arg[1], func(value map[string]interface{}) { m.Richs(ice.CHAT_RIVER, kit.Keys(kit.MDB_HASH, arg[0], "tool"), arg[1], func(value map[string]interface{}) {
m.Option(ice.MSG_STORM, arg[1]) m.Option(ice.MSG_STORM, arg[1])
}) })
@ -69,13 +66,17 @@ var Index = &ice.Context{Name: "chat", Help: "聊天模块",
}) })
} }
} }
if cmd == "/login" { if m.Option(ice.MSG_USERURL) == "/login" {
return return
} }
// 登录检查 // 登录检查
if m.Warn(!m.Options(ice.MSG_SESSID) || !m.Options(ice.MSG_USERNAME), "not login") { if m.Warn(!m.Options(ice.MSG_SESSID) || !m.Options(ice.MSG_USERNAME), "not login") {
m.Option("url", "") m.Option(ice.MSG_USERURL, "")
}
// 权限检查
if !m.Right(m.Option(ice.MSG_USERURL), m.Optionv("cmds")) {
m.Option(ice.MSG_USERURL, "")
} }
}}, }},
@ -112,7 +113,11 @@ var Index = &ice.Context{Name: "chat", Help: "聊天模块",
switch arg[0] { switch arg[0] {
case "spawn": case "spawn":
// 创建群组 // 创建群组
river := m.Rich(ice.CHAT_RIVER, nil, kit.Data(kit.MDB_NAME, arg[1])) river := m.Rich(ice.CHAT_RIVER, nil, kit.Dict(
kit.MDB_META, kit.Dict(kit.MDB_NAME, kit.Select(arg[2]+"@"+m.Conf(ice.CLI_RUNTIME, "boot.hostname"), arg[1])),
"user", kit.Data(kit.MDB_SHORT, "username"),
"tool", kit.Data(),
))
m.Info("create river: %v name: %v", river, arg[1]) m.Info("create river: %v name: %v", river, arg[1])
m.Cmd("/river", river, "add", arg[2:]) m.Cmd("/river", river, "add", arg[2:])
m.Echo(river) m.Echo(river)
@ -123,7 +128,9 @@ var Index = &ice.Context{Name: "chat", Help: "聊天模块",
case 0: case 0:
// 群组列表 // 群组列表
m.Richs(ice.CHAT_RIVER, nil, "*", func(key string, value map[string]interface{}) { m.Richs(ice.CHAT_RIVER, nil, "*", func(key string, value map[string]interface{}) {
m.Push(key, value["meta"], []string{kit.MDB_KEY, kit.MDB_NAME}) m.Richs(ice.CHAT_RIVER, kit.Keys(kit.MDB_HASH, key, "user"), m.Option(ice.MSG_USERNAME), func(k string, val map[string]interface{}) {
m.Push(key, value["meta"], []string{kit.MDB_KEY, kit.MDB_NAME})
})
}) })
case 1: case 1:
// 群组详情 // 群组详情
@ -133,6 +140,7 @@ var Index = &ice.Context{Name: "chat", Help: "聊天模块",
default: default:
switch arg[1] { switch arg[1] {
case "add": case "add":
m.Rich(ice.CHAT_RIVER, kit.Keys(kit.MDB_HASH, arg[0], "user"), kit.Data("username", m.Conf(ice.CLI_RUNTIME, "boot.username")))
// 添加用户 // 添加用户
for _, v := range arg[2:] { for _, v := range arg[2:] {
user := m.Rich(ice.CHAT_RIVER, kit.Keys(kit.MDB_HASH, arg[0], "user"), kit.Data("username", v)) user := m.Rich(ice.CHAT_RIVER, kit.Keys(kit.MDB_HASH, arg[0], "user"), kit.Data("username", v))
@ -152,6 +160,9 @@ var Index = &ice.Context{Name: "chat", Help: "聊天模块",
return return
} }
if !m.Right(cmd, arg[2]) {
return
}
switch arg[2] { switch arg[2] {
case "add": case "add":
// 添加命令 // 添加命令
@ -187,7 +198,9 @@ var Index = &ice.Context{Name: "chat", Help: "聊天模块",
switch arg[1] { switch arg[1] {
case "spawn": case "spawn":
// 创建应用 // 创建应用
storm := m.Rich(ice.CHAT_RIVER, kit.Keys(kit.MDB_HASH, arg[0], "tool"), kit.Data(kit.MDB_NAME, arg[2])) storm := m.Rich(ice.CHAT_RIVER, kit.Keys(kit.MDB_HASH, arg[0], "tool"), kit.Dict(
kit.MDB_META, kit.Dict(kit.MDB_NAME, arg[2]),
))
m.Info("create river: %s storm: %s name: %v", arg[0], storm, arg[2]) m.Info("create river: %s storm: %s name: %v", arg[0], storm, arg[2])
m.Cmd("/storm", arg[0], storm, "add", arg[3:]) m.Cmd("/storm", arg[0], storm, "add", arg[3:])
m.Echo(storm) m.Echo(storm)
@ -213,7 +226,7 @@ var Index = &ice.Context{Name: "chat", Help: "聊天模块",
m.Push("group", meta["ctx"]) m.Push("group", meta["ctx"])
m.Push("index", meta["cmd"]) m.Push("index", meta["cmd"])
msg := m.Cmd(ice.WEB_SPACE, meta["pod"], ice.CTX_COMMAND, meta["ctx"], meta["cmd"]) msg := m.Cmd(m.Space(meta["pod"]), ice.CTX_COMMAND, meta["ctx"], meta["cmd"])
m.Push("name", meta["cmd"]) m.Push("name", meta["cmd"])
m.Push("help", msg.Append("help")) m.Push("help", msg.Append("help"))
m.Push("inputs", msg.Append("list")) m.Push("inputs", msg.Append("list"))
@ -227,16 +240,14 @@ var Index = &ice.Context{Name: "chat", Help: "聊天模块",
cmds := []string{} cmds := []string{}
m.Grows(ice.CHAT_RIVER, prefix, kit.MDB_ID, kit.Format(kit.Int(arg[2])+1), func(index int, value map[string]interface{}) { m.Grows(ice.CHAT_RIVER, prefix, kit.MDB_ID, kit.Format(kit.Int(arg[2])+1), func(index int, value map[string]interface{}) {
if meta, ok := kit.Value(value, "meta").(map[string]interface{}); ok { if meta, ok := kit.Value(value, "meta").(map[string]interface{}); ok {
if kit.Format(meta["pod"]) == m.Conf(ice.CLI_RUNTIME, "node.name") { cmds = kit.Simple(m.Space(meta["pod"]), kit.Keys(meta["ctx"], meta["cmd"]), arg[3:])
cmds = kit.Simple(kit.Keys(meta["ctx"], meta["cmd"]), arg[3:])
} else {
cmds = kit.Simple(ice.WEB_SPACE, meta["pod"], kit.Keys(meta["ctx"], meta["cmd"]), arg[3:])
}
} }
}) })
// 执行命令 // 执行命令
m.Cmdy(cmds).Option("cmds", cmds) if m.Right(cmds) {
m.Cmdy(cmds).Option("cmds", cmds)
}
}}, }},
}, },
} }

11
type.go
View File

@ -78,7 +78,7 @@ func (c *Context) Server() Server {
} }
func (c *Context) Run(m *Message, cmd *Command, key string, arg ...string) *Message { func (c *Context) Run(m *Message, cmd *Command, key string, arg ...string) *Message {
m.Hand = true m.Hand = true
m.Log(LOG_CMDS, "%s.%s %v", c.Name, key, arg) m.Log(LOG_CMDS, "%s.%s %d %v", c.Name, key, len(arg), arg)
cmd.Hand(m, c, key, arg...) cmd.Hand(m, c, key, arg...)
return m return m
} }
@ -655,6 +655,15 @@ func (m *Message) Trace(key string, str string, arg ...interface{}) *Message {
return m return m
} }
func (m *Message) Space(arg interface{}) []string {
if arg == nil || kit.Format(arg) == m.Conf(CLI_RUNTIME, "node.name") {
return nil
}
return []string{WEB_SPACE, kit.Format(arg)}
}
func (m *Message) Right(arg ...interface{}) bool {
return !m.Warn(m.Cmdx(AAA_ROLE, "right", m.Option(MSG_USERROLE), kit.Keys(arg...)) != "ok", "no right")
}
func (m *Message) Event(key string, arg ...string) *Message { func (m *Message) Event(key string, arg ...string) *Message {
m.Cmd(GDB_EVENT, "action", key, arg) m.Cmd(GDB_EVENT, "action", key, arg)
return m return m