Compare commits
No commits in common. "master" and "v1.0.6" have entirely different histories.
|
@ -1,30 +0,0 @@
|
|||
package sql
|
||||
|
||||
import "strings"
|
||||
|
||||
// key,value To like sql
|
||||
func Like(key, val string) string {
|
||||
if val == "" {
|
||||
return ""
|
||||
}
|
||||
key = strings.TrimSpace(key)
|
||||
val = strings.TrimSpace(val)
|
||||
return key + " LIKE '%" + val + "%'"
|
||||
}
|
||||
|
||||
// map strings to like sqls
|
||||
func Likes(in map[string]string) string {
|
||||
var ar []string
|
||||
for key, val := range in {
|
||||
sql := Like(key, val)
|
||||
if sql != "" {
|
||||
ar = append(ar, sql)
|
||||
}
|
||||
}
|
||||
|
||||
if len(ar) == 0 {
|
||||
return ""
|
||||
}
|
||||
|
||||
return strings.Join(ar, " AND ")
|
||||
}
|
|
@ -24,15 +24,14 @@ func NewPostgreSql(dsn string, options *types.SqlOptions) (*gorm.DB, error) {
|
|||
}
|
||||
|
||||
//控制台和文件同时输出日志
|
||||
//var newLogger = setLogger(vars.ServiceKey, options.LogStdout)
|
||||
var newLogger = setLogger(vars.ServiceKey, options.LogStdout)
|
||||
|
||||
gormDb, err := gorm.Open(postgres.New(postgres.Config{
|
||||
DSN: dsn,
|
||||
// PreferSimpleProtocol: true, disables implicit prepared statement usage
|
||||
|
||||
}), &gorm.Config{
|
||||
//Logger:newLogger,
|
||||
DisableForeignKeyConstraintWhenMigrating: true,
|
||||
Logger: newLogger,
|
||||
NamingStrategy: schema.NamingStrategy{
|
||||
SingularTable: true, // 使用单数表名,启用该选项,此时,`User` 的表名应该是 `t_user`
|
||||
}})
|
||||
|
|
|
@ -6,6 +6,7 @@ import (
|
|||
"crypto/cipher"
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
|
@ -21,29 +22,28 @@ var (
|
|||
JwtSecretLen int
|
||||
)
|
||||
|
||||
func New(token string) {
|
||||
JwtSecret = []byte(token)
|
||||
func New() {
|
||||
JwtSecret = []byte(env.MeshEnv.JwtSecretKey)
|
||||
JwtSecretLen = len(env.MeshEnv.JwtSecretKey)
|
||||
}
|
||||
|
||||
func GenerateTokenAes(id uint, identity, client, role string, owner any, extend map[string]string) (string, error) {
|
||||
func GenerateTokenAes(id uint, identity, client, role string, extend map[string]string) (string, error) {
|
||||
if (JwtSecretLen == 16 || JwtSecretLen == 24 || JwtSecretLen == 32) == false {
|
||||
return "", exception.ErrAuthSecret
|
||||
return "", errors.New("JwtSecret lenght must 16/24/32.")
|
||||
}
|
||||
expireTime := time.Now().Add(vars.JwtExpireDay)
|
||||
claims := types.JwtClaims{
|
||||
ID: id,
|
||||
Identity: identity,
|
||||
Client: client,
|
||||
Extend: extend,
|
||||
Owner: owner,
|
||||
Client: client,
|
||||
Role: role,
|
||||
ExpiresAt: expireTime.Unix(),
|
||||
}
|
||||
|
||||
byte, err := json.Marshal(claims)
|
||||
if err != nil {
|
||||
return "", exception.ErrJsonEncode
|
||||
return "", err
|
||||
}
|
||||
|
||||
token, err := AesEncryptCBC(byte)
|
||||
|
@ -57,10 +57,7 @@ func AesEncryptCBC(plan []byte) (string, error) {
|
|||
|
||||
// 分组秘钥
|
||||
// NewCipher该函数限制了输入k的长度必须为16, 24或者32
|
||||
block, err := aes.NewCipher(JwtSecret)
|
||||
if err != nil {
|
||||
return "", exception.ErrAuthSecret
|
||||
}
|
||||
block, _ := aes.NewCipher(JwtSecret)
|
||||
// 获取秘钥块的长度
|
||||
blockSize := block.BlockSize()
|
||||
// 补全码
|
||||
|
@ -76,17 +73,17 @@ func AesEncryptCBC(plan []byte) (string, error) {
|
|||
|
||||
func AesDecryptCBC(cryted string) (b []byte, err error) {
|
||||
if (JwtSecretLen == 16 || JwtSecretLen == 24 || JwtSecretLen == 32) == false {
|
||||
return nil, exception.ErrAuthSecret
|
||||
return b, errors.New("JwtSecret lenght must 16/24/32.")
|
||||
}
|
||||
// 转成字节数组
|
||||
crytedByte, err := base64.StdEncoding.DecodeString(cryted)
|
||||
if err != nil {
|
||||
return nil, exception.ErrBase64Decode
|
||||
return
|
||||
}
|
||||
// 分组秘钥
|
||||
block, err := aes.NewCipher(JwtSecret)
|
||||
if err != nil {
|
||||
return nil, exception.ErrAuthSecret
|
||||
return
|
||||
}
|
||||
// 获取秘钥块的长度
|
||||
blockSize := block.BlockSize()
|
||||
|
|
|
@ -14,32 +14,11 @@ var MeshEnv *types.MeshEnv = nil
|
|||
func NewEnv() *types.MeshEnv {
|
||||
if MeshEnv == nil {
|
||||
MeshEnv = &types.MeshEnv{
|
||||
Workspace: GetEnvDefault("BlocksMesh_Workspace", "def"),
|
||||
Workspace: GetEnvDefault("BlocksMesh_Workspace", "bsm"),
|
||||
Prefix: GetEnvDefault("BlocksMesh_Prefix", utils.GetCurrentPath()),
|
||||
JwtSecretKey: GetEnvDefault("BlocksMesh_JwtSecretKey", "Cblocksmesh2022C"),
|
||||
RuntimeMode: strings.ToLower(GetEnvDefault("BlocksMesh_RuntimeMode", "dev")),
|
||||
}
|
||||
|
||||
if MeshEnv.RuntimeMode == "dev" {
|
||||
MeshEnv.Prefix = GetEnvDefault("BlocksMesh_Prefix", utils.GetCurrentPath())
|
||||
} else {
|
||||
MeshEnv.Prefix = GetEnvDefault("BlocksMesh_Prefix", "/usr/local/bsm")
|
||||
}
|
||||
}
|
||||
return MeshEnv
|
||||
}
|
||||
|
||||
// get system base env.
|
||||
func NewBaseEnv() *types.MeshEnv {
|
||||
if MeshEnv == nil {
|
||||
MeshEnv = &types.MeshEnv{
|
||||
RuntimeMode: strings.ToLower(GetEnvDefault("BlocksMesh_RuntimeMode", "dev")),
|
||||
}
|
||||
|
||||
if MeshEnv.RuntimeMode == "dev" {
|
||||
MeshEnv.Prefix = GetEnvDefault("BlocksMesh_Prefix", utils.GetCurrentPath())
|
||||
} else {
|
||||
MeshEnv.Prefix = GetEnvDefault("BlocksMesh_Prefix", "/usr/local/bsm")
|
||||
}
|
||||
}
|
||||
return MeshEnv
|
||||
}
|
||||
|
|
|
@ -2,8 +2,7 @@ package exception
|
|||
|
||||
// jwt custom error code ,begin:200
|
||||
var (
|
||||
ErrAuthSecret = Errorf(200, "Auth JwtSecret Error")
|
||||
ErrBase64Decode = Errorf(201, "Auth Token Base64 Decode Error")
|
||||
ErrAuthPasswd = Errorf(201, "Password Error")
|
||||
ErrAuthNotFound = Errorf(202, "Auth Token Not Found")
|
||||
ErrAuthParseFail = Errorf(203, "Auth Parse Fail")
|
||||
ErrAuthId = Errorf(204, "Auth Id Not Passed")
|
||||
|
@ -11,8 +10,5 @@ var (
|
|||
ErrAuthTokenChanged = Errorf(206, "Auth Token Changed")
|
||||
ErrAuthIdType = Errorf(207, "Auth Id Type Error")
|
||||
ErrAuthExpire = Errorf(208, "Auth Token Expire")
|
||||
ErrAuthClient = Errorf(209, "Auth Token Client Not Passed")
|
||||
ErrJsonDecode = Errorf(210, "Auth JSON Decode Error")
|
||||
ErrJsonEncode = Errorf(211, "Auth JSON Encode Error")
|
||||
ErrAccountNotFound = Errorf(202, "Account Not Found")
|
||||
ErrAuthClient = Errorf(208, "Auth Token Client Not Passed")
|
||||
)
|
||||
|
|
|
@ -28,11 +28,8 @@ var (
|
|||
ErrUnauthenticated = Errorf(16, "Unauthenticated")
|
||||
ErrJSONMarshal = Errorf(17, "Marshal JSON")
|
||||
ErrJSONUnmarshal = Errorf(18, "Unmarshal JSON")
|
||||
ErrPasswd = Errorf(19, "Password Error")
|
||||
|
||||
ErrSmsCode = Errorf(20, "SMS Code Invalid")
|
||||
ErrIdArgument = Errorf(30, "ID Invalid Argument")
|
||||
ErrIdentityArgument = Errorf(31, "Identity Invalid Argument")
|
||||
|
||||
// coustom error status
|
||||
)
|
||||
|
|
|
@ -2,11 +2,12 @@ package service
|
|||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"strings"
|
||||
|
||||
"git.apinb.com/bsm-sdk/engine/encipher"
|
||||
"git.apinb.com/bsm-sdk/engine/exception"
|
||||
"git.apinb.com/bsm-sdk/engine/types"
|
||||
"git.apinb.com/bsm-sdk/engine/utils"
|
||||
"google.golang.org/grpc/metadata"
|
||||
)
|
||||
|
||||
|
@ -23,23 +24,27 @@ func ParseMetaCtx(ctx context.Context, opts *ParseOptions) (*types.JwtClaims, er
|
|||
return nil, exception.ErrAuthNotFound
|
||||
}
|
||||
|
||||
var Authorizations []string = md.Get("authorization_claims")
|
||||
var Authorizations []string = md.Get("authorization")
|
||||
if len(Authorizations) == 0 || Authorizations[0] == "" {
|
||||
return nil, exception.ErrAuthNotFound
|
||||
}
|
||||
|
||||
var claims types.JwtClaims
|
||||
err := json.Unmarshal([]byte(Authorizations[0]), &claims)
|
||||
claims, err := encipher.ParseTokenAes(Authorizations[0])
|
||||
if err != nil {
|
||||
return nil, exception.ErrAuthParseFail
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if opts != nil {
|
||||
if !strings.Contains(claims.Role, opts.RoleValue) {
|
||||
return nil, exception.ErrPermissionDenied
|
||||
}
|
||||
if opts.MustPrivateAllow {
|
||||
if utils.IsPublicIP(claims.Client) {
|
||||
return nil, exception.ErrPermissionDenied
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return &claims, nil
|
||||
return claims, nil
|
||||
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@ import (
|
|||
|
||||
"git.apinb.com/bsm-sdk/engine/cmd"
|
||||
"git.apinb.com/bsm-sdk/engine/configure"
|
||||
"git.apinb.com/bsm-sdk/engine/encipher"
|
||||
"git.apinb.com/bsm-sdk/engine/env"
|
||||
"git.apinb.com/bsm-sdk/engine/print"
|
||||
"git.apinb.com/bsm-sdk/engine/vars"
|
||||
|
@ -22,6 +23,8 @@ func Register(srvKey string, cfg any) {
|
|||
// open side cmd.
|
||||
cmd.NewCmd()
|
||||
|
||||
encipher.New()
|
||||
|
||||
print.Info("[Blocks Service] %s Starting...", vars.ServiceKey)
|
||||
|
||||
// set config args.
|
||||
|
@ -34,7 +37,7 @@ func Register(srvKey string, cfg any) {
|
|||
// get config file.
|
||||
cf := fmt.Sprintf("%s_%s.yaml", srvKey, env.MeshEnv.RuntimeMode)
|
||||
cf = filepath.Join(env.MeshEnv.Prefix, "etc", cf)
|
||||
print.Info("[Blocks Service] %s Config File: %s", vars.ServiceKey, cf)
|
||||
|
||||
configure.LoadYamlFile(cf, args, cfg)
|
||||
|
||||
return
|
||||
|
|
40
types/db.go
40
types/db.go
|
@ -18,54 +18,48 @@ type (
|
|||
Debug bool
|
||||
}
|
||||
|
||||
// standard ID,Identity definition.
|
||||
Std_IDIdentity struct {
|
||||
ID uint `gorm:"primarykey;" json:"id"`
|
||||
Identity string `gorm:"column:identity;type:varchar(36);uniqueIndex;" json:"identity"` // 唯一标识,24位NanoID,36位为ULID
|
||||
}
|
||||
|
||||
// standard ID,Created,Updated,Deleted definition.
|
||||
Std_IICUDS struct {
|
||||
ID uint `gorm:"primarykey;" json:"id"`
|
||||
Identity string `gorm:"column:identity;type:varchar(36);uniqueIndex;" json:"identity"` // 唯一标识,24位NanoID,36位为ULID
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index;" json:"deleted_at"`
|
||||
Status int8 `gorm:"default:0;index;" json:"status"` // 状态:默认为0,-1禁止,1为正常
|
||||
ID uint `gorm:"primarykey;"`
|
||||
Identity string `gorm:"column:identity;type:varchar(36);uniqueIndex;"` // 唯一标识,24位NanoID,36位为UUID
|
||||
CreatedAt time.Time
|
||||
UpdatedAt time.Time
|
||||
DeletedAt gorm.DeletedAt `gorm:"index";`
|
||||
Status int8 `gorm:"default:0;index;"` // 状态:默认为0,-1禁止,1为正常
|
||||
}
|
||||
|
||||
// standard ID,Identity,Created,Updated,Deleted,Status definition.
|
||||
Std_ICUD struct {
|
||||
ID uint `gorm:"primarykey;" json:"id"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index;" json:"deleted_at"`
|
||||
ID uint `gorm:"primarykey;"`
|
||||
CreatedAt time.Time
|
||||
UpdatedAt time.Time
|
||||
DeletedAt gorm.DeletedAt `gorm:"index"`
|
||||
}
|
||||
|
||||
// standard ID,Created definition.
|
||||
Std_IdCreated struct {
|
||||
ID uint `gorm:"primarykey;" json:"id"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
ID uint `gorm:"primarykey;"`
|
||||
CreatedAt time.Time
|
||||
}
|
||||
|
||||
// standard PassportID,PassportIdentity definition.
|
||||
Std_Passport struct {
|
||||
PassportID uint `gorm:"column:passport_id;Index;" json:"passport_id"`
|
||||
PassportIdentity string `gorm:"column:passport_identity;type:varchar(36);Index;" json:"passport_identity"` // 用户唯一标识,24位NanoID,36位为ULID
|
||||
PassportID uint `gorm:"column:passport_id;Index;"`
|
||||
PassportIdentity string `gorm:"column:passport_identity;type:varchar(36);Index;"` // 用户唯一标识,24位NanoID,36位为UUID
|
||||
}
|
||||
|
||||
// standard ID definition.
|
||||
Std_ID struct {
|
||||
ID uint `gorm:"primarykey;" json:"id"`
|
||||
ID uint `gorm:"primarykey;"`
|
||||
}
|
||||
|
||||
// standard Identity definition.
|
||||
Std_Identity struct {
|
||||
Identity string `gorm:"column:identity;type:varchar(36);uniqueIndex;" json:"identity"` // 唯一标识,24位NanoID,36位为ULID
|
||||
Identity string `gorm:"column:identity;type:varchar(36);uniqueIndex;"` // 唯一标识,24位NanoID,36位为UUID
|
||||
}
|
||||
|
||||
// standard Status definition.
|
||||
Std_Status struct {
|
||||
Status int8 `gorm:"default:0;index;" json:"status"` // 状态:默认为0,-1禁止,1为正常
|
||||
Status int8 `gorm:"default:0;index;"` // 状态:默认为0,-1禁止,1为正常
|
||||
}
|
||||
)
|
||||
|
|
|
@ -10,7 +10,6 @@ type JwtClaims struct {
|
|||
Identity string `json:"identity"`
|
||||
Extend map[string]string `json:"extend"`
|
||||
Client string `json:"client"`
|
||||
Owner any `json:"owner"`
|
||||
Role string `json:"role"`
|
||||
ExpiresAt int64 `json:"exp"`
|
||||
}
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
package types
|
||||
|
||||
type Etcd struct {
|
||||
Endpoints []string `json:"Endpoints"`
|
||||
Tls EtcdTls `json:"Tls,optional"`
|
||||
Endpoints []string `json:"endpoints"`
|
||||
Tls EtcdTls `json:",optional"`
|
||||
}
|
||||
|
||||
type EtcdTls struct {
|
||||
Ca string `json:"Ca,optional"`
|
||||
Cert string `json:"Cert,optional"`
|
||||
CertKey string `json:"CertKey,optional" `
|
||||
Ca string `json:"ca,optional"`
|
||||
Cert string `json:"cert,optional"`
|
||||
CertKey string `json:"cert_key,optional" `
|
||||
}
|
||||
|
|
56
types/mcs.go
56
types/mcs.go
|
@ -1,56 +0,0 @@
|
|||
package types
|
||||
|
||||
type Message struct {
|
||||
TimeSequence int64 //消息创建的时间戳
|
||||
SessionIdent string // 会话唯一标识
|
||||
SenderId int64
|
||||
SenderIdentity string
|
||||
TargetId int64
|
||||
TargetIdentity string
|
||||
GroupId int64 //群组唯一ID,在群聊消息的时候使用到。不使用时则为空
|
||||
GroupIdentity string //群组唯一码,在群聊消息的时候使用到。不使用时则为空
|
||||
MsgType int32 //0异常提示,1单聊,2群聊,3系统
|
||||
BodyType int32 //正文类型:0文本,1图片,2,视频,3.....
|
||||
Body string
|
||||
Status int32 //消息状态:0待续,1存储成功,2送达确认,3已读确认,-1撤回
|
||||
}
|
||||
|
||||
type ChatMessage struct {
|
||||
TimeSequence int64 //消息创建的时间戳
|
||||
SessionIdent string // 会话唯一标识
|
||||
SenderId int64
|
||||
SenderIdentity string
|
||||
TargetId int64
|
||||
TargetIdentity string
|
||||
BodyType int32 //正文类型:0文本,1图片,2,视频,3.....
|
||||
Body string
|
||||
Status int32 //消息状态:0待续,1存储成功,2送达确认,3已读确认,-1撤回
|
||||
}
|
||||
|
||||
type GroupMessage struct {
|
||||
TimeSequence int64 //消息创建的时间戳
|
||||
GroupId int64 //群组唯一ID,在群聊消息的时候使用到。不使用时则为空
|
||||
GroupIdentity string //群组唯一标识,在群聊消息的时候使用到。不使用时则为空
|
||||
SenderId int64
|
||||
SenderIdentity string
|
||||
BodyType int32 //正文类型:0文本,1图片,2,视频,3.....
|
||||
Body string
|
||||
Status int32 //消息状态:0待续,1存储成功,2送达确认,3已读确认,-1撤回
|
||||
}
|
||||
|
||||
type SystemMessage struct {
|
||||
TimeSequence int64 //消息创建的时间戳
|
||||
TargetId int64
|
||||
TargetIdentity string
|
||||
BodyType int32 //正文类型:0文本,1图片,2,视频,3.....
|
||||
Body string
|
||||
Status int32 //消息状态:0待续,1存储成功,2送达确认,3已读确认,-1撤回
|
||||
}
|
||||
|
||||
type EventMessage struct {
|
||||
TimeSequence int64 //消息创建的时间戳
|
||||
TargetId int64
|
||||
TargetIdentity string
|
||||
EventType int32 //事件类型:0 正在输入,已送达...
|
||||
Status int32 //消息状态:0待续,1存储成功,2送达确认,3已读确认,-1撤回
|
||||
}
|
|
@ -1,10 +1,26 @@
|
|||
package utils
|
||||
|
||||
import (
|
||||
ulid "github.com/oklog/ulid/v2"
|
||||
"strconv"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"github.com/jaevor/go-nanoid"
|
||||
)
|
||||
|
||||
// remove nanoid,uuid,replace to ulid
|
||||
func ULID() string {
|
||||
return ulid.Make().String()
|
||||
func NanoID() string {
|
||||
nanoid, _ := nanoid.CustomASCII("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", 21)
|
||||
return nanoid()
|
||||
}
|
||||
|
||||
func NanoIDInt() (id int64, err error) {
|
||||
decenaryID, err := nanoid.CustomASCII("0123456789", 20)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
id, err = strconv.ParseInt(decenaryID(), 10, 64)
|
||||
return
|
||||
}
|
||||
|
||||
func UUID() string {
|
||||
return uuid.NewString()
|
||||
}
|
||||
|
|
|
@ -99,7 +99,7 @@ func HttpPost(url string, header map[string]string, data []byte) ([]byte, error)
|
|||
}
|
||||
|
||||
request.Header.Set("Content-Type", "application/json;charset=UTF-8")
|
||||
request.Header.Set("Request-Id", ULID())
|
||||
request.Header.Set("Request-Id", NanoID())
|
||||
|
||||
for key, val := range header {
|
||||
request.Header.Set(key, val)
|
||||
|
|
|
@ -1,8 +0,0 @@
|
|||
package vars
|
||||
|
||||
const (
|
||||
// NormalStatus .
|
||||
NormalStatus = 1
|
||||
// DisabledStatus .
|
||||
DisabledStatus = -1
|
||||
)
|
Loading…
Reference in New Issue