Skip to content

Commit 4b3a2b7

Browse files
authored
Merge pull request #3342 from openimsdk/cherry-pick-1d7660b
fix: optimize grpc option and fix some interface permission checks [Created by @withchao from #3327]
2 parents c7a934e + a315570 commit 4b3a2b7

File tree

26 files changed

+364
-433
lines changed

26 files changed

+364
-433
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ require (
1313
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
1414
github.com/mitchellh/mapstructure v1.5.0
1515
github.com/openimsdk/protocol v0.0.73-alpha.6
16-
github.com/openimsdk/tools v0.0.50-alpha.79
16+
github.com/openimsdk/tools v0.0.50-alpha.81
1717
github.com/pkg/errors v0.9.1 // indirect
1818
github.com/prometheus/client_golang v1.18.0
1919
github.com/stretchr/testify v1.9.0

go.sum

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -345,12 +345,12 @@ github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA
345345
github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To=
346346
github.com/onsi/gomega v1.25.0 h1:Vw7br2PCDYijJHSfBOWhov+8cAnUf8MfMaIOV323l6Y=
347347
github.com/onsi/gomega v1.25.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM=
348-
github.com/openimsdk/gomake v0.0.15-alpha.2 h1:5Q8yl8ezy2yx+q8/ucU/t4kJnDfCzNOrkXcDACCqtyM=
349-
github.com/openimsdk/gomake v0.0.15-alpha.2/go.mod h1:PndCozNc2IsQIciyn9mvEblYWZwJmAI+06z94EY+csI=
348+
github.com/openimsdk/gomake v0.0.15-alpha.5 h1:eEZCEHm+NsmcO3onXZPIUbGFCYPYbsX5beV3ZyOsGhY=
349+
github.com/openimsdk/gomake v0.0.15-alpha.5/go.mod h1:PndCozNc2IsQIciyn9mvEblYWZwJmAI+06z94EY+csI=
350350
github.com/openimsdk/protocol v0.0.73-alpha.6 h1:sna9coWG7HN1zObBPtvG0Ki/vzqHXiB4qKbA5P3w7kc=
351351
github.com/openimsdk/protocol v0.0.73-alpha.6/go.mod h1:WF7EuE55vQvpyUAzDXcqg+B+446xQyEba0X35lTINmw=
352-
github.com/openimsdk/tools v0.0.50-alpha.79 h1:jxYEbrzaze4Z2r4NrKad816buZ690ix0L9MTOOOH3ik=
353-
github.com/openimsdk/tools v0.0.50-alpha.79/go.mod h1:n2poR3asX1e1XZce4O+MOWAp+X02QJRFvhcLCXZdzRo=
352+
github.com/openimsdk/tools v0.0.50-alpha.81 h1:VbuJKtigNXLkCKB/Q6f2UHsqoSaTOAwS8F51c1nhOCA=
353+
github.com/openimsdk/tools v0.0.50-alpha.81/go.mod h1:n2poR3asX1e1XZce4O+MOWAp+X02QJRFvhcLCXZdzRo=
354354
github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
355355
github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
356356
github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ=

internal/api/config_manager.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ func NewConfigManager(IMAdminUserID []string, cfg *config.AllConfig, client *cli
4545
}
4646

4747
func (cm *ConfigManager) CheckAdmin(c *gin.Context) {
48-
if err := authverify.CheckAdmin(c, cm.imAdminUserID); err != nil {
48+
if err := authverify.CheckAdmin(c); err != nil {
4949
apiresp.GinError(c, err)
5050
c.Abort()
5151
}

internal/api/msg.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ func (m *MessageApi) SendMessage(c *gin.Context) {
281281
}
282282

283283
// Check if the user has the app manager role.
284-
if !authverify.IsAppManagerUid(c, m.imAdminUserID) {
284+
if !authverify.IsAdmin(c) {
285285
// Respond with a permission error if the user is not an app manager.
286286
apiresp.GinError(c, errs.ErrNoPermission.WrapMsg("only app manager can send message"))
287287
return
@@ -355,7 +355,7 @@ func (m *MessageApi) SendBusinessNotification(c *gin.Context) {
355355
if req.ReliabilityLevel == nil {
356356
req.ReliabilityLevel = datautil.ToPtr(1)
357357
}
358-
if !authverify.IsAppManagerUid(c, m.imAdminUserID) {
358+
if !authverify.IsAdmin(c) {
359359
apiresp.GinError(c, errs.ErrNoPermission.WrapMsg("only app manager can send message"))
360360
return
361361
}
@@ -399,7 +399,7 @@ func (m *MessageApi) BatchSendMsg(c *gin.Context) {
399399
apiresp.GinError(c, errs.ErrArgs.WithDetail(err.Error()).Wrap())
400400
return
401401
}
402-
if err := authverify.CheckAdmin(c, m.imAdminUserID); err != nil {
402+
if err := authverify.CheckAdmin(c); err != nil {
403403
apiresp.GinError(c, errs.ErrNoPermission.WrapMsg("only app manager can send message"))
404404
return
405405
}

internal/api/router.go

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ import (
99
"github.com/gin-gonic/gin"
1010
"github.com/gin-gonic/gin/binding"
1111
"github.com/go-playground/validator/v10"
12+
"github.com/openimsdk/open-im-server/v3/pkg/authverify"
13+
"github.com/openimsdk/tools/mcontext"
14+
"github.com/openimsdk/tools/utils/datautil"
15+
clientv3 "go.etcd.io/etcd/client/v3"
16+
1217
"github.com/openimsdk/open-im-server/v3/internal/api/jssdk"
1318
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
1419
"github.com/openimsdk/open-im-server/v3/pkg/common/prommetrics"
@@ -96,7 +101,7 @@ func newGinRouter(ctx context.Context, client discovery.SvcDiscoveryRegistry, cf
96101
r.Use(gzip.Gzip(gzip.BestSpeed))
97102
}
98103
r.Use(prommetricsGin(), gin.RecoveryWithWriter(gin.DefaultErrorWriter, mw.GinPanicErr), mw.CorsHandler(),
99-
mw.GinParseOperationID(), GinParseToken(rpcli.NewAuthClient(authConn)))
104+
mw.GinParseOperationID(), GinParseToken(rpcli.NewAuthClient(authConn)), setGinIsAdmin(cfg.Share.IMAdminUserID))
100105

101106
u := NewUserApi(user.NewUserClient(userConn), client, cfg.Discovery.RpcService)
102107
{
@@ -352,6 +357,14 @@ func GinParseToken(authClient *rpcli.AuthClient) gin.HandlerFunc {
352357
}
353358
}
354359

360+
func setGinIsAdmin(imAdminUserID []string) gin.HandlerFunc {
361+
return func(c *gin.Context) {
362+
opUserID := mcontext.GetOpUserID(c)
363+
admin := datautil.Contain(opUserID, imAdminUserID...)
364+
c.Set(authverify.CtxIsAdminKey, admin)
365+
}
366+
}
367+
355368
// Whitelist api not parse token
356369
var Whitelist = []string{
357370
"/auth/get_admin_token",

internal/msggateway/hub_server.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ func NewServer(longConnServer LongConnServer, conf *Config, ready func(srv *Serv
101101
}
102102

103103
func (s *Server) GetUsersOnlineStatus(ctx context.Context, req *msggateway.GetUsersOnlineStatusReq) (*msggateway.GetUsersOnlineStatusResp, error) {
104-
if !authverify.IsAppManagerUid(ctx, s.config.Share.IMAdminUserID) {
104+
if !authverify.IsAdmin(ctx) {
105105
return nil, errs.ErrNoPermission.WrapMsg("only app manager")
106106
}
107107
var resp msggateway.GetUsersOnlineStatusResp

internal/rpc/auth/auth.go

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,14 @@ import (
1818
"context"
1919
"errors"
2020

21+
"github.com/openimsdk/open-im-server/v3/pkg/common/storage/cache"
22+
"github.com/openimsdk/open-im-server/v3/pkg/common/storage/cache/mcache"
23+
"github.com/openimsdk/open-im-server/v3/pkg/common/storage/database/mgo"
24+
"github.com/openimsdk/open-im-server/v3/pkg/dbbuild"
2125
"github.com/openimsdk/open-im-server/v3/pkg/rpcli"
2226

2327
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
2428
redis2 "github.com/openimsdk/open-im-server/v3/pkg/common/storage/cache/redis"
25-
"github.com/openimsdk/tools/db/redisutil"
2629
"github.com/openimsdk/tools/utils/datautil"
2730
"github.com/redis/go-redis/v9"
2831

@@ -43,31 +46,47 @@ import (
4346
type authServer struct {
4447
pbauth.UnimplementedAuthServer
4548
authDatabase controller.AuthDatabase
46-
RegisterCenter discovery.SvcDiscoveryRegistry
49+
RegisterCenter discovery.Conn
4750
config *Config
4851
userClient *rpcli.UserClient
4952
}
5053

5154
type Config struct {
5255
RpcConfig config.Auth
5356
RedisConfig config.Redis
57+
MongoConfig config.Mongo
5458
Share config.Share
5559
Discovery config.Discovery
5660
}
5761

58-
func Start(ctx context.Context, config *Config, client discovery.SvcDiscoveryRegistry, server *grpc.Server) error {
59-
rdb, err := redisutil.NewRedisClient(ctx, config.RedisConfig.Build())
62+
func Start(ctx context.Context, config *Config, client discovery.Conn, server grpc.ServiceRegistrar) error {
63+
dbb := dbbuild.NewBuilder(&config.MongoConfig, &config.RedisConfig)
64+
rdb, err := dbb.Redis(ctx)
6065
if err != nil {
6166
return err
6267
}
68+
var token cache.TokenModel
69+
if rdb == nil {
70+
mdb, err := dbb.Mongo(ctx)
71+
if err != nil {
72+
return err
73+
}
74+
mc, err := mgo.NewCacheMgo(mdb.GetDB())
75+
if err != nil {
76+
return err
77+
}
78+
token = mcache.NewTokenCacheModel(mc, config.RpcConfig.TokenPolicy.Expire)
79+
} else {
80+
token = redis2.NewTokenCacheModel(rdb, config.RpcConfig.TokenPolicy.Expire)
81+
}
6382
userConn, err := client.GetConn(ctx, config.Discovery.RpcService.User)
6483
if err != nil {
6584
return err
6685
}
6786
pbauth.RegisterAuthServer(server, &authServer{
6887
RegisterCenter: client,
6988
authDatabase: controller.NewAuthDatabase(
70-
redis2.NewTokenCacheModel(rdb, config.RpcConfig.TokenPolicy.Expire),
89+
token,
7190
config.Share.Secret,
7291
config.RpcConfig.TokenPolicy.Expire,
7392
config.Share.MultiLogin,
@@ -106,7 +125,7 @@ func (s *authServer) GetAdminToken(ctx context.Context, req *pbauth.GetAdminToke
106125
}
107126

108127
func (s *authServer) GetUserToken(ctx context.Context, req *pbauth.GetUserTokenReq) (*pbauth.GetUserTokenResp, error) {
109-
if err := authverify.CheckAdmin(ctx, s.config.Share.IMAdminUserID); err != nil {
128+
if err := authverify.CheckAdmin(ctx); err != nil {
110129
return nil, err
111130
}
112131

@@ -116,7 +135,7 @@ func (s *authServer) GetUserToken(ctx context.Context, req *pbauth.GetUserTokenR
116135

117136
resp := pbauth.GetUserTokenResp{}
118137

119-
if authverify.IsManagerUserID(req.UserID, s.config.Share.IMAdminUserID) {
138+
if authverify.CheckUserIsAdmin(ctx, req.UserID) {
120139
return nil, errs.ErrNoPermission.WrapMsg("don't get Admin token")
121140
}
122141
user, err := s.userClient.GetUserInfo(ctx, req.UserID)
@@ -145,7 +164,7 @@ func (s *authServer) parseToken(ctx context.Context, tokensString string) (claim
145164
return nil, err
146165
}
147166
if len(m) == 0 {
148-
isAdmin := authverify.IsManagerUserID(claims.UserID, s.config.Share.IMAdminUserID)
167+
isAdmin := authverify.CheckUserIsAdmin(ctx, claims.UserID)
149168
if isAdmin {
150169
if err = s.authDatabase.GetTemporaryTokensWithoutError(ctx, claims.UserID, claims.PlatformID, tokensString); err == nil {
151170
return claims, nil
@@ -163,7 +182,7 @@ func (s *authServer) parseToken(ctx context.Context, tokensString string) (claim
163182
return nil, errs.Wrap(errs.ErrTokenUnknown)
164183
}
165184
} else {
166-
isAdmin := authverify.IsManagerUserID(claims.UserID, s.config.Share.IMAdminUserID)
185+
isAdmin := authverify.CheckUserIsAdmin(ctx, claims.UserID)
167186
if isAdmin {
168187
if err = s.authDatabase.GetTemporaryTokensWithoutError(ctx, claims.UserID, claims.PlatformID, tokensString); err == nil {
169188
return claims, nil
@@ -186,7 +205,7 @@ func (s *authServer) ParseToken(ctx context.Context, req *pbauth.ParseTokenReq)
186205
}
187206

188207
func (s *authServer) ForceLogout(ctx context.Context, req *pbauth.ForceLogoutReq) (*pbauth.ForceLogoutResp, error) {
189-
if err := authverify.CheckAdmin(ctx, s.config.Share.IMAdminUserID); err != nil {
208+
if err := authverify.CheckAdmin(ctx); err != nil {
190209
return nil, err
191210
}
192211
if err := s.forceKickOff(ctx, req.UserID, req.PlatformID); err != nil {

internal/rpc/conversation/sync.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,16 @@ import (
44
"context"
55

66
"github.com/openimsdk/open-im-server/v3/internal/rpc/incrversion"
7+
"github.com/openimsdk/open-im-server/v3/pkg/authverify"
78
"github.com/openimsdk/open-im-server/v3/pkg/common/storage/model"
89
"github.com/openimsdk/open-im-server/v3/pkg/util/hashutil"
910
"github.com/openimsdk/protocol/conversation"
1011
)
1112

1213
func (c *conversationServer) GetFullOwnerConversationIDs(ctx context.Context, req *conversation.GetFullOwnerConversationIDsReq) (*conversation.GetFullOwnerConversationIDsResp, error) {
14+
if err := authverify.CheckAccess(ctx, req.UserID); err != nil {
15+
return nil, err
16+
}
1317
vl, err := c.conversationDatabase.FindMaxConversationUserVersionCache(ctx, req.UserID)
1418
if err != nil {
1519
return nil, err

0 commit comments

Comments
 (0)