1
0
forked from x/ContextOS

opt aaa.session

This commit is contained in:
shylinux 2018-12-27 18:46:14 +08:00
parent 09d1de4b87
commit b3f37bb2a7
6 changed files with 137 additions and 125 deletions

View File

@ -1,7 +1,8 @@
source etc/exit_local.shy
~web ~web
config save web.json bench config save web.json bench
~aaa
config save session.json session
~stdio ~stdio
config save history.json history config save history.json history

View File

@ -1,5 +1,7 @@
~stdio ~stdio
config load history.json history config load history.json
~aaa
config load session.json
~web ~web
config load web.json config load web.json

View File

@ -125,7 +125,7 @@ var Index = &ctx.Context{Name: "aaa", Help: "认证中心",
return return
} }
// 会话 // 创建会话
s, t := "", "" s, t := "", ""
if len(arg) > 0 && arg[0] == "create" { if len(arg) > 0 && arg[0] == "create" {
s, t = Session(arg[1]), "session" s, t = Session(arg[1]), "session"
@ -135,16 +135,21 @@ var Index = &ctx.Context{Name: "aaa", Help: "认证中心",
"meta": arg[1], "meta": arg[1],
}) })
defer func() {
m.Set("result").Echo(s)
}()
if arg = arg[2:]; len(arg) == 0 { if arg = arg[2:]; len(arg) == 0 {
m.Echo(s)
return return
} }
} }
if v, ok := m.Confv("session", []interface{}{arg[0], "type"}).(string); ok { if v, ok := m.Confv("session", []interface{}{arg[0], "type"}).(string); ok {
s, t, arg = arg[0], v, arg[1:] s, t, arg = arg[0], v, arg[1:]
} }
if s == "" {
return
}
// 属性 // 查询会话
which := "data" which := "data"
if len(arg) > 0 { if len(arg) > 0 {
switch arg[0] { switch arg[0] {
@ -161,9 +166,10 @@ var Index = &ctx.Context{Name: "aaa", Help: "认证中心",
return return
} }
// 编辑会话
switch which { switch which {
case "data": // 数据 case "data": // 数据操作
if len(arg) == 1 { if len(arg) == 1 { // 读取数据
m.Spawn().Cmd("config", "session", strings.Join([]string{s, "data", arg[0]}, ".")).CopyTo(m) m.Spawn().Cmd("config", "session", strings.Join([]string{s, "data", arg[0]}, ".")).CopyTo(m)
for k, _ := range m.Confv("session", []interface{}{s, "ship"}).(map[string]interface{}) { for k, _ := range m.Confv("session", []interface{}{s, "ship"}).(map[string]interface{}) {
if len(m.Meta["result"]) > 0 || len(m.Meta["append"]) > 0 { if len(m.Meta["result"]) > 0 || len(m.Meta["append"]) > 0 {
@ -174,55 +180,56 @@ var Index = &ctx.Context{Name: "aaa", Help: "认证中心",
break break
} }
// 添加数据
m.Spawn().Cmd("config", "session", strings.Join([]string{s, "data", arg[0]}, "."), arg[1]).CopyTo(m) m.Spawn().Cmd("config", "session", strings.Join([]string{s, "data", arg[0]}, "."), arg[1]).CopyTo(m)
break break
case "ship": // 节点 case "ship": // 节点操作
if len(arg) == 1 { p, condition, chain := s, "", []map[string]string{}
for k, _ := range m.Confv("session", []interface{}{s, "ship"}).(map[string]interface{}) { for i := 0; i < len(arg); i += 2 {
if auth, ok := m.Confv("session", k).(map[string]interface{}); ok { // 查询节点
if auth["type"].(string) == arg[0] { if i == len(arg)-1 {
m.Add("append", "key", k) for k, _ := range m.Confv("session", []interface{}{p, "ship"}).(map[string]interface{}) {
m.Add("append", "type", auth["type"]) if auth, ok := m.Confv("session", k).(map[string]interface{}); ok {
m.Add("append", "meta", auth["meta"]) if auth["type"].(string) == arg[i] {
m.Add("append", "key", k)
m.Add("append", "type", auth["type"])
m.Add("append", "meta", auth["meta"])
}
} }
} }
m.Table()
return
} }
m.Table()
return h := Hash("%s%s: %s", condition, arg[i], arg[i+1])
if sess := m.Confv("session", h); sess == nil {
// 节点认证
if arg[i] == "password" {
if v, ok := m.Confv("session", []interface{}{p, "ship"}).(map[string]interface{}); ok {
for k, _ := range v {
if node, ok := m.Confv("session", []interface{}{k, "type"}).(string); ok && node == "password" {
return
}
}
}
}
// 创建节点
m.Confv("session", h, map[string]interface{}{"create_time": time.Now().Unix(), "type": arg[i], "meta": arg[i+1]})
chain = append(chain, map[string]string{"node": h, "hash": p, "level": "0", "type": t})
}
// 添加节点
chain = append(chain, map[string]string{"node": s, "hash": h, "level": "2", "type": arg[i]})
chain = append(chain, map[string]string{"node": p, "hash": h, "level": "1", "type": arg[i]})
p, t = h, arg[i]
} }
p, condition := s, "" for _, v := range chain {
for i := 0; i < len(arg)-1; i += 2 { m.Log("info", "chain: %v", v)
switch arg[i] { m.Confv("session", []interface{}{v["node"], "ship", v["hash"]}, map[string]interface{}{"level": v["level"], "type": v["type"]})
case "password":
if t == "session" {
break
}
fallthrough
default:
h := Hash("%s%s: %s", condition, arg[i], arg[i+1])
if sess := m.Confv("session", h); sess == nil {
m.Confv("session", h, map[string]interface{}{
"create_time": time.Now().Unix(),
"type": arg[i],
"meta": arg[i+1],
"ship": map[string]interface{}{p: map[string]interface{}{
"level": 0,
"type": t,
}},
})
}
m.Confv("session", []interface{}{s, "ship", h}, map[string]interface{}{
"level": 2,
"type": arg[i],
})
m.Confv("session", []interface{}{p, "ship", h}, map[string]interface{}{
"level": 1,
"type": arg[i],
})
p, t = h, arg[i]
}
} }
m.Echo(p) m.Echo(p)
} }
}}, }},

View File

@ -96,8 +96,14 @@ func (web *WEB) HandleCmd(m *ctx.Message, key string, cmd *ctx.Command) {
msg.Option("index_path", r.Header.Get("index_path")) msg.Option("index_path", r.Header.Get("index_path"))
msg.Option("index_url", r.Header.Get("index_url")) msg.Option("index_url", r.Header.Get("index_url"))
msg.Option("remote_addr", r.RemoteAddr) msg.Option("remote_addr", r.RemoteAddr)
msg.Option("remote_ip", strings.Split(r.RemoteAddr, ":")) if ip := r.Header.Get("X-Real-Ip"); ip != "" {
msg.Option("remote_ip", ip)
} else {
msg.Option("remote_ip", strings.Split(r.RemoteAddr, ":"))
}
msg.Option("dir_root", m.Cap("directory")) msg.Option("dir_root", m.Cap("directory"))
msg.Option("referer", r.Header.Get("Referer")) msg.Option("referer", r.Header.Get("Referer"))
msg.Option("accept", r.Header.Get("Accept")) msg.Option("accept", r.Header.Get("Accept"))
@ -142,12 +148,6 @@ func (web *WEB) HandleCmd(m *ctx.Message, key string, cmd *ctx.Command) {
} }
} }
if false {
if !msg.Sess("aaa").Cmd("session", msg.Option("session"), "ship", "ip").Results(0) {
msg.Sess("aaa").Cmd("session", "create", "web", "ship", "ip", m.Option("remote_ip"))
}
}
msg.Log("cmd", "%s [] %v", key, msg.Meta["option"]) msg.Log("cmd", "%s [] %v", key, msg.Meta["option"])
msg.Put("option", "request", r).Put("option", "response", w) msg.Put("option", "request", r).Put("option", "response", w)
cmd.Hand(msg, msg.Target(), msg.Option("path")) cmd.Hand(msg, msg.Target(), msg.Option("path"))
@ -899,15 +899,23 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
}}, }},
"session": &ctx.Command{Name: "session", Help: "用户登录", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { "session": &ctx.Command{Name: "session", Help: "用户登录", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
sessid := m.Option("sessid") sessid := m.Option("sessid")
if m.Options("username") && m.Options("password") { if !m.Sess("aaa").Cmd("session", sessid, "ship", "ip").Results(0) {
sessid = m.Sess("aaa").Cmd("login", m.Option("username"), m.Option("password")).Result(0) w := m.Optionv("response").(http.ResponseWriter)
} sessid = m.Sess("aaa").Cmd("session", "create", "web", "ship", "ip", m.Option("remote_ip")).Result(0)
if sessid == "" && m.Options("remote_addr") { http.SetCookie(w, &http.Cookie{Name: "sessid", Value: sessid, Path: "/"})
sessid = m.Sess("aaa").Cmd("login", "ip", m.Option("remote_addr")).Result(0)
} }
login := m.Sess("aaa").Cmd("login", sessid).Sess("login", false) if m.Options("username") && m.Options("password") {
m.Appendv("login", login) if !m.Sess("aaa").Cmd("session", sessid, "ship", "username", m.Option("username"), "password", m.Option("password")).Results(0) {
return
}
}
for _, user := range m.Sess("aaa").Cmd("session", sessid, "ship", "username").Meta["meta"] {
if m.Sess("aaa").Cmd("session", sessid, "ship", "username", user, "password").Results(0) {
m.Add("append", "username", user)
}
}
m.Echo(sessid) m.Echo(sessid)
}}, }},
"bench": &ctx.Command{Name: "bench", Help: "任务列表", Form: map[string]int{"view": 1}, Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { "bench": &ctx.Command{Name: "bench", Help: "任务列表", Form: map[string]int{"view": 1}, Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
@ -1006,17 +1014,16 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
}}, }},
"/render": &ctx.Command{Name: "/render template", Help: "渲染模板, template: 模板名称", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { "/render": &ctx.Command{Name: "/render template", Help: "渲染模板, template: 模板名称", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
if web, ok := m.Target().Server.(*WEB); m.Assert(ok) { if m.Options("toolkit") {
accept_json := strings.HasPrefix(m.Option("accept"), "application/json") if kit, ok := m.Confv("toolkit", m.Option("toolkit")).(map[string]interface{}); ok {
list := []interface{}{} m.Sess("cli").Cmd(kit["cmd"], m.Option("argument")).CopyTo(m)
tmpl := web.Template
if m.Confs("template_debug") {
tmpl = template.New("render").Funcs(ctx.CGI)
tmpl.ParseGlob(path.Join(m.Conf("template_dir"), "/*.tmpl"))
tmpl.ParseGlob(path.Join(m.Conf("template_dir"), m.Conf("template_sub"), "/*.tmpl"))
} }
return
}
if web, ok := m.Target().Server.(*WEB); m.Assert(ok) {
// 响应类型
accept_json := strings.HasPrefix(m.Option("accept"), "application/json")
w := m.Optionv("response").(http.ResponseWriter) w := m.Optionv("response").(http.ResponseWriter)
if accept_json { if accept_json {
w.Header().Add("Content-Type", "application/json") w.Header().Add("Content-Type", "application/json")
@ -1024,66 +1031,60 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
w.Header().Add("Content-Type", "text/html") w.Header().Add("Content-Type", "text/html")
} }
// 响应数据
list := []interface{}{}
tmpl := web.Template
if m.Confs("template_debug") {
tmpl = template.New("render").Funcs(ctx.CGI)
tmpl.ParseGlob(path.Join(m.Conf("template_dir"), "/*.tmpl"))
tmpl.ParseGlob(path.Join(m.Conf("template_dir"), m.Conf("template_sub"), "/*.tmpl"))
}
// 响应模板
if m.Option("componet_group") == "" { if m.Option("componet_group") == "" {
m.Option("componet_group", m.Conf("componet_group")) m.Option("componet_group", m.Conf("componet_group"))
} }
group := m.Option("componet_group") group := m.Option("componet_group")
order := m.Option("componet_name") order := m.Option("componet_name")
// 权限检查
username := m.Spawn().Cmd("session").Append("username")
right := group == "login" right := group == "login"
if !right { if !right {
right = !m.Confs("login_right") right = !m.Confs("login_right")
} }
login := m
login = nil
if !right { if !right {
login = m.Spawn().Cmd("session").Appendv("login").(*ctx.Message) right = m.Sess("aaa").Cmd("right", username, "check", group).Results(0)
if login != nil && !m.Options("username") {
m.Option("username", login.Cap("stream"))
}
} }
if login != nil { if !right {
http.SetCookie(w, &http.Cookie{Name: "sessid", Value: login.Cap("sessid"), Path: "/"})
}
if !right && login != nil {
right = m.Sess("aaa").Cmd("right", login.Cap("stream"), "check", group).Results(0)
}
if !right && login != nil {
right = m.Sess("aaa").Cmd("right", "void", "check", group).Results(0) right = m.Sess("aaa").Cmd("right", "void", "check", group).Results(0)
} }
if !right { if !right {
lark := m.Find("web.chat.lark") if lark := m.Find("web.chat.lark"); lark != nil && m.Confs("login_lark") {
if lark != nil && m.Confs("login_lark") {
right = ctx.Right(lark.Cmd("auth", m.Option("username"), "check", m.Option("cmd")).Result(0)) right = ctx.Right(lark.Cmd("auth", m.Option("username"), "check", m.Option("cmd")).Result(0))
} }
} }
if m.Options("toolkit") { // 工作空间
m.Log("what", "waht %v", m.Optionv("toolkit"))
m.Log("what", "waht %v", m.Confv("toolkit"))
if kit, ok := m.Confv("toolkit", m.Option("toolkit")).(map[string]interface{}); ok {
m.Log("what", "waht %v", kit)
msg := m.Sess("cli").Cmd(kit["cmd"], m.Option("argument"))
m.Copy(msg, "append").Copy(msg, "result")
}
return
}
bench_share := "" bench_share := ""
bench, ok := m.Confv("bench", m.Option("bench")).(map[string]interface{}) bench, ok := m.Confv("bench", m.Option("bench")).(map[string]interface{})
if right && !m.Confs("bench_disable") { if order == "" {
if !ok { // 创建工作流 if username == "" {
m.Append("redirect", fmt.Sprintf("%s?bench=%s", m.Option("index_path"), m.Spawn().Cmd("bench", "create").Append("key"))) group, order, right = "login", "", true
return } else {
} if right && !m.Confs("bench_disable") {
if bench_share = m.Spawn().Cmd("bench", "check", m.Option("username")).Result(0); bench_share == "private" { if !ok {
return m.Append("redirect", fmt.Sprintf("%s?bench=%s", m.Option("index_path"), m.Spawn().Cmd("bench", "create").Append("key")))
return
}
if bench_share = m.Spawn().Cmd("bench", "check", m.Option("username")).Result(0); bench_share == "private" {
return
}
}
} }
} }
m.Log("info", "group: %v, order: %v, right: %v, share: %v", group, order, right, bench_share)
m.Log("info", "json: %v group: %v order: %v user: %v right: %v share: %v", accept_json, group, order, username, right, bench_share)
for count := 0; count == 0; group, order, right = "login", "", true { for count := 0; count == 0; group, order, right = "login", "", true {
for _, v := range m.Confv("componet", group).([]interface{}) { for _, v := range m.Confv("componet", group).([]interface{}) {
@ -1092,22 +1093,23 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
continue continue
} }
// 权限检查
order_right := right order_right := right
if !order_right && login != nil { if !order_right {
order_right = m.Sess("aaa").Cmd("right", login.Cap("stream"), "check", group, val["componet_name"]).Results(0) order_right = m.Sess("aaa").Cmd("right", username, "check", group, val["componet_name"]).Results(0)
} }
if !order_right && login != nil { if !order_right {
order_right = m.Sess("aaa").Cmd("right", "void", "check", group, val["componet_name"]).Results(0) order_right = m.Sess("aaa").Cmd("right", "void", "check", group, val["componet_name"]).Results(0)
} }
if !order_right { if !order_right {
continue continue
} }
// 查找模块
context := m.Cap("module") context := m.Cap("module")
if val["componet_ctx"] != nil { if val["componet_ctx"] != nil {
context = val["componet_ctx"].(string) context = val["componet_ctx"].(string)
} }
msg := m.Find(context) msg := m.Find(context)
if msg == nil { if msg == nil {
if !accept_json && val["template"] != nil { if !accept_json && val["template"] != nil {
@ -1117,8 +1119,8 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
} }
count++ count++
// 添加固定值
msg.Option("componet_name", val["componet_name"].(string)) msg.Option("componet_name", val["componet_name"].(string))
for k, v := range val { for k, v := range val {
if msg.Option(k) != "" { if msg.Option(k) != "" {
continue continue
@ -1133,6 +1135,7 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
} }
} }
// 添加输入值
if val["inputs"] != nil { if val["inputs"] != nil {
for _, v := range val["inputs"].([]interface{}) { for _, v := range val["inputs"].([]interface{}) {
value := v.(map[string]interface{}) value := v.(map[string]interface{})
@ -1142,11 +1145,11 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
} }
} }
// 添加参数值
args := []string{} args := []string{}
if val["componet_cmd"] != nil { if val["componet_cmd"] != nil {
args = append(args, val["componet_cmd"].(string)) args = append(args, val["componet_cmd"].(string))
} }
if val["arguments"] != nil { if val["arguments"] != nil {
for _, v := range val["arguments"].([]interface{}) { for _, v := range val["arguments"].([]interface{}) {
switch value := v.(type) { switch value := v.(type) {
@ -1158,6 +1161,7 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
if order != "" || (val["pre_run"] != nil && val["pre_run"].(bool)) { if order != "" || (val["pre_run"] != nil && val["pre_run"].(bool)) {
if val["componet_cmd"] != nil { if val["componet_cmd"] != nil {
// 记录命令列表
if len(bench) > 0 && bench_share != "protected" { if len(bench) > 0 && bench_share != "protected" {
now := time.Now().Format(m.Conf("time_format")) now := time.Now().Format(m.Conf("time_format"))
m.Confv("bench", []interface{}{m.Option("bench"), "commands", m.Option("componet_name_order")}, map[string]interface{}{ m.Confv("bench", []interface{}{m.Option("bench"), "commands", m.Option("componet_name_order")}, map[string]interface{}{
@ -1167,7 +1171,10 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
m.Confv("bench", []interface{}{m.Option("bench"), "modify_time"}, now) m.Confv("bench", []interface{}{m.Option("bench"), "modify_time"}, now)
} }
// 执行命令
msg.Cmd(args) msg.Cmd(args)
// 生成下载链接
if msg.Options("download_file") { if msg.Options("download_file") {
m.Append("page_redirect", fmt.Sprintf("/download/%s", m.Append("page_redirect", fmt.Sprintf("/download/%s",
msg.Sess("nfs").Copy(msg, "append").Copy(msg, "result").Cmd("export", msg.Option("download_file")).Result(0))) msg.Sess("nfs").Copy(msg, "append").Copy(msg, "result").Cmd("export", msg.Option("download_file")).Result(0)))
@ -1176,6 +1183,7 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
} }
} }
// 添加响应
if accept_json { if accept_json {
list = append(list, msg.Meta) list = append(list, msg.Meta)
} else if val["template"] != nil { } else if val["template"] != nil {
@ -1186,15 +1194,10 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
m.Append("download_file", fmt.Sprintf("/download/%s", msg.Append("directory"))) m.Append("download_file", fmt.Sprintf("/download/%s", msg.Append("directory")))
return return
} }
if msg.Detail(0) == "login" && msg.Appends("sessid") {
http.SetCookie(w, &http.Cookie{Name: "sessid", Value: msg.Append("sessid")})
m.Append("page_refresh", "10")
return
}
} }
} }
// 生成响应
if accept_json { if accept_json {
en := json.NewEncoder(w) en := json.NewEncoder(w)
en.SetIndent("", " ") en.SetIndent("", " ")

View File

@ -212,7 +212,9 @@ function send_command(form, cb) {
data[key] = form.dataset[key] data[key] = form.dataset[key]
} }
for (var i = 0; i < form.length; i++) { for (var i = 0; i < form.length; i++) {
data[form[i].name] = form[i].value if form[i].name {
data[form[i].name] = form[i].value
}
} }
var order = (data["componet_name_order"]||"") var order = (data["componet_name_order"]||"")

View File

@ -196,10 +196,7 @@
<li data-action="refresh_fly">+ 刷新工作流(Ctrl+R)</li> <li data-action="refresh_fly">+ 刷新工作流(Ctrl+R)</li>
<li data-action="create_fly">+ 添加工作流(Ctrl+T)</li> <li data-action="create_fly">+ 添加工作流(Ctrl+T)</li>
{{range $key, $item := conf . "bench"}} {{range $key, $item := conf . "bench"}}
{{$creator := index $item "creator"|option}}
{{if eq $creator $username}}
<li data-key="{{$key}}">{{index $item "modify_time"}} {{index $item "comment"}}({{slice $key 0 6}})</li> <li data-key="{{$key}}">{{index $item "modify_time"}} {{index $item "comment"}}({{slice $key 0 6}})</li>
{{end}}
{{end}} {{end}}
<li data-action="rename_fly">+ 命名工作流</li> <li data-action="rename_fly">+ 命名工作流</li>
<li data-action="remove_fly">+ 删除工作流</li> <li data-action="remove_fly">+ 删除工作流</li>