1
0
forked from x/icebergs
This commit is contained in:
shylinux 2021-10-20 16:51:21 +08:00
parent 82f4d2cf7e
commit a458771a79
14 changed files with 134 additions and 126 deletions

View File

@ -29,6 +29,9 @@ func _role_list(m *ice.Message, userrole string) {
}
})
}
func _role_chain(arg ...string) string {
return strings.ReplaceAll(kit.Keys(arg), "/", ice.PT)
}
func _role_black(m *ice.Message, userrole, chain string, status bool) {
m.Richs(ROLE, nil, userrole, func(key string, value map[string]interface{}) {
m.Log_MODIFY(ROLE, userrole, BLACK, chain)
@ -57,7 +60,7 @@ func _role_right(m *ice.Message, userrole string, keys ...string) (ok bool) {
}
}
if m.Warn(!ok, ice.ErrNotRight, userrole, " of ", keys) {
if m.Warn(!ok, ice.ErrNotRight, userrole, ice.OF, keys) {
return
}
if userrole == TECH {
@ -72,7 +75,7 @@ func _role_right(m *ice.Message, userrole string, keys ...string) (ok bool) {
}
}
if m.Warn(!ok, ice.ErrNotRight, userrole, " of ", keys) {
if m.Warn(!ok, ice.ErrNotRight, userrole, ice.OF, keys) {
return
}
// 普通用户
@ -117,13 +120,13 @@ func init() {
}},
BLACK: {Name: "black role chain...", Help: "黑名单", Hand: func(m *ice.Message, arg ...string) {
_role_black(m, arg[0], strings.ReplaceAll(kit.Keys(arg[1:]), "/", ice.PT), true)
_role_black(m, arg[0], _role_chain(arg[1:]...), true)
}},
WHITE: {Name: "white role chain...", Help: "白名单", Hand: func(m *ice.Message, arg ...string) {
_role_white(m, arg[0], strings.ReplaceAll(kit.Keys(arg[1:]), "/", ice.PT), true)
_role_white(m, arg[0], _role_chain(arg[1:]...), true)
}},
RIGHT: {Name: "right role chain...", Help: "查看权限", Hand: func(m *ice.Message, arg ...string) {
if _role_right(m, arg[0], kit.Split(strings.ReplaceAll(kit.Keys(arg[1:]), "/", ice.PT), ice.PT)...) {
if _role_right(m, arg[0], kit.Split(_role_chain(arg[1:]...), ice.PT)...) {
m.Echo(ice.OK)
}
}},

View File

@ -5,6 +5,7 @@ const (
SP = " "
PT = "."
NL = "\n"
OF = " of "
OK = "ok"
TRUE = "true"

View File

@ -4,6 +4,7 @@ import (
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/tcp"
"shylinux.com/x/icebergs/base/web"
"shylinux.com/x/icebergs/core/chat"
kit "shylinux.com/x/toolkits"
@ -14,50 +15,48 @@ const (
APPMM = "appmm"
ACCESS = "access"
OPENID = "openid"
WEIXIN = "weixin"
)
const LOGIN = "login"
func init() {
Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{
LOGIN: {Name: LOGIN, Help: "认证", Value: kit.Data(
WEIXIN, "https://api.weixin.qq.com", APPID, "", APPMM, "",
)},
},
Commands: map[string]*ice.Command{
ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Cmd(web.SPIDE, mdb.CREATE, WEIXIN, m.Conf(LOGIN, kit.Keym(WEIXIN)))
}},
"/login/": {Name: "/login/", Help: "认证", Action: map[string]*ice.Action{
aaa.SESS: {Name: "sess code", Help: "会话", Hand: func(m *ice.Message, arg ...string) {
msg := m.Cmd(web.SPIDE, WEIXIN, web.SPIDE_GET, "/sns/jscode2session?grant_type=authorization_code",
"js_code", m.Option(kit.MDB_CODE), APPID, m.Conf(LOGIN, kit.Keym(APPID)), "secret", m.Conf(LOGIN, kit.Keym(APPMM)))
Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
LOGIN: {Name: LOGIN, Help: "认证", Value: kit.Data(
tcp.SERVER, "https://api.weixin.qq.com",
APPID, "", APPMM, "", "tokens", "",
)},
}, Commands: map[string]*ice.Command{
ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Cmd(web.SPIDE, mdb.CREATE, MP, m.Conf(LOGIN, kit.Keym(tcp.SERVER)))
}},
"/login/": {Name: "/login/", Help: "认证", Action: map[string]*ice.Action{
aaa.SESS: {Name: "sess code", Help: "会话", Hand: func(m *ice.Message, arg ...string) {
msg := m.Cmd(web.SPIDE, MP, web.SPIDE_GET, "/sns/jscode2session?grant_type=authorization_code",
"js_code", m.Option(kit.MDB_CODE), APPID, m.Config(APPID), "secret", m.Config(APPMM))
// 用户登录
m.Option(ice.MSG_USERZONE, MP)
m.Echo(aaa.SessCreate(msg, msg.Append(OPENID)))
}},
aaa.USER: {Name: "user", Help: "用户", Hand: func(m *ice.Message, arg ...string) {
m.Option(aaa.USERNAME, m.Option(ice.MSG_USERNAME))
m.Cmd(aaa.USER, mdb.MODIFY, aaa.USERZONE, MP, aaa.USERNICK, m.Option("nickName"),
aaa.AVATAR, m.Option("avatarUrl"), aaa.GENDER, kit.Select("女", "男", m.Option(aaa.GENDER) == "1"),
aaa.COUNTRY, m.Option(aaa.COUNTRY), aaa.LANGUAGE, m.Option(aaa.LANGUAGE),
aaa.CITY, m.Option(aaa.CITY), aaa.PROVINCE, m.Option(aaa.PROVINCE),
)
}},
chat.SCAN: {Name: "scan", Help: "扫码", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(chat.SCAN, arg)
}},
// 用户登录
m.Option(ice.MSG_USERZONE, MP)
m.Echo(aaa.SessCreate(msg, msg.Append(OPENID)))
}},
LOGIN: {Name: "login appid auto login", Help: "认证", Action: map[string]*ice.Action{
mdb.CREATE: {Name: "create appid appmm", Help: "登录", Hand: func(m *ice.Message, arg ...string) {
m.Conf(LOGIN, kit.Keym(APPID), m.Option(APPID))
m.Conf(LOGIN, kit.Keym(APPMM), m.Option(APPMM))
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Echo(m.Conf(LOGIN, kit.Keym(APPID)))
aaa.USER: {Name: "user", Help: "用户", Hand: func(m *ice.Message, arg ...string) {
m.Option(aaa.USERNAME, m.Option(ice.MSG_USERNAME))
m.Cmd(aaa.USER, mdb.MODIFY, aaa.USERZONE, MP, aaa.USERNICK, m.Option("nickName"),
aaa.AVATAR, m.Option("avatarUrl"), aaa.GENDER, kit.Select("女", "男", m.Option(aaa.GENDER) == "1"),
aaa.COUNTRY, m.Option(aaa.COUNTRY), aaa.LANGUAGE, m.Option(aaa.LANGUAGE),
aaa.CITY, m.Option(aaa.CITY), aaa.PROVINCE, m.Option(aaa.PROVINCE),
)
}},
},
chat.SCAN: {Name: "scan", Help: "扫码", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(chat.SCAN, arg)
}},
}},
LOGIN: {Name: "login appid auto login", Help: "认证", Action: map[string]*ice.Action{
mdb.CREATE: {Name: "create appid appmm", Help: "登录", Hand: func(m *ice.Message, arg ...string) {
m.Config(APPID, m.Option(APPID))
m.Config(APPMM, m.Option(APPMM))
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Echo(m.Config(APPID))
}},
},
})
}

View File

@ -8,15 +8,6 @@ import (
const MP = "mp"
var Index = &ice.Context{Name: MP, Help: "小程序",
Commands: map[string]*ice.Command{
ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Load()
}},
ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Save()
}},
},
}
var Index = &ice.Context{Name: MP, Help: "小程序"}
func init() { chat.Index.Register(Index, &web.Frame{}) }

View File

@ -1,5 +1,5 @@
title "微信小程序"
refer "" `
refer `
官网 https://weixin.qq.com/
后台 https://mp.weixin.qq.com/
文档 https://developers.weixin.qq.com/miniprogram/dev/api/

View File

@ -5,8 +5,6 @@ import (
"crypto/cipher"
"crypto/sha1"
"encoding/base64"
"encoding/hex"
"sort"
"strings"
ice "shylinux.com/x/icebergs"
@ -20,35 +18,40 @@ const BOT = "bot"
func init() {
Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
BOT: {Name: "bot", Help: "机器人", Value: kit.Data(
kit.MDB_SHORT, "name", kit.MDB_FIELD, "time,name,token,ekey,hook",
kit.MDB_SHORT, kit.MDB_NAME, kit.MDB_FIELD, "time,name,token,ekey,hook",
)},
}, Commands: map[string]*ice.Command{
ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Load() }},
ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Save() }},
web.WEB_LOGIN: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {}},
"/bot/": {Name: "/bot", Help: "机器人", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
"/bot/": {Name: "/bot/", Help: "机器人", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
msg := m.Cmd(BOT, arg[0])
list := []string{msg.Append("token"), m.Option("nonce"), m.Option("timestamp"), m.Option("echostr")}
sort.Strings(list)
res := sha1.Sum([]byte(strings.Join(list, "")))
m.Debug(hex.EncodeToString(res[:]))
check := kit.Sort([]string{msg.Append("token"), m.Option("nonce"), m.Option("timestamp"), m.Option("echostr")})
sig := kit.Format(sha1.Sum([]byte(strings.Join(check, ""))))
m.Debug("what %v", sig)
m.Debug("what %v", check)
if m.Warn(sig != m.Option("msg_signature"), ice.ErrNotRight) {
// return
}
aeskey, err := base64.StdEncoding.DecodeString(msg.Append("ekey"))
m.Debug("what %v", msg.Append("ekey"))
aeskey, err := base64.RawURLEncoding.DecodeString(msg.Append("ekey"))
m.Assert(err)
en_msg, err := base64.StdEncoding.DecodeString(m.Option("echostr"))
en_msg, err := base64.RawURLEncoding.DecodeString(m.Option("echostr"))
m.Assert(err)
block, err := aes.NewCipher(aeskey)
m.Assert(err)
mode := cipher.NewCBCDecrypter(block, aeskey[:aes.BlockSize])
mode.CryptBlocks(en_msg, en_msg)
}},
BOT: {Name: "bot name chat text:textarea auto create", Help: "机器人", Action: ice.MergeAction(map[string]*ice.Action{
mdb.CREATE: {Name: "create name token ekey hook", Help: "创建"},
mdb.CREATE: {Name: "create name token ekey hook", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(web.SPIDE, mdb.CREATE, m.Option("name"), m.Option("hook"))
m.Cmdy(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, arg)
}},
}, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if mdb.HashSelect(m, arg...); len(arg) > 2 {
m.SetAppend()
m.Cmd(web.SPIDE, mdb.CREATE, arg[0], m.Append("hook"))
m.Cmdy(web.SPIDE, arg[0], "", kit.Format(kit.Dict(
"chatid", arg[1], "msgtype", "text", "text.content", arg[2],
)))

View File

@ -6,6 +6,8 @@ import (
"shylinux.com/x/icebergs/core/chat"
)
var Index = &ice.Context{Name: "wework", Help: "企业微信"}
const WEWORK = "wework"
var Index = &ice.Context{Name: WEWORK, Help: "企业微信"}
func init() { chat.Index.Register(Index, &web.Frame{}) }

View File

@ -21,6 +21,7 @@ func _wx_sign(m *ice.Message, nonce, stamp string) string {
kit.Format("noncestr=%s", nonce),
}), "&"))))
}
func _wx_config(m *ice.Message, nonce string) {
m.Option(APPID, m.Config(APPID))
m.Option(ssh.SCRIPT, m.Config(ssh.SCRIPT))
@ -36,7 +37,6 @@ const (
EXPIRES = "expires"
)
const (
WEIXIN = "weixin"
ERRCODE = "errcode"
ERRMSG = "errmsg"
)
@ -51,7 +51,7 @@ func init() {
)},
}, Commands: map[string]*ice.Command{
ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Cmd(web.SPIDE, mdb.CREATE, WEIXIN, m.Config(tcp.SERVER))
m.Cmd(web.SPIDE, mdb.CREATE, WX, m.Conf(ACCESS, kit.Keym(tcp.SERVER)))
}},
ACCESS: {Name: "access appid auto ticket token login", Help: "认证", Action: map[string]*ice.Action{
LOGIN: {Name: "login appid appmm token", Help: "登录", Hand: func(m *ice.Message, arg ...string) {
@ -61,7 +61,7 @@ func init() {
}},
TOKEN: {Name: "token", Help: "令牌", Hand: func(m *ice.Message, arg ...string) {
if now := time.Now().Unix(); m.Config(TOKEN) == "" || now > kit.Int64(m.Config(EXPIRE)) {
msg := m.Cmd(web.SPIDE, WEIXIN, web.SPIDE_GET, "/cgi-bin/token?grant_type=client_credential",
msg := m.Cmd(web.SPIDE, WX, web.SPIDE_GET, "/cgi-bin/token?grant_type=client_credential",
APPID, m.Config(APPID), "secret", m.Config(APPMM))
if m.Warn(msg.Append(ERRCODE) != "", msg.Append(ERRCODE), msg.Append(ERRMSG)) {
return
@ -74,7 +74,7 @@ func init() {
}},
TICKET: {Name: "ticket", Help: "票据", Hand: func(m *ice.Message, arg ...string) {
if now := time.Now().Unix(); m.Conf(TICKET) == "" || now > kit.Int64(m.Config(EXPIRES)) {
msg := m.Cmd(web.SPIDE, WEIXIN, web.SPIDE_GET, "/cgi-bin/ticket/getticket?type=jsapi", "access_token", m.Cmdx(ACCESS, TOKEN))
msg := m.Cmd(web.SPIDE, WX, web.SPIDE_GET, "/cgi-bin/ticket/getticket?type=jsapi", "access_token", m.Cmdx(ACCESS, TOKEN))
if m.Warn(msg.Append(ERRCODE) != "0", msg.Append(ERRCODE), msg.Append(ERRMSG)) {
return
}
@ -88,7 +88,7 @@ func init() {
_wx_config(m, "some")
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Echo(kit.Formats(m.Confv(ACCESS)))
m.Echo(m.Config(APPID))
}},
}})
}

View File

@ -8,11 +8,20 @@ import (
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/web"
"shylinux.com/x/icebergs/core/wiki"
kit "shylinux.com/x/toolkits"
)
func _wx_check(m *ice.Message) bool {
check := kit.Sort([]string{m.Conf(ACCESS, "meta.tokens"), m.Option("timestamp"), m.Option("nonce")})
if sig := kit.Format(sha1.Sum([]byte(strings.Join(check, "")))); m.Warn(sig != m.Option("signature"), ice.ErrNotRight) {
return false // 验证失败
}
if m.Option("echostr") != "" {
m.RenderResult(m.Option("echostr"))
return false // 绑定验证
}
return true
}
func _wx_parse(m *ice.Message) {
data := struct {
FromUserName string
@ -40,38 +49,6 @@ func _wx_reply(m *ice.Message, tmpl string) {
m.Set(ice.MSG_RESULT).RenderResult(string(res))
}
}
func _wx_action(m *ice.Message) {
m.Set(ice.MSG_RESULT).RenderResult()
m.Echo(`<xml>
<FromUserName><![CDATA[%s]]></FromUserName>
<ToUserName><![CDATA[%s]]></ToUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
`, m.Option("ToUserName"), m.Option("FromUserName"), m.Option("CreateTime"), "news")
count := 0
m.Table(func(index int, value map[string]string, head []string) { count++ })
m.Echo(`<ArticleCount>%d</ArticleCount>`, count)
share := m.Cmdx(web.SHARE, mdb.CREATE, kit.MDB_TYPE, web.LOGIN)
m.Echo(`<Articles>`)
m.Table(func(index int, value map[string]string, head []string) {
m.Echo(`<item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item>
`, value[wiki.TITLE], value[wiki.SPARK], value[wiki.IMAGE],
kit.MergeURL(kit.Format(value[wiki.REFER]), web.SHARE, share))
})
m.Echo(`</Articles>`)
m.Echo(`</xml>`)
m.Debug("echo: %v", m.Result())
}
const LOGIN = "login"
@ -80,13 +57,8 @@ func init() {
LOGIN: {Name: LOGIN, Help: "登录", Value: kit.Data()},
}, Commands: map[string]*ice.Command{
"/login/": {Name: "/login/", Help: "认证", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
check := kit.Sort([]string{m.Conf(ACCESS, "meta.tokens"), m.Option("timestamp"), m.Option("nonce")})
if sig := kit.Format(sha1.Sum([]byte(strings.Join(check, "")))); m.Warn(sig != m.Option("signature"), ice.ErrNotRight) {
return // 验证失败
}
if m.Option("echostr") != "" {
m.RenderResult(m.Option("echostr"))
return // 绑定验证
if !_wx_check(m) {
return // 验签失败
}
// 解析数据

View File

@ -3,9 +3,44 @@ package wx
import (
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/web"
"shylinux.com/x/icebergs/core/wiki"
kit "shylinux.com/x/toolkits"
)
func _wx_action(m *ice.Message) {
m.Set(ice.MSG_RESULT).RenderResult()
m.Echo(`<xml>
<FromUserName><![CDATA[%s]]></FromUserName>
<ToUserName><![CDATA[%s]]></ToUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
`, m.Option("ToUserName"), m.Option("FromUserName"), m.Option("CreateTime"), "news")
count := 0
m.Table(func(index int, value map[string]string, head []string) { count++ })
m.Echo(`<ArticleCount>%d</ArticleCount>`, count)
share := m.Cmdx(web.SHARE, mdb.CREATE, kit.MDB_TYPE, web.LOGIN)
m.Echo(`<Articles>`)
m.Table(func(index int, value map[string]string, head []string) {
m.Echo(`<item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item>
`, value[wiki.TITLE], value[wiki.SPARK], value[wiki.IMAGE],
kit.MergeURL(kit.Format(value[wiki.REFER]), web.SHARE, share))
})
m.Echo(`</Articles>`)
m.Echo(`</xml>`)
m.Debug("echo: %v", m.Result())
}
const MENU = "menu"
func init() {

View File

@ -8,13 +8,6 @@ import (
const WX = "wx"
var Index = &ice.Context{Name: WX, Help: "公众号", Commands: map[string]*ice.Command{
ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Load()
}},
ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Save()
}},
}}
var Index = &ice.Context{Name: WX, Help: "公众号"}
func init() { chat.Index.Register(Index, &web.Frame{}) }

View File

@ -23,6 +23,9 @@ field "共享" web.share
field "会话" aaa.sess
field "用户" aaa.user
chapter "企业微信"
field "机器人" web.chat.wework.bot
chapter "项目"
field "源代码" web.code.inner args `usr/icebergs/ misc/wx/wx.go`
field "趋势图" web.code.git.trend args `icebergs`

View File

@ -26,7 +26,7 @@ func Render(m *Message, cmd string, args ...interface{}) string {
break
}
list := []string{}
for _, k := range kit.Split(strings.ToLower(kit.Join(arg))) {
for _, k := range kit.Split(kit.Join(arg)) {
list = append(list, kit.Format(`<input type="button" name="%s" value="%s">`,
k, kit.Select(k, kit.Value(m._cmd.Meta, kit.Keys("_trans", k)), m.Option(MSG_LANGUAGE) != "en")))
}

View File

@ -105,6 +105,12 @@ func (c *Context) Merge(s *Context) *Context {
if c.Commands == nil {
c.Commands = map[string]*Command{}
}
if c.Commands[CTX_INIT] == nil {
c.Commands[CTX_INIT] = &Command{Hand: func(m *Message, c *Context, cmd string, arg ...string) { m.Load() }}
}
if c.Commands[CTX_EXIT] == nil {
c.Commands[CTX_EXIT] = &Command{Hand: func(m *Message, c *Context, cmd string, arg ...string) { m.Save() }}
}
for k, v := range s.Commands {
if o, ok := c.Commands[k]; ok && s != c {
func() {