forked from x/ContextOS
opt aaa.md5
Change-Id: I28e36076a377b936563e50d67a7fe7305946d007
This commit is contained in:
parent
611fc9efc7
commit
4eaf53b217
@ -30,15 +30,7 @@ type AAA struct {
|
||||
*ctx.Context
|
||||
}
|
||||
|
||||
func Hash(meta string, arg ...interface{}) string {
|
||||
bs := md5.Sum([]byte(fmt.Sprintln("%s", meta, arg)))
|
||||
return hex.EncodeToString(bs[:])
|
||||
}
|
||||
func Session(meta string) string {
|
||||
bs := md5.Sum([]byte(fmt.Sprintln("%d%d%s", time.Now().Unix(), rand.Int(), meta)))
|
||||
return hex.EncodeToString(bs[:])
|
||||
}
|
||||
func (aaa *AAA) Password(pwd string) string {
|
||||
func Password(pwd string) string {
|
||||
bs := md5.Sum([]byte(fmt.Sprintln("password:%s", pwd)))
|
||||
return hex.EncodeToString(bs[:])
|
||||
}
|
||||
@ -61,7 +53,7 @@ func (aaa *AAA) Spawn(m *ctx.Message, c *ctx.Context, arg ...string) ctx.Server
|
||||
now := time.Now().Unix()
|
||||
c.Caches = map[string]*ctx.Cache{
|
||||
"method": &ctx.Cache{Name: "method", Value: arg[0], Help: "登录方式"},
|
||||
"sessid": &ctx.Cache{Name: "sessid", Value: Session(arg[1]), Help: "会话令牌"},
|
||||
"sessid": &ctx.Cache{Name: "sessid", Value: "", Help: "会话令牌"},
|
||||
"login_time": &ctx.Cache{Name: "login_time", Value: fmt.Sprintf("%d", now), Help: "登录时间"},
|
||||
"expire_time": &ctx.Cache{Name: "expire_time", Value: fmt.Sprintf("%d", int64(m.Confi("expire"))+now), Help: "会话超时"},
|
||||
}
|
||||
@ -85,20 +77,20 @@ func (aaa *AAA) Start(m *ctx.Message, arg ...string) bool {
|
||||
|
||||
aaa.certificate = cert
|
||||
aaa.public = cert.PublicKey.(*rsa.PublicKey)
|
||||
stream = aaa.Password(stream)
|
||||
stream = Password(stream)
|
||||
case "pub":
|
||||
public, e := x509.ParsePKIXPublicKey(aaa.Decode(stream))
|
||||
m.Assert(e)
|
||||
|
||||
aaa.public = public.(*rsa.PublicKey)
|
||||
stream = aaa.Password(stream)
|
||||
stream = Password(stream)
|
||||
case "key":
|
||||
private, e := x509.ParsePKCS1PrivateKey(aaa.Decode(stream))
|
||||
m.Assert(e)
|
||||
|
||||
aaa.private = private
|
||||
aaa.public = &aaa.private.PublicKey
|
||||
stream = aaa.Password(stream)
|
||||
stream = Password(stream)
|
||||
}
|
||||
m.Log("info", "%d login %s", m.Capi("nuser"), m.Cap("stream", stream))
|
||||
return false
|
||||
@ -113,24 +105,25 @@ var Index = &ctx.Context{Name: "aaa", Help: "认证中心",
|
||||
},
|
||||
Configs: map[string]*ctx.Config{
|
||||
"secrete_key": &ctx.Config{Name: "secrete_key", Value: map[string]interface{}{"password": 1, "uuid": 1}, Help: "私钥文件"},
|
||||
"session": &ctx.Config{Name: "session", Value: map[string]interface{}{}, Help: "私钥文件"},
|
||||
"auth": &ctx.Config{Name: "auth", Value: map[string]interface{}{}, Help: "私钥文件"},
|
||||
"expire": &ctx.Config{Name: "expire(s)", Value: "72000", Help: "会话超时"},
|
||||
"cert": &ctx.Config{Name: "cert", Value: "etc/pem/cert.pem", Help: "证书文件"},
|
||||
"pub": &ctx.Config{Name: "pub", Value: "etc/pem/pub.pem", Help: "公钥文件"},
|
||||
"key": &ctx.Config{Name: "key", Value: "etc/pem/key.pem", Help: "私钥文件"},
|
||||
"md5": &ctx.Config{Name: "md5", Value: map[string]interface{}{}, Help: "私钥文件"},
|
||||
},
|
||||
Commands: map[string]*ctx.Command{
|
||||
"session": &ctx.Command{Name: "session create", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||
"auth": &ctx.Command{Name: "auth create", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||
if len(arg) == 0 {
|
||||
m.Spawn().Cmd("config", "session").Cmd("select", "parse", "value", "", "fields", "key type meta ship data").CopyTo(m)
|
||||
m.Spawn().Cmd("config", "auth").Cmd("select", "parse", "value", "", "fields", "key type meta ship data").CopyTo(m)
|
||||
return
|
||||
}
|
||||
|
||||
// 创建会话
|
||||
s, t := "", ""
|
||||
if len(arg) > 0 && arg[0] == "create" {
|
||||
s, t = Session(arg[1]), "session"
|
||||
m.Confv("session", s, map[string]interface{}{
|
||||
s, t = m.Spawn().Cmd("md5", "session", arg[1], "time", "rand").Result(0), "session"
|
||||
m.Confv("auth", s, map[string]interface{}{
|
||||
"create_time": time.Now().Unix(),
|
||||
"type": "session",
|
||||
"meta": arg[1],
|
||||
@ -143,7 +136,7 @@ var Index = &ctx.Context{Name: "aaa", Help: "认证中心",
|
||||
return
|
||||
}
|
||||
}
|
||||
if v, ok := m.Confv("session", []interface{}{arg[0], "type"}).(string); ok {
|
||||
if v, ok := m.Confv("auth", []interface{}{arg[0], "type"}).(string); ok {
|
||||
s, t, arg = arg[0], v, arg[1:]
|
||||
}
|
||||
if s == "" {
|
||||
@ -163,7 +156,7 @@ var Index = &ctx.Context{Name: "aaa", Help: "认证中心",
|
||||
if which != "" {
|
||||
args = append(args, which)
|
||||
}
|
||||
m.Spawn().Cmd("config", "session", strings.Join(args, ".")).CopyTo(m)
|
||||
m.Spawn().Cmd("config", "auth", strings.Join(args, ".")).CopyTo(m)
|
||||
return
|
||||
}
|
||||
|
||||
@ -171,26 +164,26 @@ var Index = &ctx.Context{Name: "aaa", Help: "认证中心",
|
||||
switch which {
|
||||
case "data": // 数据操作
|
||||
if len(arg) == 1 { // 读取数据
|
||||
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{}) {
|
||||
m.Spawn().Cmd("config", "auth", strings.Join([]string{s, "data", arg[0]}, ".")).CopyTo(m)
|
||||
for k, _ := range m.Confv("auth", []interface{}{s, "ship"}).(map[string]interface{}) {
|
||||
if len(m.Meta["result"]) > 0 || len(m.Meta["append"]) > 0 {
|
||||
break
|
||||
}
|
||||
m.Spawn().Cmd("config", "session", strings.Join([]string{k, "data", arg[0]}, ".")).CopyTo(m)
|
||||
m.Spawn().Cmd("config", "auth", strings.Join([]string{k, "data", arg[0]}, ".")).CopyTo(m)
|
||||
}
|
||||
break
|
||||
}
|
||||
|
||||
// 添加数据
|
||||
m.Spawn().Cmd("config", "session", strings.Join([]string{s, "data", arg[0]}, "."), arg[1]).CopyTo(m)
|
||||
m.Spawn().Cmd("config", "auth", strings.Join([]string{s, "data", arg[0]}, "."), arg[1]).CopyTo(m)
|
||||
break
|
||||
case "ship": // 节点操作
|
||||
p, condition, chain := s, "", []map[string]string{}
|
||||
for i := 0; i < len(arg); i += 2 {
|
||||
// 查询节点
|
||||
if i == len(arg)-1 {
|
||||
for k, _ := range m.Confv("session", []interface{}{p, "ship"}).(map[string]interface{}) {
|
||||
if auth, ok := m.Confv("session", k).(map[string]interface{}); ok {
|
||||
for k, _ := range m.Confv("auth", []interface{}{p, "ship"}).(map[string]interface{}) {
|
||||
if auth, ok := m.Confv("auth", k).(map[string]interface{}); ok {
|
||||
if auth["type"].(string) == arg[i] {
|
||||
m.Add("append", "key", k)
|
||||
m.Add("append", "type", auth["type"])
|
||||
@ -204,16 +197,16 @@ var Index = &ctx.Context{Name: "aaa", Help: "认证中心",
|
||||
|
||||
value := arg[i+1]
|
||||
if m.Confv("secrete_key", arg[i]) != nil {
|
||||
value = Hash("%s", value)
|
||||
value = Password(value)
|
||||
}
|
||||
|
||||
h := Hash("%s%s: %s", condition, arg[i], value)
|
||||
if sess := m.Confv("session", h); sess == nil {
|
||||
h := m.Spawn().Cmd("md5", arg[i], value, condition).Result(0)
|
||||
if sess := m.Confv("auth", h); sess == nil {
|
||||
// 节点认证
|
||||
if arg[i] == "password" {
|
||||
if v, ok := m.Confv("session", []interface{}{p, "ship"}).(map[string]interface{}); ok {
|
||||
if v, ok := m.Confv("auth", []interface{}{p, "ship"}).(map[string]interface{}); ok {
|
||||
for k, _ := range v {
|
||||
if node, ok := m.Confv("session", []interface{}{k, "type"}).(string); ok && node == "password" {
|
||||
if node, ok := m.Confv("auth", []interface{}{k, "type"}).(string); ok && node == "password" {
|
||||
return
|
||||
}
|
||||
}
|
||||
@ -221,7 +214,7 @@ var Index = &ctx.Context{Name: "aaa", Help: "认证中心",
|
||||
}
|
||||
|
||||
// 创建节点
|
||||
m.Confv("session", h, map[string]interface{}{"create_time": time.Now().Unix(), "type": arg[i], "meta": value})
|
||||
m.Confv("auth", h, map[string]interface{}{"create_time": time.Now().Unix(), "type": arg[i], "meta": value})
|
||||
chain = append(chain, map[string]string{"node": h, "hash": p, "level": "0", "type": t})
|
||||
}
|
||||
|
||||
@ -233,7 +226,7 @@ var Index = &ctx.Context{Name: "aaa", Help: "认证中心",
|
||||
|
||||
for _, v := range chain {
|
||||
m.Log("info", "chain: %v", v)
|
||||
m.Confv("session", []interface{}{v["node"], "ship", v["hash"]}, map[string]interface{}{"level": v["level"], "type": v["type"]})
|
||||
m.Confv("auth", []interface{}{v["node"], "ship", v["hash"]}, map[string]interface{}{"level": v["level"], "type": v["type"]})
|
||||
}
|
||||
|
||||
m.Echo(p)
|
||||
@ -245,7 +238,7 @@ var Index = &ctx.Context{Name: "aaa", Help: "认证中心",
|
||||
Help: []string{"会话管理", "sessid: 令牌", "username: 账号", "password: 密码",
|
||||
"ip: 主机地址", "openid: 微信登录", "cert: 证书", "pub: 公钥", "key: 私钥"},
|
||||
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||
if aaa, ok := c.Server.(*AAA); m.Assert(ok) {
|
||||
if _, ok := c.Server.(*AAA); m.Assert(ok) {
|
||||
method := ""
|
||||
for _, v := range []string{"ip", "openid", "cert", "pub", "key"} {
|
||||
if m.Has(v) {
|
||||
@ -263,7 +256,7 @@ var Index = &ctx.Context{Name: "aaa", Help: "认证中心",
|
||||
return false
|
||||
}
|
||||
case "cert", "pub", "key":
|
||||
if m.Cap("stream") == aaa.Password(m.Option(method)) {
|
||||
if m.Cap("stream") == Password(m.Option(method)) {
|
||||
m.Cap("expire_time", fmt.Sprintf("%d", time.Now().Unix()+int64(m.Confi("expire"))))
|
||||
m.Echo(m.Cap("sessid"))
|
||||
return false
|
||||
@ -286,7 +279,7 @@ var Index = &ctx.Context{Name: "aaa", Help: "认证中心",
|
||||
case 2:
|
||||
m.Travel(func(m *ctx.Message, n int) bool {
|
||||
if n > 0 && m.Cap("method") == "password" && m.Cap("stream") == arg[0] {
|
||||
m.Assert(m.Cap("password") == aaa.Password(arg[1]))
|
||||
m.Assert(m.Cap("password") == Password(arg[1]))
|
||||
m.Cap("expire_time", fmt.Sprintf("%d", time.Now().Unix()+int64(m.Confi("expire"))))
|
||||
m.Echo(m.Cap("sessid"))
|
||||
return false
|
||||
@ -311,7 +304,7 @@ var Index = &ctx.Context{Name: "aaa", Help: "认证中心",
|
||||
}
|
||||
|
||||
m.Start(name, "密码登录", "password", arg[0])
|
||||
m.Cap("password", "password", aaa.Password(arg[1]), "密码登录")
|
||||
m.Cap("password", "password", Password(arg[1]), "密码登录")
|
||||
m.Append("sessid", m.Cap("sessid"))
|
||||
m.Echo(m.Cap("sessid"))
|
||||
return
|
||||
@ -449,10 +442,32 @@ var Index = &ctx.Context{Name: "aaa", Help: "认证中心",
|
||||
m.Table()
|
||||
}},
|
||||
|
||||
"md5": &ctx.Command{Name: "md5 content", Help: "数字摘要", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||
"md5": &ctx.Command{Name: "md5 type data time rand", Help: "数字摘要", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||
if aaa, ok := m.Target().Server.(*AAA); m.Assert(ok) {
|
||||
h := md5.Sum(aaa.Input(strings.Join(arg, "")))
|
||||
m.Echo(hex.EncodeToString(h[:]))
|
||||
if len(arg) == 0 {
|
||||
m.Spawn().Cmd("config", "md5").CopyTo(m)
|
||||
return
|
||||
}
|
||||
|
||||
meta := []string{}
|
||||
for _, v := range arg {
|
||||
switch v {
|
||||
case "time":
|
||||
v = time.Now().Format(m.Conf("time_format"))
|
||||
case "rand":
|
||||
v = fmt.Sprintf("%d", rand.Int())
|
||||
case "":
|
||||
continue
|
||||
}
|
||||
meta = append(meta, v)
|
||||
}
|
||||
|
||||
h := md5.Sum(aaa.Input(strings.Join(meta, "")))
|
||||
hs := hex.EncodeToString(h[:])
|
||||
|
||||
m.Log("info", "%s: %v", hs, meta)
|
||||
m.Confv("md5", hs, meta)
|
||||
m.Echo(hs)
|
||||
}
|
||||
}},
|
||||
|
||||
|
@ -45,7 +45,6 @@ func (cli *CLI) schedule(m *ctx.Message) string {
|
||||
}
|
||||
}
|
||||
cli.Timer.Reset(time.Until(time.Unix(0, timer/int64(m.Confi("time_unit"))*1000000000)))
|
||||
m.Log("fuck", "what %v %d", first, timer)
|
||||
return m.Conf("timer_next", first)
|
||||
}
|
||||
|
||||
@ -1111,10 +1110,12 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
|
||||
return
|
||||
}
|
||||
|
||||
now := int64(m.Spawn().Cmd("time").Appendi("timestamp"))
|
||||
m.Log("what", "wath %v", m.Spawn().Cmd("time"))
|
||||
|
||||
now := int64(m.Sess("cli").Cmd("time").Appendi("timestamp"))
|
||||
begin := now
|
||||
if len(arg) > 0 && arg[0] == "begin" {
|
||||
begin, arg = int64(m.Spawn().Cmd("time", arg[1]).Appendi("timestamp")), arg[2:]
|
||||
begin, arg = int64(m.Sess("cli").Cmd("time", arg[1]).Appendi("timestamp")), arg[2:]
|
||||
}
|
||||
|
||||
repeat := false
|
||||
@ -1127,10 +1128,10 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
|
||||
order, arg = arg[1], arg[2:]
|
||||
}
|
||||
|
||||
action := int64(m.Spawn().Cmd("time", begin, order, arg[0]).Appendi("timestamp"))
|
||||
action := int64(m.Sess("cli").Cmd("time", begin, order, arg[0]).Appendi("timestamp"))
|
||||
|
||||
// 创建任务
|
||||
hash := m.Sess("aaa").Cmd("md5", arg, now).Result(0)
|
||||
hash := m.Sess("aaa").Cmd("md5", "timer", arg, "time", "rand").Result(0)
|
||||
m.Confv("timer", hash, map[string]interface{}{
|
||||
"create_time": now,
|
||||
"begin_time": begin,
|
||||
@ -1162,7 +1163,7 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
|
||||
timer["msg"] = msg.Code()
|
||||
|
||||
if timer["repeat"].(bool) {
|
||||
timer["action_time"] = int64(m.Spawn().Cmd("time", timer["action_time"], timer["order"], timer["time"]).Appendi("timestamp"))
|
||||
timer["action_time"] = int64(m.Sess("cli").Cmd("time", timer["action_time"], timer["order"], timer["time"]).Appendi("timestamp"))
|
||||
} else {
|
||||
timer["done"] = true
|
||||
}
|
||||
|
@ -525,7 +525,7 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
|
||||
m.Assert(e)
|
||||
io.Copy(f, res.Body)
|
||||
defer f.Close()
|
||||
m.Log("info", "save file %s %s", p, m.Sess("aaa").Cmd("md5", p).Result(0))
|
||||
m.Log("info", "save file %s %s", p, m.Sess("aaa").Cmd("md5", "file", p).Result(0))
|
||||
m.Echo(p)
|
||||
return
|
||||
}
|
||||
@ -600,7 +600,6 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
|
||||
m.Assert(e)
|
||||
if m.Has("parse") {
|
||||
json.Unmarshal(buf, &result)
|
||||
m.Log("fuck", "%v ", result)
|
||||
msg := m.Spawn()
|
||||
msg.Put("option", "response", result)
|
||||
msg.Cmd("trans", "response", m.Option("parse"))
|
||||
@ -902,26 +901,26 @@ 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) {
|
||||
sessid := m.Option("sessid")
|
||||
if !m.Sess("aaa").Cmd("session", sessid, "ship", "ip").Results(0) {
|
||||
if !m.Sess("aaa").Cmd("auth", sessid, "ship", "ip").Results(0) {
|
||||
w := m.Optionv("response").(http.ResponseWriter)
|
||||
sessid = m.Sess("aaa").Cmd("session", "create", "web", "ship", "ip", m.Option("remote_ip")).Result(0)
|
||||
sessid = m.Sess("aaa").Cmd("auth", "create", "web", "ship", "ip", m.Option("remote_ip")).Result(0)
|
||||
http.SetCookie(w, &http.Cookie{Name: "sessid", Value: sessid, Path: "/"})
|
||||
}
|
||||
|
||||
if m.Options("username") && m.Options("uuid") {
|
||||
if !m.Sess("aaa").Cmd("session", sessid, "ship", "username", m.Option("username"), "uuid", m.Option("uuid")).Results(0) {
|
||||
if !m.Sess("aaa").Cmd("auth", sessid, "ship", "username", m.Option("username"), "uuid", m.Option("uuid")).Results(0) {
|
||||
return
|
||||
}
|
||||
} else if m.Options("username") && m.Options("password") {
|
||||
if !m.Sess("aaa").Cmd("session", sessid, "ship", "username", m.Option("username"), "password", m.Option("password")).Results(0) {
|
||||
if !m.Sess("aaa").Cmd("auth", 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, "uuid").Results(0) {
|
||||
for _, user := range m.Sess("aaa").Cmd("auth", sessid, "ship", "username").Meta["meta"] {
|
||||
if m.Sess("aaa").Cmd("auth", sessid, "ship", "username", user, "uuid").Results(0) {
|
||||
m.Add("append", "username", user)
|
||||
} else if m.Sess("aaa").Cmd("session", sessid, "ship", "username", user, "password").Results(0) {
|
||||
} else if m.Sess("aaa").Cmd("auth", sessid, "ship", "username", user, "password").Results(0) {
|
||||
m.Add("append", "username", user)
|
||||
}
|
||||
}
|
||||
@ -944,7 +943,7 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
|
||||
create_time := time.Now().Format(m.Conf("time_format"))
|
||||
key := m.Option("bench")
|
||||
if key == "" {
|
||||
key = m.Sess("aaa").Cmd("md5", m.Option("remote_addr"), create_time).Result(0)
|
||||
key = m.Sess("aaa").Cmd("md5", "bench", m.Option("remote_addr"), "time", "rand").Result(0)
|
||||
}
|
||||
|
||||
link := fmt.Sprintf("%s?bench=%s", m.Conf("site"), key)
|
||||
@ -970,7 +969,6 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
|
||||
|
||||
if len(arg) > 0 && arg[0] == "check" { // 检查工作流
|
||||
bench := m.Confv("bench", m.Option("bench")).(map[string]interface{})
|
||||
m.Log("fuck", "waht %v", bench)
|
||||
if bench["creator"].(string) != arg[1] {
|
||||
switch bench["share"].(string) {
|
||||
case "private":
|
||||
@ -1233,7 +1231,7 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
|
||||
r := m.Optionv("request").(*http.Request)
|
||||
w := m.Optionv("response").(http.ResponseWriter)
|
||||
p := m.Sess("nfs").Cmd("path", strings.TrimPrefix(m.Option("path"), "/download/")).Result(0)
|
||||
m.Log("info", "download %s %s", p, m.Sess("aaa").Cmd("md5", p).Result(0))
|
||||
m.Log("info", "download %s %s", p, m.Sess("aaa").Cmd("md5", "file", p).Result(0))
|
||||
http.ServeFile(w, r, p)
|
||||
}},
|
||||
"/proxy/": &ctx.Command{Name: "/proxy/", Help: "服务代理", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user