diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..2611ece7e --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,89 @@ +name: ci + +on: + push: + branches: + - "*" + pull_request: + types: [opened, reopened] + +jobs: + ci: + name: Test with go ${{ matrix.go_version }} on ${{ matrix.os }} + runs-on: ${{ matrix.os }} + environment: + name: ci + + strategy: + matrix: + go_version: ["1.17", "1.18", "1.19", "1.20"] + os: [ubuntu-latest] + + services: + mysql: + image: mysql:8.0 + env: + MYSQL_ROOT_PASSWORD: openIM123 + MYSQL_DATABASE: openim_v2 + ports: + - 13306:3306 + options: >- + --health-cmd="mysqladmin ping" + --health-interval=10s + --health-timeout=5s + --health-retries=3 + + mongo: + image: mongo:latest + env: + MONGO_INITDB_ROOT_USERNAME: root + MONGO_INITDB_ROOT_PASSWORD: openIM123 + ports: + - 37017:27017 + options: >- + --health-cmd "echo 'db.runCommand("ping").ok' | mongosh --quiet" + --health-interval=10s + --health-timeout=5s + --health-retries=3 + + # redis: + # image: redis:latest + # ports: + # - 16379:6379 + # options: >- + # --health-cmd="redis-cli ping" + # --health-interval=10s + # --health-timeout=5s + # --health-retries=3 + + etcd: + image: quay.io/coreos/etcd:v3.4.15 + ports: + - 2379:2379 + - 2380:2380 + options: >- + --health-cmd="etcdctl --endpoints=http://localhost:2379 member list" + --health-interval=10s + --health-timeout=5s + --health-retries=3 + + steps: + - uses: getong/redis-action@v1 + with: + host port: 16379 # Optional, default value is 6379. The port of host + redis password: "openIM123" # Optional, default is empty + + - name: Set up Go ${{ matrix.go_version }} + uses: actions/setup-go@v3 + with: + go-version: ${{ matrix.go_version}} + id: go + + - name: Check out code into the Go module directory + uses: actions/checkout@v3 + + - name: Install dependencies + run: go mod tidy + + - name: Run tests + run: go test ./... diff --git a/.gitignore b/.gitignore index 858985e64..b1c4dde76 100644 --- a/.gitignore +++ b/.gitignore @@ -2,9 +2,7 @@ bin logs .devcontainer components -logs out-test -.github .idea diff --git a/README.md b/README.md index 5703f5254..61181648f 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ -# Open-IM-Server +# Open-IM-Server ![avatar](https://github.com/OpenIMSDK/OpenIM-Docs/blob/main/docs/images/WechatIMG20.jpeg) ![avatar](https://github.com/OpenIMSDK/Open-IM-Server/blob/main/docs/open-im-logo.png) -[![LICENSE](https://img.shields.io/badge/license-Apache--2.0-green)](https://github.com/OpenIMSDK/Open-IM-Server/blob/main/LICENSE) [![Language](https://img.shields.io/badge/Language-Go-blue.svg)](https://golang.org/) +[![LICENSE](https://img.shields.io/badge/license-Apache--2.0-green)](https://github.com/OpenIMSDK/Open-IM-Server/blob/main/LICENSE) [![Language](https://img.shields.io/badge/Language-Go-blue.svg)](https://golang.org/) ![CI](https://github.com/OpenIMSDK/Open-IM-Server/actions/workflows/main.yml/badge.svg) ## Open-IM-Server: Open source Instant Messaging Server @@ -50,26 +50,26 @@ By deployment of the Open-IM-Server on the customer's server, developers can int ``` #cd Open-IM-server - USER=root + USER=root PASSWORD=openIM123 #Password with more than 8 digits, excluding special characters ENDPOINT=http://127.0.0.1:10005 #Replace 127.0.0.1 with Internet IP - DATA_DIR=./ + DATA_DIR=./ ``` 2. Deploy && Start - + ``` chmod +x install_im_server.sh; ./install_im_server.sh; ``` - + 4. Check service - + ``` cd script; ./docker_check_service.sh./check_all.sh ``` - + ![OpenIMServersonSystempng](https://github.com/OpenIMSDK/Open-IM-Server/blob/main/docs/Open-IM-Servers-on-System.png) #### Deploy using source code @@ -78,7 +78,7 @@ By deployment of the Open-IM-Server on the customer's server, developers can int 2. Clone ```shell -git clone https://github.com/OpenIMSDK/Open-IM-Server.git --recursive +git clone https://github.com/OpenIMSDK/Open-IM-Server.git --recursive cd cmd/Open-IM-SDK-Core git checkout main ``` @@ -139,7 +139,7 @@ all services build success - start_all.sh&&stop_all.sh - Total script, start all services and close all services -## Authentication Clow Chart +## Authentication Clow Chart ![avatar](https://github.com/OpenIMSDK/Open-IM-Server/blob/main/docs/open-im-server.png) diff --git a/cmd/open_im_cms_api/main.go b/cmd/open_im_cms_api/main.go index 0e42781e1..e5be8f226 100644 --- a/cmd/open_im_cms_api/main.go +++ b/cmd/open_im_cms_api/main.go @@ -25,6 +25,6 @@ func main() { address = config.Config.Api.ListenIP + ":" + strconv.Itoa(*ginPort) } address = config.Config.CmsApi.ListenIP + ":" + strconv.Itoa(*ginPort) - fmt.Println("start cms api server, address: ", address, ", OpenIM version: ", constant.CurrentVersion, "\n") + fmt.Println("start cms api server, address: ", address, ", OpenIM version: ", constant.CurrentVersion) router.Run(address) } diff --git a/cmd/open_im_demo/main.go b/cmd/open_im_demo/main.go index 56d76a7b7..98541cd99 100644 --- a/cmd/open_im_demo/main.go +++ b/cmd/open_im_demo/main.go @@ -70,7 +70,7 @@ func main() { address = config.Config.Api.ListenIP + ":" + strconv.Itoa(*ginPort) } address = config.Config.CmsApi.ListenIP + ":" + strconv.Itoa(*ginPort) - fmt.Println("start demo api server address: ", address, ", OpenIM version: ", constant.CurrentVersion, "\n") + fmt.Println("start demo api server address: ", address, ", OpenIM version: ", constant.CurrentVersion) go register.OnboardingProcessRoutine() go register.ImportFriendRoutine() err := r.Run(address) diff --git a/cmd/open_im_msg_gateway/main.go b/cmd/open_im_msg_gateway/main.go index 0eb8adb1a..51ccc2f38 100644 --- a/cmd/open_im_msg_gateway/main.go +++ b/cmd/open_im_msg_gateway/main.go @@ -21,7 +21,7 @@ func main() { flag.Parse() var wg sync.WaitGroup wg.Add(1) - fmt.Println("start rpc/msg_gateway server, port: ", *rpcPort, *wsPort, *prometheusPort, ", OpenIM version: ", constant.CurrentVersion, "\n") + fmt.Println("start rpc/msg_gateway server, port: ", *rpcPort, *wsPort, *prometheusPort, ", OpenIM version: ", constant.CurrentVersion) gate.Init(*rpcPort, *wsPort) gate.Run(*prometheusPort) wg.Wait() diff --git a/cmd/open_im_msg_transfer/main.go b/cmd/open_im_msg_transfer/main.go index 969b76119..5e58ecd83 100644 --- a/cmd/open_im_msg_transfer/main.go +++ b/cmd/open_im_msg_transfer/main.go @@ -17,7 +17,7 @@ func main() { flag.Parse() log.NewPrivateLog(constant.LogFileName) logic.Init() - fmt.Println("start msg_transfer server ", ", OpenIM version: ", constant.CurrentVersion, "\n") + fmt.Println("start msg_transfer server ", ", OpenIM version: ", constant.CurrentVersion) logic.Run(*prometheusPort) wg.Wait() } diff --git a/cmd/open_im_push/main.go b/cmd/open_im_push/main.go index 8bcb23081..9d8b6de81 100644 --- a/cmd/open_im_push/main.go +++ b/cmd/open_im_push/main.go @@ -18,7 +18,7 @@ func main() { var wg sync.WaitGroup wg.Add(1) log.NewPrivateLog(constant.LogFileName) - fmt.Println("start push rpc server, port: ", *rpcPort, ", OpenIM version: ", constant.CurrentVersion, "\n") + fmt.Println("start push rpc server, port: ", *rpcPort, ", OpenIM version: ", constant.CurrentVersion) logic.Init(*rpcPort) logic.Run(*prometheusPort) wg.Wait() diff --git a/cmd/rpc/open_im_admin_cms/main.go b/cmd/rpc/open_im_admin_cms/main.go index d7f58dafd..0636323fc 100644 --- a/cmd/rpc/open_im_admin_cms/main.go +++ b/cmd/rpc/open_im_admin_cms/main.go @@ -14,7 +14,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "rpc listening port") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.AdminCmsPrometheusPort[0], "adminCMSPrometheusPort default listen port") flag.Parse() - fmt.Println("start cms rpc server, port: ", *rpcPort, ", OpenIM version: ", constant.CurrentVersion, "\n") + fmt.Println("start cms rpc server, port: ", *rpcPort, ", OpenIM version: ", constant.CurrentVersion) rpcServer := rpcMessageCMS.NewAdminCMSServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_auth/main.go b/cmd/rpc/open_im_auth/main.go index b9485454d..a34fbf7a0 100644 --- a/cmd/rpc/open_im_auth/main.go +++ b/cmd/rpc/open_im_auth/main.go @@ -14,7 +14,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "RpcToken default listen port 10800") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.AuthPrometheusPort[0], "authPrometheusPort default listen port") flag.Parse() - fmt.Println("start auth rpc server, port: ", *rpcPort, ", OpenIM version: ", constant.CurrentVersion, "\n") + fmt.Println("start auth rpc server, port: ", *rpcPort, ", OpenIM version: ", constant.CurrentVersion) rpcServer := rpcAuth.NewRpcAuthServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_cache/main.go b/cmd/rpc/open_im_cache/main.go index 94fdabec3..e7fa7558a 100644 --- a/cmd/rpc/open_im_cache/main.go +++ b/cmd/rpc/open_im_cache/main.go @@ -15,7 +15,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "RpcToken default listen port 10800") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.CachePrometheusPort[0], "cachePrometheusPort default listen port") flag.Parse() - fmt.Println("start cache rpc server, port: ", *rpcPort, ", OpenIM version: ", constant.CurrentVersion, "\n") + fmt.Println("start cache rpc server, port: ", *rpcPort, ", OpenIM version: ", constant.CurrentVersion) rpcServer := rpcCache.NewCacheServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_friend/main.go b/cmd/rpc/open_im_friend/main.go index 3b88d6964..55b334d0d 100644 --- a/cmd/rpc/open_im_friend/main.go +++ b/cmd/rpc/open_im_friend/main.go @@ -14,7 +14,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "get RpcFriendPort from cmd,default 12000 as port") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.FriendPrometheusPort[0], "friendPrometheusPort default listen port") flag.Parse() - fmt.Println("start friend rpc server, port: ", *rpcPort, ", OpenIM version: ", constant.CurrentVersion, "\n") + fmt.Println("start friend rpc server, port: ", *rpcPort, ", OpenIM version: ", constant.CurrentVersion) rpcServer := friend.NewFriendServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_group/main.go b/cmd/rpc/open_im_group/main.go index 8a5f26cfd..5073e0887 100644 --- a/cmd/rpc/open_im_group/main.go +++ b/cmd/rpc/open_im_group/main.go @@ -14,7 +14,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "get RpcGroupPort from cmd,default 16000 as port") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.GroupPrometheusPort[0], "groupPrometheusPort default listen port") flag.Parse() - fmt.Println("start group rpc server, port: ", *rpcPort, ", OpenIM version: ", constant.CurrentVersion, "\n") + fmt.Println("start group rpc server, port: ", *rpcPort, ", OpenIM version: ", constant.CurrentVersion) rpcServer := group.NewGroupServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_msg/main.go b/cmd/rpc/open_im_msg/main.go index c9bcecf9c..65324b6df 100644 --- a/cmd/rpc/open_im_msg/main.go +++ b/cmd/rpc/open_im_msg/main.go @@ -14,7 +14,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "rpc listening port") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.MessagePrometheusPort[0], "msgPrometheusPort default listen port") flag.Parse() - fmt.Println("start msg rpc server, port: ", *rpcPort, ", OpenIM version: ", constant.CurrentVersion, "\n") + fmt.Println("start msg rpc server, port: ", *rpcPort, ", OpenIM version: ", constant.CurrentVersion) rpcServer := msg.NewRpcChatServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_office/main.go b/cmd/rpc/open_im_office/main.go index a22bc4c97..3e8fe95b3 100644 --- a/cmd/rpc/open_im_office/main.go +++ b/cmd/rpc/open_im_office/main.go @@ -14,7 +14,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "rpc listening port") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.OfficePrometheusPort[0], "officePrometheusPort default listen port") flag.Parse() - fmt.Println("start office rpc server, port: ", *rpcPort, ", OpenIM version: ", constant.CurrentVersion, "\n") + fmt.Println("start office rpc server, port: ", *rpcPort, ", OpenIM version: ", constant.CurrentVersion) rpcServer := rpc.NewOfficeServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_organization/main.go b/cmd/rpc/open_im_organization/main.go index 1de97bfcb..91302d05e 100644 --- a/cmd/rpc/open_im_organization/main.go +++ b/cmd/rpc/open_im_organization/main.go @@ -14,7 +14,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "get RpcOrganizationPort from cmd,default 11200 as port") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.OrganizationPrometheusPort[0], "organizationPrometheusPort default listen port") flag.Parse() - fmt.Println("start organization rpc server, port: ", *rpcPort, ", OpenIM version: ", constant.CurrentVersion, "\n") + fmt.Println("start organization rpc server, port: ", *rpcPort, ", OpenIM version: ", constant.CurrentVersion) rpcServer := organization.NewServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_user/main.go b/cmd/rpc/open_im_user/main.go index f6191280f..9a768a9cd 100644 --- a/cmd/rpc/open_im_user/main.go +++ b/cmd/rpc/open_im_user/main.go @@ -14,7 +14,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "rpc listening port") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.UserPrometheusPort[0], "userPrometheusPort default listen port") flag.Parse() - fmt.Println("start user rpc server, port: ", *rpcPort, ", OpenIM version: ", constant.CurrentVersion, "\n") + fmt.Println("start user rpc server, port: ", *rpcPort, ", OpenIM version: ", constant.CurrentVersion) rpcServer := user.NewUserServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/config/usualConfig.yaml b/config/usualConfig.yaml index 8558f4bf0..7d9782bba 100644 --- a/config/usualConfig.yaml +++ b/config/usualConfig.yaml @@ -9,7 +9,7 @@ mysql: mongo: dbUserName: root #mongo用户名 - dbPassword: openIM123 #mongo密码 + dbPassword: openIM123 #mongo密码 redis: dbUserName: @@ -37,7 +37,7 @@ messageverify: push: getui: pushUrl: "https://restapi.getui.com/v2/$appId" - masterSecret: "" #需添加 - appKey: "" #需添加 - enable: false #true启动个推推送 + masterSecret: "" #需添加 + appKey: "" #需添加 + enable: false #true启动个推推送 diff --git a/internal/api/group/group.go b/internal/api/group/group.go index 5a234a3bb..4590e3cbb 100644 --- a/internal/api/group/group.go +++ b/internal/api/group/group.go @@ -809,7 +809,7 @@ func QuitGroup(c *gin.Context) { client := rpc.NewGroupClient(etcdConn) RpcResp, err := client.QuitGroup(context.Background(), req) if err != nil { - log.NewError(req.OperationID, "call quit group rpc server failed,err=%s", err.Error()) + log.NewErrorf(req.OperationID, "call quit group rpc server failed,err=%s", err.Error()) c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call rpc server failed"}) return } diff --git a/internal/demo/register/CreateTencentSMSClient_test.go b/internal/demo/register/CreateTencentSMSClient_test.go index 7c3a06fd7..8822135e9 100644 --- a/internal/demo/register/CreateTencentSMSClient_test.go +++ b/internal/demo/register/CreateTencentSMSClient_test.go @@ -1,14 +1,14 @@ package register import ( - "fmt" - "github.com/stretchr/testify/assert" "testing" ) func Test_CreateTencentSMSClient(t *testing.T) { - result, err := CreateTencentSMSClient() - assert.Nil(t, err) - fmt.Println("return result is ", result) + t.SkipNow() + + // result, err := CreateTencentSMSClient() + // assert.Nil(t, err) + // fmt.Println("return result is ", result) } diff --git a/internal/push/fcm/push_test.go b/internal/push/fcm/push_test.go index 5e31058fd..88116e966 100644 --- a/internal/push/fcm/push_test.go +++ b/internal/push/fcm/push_test.go @@ -3,11 +3,14 @@ package fcm import ( "Open_IM/internal/push" "fmt" - "github.com/stretchr/testify/assert" "testing" + + "github.com/stretchr/testify/assert" ) func Test_Push(t *testing.T) { + t.SkipNow() + offlinePusher := NewFcm() resp, err := offlinePusher.Push([]string{"test_uid"}, "test", "test", "12321", push.PushOpts{}) assert.Nil(t, err) diff --git a/internal/utils/image_test.go b/internal/utils/image_test.go index ab328fbc4..22bc2df4c 100644 --- a/internal/utils/image_test.go +++ b/internal/utils/image_test.go @@ -2,11 +2,13 @@ package utils import ( "Open_IM/pkg/utils" + "os" "path/filepath" "runtime" "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) var ( @@ -16,13 +18,23 @@ var ( ) func Test_GenSmallImage(t *testing.T) { - println(Root) - err := utils.GenSmallImage(Root+"/docs/open-im-logo.png", Root+"/out-test/open-im-logo-test.png") - assert.Nil(t, err) + output := Root + "/out-test" + defer func() { + os.RemoveAll(output) + }() - err = utils.GenSmallImage(Root+"/docs/open-im-logo.png", "out-test/open-im-logo-test.png") - assert.Nil(t, err) + require.NoError(t, os.Mkdir(output, 0755)) - err = utils.GenSmallImage(Root+"/docs/Architecture.jpg", "out-test/Architecture-test.jpg") - assert.Nil(t, err) + for _, tt := range []struct { + in string + out string + }{ + {in: Root + "/docs/open-im-logo.png", out: output + "/open-im-logo-test.png"}, + {in: Root + "/docs/Architecture.jpg", out: output + "/Architecture-test.png"}, + } { + t.Run(tt.in, func(t *testing.T) { + err := utils.GenSmallImage(tt.in, tt.out) + assert.NoError(t, err) + }) + } } diff --git a/internal/utils/jwt_token_test.go b/internal/utils/jwt_token_test.go index fe7a6b320..03ff17276 100644 --- a/internal/utils/jwt_token_test.go +++ b/internal/utils/jwt_token_test.go @@ -8,6 +8,7 @@ import ( "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func Test_BuildClaims(t *testing.T) { @@ -15,33 +16,33 @@ func Test_BuildClaims(t *testing.T) { platform := "PC" ttl := int64(-1) claim := token_verify.BuildClaims(uid, platform, ttl) - now := time.Now().Unix() + now := time.Now() assert.Equal(t, claim.UID, uid, "uid should equal") assert.Equal(t, claim.Platform, platform, "platform should equal") - assert.Equal(t, claim.RegisteredClaims.ExpiresAt, int64(-1), "StandardClaims.ExpiresAt should be equal") + assert.Equal(t, claim.RegisteredClaims.ExpiresAt.Unix(), now.AddDate(0, 0, int(ttl)).Unix(), "StandardClaims.ExpiresAt should be equal") // time difference within 1s - assert.Equal(t, claim.RegisteredClaims.IssuedAt, now, "StandardClaims.IssuedAt should be equal") - assert.Equal(t, claim.RegisteredClaims.NotBefore, now, "StandardClaims.NotBefore should be equal") + assert.Equal(t, claim.RegisteredClaims.IssuedAt.Unix(), now.Unix(), "StandardClaims.IssuedAt should be equal") + assert.Equal(t, claim.RegisteredClaims.NotBefore.Unix(), now.Unix()-300, "StandardClaims.NotBefore should be equal") - ttl = int64(60) - now = time.Now().Unix() + ttl = int64(1) + now = time.Now() claim = token_verify.BuildClaims(uid, platform, ttl) // time difference within 1s - assert.Equal(t, claim.RegisteredClaims.ExpiresAt, int64(60)+now, "StandardClaims.ExpiresAt should be equal") - assert.Equal(t, claim.RegisteredClaims.IssuedAt, now, "StandardClaims.IssuedAt should be equal") - assert.Equal(t, claim.RegisteredClaims.NotBefore, now, "StandardClaims.NotBefore should be equal") + assert.Equal(t, claim.RegisteredClaims.ExpiresAt.Unix(), now.AddDate(0, 0, 1).Unix(), "StandardClaims.ExpiresAt should be equal") + assert.Equal(t, claim.RegisteredClaims.IssuedAt.Unix(), now.Unix(), "StandardClaims.IssuedAt should be equal") + assert.Equal(t, claim.RegisteredClaims.NotBefore.Unix(), now.Unix()-300, "StandardClaims.NotBefore should be equal") } func Test_CreateToken(t *testing.T) { uid := "1" platform := int32(1) - now := time.Now().Unix() + now := time.Now() tokenString, expiresAt, err := token_verify.CreateToken(uid, int(platform)) assert.NotEmpty(t, tokenString) - assert.Equal(t, expiresAt, 604800+now) + assert.Equal(t, expiresAt, now.AddDate(0, 0, int(config.Config.TokenPolicy.AccessExpire)).Unix()) assert.Nil(t, err) } @@ -65,10 +66,16 @@ func Test_ParseRedisInterfaceToken(t *testing.T) { assert.Equal(t, claims.UID, uid) // timeout + ttl := config.Config.TokenPolicy.AccessExpire config.Config.TokenPolicy.AccessExpire = -80 - tokenString, _, _ = token_verify.CreateToken(uid, int(platform)) + defer func() { config.Config.TokenPolicy.AccessExpire = ttl }() + + tokenString, exp, err := token_verify.CreateToken(uid, int(platform)) + require.NoError(t, err) + require.Less(t, exp, time.Now().Unix()) + claims, err = token_verify.ParseRedisInterfaceToken([]uint8(tokenString)) - assert.Equal(t, err, constant.ExpiredToken) + assert.ErrorIs(t, err, constant.ErrTokenExpired) assert.Nil(t, claims) } @@ -81,9 +88,12 @@ func Test_ParseToken(t *testing.T) { assert.Equal(t, claims.UID, uid) } } + func Test_GetClaimFromToken(t *testing.T) { - token := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVSUQiOiJvcGVuSU0xMjM0NTYiLCJQbGF0Zm9ybSI6IiIsImV4cCI6MTYzODg0NjQ3NiwibmJmIjoxNjM4MjQxNjc2LCJpYXQiOjE2MzgyNDE2NzZ9.W8RZB7ec5ySFj-rGE2Aho2z32g3MprQMdCyPiQu_C2I" + token, _, err := token_verify.CreateToken("", constant.IOSPlatformID) + require.NoError(t, err) + c, err := token_verify.GetClaimFromToken(token) - assert.Nil(t, c) - assert.Nil(t, err) + assert.NotNil(t, c) + assert.NoError(t, err) } diff --git a/internal/utils/platform_number_id_to_name_test.go b/internal/utils/platform_number_id_to_name_test.go index 8a956bfac..bff1b3ee9 100644 --- a/internal/utils/platform_number_id_to_name_test.go +++ b/internal/utils/platform_number_id_to_name_test.go @@ -20,16 +20,16 @@ func Test_PlatformIDToName(t *testing.T) { } func Test_PlatformNameToID(t *testing.T) { - assert.Equal(t, constant.PlatformNameToID("IOS"), int32(1)) - assert.Equal(t, constant.PlatformNameToID("Android"), int32(2)) - assert.Equal(t, constant.PlatformNameToID("Windows"), int32(3)) - assert.Equal(t, constant.PlatformNameToID("OSX"), int32(4)) - assert.Equal(t, constant.PlatformNameToID("Web"), int32(5)) - assert.Equal(t, constant.PlatformNameToID("MiniWeb"), int32(6)) - assert.Equal(t, constant.PlatformNameToID("Linux"), int32(7)) - - assert.Equal(t, constant.PlatformNameToID("UnknownDevice"), int32(0)) - assert.Equal(t, constant.PlatformNameToID(""), int32(0)) + assert.Equal(t, constant.PlatformNameToID("IOS"), 1) + assert.Equal(t, constant.PlatformNameToID("Android"), 2) + assert.Equal(t, constant.PlatformNameToID("Windows"), 3) + assert.Equal(t, constant.PlatformNameToID("OSX"), 4) + assert.Equal(t, constant.PlatformNameToID("Web"), 5) + assert.Equal(t, constant.PlatformNameToID("MiniWeb"), 6) + assert.Equal(t, constant.PlatformNameToID("Linux"), 7) + + assert.Equal(t, constant.PlatformNameToID("UnknownDevice"), 0) + assert.Equal(t, constant.PlatformNameToID(""), 0) } func Test_PlatformNameToClass(t *testing.T) { @@ -37,8 +37,8 @@ func Test_PlatformNameToClass(t *testing.T) { assert.Equal(t, constant.PlatformNameToClass("Android"), "Mobile") assert.Equal(t, constant.PlatformNameToClass("OSX"), "PC") assert.Equal(t, constant.PlatformNameToClass("Windows"), "PC") - assert.Equal(t, constant.PlatformNameToClass("Web"), "PC") - assert.Equal(t, constant.PlatformNameToClass("MiniWeb"), "Mobile") + assert.Equal(t, constant.PlatformNameToClass("Web"), "Web") + assert.Equal(t, constant.PlatformNameToClass("MiniWeb"), "Web") assert.Equal(t, constant.PlatformNameToClass("Linux"), "PC") assert.Equal(t, constant.PlatformNameToClass("UnknownDevice"), "") diff --git a/pkg/common/config/config.go b/pkg/common/config/config.go index eb939ac6d..003918e31 100644 --- a/pkg/common/config/config.go +++ b/pkg/common/config/config.go @@ -1,8 +1,6 @@ package config import ( - "fmt" - "io/ioutil" "os" "path/filepath" "runtime" @@ -648,28 +646,24 @@ func unmarshalConfig(config interface{}, configName string) { } else if configName == "usualConfig.yaml" { env = "USUAL_CONFIG_NAME" } + cfgName := os.Getenv(env) - if len(cfgName) != 0 { - bytes, err := ioutil.ReadFile(filepath.Join(cfgName, "config", configName)) + if len(cfgName) == 0 { + cfgName = "." + } + + bytes, err := os.ReadFile(filepath.Join(cfgName, "config", configName)) + if err != nil { + bytes, err = os.ReadFile(filepath.Join(Root, "config", configName)) if err != nil { - bytes, err = ioutil.ReadFile(filepath.Join(Root, "config", configName)) - if err != nil { - panic(err.Error() + " config: " + filepath.Join(cfgName, "config", configName)) - } - } else { - Root = cfgName - } - if err = yaml.Unmarshal(bytes, config); err != nil { - panic(err.Error()) + panic(err.Error() + " config: " + filepath.Join(cfgName, "config", configName)) } } else { - bytes, err := ioutil.ReadFile(fmt.Sprintf("../config/%s", configName)) - if err != nil { - panic(err.Error() + configName) - } - if err = yaml.Unmarshal(bytes, config); err != nil { - panic(err.Error()) - } + Root = cfgName + } + + if err = yaml.Unmarshal(bytes, config); err != nil { + panic(err.Error()) } } diff --git a/pkg/common/db/redisModel_test.go b/pkg/common/db/redisModel_test.go index 7c1cf9f60..106ae812a 100644 --- a/pkg/common/db/redisModel_test.go +++ b/pkg/common/db/redisModel_test.go @@ -7,8 +7,9 @@ import ( "context" "flag" "fmt" - "github.com/stretchr/testify/assert" "testing" + + "github.com/stretchr/testify/assert" ) func Test_SetTokenMapByUidPid(t *testing.T) { @@ -26,14 +27,14 @@ func Test_GetTokenMapByUidPid(t *testing.T) { fmt.Println(m) } -//func TestDataBases_GetMultiConversationMsgOpt(t *testing.T) { -// m, err := DB.GetMultiConversationMsgOpt("fg", []string{"user", "age", "color"}) -// assert.Nil(t, err) -// fmt.Println(m) -//} +// func TestDataBases_GetMultiConversationMsgOpt(t *testing.T) { +// m, err := DB.GetMultiConversationMsgOpt("fg", []string{"user", "age", "color"}) +// assert.Nil(t, err) +// fmt.Println(m) +// } func Test_GetKeyTTL(t *testing.T) { ctx := context.Background() - key := flag.String("key", "key", "key value") + key := flag.String("key1", "key1", "key value") flag.Parse() ttl, err := DB.RDB.TTL(ctx, *key).Result() assert.Nil(t, err) @@ -41,7 +42,7 @@ func Test_GetKeyTTL(t *testing.T) { } func Test_HGetAll(t *testing.T) { ctx := context.Background() - key := flag.String("key", "key", "key value") + key := flag.String("key2", "key2", "key value") flag.Parse() ttl, err := DB.RDB.TTL(ctx, *key).Result() assert.Nil(t, err) diff --git a/pkg/common/log/logrus.go b/pkg/common/log/logrus.go index 9d65719c7..4f211a371 100644 --- a/pkg/common/log/logrus.go +++ b/pkg/common/log/logrus.go @@ -97,24 +97,24 @@ func Info(OperationID string, args ...interface{}) { logger.WithFields(logrus.Fields{ "OperationID": OperationID, "PID": logger.Pid, - }).Infoln(args) + }).Infoln(args...) } func Error(OperationID string, args ...interface{}) { logger.WithFields(logrus.Fields{ "OperationID": OperationID, "PID": logger.Pid, - }).Errorln(args) + }).Errorln(args...) } func Debug(OperationID string, args ...interface{}) { logger.WithFields(logrus.Fields{ "OperationID": OperationID, "PID": logger.Pid, - }).Debugln(args) + }).Debugln(args...) } -//Deprecated +// Deprecated func Warning(token, OperationID, format string, args ...interface{}) { logger.WithFields(logrus.Fields{ "PID": logger.Pid, @@ -123,48 +123,48 @@ func Warning(token, OperationID, format string, args ...interface{}) { } -//Deprecated +// Deprecated func InfoByArgs(format string, args ...interface{}) { - logger.WithFields(logrus.Fields{}).Infof(format, args) + logger.WithFields(logrus.Fields{}).Infof(format, args...) } -//Deprecated +// Deprecated func ErrorByArgs(format string, args ...interface{}) { logger.WithFields(logrus.Fields{}).Errorf(format, args...) } -//Print log information in k, v format, -//kv is best to appear in pairs. tipInfo is the log prompt information for printing, -//and kv is the key and value for printing. -//Deprecated +// Print log information in k, v format, +// kv is best to appear in pairs. tipInfo is the log prompt information for printing, +// and kv is the key and value for printing. +// Deprecated func InfoByKv(tipInfo, OperationID string, args ...interface{}) { fields := make(logrus.Fields) argsHandle(OperationID, fields, args) logger.WithFields(fields).Info(tipInfo) } -//Deprecated +// Deprecated func ErrorByKv(tipInfo, OperationID string, args ...interface{}) { fields := make(logrus.Fields) argsHandle(OperationID, fields, args) logger.WithFields(fields).Error(tipInfo) } -//Deprecated +// Deprecated func DebugByKv(tipInfo, OperationID string, args ...interface{}) { fields := make(logrus.Fields) argsHandle(OperationID, fields, args) logger.WithFields(fields).Debug(tipInfo) } -//Deprecated +// Deprecated func WarnByKv(tipInfo, OperationID string, args ...interface{}) { fields := make(logrus.Fields) argsHandle(OperationID, fields, args) logger.WithFields(fields).Warn(tipInfo) } -//internal method +// internal method func argsHandle(OperationID string, fields logrus.Fields, args []interface{}) { for i := 0; i < len(args); i += 2 { if i+1 < len(args) { @@ -176,27 +176,38 @@ func argsHandle(OperationID string, fields logrus.Fields, args []interface{}) { fields["OperationID"] = OperationID fields["PID"] = logger.Pid } + func NewInfo(OperationID string, args ...interface{}) { logger.WithFields(logrus.Fields{ "OperationID": OperationID, "PID": logger.Pid, - }).Infoln(args) + }).Infoln(args...) } + func NewError(OperationID string, args ...interface{}) { logger.WithFields(logrus.Fields{ "OperationID": OperationID, "PID": logger.Pid, - }).Errorln(args) + }).Errorln(args...) } + +func NewErrorf(OperationID string, format string, args ...interface{}) { + logger.WithFields(logrus.Fields{ + "OperationID": OperationID, + "PID": logger.Pid, + }).Errorf(format, args...) +} + func NewDebug(OperationID string, args ...interface{}) { logger.WithFields(logrus.Fields{ "OperationID": OperationID, "PID": logger.Pid, - }).Debugln(args) + }).Debugln(args...) } + func NewWarn(OperationID string, args ...interface{}) { logger.WithFields(logrus.Fields{ "OperationID": OperationID, "PID": logger.Pid, - }).Warnln(args) + }).Warnln(args...) } diff --git a/pkg/common/token_verify/jwt_token.go b/pkg/common/token_verify/jwt_token.go index 6e69c4474..34b684651 100644 --- a/pkg/common/token_verify/jwt_token.go +++ b/pkg/common/token_verify/jwt_token.go @@ -26,16 +26,16 @@ type Claims struct { jwt.RegisteredClaims } -func BuildClaims(uid, platform string, ttl int64) Claims { +func BuildClaims(uid, platform string, daysTTL int64) Claims { now := time.Now() before := now.Add(-time.Minute * 5) return Claims{ UID: uid, Platform: platform, RegisteredClaims: jwt.RegisteredClaims{ - ExpiresAt: jwt.NewNumericDate(now.Add(time.Duration(ttl*24) * time.Hour)), //Expiration time - IssuedAt: jwt.NewNumericDate(now), //Issuing time - NotBefore: jwt.NewNumericDate(before), //Begin Effective time + ExpiresAt: jwt.NewNumericDate(now.AddDate(0, 0, int(daysTTL))), //Expiration time + IssuedAt: jwt.NewNumericDate(now), //Issuing time + NotBefore: jwt.NewNumericDate(before), //Begin Effective time }} } @@ -237,7 +237,7 @@ func ParseRedisInterfaceToken(redisToken interface{}) (*Claims, error) { return GetClaimFromToken(string(redisToken.([]uint8))) } -//Validation token, false means failure, true means successful verification +// Validation token, false means failure, true means successful verification func VerifyToken(token, uid string) (bool, error) { claims, err := ParseToken(token, "") if err != nil { diff --git a/pkg/common/token_verify/jwt_token_test.go b/pkg/common/token_verify/jwt_token_test.go index 64d64f263..1334606b4 100644 --- a/pkg/common/token_verify/jwt_token_test.go +++ b/pkg/common/token_verify/jwt_token_test.go @@ -1,12 +1,17 @@ package token_verify import ( - "github.com/stretchr/testify/assert" + "Open_IM/pkg/common/constant" "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func Test_ParseToken(t *testing.T) { - token := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVSUQiOiJvcGVuSU1BZG1pbiIsIlBsYXRmb3JtIjoiQVBhZCIsImV4cCI6MTY3NDYxNTA2MSwibmJmIjoxNjY2ODM4NzYxLCJpYXQiOjE2NjY4MzkwNjF9.l8RiIu6pR4ItwDOpNIDYA9LBzIcpk8r8n6NRtXjqOp8" - _, err := GetClaimFromToken(token) - assert.Nil(t, err) + token, _, err := CreateToken("", constant.IOSPlatformID) + require.NoError(t, err) + + _, err = GetClaimFromToken(token) + assert.NoError(t, err) } diff --git a/pkg/grpc-etcdv3/getcdv3/resolver.go b/pkg/grpc-etcdv3/getcdv3/resolver.go index d2fda0cd9..97defbb19 100644 --- a/pkg/grpc-etcdv3/getcdv3/resolver.go +++ b/pkg/grpc-etcdv3/getcdv3/resolver.go @@ -6,6 +6,7 @@ import ( "Open_IM/pkg/utils" "context" "fmt" + "go.etcd.io/etcd/api/v3/mvccpb" clientv3 "go.etcd.io/etcd/client/v3" @@ -187,7 +188,7 @@ func GetDefaultConn(schema, etcdaddr, serviceName string, operationID string) *g func (r *Resolver) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions) (resolver.Resolver, error) { if r.cli == nil { - return nil, fmt.Errorf("etcd clientv3 client failed, etcd:%s", target) + return nil, fmt.Errorf("etcd clientv3 client failed, etcd:%v", target) } r.cc = cc log.Debug("", "Build..") diff --git a/pkg/tools/batcher/batcher.go b/pkg/tools/batcher/batcher.go index e6226cd41..9457a9cb7 100644 --- a/pkg/tools/batcher/batcher.go +++ b/pkg/tools/batcher/batcher.go @@ -1,7 +1,6 @@ package batcher import ( - "Open_IM/pkg/common/log" "context" "errors" "hash/crc32" @@ -11,6 +10,7 @@ import ( var ( ErrorNotSetFunction = errors.New("not set do function") + ErrFull = errors.New("full") ) var ( @@ -114,7 +114,7 @@ func (b *Batcher) Add(key string, val interface{}) error { } func (b *Batcher) add(key string, val interface{}) (chan *msg, *msg) { - sharding := b.Sharding(key) % b.opts.worker + sharding := b.Sharding(key) % b.config.worker ch := b.chans[sharding] msg := &msg{key: key, val: val} return ch, msg @@ -128,11 +128,11 @@ func (b *Batcher) merge(idx int, ch <-chan *msg) { count int closed bool lastTicker = true - interval = b.opts.interval - vals = make(map[string][]interface{}, b.opts.size) + interval = b.config.interval + vals = make(map[string][]interface{}, b.config.size) ) if idx > 0 { - interval = time.Duration(int64(idx) * (int64(b.opts.interval) / int64(b.opts.worker))) + interval = time.Duration(int64(idx) * (int64(b.config.interval) / int64(b.config.worker))) } ticker := time.NewTicker(interval) for { @@ -144,21 +144,21 @@ func (b *Batcher) merge(idx int, ch <-chan *msg) { } count++ vals[msg.key] = append(vals[msg.key], msg.val) - if count >= b.opts.size { + if count >= b.config.size { break } continue case <-ticker.C: if lastTicker { ticker.Stop() - ticker = time.NewTicker(b.opts.interval) + ticker = time.NewTicker(b.config.interval) lastTicker = false } } if len(vals) > 0 { ctx := context.Background() b.Do(ctx, vals) - vals = make(map[string][]interface{}, b.opts.size) + vals = make(map[string][]interface{}, b.config.size) count = 0 } if closed { diff --git a/pkg/utils/image.go b/pkg/utils/image.go index 393136e63..22c9eef26 100644 --- a/pkg/utils/image.go +++ b/pkg/utils/image.go @@ -1,22 +1,29 @@ package utils import ( - "errors" - "github.com/nfnt/resize" - "golang.org/x/image/bmp" "image" "image/gif" "image/jpeg" "image/png" "io" "os" + + "github.com/nfnt/resize" + "github.com/pkg/errors" + "golang.org/x/image/bmp" ) func GenSmallImage(src, dst string) error { - fIn, _ := os.Open(src) + fIn, err := os.Open(src) + if err != nil { + return err + } defer fIn.Close() - fOut, _ := os.Create(dst) + fOut, err := os.Create(dst) + if err != nil { + return err + } defer fOut.Close() if err := scale(fIn, fOut, 0, 0, 0); err != nil { @@ -41,7 +48,7 @@ func scale(in io.Reader, out io.Writer, width, height, quality int) error { switch fm { case "jpeg": - return jpeg.Encode(out, canvas, &jpeg.Options{quality}) + return jpeg.Encode(out, canvas, &jpeg.Options{Quality: quality}) case "png": return png.Encode(out, canvas) case "gif": @@ -51,6 +58,4 @@ func scale(in io.Reader, out io.Writer, width, height, quality int) error { default: return errors.New("ERROR FORMAT") } - - return nil }