From 8e2d4abea408ee9f5bb3aaed6dd828ef76df4207 Mon Sep 17 00:00:00 2001 From: flywukong <2229306838@qq.com> Date: Wed, 16 Aug 2023 18:02:45 +0800 Subject: [PATCH 01/18] fix: improve no balance err --- cmd/utils.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmd/utils.go b/cmd/utils.go index c554996..7d80086 100644 --- a/cmd/utils.go +++ b/cmd/utils.go @@ -98,6 +98,8 @@ const ( exitStatus = "GRACEFUL_EXITING" StatusSPrefix = "STATUS_" defaultMaxKey = 500 + + noBalanceErr = "key not found" ) var ( @@ -149,6 +151,9 @@ func getVisibilityType(visibility string) (storageTypes.VisibilityType, error) { } func toCmdErr(err error) error { + if strings.Contains(err.Error(), noBalanceErr) { + fmt.Println("The operator account have no balance, please transfer token to your account") + } fmt.Printf("run command error: %s\n", err.Error()) return nil } From 97fdfe6e8e2e479c0a6e72f4abcf2dd634bdf3be Mon Sep 17 00:00:00 2001 From: flywukong <2229306838@qq.com> Date: Thu, 17 Aug 2023 14:43:12 +0800 Subject: [PATCH 02/18] feat: support group ls and ls-member command && update dependency --- cmd/cmd_group.go | 223 +++++++++++++++++++++++++++++++++++++++++------ cmd/utils.go | 3 +- go.mod | 16 ++-- go.sum | 28 +++--- 4 files changed, 218 insertions(+), 52 deletions(-) diff --git a/cmd/cmd_group.go b/cmd/cmd_group.go index d52be2a..b078d77 100644 --- a/cmd/cmd_group.go +++ b/cmd/cmd_group.go @@ -86,19 +86,70 @@ Examples: $ gnfd-cmd group renew --groupOwner 0x.. --renewMembers 0x.. --expireTime 1691569957 group-name`, Flags: []cli.Flag{ &cli.StringFlag{ - Name: renewMemberFlag, - Value: "", - Usage: "indicate the init member addr string list, input like addr1,addr2,addr3", + Name: renewMemberFlag, + Value: "", + Usage: "indicate the init member addr string list, input like addr1,addr2,addr3", + Required: true, }, &cli.StringFlag{ - Name: groupOwnerFlag, - Value: "", - Usage: "need set the owner address if you are not the owner of the group", + Name: groupOwnerFlag, + Value: "", + Usage: "need set the owner address if you are not the owner of the group", + Required: false, }, &cli.Int64Flag{ - Name: groupMemberExpireFlag, - Value: 0, - Usage: "set the expire timestamp for the addMember, it will apply to all the add members", + Name: groupMemberExpireFlag, + Value: 0, + Usage: "set the expire timestamp for the addMember, it will apply to all the add members", + Required: false, + }, + }, + } +} + +// cmdListGroupMember is the command to list members info of the particular group. +func cmdListGroupMember() *cli.Command { + return &cli.Command{ + Name: "ls-member", + Action: listGroupMember, + Usage: "list the members which contained within the group", + ArgsUsage: "GROUP-NAME", + Description: ` +List the members of the specific group +You need also set group owner using --groupOwner if you are not the owner of the group. + +Examples: +$ gnfd-cmd group ls-member group-name`, + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: groupOwnerFlag, + Value: "", + Usage: "need set the owner address if you are not the owner of the group", + Required: false, + }, + }, + } +} + +// cmdListGroup is the command to list members info of the particular group. +func cmdListGroup() *cli.Command { + return &cli.Command{ + Name: "ls", + Action: listGroup, + Usage: "list groups owned by the specified user", + ArgsUsage: "GROUP-NAME", + Description: ` + Returns a list of groups owned by the specified user, +You need also set group owner using --groupOwner if you are not the owner of the group. + +Examples: +$ gnfd-cmd group ls`, + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: groupOwnerFlag, + Value: "", + Usage: "need set the owner address if you are not the owner of the group", + Required: false, }, }, } @@ -216,18 +267,6 @@ func updateGroupMember(ctx *cli.Context) error { return toCmdErr(err) } - expireTimestamp := ctx.Int64(expireTimeFlag) - // set default expire timestamp - if expireTimestamp == 0 { - expireTimestamp = storageTypes.MaxTimeStamp.Unix() - } - - addMemberNum := len(addGroupMembers) - expireTimeList := make([]time.Time, addMemberNum) - for i := 0; i < addMemberNum; i++ { - expireTimeList[i] = time.Unix(expireTimestamp, 0) - } - c, cancelUpdateGroup := context.WithCancel(globalContext) defer cancelUpdateGroup() @@ -236,9 +275,27 @@ func updateGroupMember(ctx *cli.Context) error { return toCmdErr(ErrGroupNotExist) } - txOpts := &types.TxOption{Mode: &SyncBroadcastMode} - txnHash, err := client.UpdateGroupMember(c, groupName, groupOwner, addGroupMembers, removeGroupMembers, expireTimeList, - sdktypes.UpdateGroupMemberOption{TxOpts: txOpts}) + expireTimestamp := ctx.Int64(expireTimeFlag) + + if expireTimestamp != 0 && expireTimestamp < time.Now().Unix() { + return toCmdErr(errors.New("expire stamp should be more than" + strconv.Itoa(int(time.Now().Unix())))) + } + + var txnHash string + if expireTimestamp > 0 && len(addGroupMembers) > 0 { + addMemberNum := len(addGroupMembers) + expireTimeList := make([]*time.Time, addMemberNum) + for i := 0; i < addMemberNum; i++ { + t := time.Unix(expireTimestamp, 0) + expireTimeList[i] = &t + } + txnHash, err = client.UpdateGroupMember(c, groupName, groupOwner, addGroupMembers, removeGroupMembers, + sdktypes.UpdateGroupMemberOption{ExpirationTime: expireTimeList}) + } else if expireTimestamp == 0 { + txnHash, err = client.UpdateGroupMember(c, groupName, groupOwner, addGroupMembers, removeGroupMembers, + sdktypes.UpdateGroupMemberOption{}) + } + if err != nil { return toCmdErr(err) } @@ -264,7 +321,6 @@ func renewGroupMember(ctx *cli.Context) error { } renewMembersInfo := ctx.String(renewMemberFlag) - if renewMembersInfo == "" { return toCmdErr(errors.New("fail to get members to renew")) } @@ -284,12 +340,16 @@ func renewGroupMember(ctx *cli.Context) error { expireTimestamp := ctx.Int64(expireTimeFlag) if expireTimestamp < time.Now().Unix() { return toCmdErr(errors.New("expire stamp should be more than" + strconv.Itoa(int(time.Now().Unix())))) + } else if expireTimestamp == 0 { + // set default expire timestamp + expireTimestamp = storageTypes.MaxTimeStamp.Unix() } memberNum := len(renewGroupMembers) - expireTimeList := make([]time.Time, memberNum) + expireTimeList := make([]*time.Time, memberNum) for i := 0; i < memberNum; i++ { - expireTimeList[i] = time.Unix(expireTimestamp, 0) + t := time.Unix(expireTimestamp, 0) + expireTimeList[i] = &t } c, cancelUpdateGroup := context.WithCancel(globalContext) @@ -300,8 +360,8 @@ func renewGroupMember(ctx *cli.Context) error { return toCmdErr(ErrGroupNotExist) } - txnHash, err := client.RenewGroupMember(c, groupOwner, groupName, renewGroupMembers, expireTimeList, - sdktypes.RenewGroupMemberOption{}) + txnHash, err := client.RenewGroupMember(c, groupOwner, groupName, renewGroupMembers, + sdktypes.RenewGroupMemberOption{ExpirationTime: expireTimeList}) if err != nil { return toCmdErr(err) } @@ -315,6 +375,111 @@ func renewGroupMember(ctx *cli.Context) error { return nil } +// listGroupMember returns a list of members contained within the group specified by the group id +// The user's expiration time has already elapsed will not be listed +func listGroupMember(ctx *cli.Context) error { + groupName, err := getGroupNameByUrl(ctx) + if err != nil { + return toCmdErr(err) + } + + client, err := NewClient(ctx, false) + if err != nil { + return toCmdErr(err) + } + + groupOwner, err := getGroupOwner(ctx) + if err != nil { + return toCmdErr(err) + } + + c, cancelListGroup := context.WithCancel(globalContext) + defer cancelListGroup() + + groupInfo, err := client.HeadGroup(c, groupName, groupOwner) + if err != nil { + return toCmdErr(ErrGroupNotExist) + } + + initStartKey := "" + for { + memberList, err := client.ListGroupMembers(c, int64(groupInfo.Id.Uint64()), + sdktypes.GroupMembersPaginationOptions{Limit: maxListMemberNum, StartAfter: initStartKey}) + if err != nil { + return toCmdErr(err) + } + + printListMemberResult(memberList) + memberNum := len(memberList.Groups) + if memberNum != maxListMemberNum { + break + } + + initStartKey = memberList.Groups[memberNum-1].AccountID + } + + return nil +} + +// listGroup returns a list of groups owned by the specified user +func listGroup(ctx *cli.Context) error { + client, err := NewClient(ctx, false) + if err != nil { + return toCmdErr(err) + } + + groupOwner, err := getGroupOwner(ctx) + if err != nil { + return toCmdErr(err) + } + + c, cancelListGroup := context.WithCancel(globalContext) + defer cancelListGroup() + + initStartKey := "" + for { + groupList, err := client.ListGroupsByOwner(c, + sdktypes.GroupsOwnerPaginationOptions{Limit: maxListMemberNum, Owner: groupOwner, StartAfter: initStartKey}) + if err != nil { + return toCmdErr(err) + } + + printListGroupResult(groupList) + memberNum := len(groupList.Groups) + if memberNum != maxListMemberNum { + break + } + + initStartKey = groupList.Groups[memberNum-1].Group.Id.String() + } + + return nil +} + +func printListMemberResult(listResult *sdktypes.GroupMembersResult) { + for _, member := range listResult.Groups { + if member.Removed { + continue + } + location, _ := time.LoadLocation("Asia/Shanghai") + t := time.Unix(member.CreateTime, 0).In(location) + + fmt.Printf("%s %45s \n", t.Format(iso8601DateFormat), member.AccountID) + } +} + +func printListGroupResult(listResult *sdktypes.GroupsResult) { + for _, group := range listResult.Groups { + if group.Removed { + continue + } + location, _ := time.LoadLocation("Asia/Shanghai") + t := time.Unix(group.CreateTime, 0).In(location) + + fmt.Printf("%s %30s id:%d\n", t.Format(iso8601DateFormat), group.Group.GroupName, group.Group.Id.Uint64()) + } +} + func getGroupOwner(ctx *cli.Context) (string, error) { groupOwnerAddrStr := ctx.String(groupOwnerFlag) diff --git a/cmd/utils.go b/cmd/utils.go index 7d80086..675bd8b 100644 --- a/cmd/utils.go +++ b/cmd/utils.go @@ -99,7 +99,8 @@ const ( StatusSPrefix = "STATUS_" defaultMaxKey = 500 - noBalanceErr = "key not found" + noBalanceErr = "key not found" + maxListMemberNum = 1000 ) var ( diff --git a/go.mod b/go.mod index b7da4a7..95297f3 100644 --- a/go.mod +++ b/go.mod @@ -5,8 +5,8 @@ go 1.20 require ( cosmossdk.io/math v1.0.1 github.com/BurntSushi/toml v1.3.2 - github.com/bnb-chain/greenfield v0.2.4-alpha.1 - github.com/bnb-chain/greenfield-go-sdk v0.2.4-alpha.1 + github.com/bnb-chain/greenfield v0.2.4-alpha.2 + github.com/bnb-chain/greenfield-go-sdk v0.2.4-alpha.2 github.com/cosmos/cosmos-sdk v0.47.3 github.com/ethereum/go-ethereum v1.10.22 github.com/urfave/cli/v2 v2.10.2 @@ -32,7 +32,7 @@ require ( github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cometbft/cometbft v0.37.1 // indirect + github.com/cometbft/cometbft v0.37.2 // indirect github.com/cometbft/cometbft-db v0.7.0 // indirect github.com/confio/ics23/go v0.9.0 // indirect github.com/consensys/gnark-crypto v0.7.0 // indirect @@ -147,13 +147,13 @@ require ( ) replace ( - cosmossdk.io/api => github.com/bnb-chain/greenfield-cosmos-sdk/api v0.0.0-20230425074444-eb5869b05fe9 - cosmossdk.io/math => github.com/bnb-chain/greenfield-cosmos-sdk/math v0.0.0-20230425074444-eb5869b05fe9 + cosmossdk.io/api => github.com/bnb-chain/greenfield-cosmos-sdk/api v0.0.0-20230816082903-b48770f5e210 + cosmossdk.io/math => github.com/bnb-chain/greenfield-cosmos-sdk/math v0.0.0-20230816082903-b48770f5e210 github.com/btcsuite/btcd => github.com/btcsuite/btcd v0.23.0 - github.com/cometbft/cometbft => github.com/bnb-chain/greenfield-cometbft v0.0.2 + github.com/cometbft/cometbft => github.com/bnb-chain/greenfield-cometbft v0.0.3-alpha.1 github.com/cometbft/cometbft-db => github.com/bnb-chain/greenfield-cometbft-db v0.8.1-alpha.1 github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go v0.8.0 - github.com/cosmos/cosmos-sdk => github.com/bnb-chain/greenfield-cosmos-sdk v0.2.4-alpha.1 - github.com/cosmos/iavl => github.com/bnb-chain/greenfield-iavl v0.20.1-alpha.1 + github.com/cosmos/cosmos-sdk => github.com/bnb-chain/greenfield-cosmos-sdk v0.2.4-alpha.2 + github.com/cosmos/iavl => github.com/bnb-chain/greenfield-iavl v0.20.1 github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 ) diff --git a/go.sum b/go.sum index 8c12c6d..9437d91 100644 --- a/go.sum +++ b/go.sum @@ -154,24 +154,24 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= -github.com/bnb-chain/greenfield v0.2.4-alpha.1 h1:ZiIHVLPWodpwkX7bid7E3lYtYDpYeTlrBOPHbwfeFOA= -github.com/bnb-chain/greenfield v0.2.4-alpha.1/go.mod h1:L0xqATrpTBtFgGc2o3hLsRoa6wG86bke+KIrgUcieUY= -github.com/bnb-chain/greenfield-cometbft v0.0.2 h1:bRamS8Lq1lA3ttRLZBha22uiNG5tqN+diD3hapdUCYI= -github.com/bnb-chain/greenfield-cometbft v0.0.2/go.mod h1:EBmwmUdaNbGPyGjf1cMuoN3pAeM2tQu7Lfg95813EAw= +github.com/bnb-chain/greenfield v0.2.4-alpha.2 h1:l/GkTKN3M6TnxC3Ak9Tm8Yd/6qW9bxSMc+/pUGvLgTU= +github.com/bnb-chain/greenfield v0.2.4-alpha.2/go.mod h1:rqUmxfdTvIwqa56H9QASdKQ7zrytbEY3zLMQAl2FMiU= +github.com/bnb-chain/greenfield-cometbft v0.0.3-alpha.1 h1:nCLXxYdkDIh5bQMxtb14TBwiut/xq2e0DqPVTLy9vtI= +github.com/bnb-chain/greenfield-cometbft v0.0.3-alpha.1/go.mod h1:3nGT4Z9fHwgRlBY/rofn0rSarnIcNbuhz/eq0XlLlkg= github.com/bnb-chain/greenfield-cometbft-db v0.8.1-alpha.1 h1:XcWulGacHVRiSCx90Q8Y//ajOrLNBQWR/KDB89dy3cU= github.com/bnb-chain/greenfield-cometbft-db v0.8.1-alpha.1/go.mod h1:ey1CiK4bYo1RBNJLRiVbYr5CMdSxci9S/AZRINLtppI= github.com/bnb-chain/greenfield-common/go v0.0.0-20230809025353-fd0519705054 h1:74pdUdHjo9QNgjSifIgzbDcloqFJ2I+qo715tOXy/oM= github.com/bnb-chain/greenfield-common/go v0.0.0-20230809025353-fd0519705054/go.mod h1:GEjCahULmz99qx5k8WGWa7cTXIUjoNMNW+J92I+kTWg= -github.com/bnb-chain/greenfield-cosmos-sdk v0.2.4-alpha.1 h1:SpkwHzAjIllIQG8av7MybFjJ8mhW1ZZ+P9JqJIsENxI= -github.com/bnb-chain/greenfield-cosmos-sdk v0.2.4-alpha.1/go.mod h1:vyZi5fr4gZBVbhV/TLxbm6T8vylHXbfqQmDCUCUPPfo= -github.com/bnb-chain/greenfield-cosmos-sdk/api v0.0.0-20230425074444-eb5869b05fe9 h1:6fLpmmI0EZvDTfPvI0zy5dBaaTUboHnEkoC5/p/w8TQ= -github.com/bnb-chain/greenfield-cosmos-sdk/api v0.0.0-20230425074444-eb5869b05fe9/go.mod h1:rbc4o84RSEvhf09o2+4Qiazsv0snRJLiEZdk17HeIDw= -github.com/bnb-chain/greenfield-cosmos-sdk/math v0.0.0-20230425074444-eb5869b05fe9 h1:1ZdK+iR1Up02bOa2YTZCml7PBpP//kcdamOcK6aWO/s= -github.com/bnb-chain/greenfield-cosmos-sdk/math v0.0.0-20230425074444-eb5869b05fe9/go.mod h1:Ygz4wBHrgc7g0N+8+MrnTfS9LLn9aaTGa9hKopuym5k= -github.com/bnb-chain/greenfield-go-sdk v0.2.4-alpha.1 h1:ZR4RZC46W9Izf3hRLkmc3X6EXt41fcJxSJWTV7OKt90= -github.com/bnb-chain/greenfield-go-sdk v0.2.4-alpha.1/go.mod h1:sDg+JXw9BA3PYaK2anb7pFAp+/ltbuBWWOjzsUofRNQ= -github.com/bnb-chain/greenfield-iavl v0.20.1-alpha.1 h1:ZnIcvkkQVurg0OaAwmUGn2cK5bZbffjVChFyhh86HMk= -github.com/bnb-chain/greenfield-iavl v0.20.1-alpha.1/go.mod h1:oLksTs8dfh7DYIKBro7hbRQ+ewls7ghJ27pIXlbEXyI= +github.com/bnb-chain/greenfield-cosmos-sdk v0.2.4-alpha.2 h1:mCojTDXd//s34SiHqRolG7saZSG9YHQ9WzPFF8rL4Zo= +github.com/bnb-chain/greenfield-cosmos-sdk v0.2.4-alpha.2/go.mod h1:2jk2ijERIAv8wxQ/IJSmzQKazCnR6YGvICk4O1YrT9M= +github.com/bnb-chain/greenfield-cosmos-sdk/api v0.0.0-20230816082903-b48770f5e210 h1:GHPbV2bC+gmuO6/sG0Tm8oGal3KKSRlyE+zPscDjlA8= +github.com/bnb-chain/greenfield-cosmos-sdk/api v0.0.0-20230816082903-b48770f5e210/go.mod h1:vhsZxXE9tYJeYB5JR4hPhd6Pc/uPf7j1T8IJ7p9FdeM= +github.com/bnb-chain/greenfield-cosmos-sdk/math v0.0.0-20230816082903-b48770f5e210 h1:FLVOn4+OVbsKi2+YJX5kmD27/4dRu4FW7xCXFhzDO5s= +github.com/bnb-chain/greenfield-cosmos-sdk/math v0.0.0-20230816082903-b48770f5e210/go.mod h1:An0MllWJY6PxibUpnwGk8jOm+a/qIxlKmL5Zyp9NnaM= +github.com/bnb-chain/greenfield-go-sdk v0.2.4-alpha.2 h1:lxrcKghW/Qz8mRvLti5R6/VGTpl4O8hd+xhtnr5EL58= +github.com/bnb-chain/greenfield-go-sdk v0.2.4-alpha.2/go.mod h1:PO+JKqXkzk2hjC8UDVFExGkscCwmOdAIzNTnQiGrUBU= +github.com/bnb-chain/greenfield-iavl v0.20.1 h1:y3L64GU99otNp27/xLVBTDbv4eroR6CzoYz0rbaVotM= +github.com/bnb-chain/greenfield-iavl v0.20.1/go.mod h1:oLksTs8dfh7DYIKBro7hbRQ+ewls7ghJ27pIXlbEXyI= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= github.com/bradfitz/gomemcache v0.0.0-20170208213004-1952afaa557d/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60= From 456bc1c4aef8120242223247876411a3cf9b102a Mon Sep 17 00:00:00 2001 From: flywukong <2229306838@qq.com> Date: Thu, 17 Aug 2023 15:36:51 +0800 Subject: [PATCH 03/18] feat: support group ls-belong command --- cmd/cmd_group.go | 77 ++++++++++++++++++++++++++++++++++++++++++++++-- cmd/main.go | 3 ++ 2 files changed, 77 insertions(+), 3 deletions(-) diff --git a/cmd/cmd_group.go b/cmd/cmd_group.go index b078d77..906a7e8 100644 --- a/cmd/cmd_group.go +++ b/cmd/cmd_group.go @@ -13,6 +13,7 @@ import ( sdktypes "github.com/bnb-chain/greenfield-go-sdk/types" "github.com/bnb-chain/greenfield/sdk/types" storageTypes "github.com/bnb-chain/greenfield/x/storage/types" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/urfave/cli/v2" ) @@ -143,7 +144,7 @@ func cmdListGroup() *cli.Command { You need also set group owner using --groupOwner if you are not the owner of the group. Examples: -$ gnfd-cmd group ls`, +$ gnfd-cmd group --groupOwner ls`, Flags: []cli.Flag{ &cli.StringFlag{ Name: groupOwnerFlag, @@ -155,6 +156,30 @@ $ gnfd-cmd group ls`, } } +// cmdListGroupBelong returns a list of all groups that the user has joined +func cmdListGroupBelong() *cli.Command { + return &cli.Command{ + Name: "ls-belong", + Action: listBelongGroup, + Usage: "list groups which the specified user has joined", + ArgsUsage: "GROUP-NAME", + Description: ` +Returns list of all groups that the account has joined +You need also set the account address using --address if you are not the account + +Examples: +$ gnfd-cmd group --address ls-belong`, + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: addressFlag, + Value: "", + Usage: "set the address of the group member", + Required: false, + }, + }, + } +} + func cmdMirrorGroup() *cli.Command { return &cli.Command{ Name: "mirror", @@ -428,6 +453,52 @@ func listGroup(ctx *cli.Context) error { return toCmdErr(err) } + var groupAccount string + addrFlag := ctx.String(addressFlag) + if addrFlag != "" { + _, err = sdk.AccAddressFromHexUnsafe(addrFlag) + if err != nil { + return toCmdErr(err) + } + groupAccount = addrFlag + } else { + acct, err := client.GetDefaultAccount() + if err != nil { + return toCmdErr(err) + } + groupAccount = acct.GetAddress().String() + } + + c, cancelListGroup := context.WithCancel(globalContext) + defer cancelListGroup() + + initStartKey := "" + for { + groupList, err := client.ListGroupsByOwner(c, + sdktypes.GroupsOwnerPaginationOptions{Limit: maxListMemberNum, Owner: groupAccount, StartAfter: initStartKey}) + if err != nil { + return toCmdErr(err) + } + + printListGroupResult(groupList) + memberNum := len(groupList.Groups) + if memberNum != maxListMemberNum { + break + } + + initStartKey = groupList.Groups[memberNum-1].Group.Id.String() + } + + return nil +} + +// listBelongGroup returns a list of all groups that the user has joined +func listBelongGroup(ctx *cli.Context) error { + client, err := NewClient(ctx, false) + if err != nil { + return toCmdErr(err) + } + groupOwner, err := getGroupOwner(ctx) if err != nil { return toCmdErr(err) @@ -438,8 +509,8 @@ func listGroup(ctx *cli.Context) error { initStartKey := "" for { - groupList, err := client.ListGroupsByOwner(c, - sdktypes.GroupsOwnerPaginationOptions{Limit: maxListMemberNum, Owner: groupOwner, StartAfter: initStartKey}) + groupList, err := client.ListGroupsByAccount(c, + sdktypes.GroupsPaginationOptions{Limit: maxListMemberNum, Account: groupOwner, StartAfter: initStartKey}) if err != nil { return toCmdErr(err) } diff --git a/cmd/main.go b/cmd/main.go index e19955d..ebc8c9c 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -110,6 +110,9 @@ func main() { cmdDelGroup(), cmdMirrorGroup(), cmdRenewGroup(), + cmdListGroup(), + cmdListGroupMember(), + cmdListGroupBelong(), }, }, From 32931f21bd7adf2c421e3d1c74a31090e87bfba0 Mon Sep 17 00:00:00 2001 From: flywukong <2229306838@qq.com> Date: Mon, 14 Aug 2023 18:44:17 +0800 Subject: [PATCH 04/18] fix: fix query account balance error --- cmd/cmd_account.go | 17 +++-------------- cmd/utils.go | 26 ++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/cmd/cmd_account.go b/cmd/cmd_account.go index a9a7afb..ddb3c32 100644 --- a/cmd/cmd_account.go +++ b/cmd/cmd_account.go @@ -118,20 +118,9 @@ func getAccountBalance(ctx *cli.Context) error { c, cancelCreateBucket := context.WithCancel(globalContext) defer cancelCreateBucket() - var addr string - flagAddr := ctx.String(addressFlag) - if flagAddr != "" { - _, err = sdk.AccAddressFromHexUnsafe(flagAddr) - if err != nil { - return toCmdErr(err) - } - addr = flagAddr - } else { - acct, err := client.GetDefaultAccount() - if err != nil { - return toCmdErr(err) - } - addr = acct.GetAddress().String() + addr, err := getUserAddress(ctx) + if err != nil { + return err } resp, err := client.GetAccountBalance(c, addr) diff --git a/cmd/utils.go b/cmd/utils.go index 675bd8b..ed72bcd 100644 --- a/cmd/utils.go +++ b/cmd/utils.go @@ -3,6 +3,7 @@ package main import ( "bufio" "encoding/hex" + "encoding/json" "errors" "fmt" "io" @@ -495,3 +496,28 @@ func getHomeDir(ctx *cli.Context) (string, error) { } return "", errors.New("home flag should not be empty") } + +func getUserAddress(ctx *cli.Context) (string, error) { + var userAddress string + var err error + flagAddr := ctx.String(addressFlag) + if flagAddr != "" { + _, err = sdk.AccAddressFromHexUnsafe(flagAddr) + if err != nil { + return "", toCmdErr(err) + } + userAddress = flagAddr + } else { + keyJson, _, err := loadKeyStoreFile(ctx) + if err != nil { + return "", toCmdErr(err) + } + + k := new(encryptedKey) + if err = json.Unmarshal(keyJson, k); err != nil { + return "", toCmdErr(errors.New("failed to get account info: " + err.Error())) + } + userAddress = k.Address + } + return userAddress, nil +} From 532f83e4ea6674878148b8d95dbbf33af3233c01 Mon Sep 17 00:00:00 2001 From: flywukong <2229306838@qq.com> Date: Thu, 17 Aug 2023 15:38:27 +0800 Subject: [PATCH 05/18] fix: fix group ls commands --- cmd/cmd_group.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/cmd_group.go b/cmd/cmd_group.go index 906a7e8..8491165 100644 --- a/cmd/cmd_group.go +++ b/cmd/cmd_group.go @@ -499,9 +499,9 @@ func listBelongGroup(ctx *cli.Context) error { return toCmdErr(err) } - groupOwner, err := getGroupOwner(ctx) + groupMemberAddr, err := getUserAddress(ctx) if err != nil { - return toCmdErr(err) + return err } c, cancelListGroup := context.WithCancel(globalContext) @@ -510,7 +510,7 @@ func listBelongGroup(ctx *cli.Context) error { initStartKey := "" for { groupList, err := client.ListGroupsByAccount(c, - sdktypes.GroupsPaginationOptions{Limit: maxListMemberNum, Account: groupOwner, StartAfter: initStartKey}) + sdktypes.GroupsPaginationOptions{Limit: maxListMemberNum, Account: groupMemberAddr, StartAfter: initStartKey}) if err != nil { return toCmdErr(err) } From 3568cf700e0e31190eb5c0ea2cf317425def64eb Mon Sep 17 00:00:00 2001 From: Alexgao001 Date: Thu, 17 Aug 2023 16:28:05 +0800 Subject: [PATCH 06/18] fix mirror cmd --- cmd/cmd_bucket.go | 16 +++++++++++----- cmd/cmd_group.go | 24 +++++++++++++++--------- cmd/cmd_object.go | 15 ++++++++++----- cmd/utils.go | 1 + 4 files changed, 37 insertions(+), 19 deletions(-) diff --git a/cmd/cmd_bucket.go b/cmd/cmd_bucket.go index b6191ea..a267a93 100644 --- a/cmd/cmd_bucket.go +++ b/cmd/cmd_bucket.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + sdk "github.com/cosmos/cosmos-sdk/types" "time" "cosmossdk.io/math" @@ -119,12 +120,18 @@ Mirror a bucket as NFT to BSC Examples: # Mirror a bucket using bucket id -$ gnfd-cmd bucket mirror --id 1 +$ gnfd-cmd bucket mirror --destChainId 97 --id 1 # Mirror a bucket using bucket name -$ gnfd-cmd bucket mirror --bucketName yourBucketName +$ gnfd-cmd bucket mirror --destChainId 97 --bucketName yourBucketName `, Flags: []cli.Flag{ + &cli.StringFlag{ + Name: DestChainIdFlag, + Value: "", + Usage: "target chain id", + Required: true, + }, &cli.StringFlag{ Name: IdFlag, Value: "", @@ -308,18 +315,17 @@ func mirrorBucket(ctx *cli.Context) error { if err != nil { return toCmdErr(err) } - id := math.NewUint(0) if ctx.String(IdFlag) != "" { id = math.NewUintFromString(ctx.String(IdFlag)) } - + destChainId := ctx.Int64(DestChainIdFlag) bucketName := ctx.String(bucketNameFlag) c, cancelContext := context.WithCancel(globalContext) defer cancelContext() - txResp, err := client.MirrorBucket(c, id, bucketName, types.TxOption{}) + txResp, err := client.MirrorBucket(c, sdk.ChainID(destChainId), id, bucketName, types.TxOption{}) if err != nil { return toCmdErr(err) } diff --git a/cmd/cmd_group.go b/cmd/cmd_group.go index b078d77..292ef3e 100644 --- a/cmd/cmd_group.go +++ b/cmd/cmd_group.go @@ -5,6 +5,7 @@ import ( "encoding/json" "errors" "fmt" + sdk "github.com/cosmos/cosmos-sdk/types" "strconv" "strings" "time" @@ -166,12 +167,18 @@ Mirror a group as NFT to BSC Examples: # Mirror a group using group id -$ gnfd-cmd group mirror --id 1 +$ gnfd-cmd group mirror --destChainId 97 --id 1 # Mirror a group using group name -$ gnfd-cmd group mirror --groupName yourGroupName +$ gnfd-cmd group mirror --destChainId 97 --groupName yourGroupName `, Flags: []cli.Flag{ + &cli.StringFlag{ + Name: DestChainIdFlag, + Value: "", + Usage: "target chain id", + Required: true, + }, &cli.StringFlag{ Name: IdFlag, Value: "", @@ -501,21 +508,20 @@ func getGroupOwner(ctx *cli.Context) (string, error) { } func mirrorGroup(ctx *cli.Context) error { - client, err := NewClient(ctx, false) - if err != nil { - return toCmdErr(err) - } + destChainId := ctx.Int64(DestChainIdFlag) id := math.NewUint(0) if ctx.String(IdFlag) != "" { id = math.NewUintFromString(ctx.String(IdFlag)) } - groupName := ctx.String(groupNameFlag) - c, cancelContext := context.WithCancel(globalContext) defer cancelContext() - txResp, err := client.MirrorGroup(c, id, groupName, types.TxOption{}) + client, err := NewClient(ctx, false) + if err != nil { + return toCmdErr(err) + } + txResp, err := client.MirrorGroup(c, sdk.ChainID(destChainId), id, groupName, types.TxOption{}) if err != nil { return toCmdErr(err) } diff --git a/cmd/cmd_object.go b/cmd/cmd_object.go index 6547389..0ac5511 100644 --- a/cmd/cmd_object.go +++ b/cmd/cmd_object.go @@ -188,12 +188,18 @@ Mirror a object as NFT to BSC Examples: # Mirror a object using object id -$ gnfd-cmd object mirror --id 1 +$ gnfd-cmd object mirror --destChainId 97 --id 1 # Mirror a object using bucket and object name -$ gnfd-cmd object mirror --bucketName yourBucketName --objectName yourObjectName +$ gnfd-cmd object mirror --destChainId 97 --bucketName yourBucketName --objectName yourObjectName `, Flags: []cli.Flag{ + &cli.StringFlag{ + Name: DestChainIdFlag, + Value: "", + Usage: "target chain id", + Required: true, + }, &cli.StringFlag{ Name: IdFlag, Value: "", @@ -684,14 +690,13 @@ func mirrorObject(ctx *cli.Context) error { if ctx.String(IdFlag) != "" { id = math.NewUintFromString(ctx.String(IdFlag)) } - + destChainId := ctx.Int64(DestChainIdFlag) bucketName := ctx.String(bucketNameFlag) objectName := ctx.String(objectNameFlag) - c, cancelContext := context.WithCancel(globalContext) defer cancelContext() - txResp, err := client.MirrorObject(c, id, bucketName, objectName, types.TxOption{}) + txResp, err := client.MirrorObject(c, sdk.ChainID(destChainId), id, bucketName, objectName, types.TxOption{}) if err != nil { return toCmdErr(err) } diff --git a/cmd/utils.go b/cmd/utils.go index 675bd8b..4c09b83 100644 --- a/cmd/utils.go +++ b/cmd/utils.go @@ -54,6 +54,7 @@ const ( effectFlag = "effect" expireTimeFlag = "expire" IdFlag = "id" + DestChainIdFlag = "destChainId" ownerAddressFlag = "owner" addressFlag = "address" From b5a809b33b93753af6c7a40b7866a36c16ce588e Mon Sep 17 00:00:00 2001 From: Alexgao001 Date: Thu, 17 Aug 2023 16:40:54 +0800 Subject: [PATCH 07/18] remove import --- cmd/cmd_group.go | 1 - 1 file changed, 1 deletion(-) diff --git a/cmd/cmd_group.go b/cmd/cmd_group.go index c9d1177..5542b24 100644 --- a/cmd/cmd_group.go +++ b/cmd/cmd_group.go @@ -5,7 +5,6 @@ import ( "encoding/json" "errors" "fmt" - sdk "github.com/cosmos/cosmos-sdk/types" "strconv" "strings" "time" From fdd04a18a82ffa26342518ac17d3b650a49d0b54 Mon Sep 17 00:00:00 2001 From: flywukong <2229306838@qq.com> Date: Thu, 17 Aug 2023 16:45:19 +0800 Subject: [PATCH 08/18] feat: support list policy --- cmd/cmd_policy.go | 85 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/cmd/cmd_policy.go b/cmd/cmd_policy.go index 0578780..aa5866f 100644 --- a/cmd/cmd_policy.go +++ b/cmd/cmd_policy.go @@ -110,6 +110,38 @@ $ gnfd-cmd policy rm --groupId 111 grn:o::gnfd-bucket/gnfd-object`, } } +func cmdListPolicy() *cli.Command { + return &cli.Command{ + Name: "ls", + Action: listPolicy, + Usage: "list policy of principal", + ArgsUsage: " RESOURCE-URL", + Description: ` +The command is used to set the object policy of the grantee or group-id. +It required to set grantee account or group-id by --grantee or --groupId. + +the resource url can be the follow types: +1) grn:b::bucketname, it indicates the bucket policy +2) grn:o::bucketname/objectname, it indicates the object policy +3) grn:g:owneraddress:groupname, it indicates the group policy + +Examples: +$ gnfd-cmd policy rm --groupId 111 grn:o::gnfd-bucket/gnfd-object`, + Flags: []cli.Flag{ + &cli.Uint64Flag{ + Name: groupIDFlag, + Value: 0, + Usage: "the group id of the group", + }, + &cli.StringFlag{ + Name: granteeFlag, + Value: "", + Usage: "the address hex string of the grantee", + }, + }, + } +} + func putPolicy(ctx *cli.Context) error { if ctx.NArg() != 1 { return toCmdErr(fmt.Errorf("args number should be one")) @@ -162,6 +194,19 @@ func deletePolicy(ctx *cli.Context) error { return handleDeletePolicy(ctx, resource, resourceType) } +func listPolicy(ctx *cli.Context) error { + if ctx.NArg() != 1 { + return toCmdErr(fmt.Errorf("args number should be one")) + } + + resource := ctx.Args().Get(0) + resourceType, err := parseResourceType(resource) + if err != nil { + return err + } + return handleDeletePolicy(ctx, resource, resourceType) +} + func handlePutPolicy(ctx *cli.Context, resource string, statements []*permTypes.Statement, policyType ResourceType) error { client, err := NewClient(ctx, false) if err != nil { @@ -266,6 +311,46 @@ func handleDeletePolicy(ctx *cli.Context, resource string, policyType ResourceTy return nil } +func handleListPolicy(ctx *cli.Context, resource string, policyType ResourceType) error { + client, err := NewClient(ctx, false) + if err != nil { + return err + } + //groupId := ctx.Uint64(groupIDFlag) + grantee := ctx.String(granteeFlag) + + if policyType == BucketResourceType { + bucketName, err := parseBucketResource(resource) + if err != nil { + return toCmdErr(err) + } + printBucketPolicy(ctx, client, bucketName) + } else if policyType == ObjectResourceType { + bucketName, objectName, err := parseObjectResource(resource) + if err != nil { + return toCmdErr(err) + } + + printObjectPolicy(ctx, client, bucketName, objectName) + } else if policyType == GroupResourceType { + _, groupName, err := parseGroupResource(resource) + if err != nil { + return toCmdErr(err) + } + + c, cancelGetPolicy := context.WithCancel(globalContext) + defer cancelGetPolicy() + + policyInfo, err := client.GetGroupPolicy(c, groupName, grantee) + if err == nil { + fmt.Printf("latest group policy info: \n %s\n", policyInfo.String()) + } + + } + + return nil +} + func handleObjectPolicy(ctx *cli.Context, client client.Client, bucketName, objectName string, principal sdktypes.Principal, statements []*permTypes.Statement, delete bool) error { c, cancelObjectPolicy := context.WithCancel(globalContext) From b57f4b8decd1841b4bbbae8d39c4f508f3d1fe90 Mon Sep 17 00:00:00 2001 From: flywukong <2229306838@qq.com> Date: Thu, 17 Aug 2023 21:12:50 +0800 Subject: [PATCH 09/18] fix: fix err and comment --- cmd/cmd_account.go | 10 +++++----- cmd/cmd_group.go | 10 +++++----- cmd/utils.go | 3 ++- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/cmd/cmd_account.go b/cmd/cmd_account.go index ddb3c32..93300dd 100644 --- a/cmd/cmd_account.go +++ b/cmd/cmd_account.go @@ -190,6 +190,11 @@ $ gnfd-cmd bank bridge --toAddress 0x.. --amount 12345`, } func importKey(ctx *cli.Context) error { + privateKeyFile := ctx.Args().First() + if privateKeyFile == "" { + return toCmdErr(errors.New("fail to get the private key file info")) + } + keyFilePath := ctx.String("keystore") if keyFilePath == "" { homeDir, err := getHomeDir(ctx) @@ -205,11 +210,6 @@ func importKey(ctx *cli.Context) error { return toCmdErr(err) } - privateKeyFile := ctx.Args().First() - if privateKeyFile == "" { - return toCmdErr(errors.New("fail to get the private key file info")) - } - // Load private key from file. privateKey, addr, err := loadKey(privateKeyFile) if err != nil { diff --git a/cmd/cmd_group.go b/cmd/cmd_group.go index 5542b24..fa05bc6 100644 --- a/cmd/cmd_group.go +++ b/cmd/cmd_group.go @@ -140,7 +140,7 @@ func cmdListGroup() *cli.Command { Usage: "list groups owned by the specified user", ArgsUsage: "GROUP-NAME", Description: ` - Returns a list of groups owned by the specified user, +Returns a list of groups owned by the specified user You need also set group owner using --groupOwner if you are not the owner of the group. Examples: @@ -407,7 +407,6 @@ func renewGroupMember(ctx *cli.Context) error { } // listGroupMember returns a list of members contained within the group specified by the group id -// The user's expiration time has already elapsed will not be listed func listGroupMember(ctx *cli.Context) error { groupName, err := getGroupNameByUrl(ctx) if err != nil { @@ -442,7 +441,7 @@ func listGroupMember(ctx *cli.Context) error { printListMemberResult(memberList) memberNum := len(memberList.Groups) - if memberNum != maxListMemberNum { + if memberNum < maxListMemberNum { break } @@ -488,7 +487,7 @@ func listGroup(ctx *cli.Context) error { printListGroupResult(groupList) memberNum := len(groupList.Groups) - if memberNum != maxListMemberNum { + if memberNum < maxListMemberNum { break } @@ -523,7 +522,7 @@ func listBelongGroup(ctx *cli.Context) error { printListGroupResult(groupList) memberNum := len(groupList.Groups) - if memberNum != maxListMemberNum { + if memberNum < maxListMemberNum { break } @@ -538,6 +537,7 @@ func printListMemberResult(listResult *sdktypes.GroupMembersResult) { if member.Removed { continue } + location, _ := time.LoadLocation("Asia/Shanghai") t := time.Unix(member.CreateTime, 0).In(location) diff --git a/cmd/utils.go b/cmd/utils.go index 5363abe..d144870 100644 --- a/cmd/utils.go +++ b/cmd/utils.go @@ -156,8 +156,9 @@ func getVisibilityType(visibility string) (storageTypes.VisibilityType, error) { func toCmdErr(err error) error { if strings.Contains(err.Error(), noBalanceErr) { fmt.Println("The operator account have no balance, please transfer token to your account") + } else { + fmt.Printf("run command error: %s\n", err.Error()) } - fmt.Printf("run command error: %s\n", err.Error()) return nil } From 5a4a95a067fb06f010bceb75c221087412eb75f7 Mon Sep 17 00:00:00 2001 From: flywukong <2229306838@qq.com> Date: Thu, 17 Aug 2023 21:37:51 +0800 Subject: [PATCH 10/18] fix: fix policy command --- cmd/cmd_policy.go | 2 +- cmd/main.go | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/cmd/cmd_policy.go b/cmd/cmd_policy.go index aa5866f..83ac8f0 100644 --- a/cmd/cmd_policy.go +++ b/cmd/cmd_policy.go @@ -117,7 +117,7 @@ func cmdListPolicy() *cli.Command { Usage: "list policy of principal", ArgsUsage: " RESOURCE-URL", Description: ` -The command is used to set the object policy of the grantee or group-id. +The command is used to list the policy of the grantee or group-id. It required to set grantee account or group-id by --grantee or --groupId. the resource url can be the follow types: diff --git a/cmd/main.go b/cmd/main.go index ebc8c9c..45ab946 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -131,6 +131,7 @@ func main() { Subcommands: []*cli.Command{ cmdPutPolicy(), cmdDelPolicy(), + cmdListPolicy(), }, }, From 6490c43f1731c12e3425bdad02d7c6e7fc1df9fd Mon Sep 17 00:00:00 2001 From: flywukong <2229306838@qq.com> Date: Thu, 17 Aug 2023 21:40:07 +0800 Subject: [PATCH 11/18] fix: fix lint --- cmd/cmd_policy.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/cmd_policy.go b/cmd/cmd_policy.go index 83ac8f0..c04d5bb 100644 --- a/cmd/cmd_policy.go +++ b/cmd/cmd_policy.go @@ -204,7 +204,7 @@ func listPolicy(ctx *cli.Context) error { if err != nil { return err } - return handleDeletePolicy(ctx, resource, resourceType) + return handleListPolicy(ctx, resource, resourceType) } func handlePutPolicy(ctx *cli.Context, resource string, statements []*permTypes.Statement, policyType ResourceType) error { From 1720458f37c02d8854a351f7a34d34fcb6fc5af8 Mon Sep 17 00:00:00 2001 From: flywukong <2229306838@qq.com> Date: Fri, 18 Aug 2023 10:52:08 +0800 Subject: [PATCH 12/18] fix: fix error --- cmd/cmd_group.go | 20 +++++--------------- cmd/cmd_object.go | 2 +- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/cmd/cmd_group.go b/cmd/cmd_group.go index fa05bc6..2de69a8 100644 --- a/cmd/cmd_group.go +++ b/cmd/cmd_group.go @@ -458,20 +458,9 @@ func listGroup(ctx *cli.Context) error { return toCmdErr(err) } - var groupAccount string - addrFlag := ctx.String(addressFlag) - if addrFlag != "" { - _, err = sdk.AccAddressFromHexUnsafe(addrFlag) - if err != nil { - return toCmdErr(err) - } - groupAccount = addrFlag - } else { - acct, err := client.GetDefaultAccount() - if err != nil { - return toCmdErr(err) - } - groupAccount = acct.GetAddress().String() + groupOwner, err := getGroupOwner(ctx) + if err != nil { + return toCmdErr(err) } c, cancelListGroup := context.WithCancel(globalContext) @@ -480,7 +469,8 @@ func listGroup(ctx *cli.Context) error { initStartKey := "" for { groupList, err := client.ListGroupsByOwner(c, - sdktypes.GroupsOwnerPaginationOptions{Limit: maxListMemberNum, Owner: groupAccount, StartAfter: initStartKey}) + sdktypes.GroupsOwnerPaginationOptions{Limit: maxListMemberNum, Owner: groupOwner, StartAfter: initStartKey}) + if err != nil { return toCmdErr(err) } diff --git a/cmd/cmd_object.go b/cmd/cmd_object.go index 0ac5511..1e68bc9 100644 --- a/cmd/cmd_object.go +++ b/cmd/cmd_object.go @@ -381,7 +381,7 @@ func putObject(ctx *cli.Context) error { if headObjOutput.ObjectInfo.GetObjectStatus().String() == "OBJECT_STATUS_SEALED" { ticker.Stop() - fmt.Printf("upload: %s to %s \n", objectName, urlInfo) + fmt.Printf("upload %s to %s \n", objectName, urlInfo) return nil } } From 60673daf35e37123ea71f5402ee4a7a5950bd012 Mon Sep 17 00:00:00 2001 From: flywukong <2229306838@qq.com> Date: Fri, 18 Aug 2023 11:02:54 +0800 Subject: [PATCH 13/18] fix: fix expire flag err --- cmd/cmd_group.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/cmd_group.go b/cmd/cmd_group.go index 2de69a8..c7e4c08 100644 --- a/cmd/cmd_group.go +++ b/cmd/cmd_group.go @@ -306,7 +306,7 @@ func updateGroupMember(ctx *cli.Context) error { return toCmdErr(ErrGroupNotExist) } - expireTimestamp := ctx.Int64(expireTimeFlag) + expireTimestamp := ctx.Int64(groupMemberExpireFlag) if expireTimestamp != 0 && expireTimestamp < time.Now().Unix() { return toCmdErr(errors.New("expire stamp should be more than" + strconv.Itoa(int(time.Now().Unix())))) @@ -368,7 +368,7 @@ func renewGroupMember(ctx *cli.Context) error { return toCmdErr(err) } - expireTimestamp := ctx.Int64(expireTimeFlag) + expireTimestamp := ctx.Int64(groupMemberExpireFlag) if expireTimestamp < time.Now().Unix() { return toCmdErr(errors.New("expire stamp should be more than" + strconv.Itoa(int(time.Now().Unix())))) } else if expireTimestamp == 0 { From e3655e8379ccbacf70b1ac5ecd9ed712f6f5cccd Mon Sep 17 00:00:00 2001 From: flywukong <2229306838@qq.com> Date: Fri, 18 Aug 2023 12:50:32 +0800 Subject: [PATCH 14/18] feat: improve policy ls commands --- cmd/cmd_policy.go | 89 +++++++++++++++++++++++++++++++++++++++++++++-- cmd/utils.go | 1 + 2 files changed, 88 insertions(+), 2 deletions(-) diff --git a/cmd/cmd_policy.go b/cmd/cmd_policy.go index c04d5bb..e0a3c81 100644 --- a/cmd/cmd_policy.go +++ b/cmd/cmd_policy.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "strconv" "strings" "time" @@ -324,14 +325,20 @@ func handleListPolicy(ctx *cli.Context, resource string, policyType ResourceType if err != nil { return toCmdErr(err) } - printBucketPolicy(ctx, client, bucketName) + err = listBucketPolicy(ctx, client, bucketName) + if err != nil { + return toCmdErr(err) + } } else if policyType == ObjectResourceType { bucketName, objectName, err := parseObjectResource(resource) if err != nil { return toCmdErr(err) } - printObjectPolicy(ctx, client, bucketName, objectName) + err = listObjectPolicy(ctx, client, bucketName, objectName) + if err != nil { + return toCmdErr(err) + } } else if policyType == GroupResourceType { _, groupName, err := parseGroupResource(resource) if err != nil { @@ -346,6 +353,8 @@ func handleListPolicy(ctx *cli.Context, resource string, policyType ResourceType fmt.Printf("latest group policy info: \n %s\n", policyInfo.String()) } + resourceName := "group:" + groupName + listPolicyInfo(0, grantee, resourceName, *policyInfo) } return nil @@ -520,6 +529,27 @@ func printObjectPolicy(ctx *cli.Context, cli client.Client, bucketName, objectNa } } +func listObjectPolicy(ctx *cli.Context, cli client.Client, bucketName, objectName string) error { + // get the latest policy from chain + groupId := ctx.Uint64(groupIDFlag) + grantee := ctx.String(granteeFlag) + c, cancelPolicy := context.WithCancel(globalContext) + defer cancelPolicy() + var policyInfo *permTypes.Policy + var err error + if groupId > 0 { + policyInfo, err = cli.GetObjectPolicyOfGroup(c, bucketName, objectName, groupId) + } else { + policyInfo, err = cli.GetObjectPolicy(c, bucketName, objectName, grantee) + } + if err != nil { + return err + } + resourceName := greenfieldPrefix + bucketName + "/" + objectName + listPolicyInfo(groupId, grantee, resourceName, *policyInfo) + return nil +} + func printBucketPolicy(ctx *cli.Context, cli client.Client, bucketName string) { c, cancelPolicy := context.WithCancel(globalContext) defer cancelPolicy() @@ -539,6 +569,29 @@ func printBucketPolicy(ctx *cli.Context, cli client.Client, bucketName string) { } } +func listBucketPolicy(ctx *cli.Context, cli client.Client, bucketName string) error { + c, cancelPolicy := context.WithCancel(globalContext) + defer cancelPolicy() + + groupId := ctx.Uint64(groupIDFlag) + grantee := ctx.String(granteeFlag) + + var policyInfo *permTypes.Policy + var err error + if groupId > 0 { + policyInfo, err = cli.GetBucketPolicyOfGroup(c, bucketName, groupId) + } else { + policyInfo, err = cli.GetBucketPolicy(c, bucketName, grantee) + } + if err != nil { + return err + } + + resourceName := greenfieldPrefix + bucketName + listPolicyInfo(groupId, grantee, resourceName, *policyInfo) + return nil +} + func parseResourceType(resource string) (ResourceType, error) { var resourceType ResourceType if strings.HasPrefix(resource, BucketResourcePrefix) { @@ -552,3 +605,35 @@ func parseResourceType(resource string) (ResourceType, error) { } return resourceType, nil } + +func getActionStr(actions []permTypes.ActionType) string { + var action string + for id, typeName := range actions { + if id == 0 { + action += typeName.String()[len("ACTION_"):] + } else { + action += "," + typeName.String()[len("ACTION_"):] + } + } + return action +} + +func listPolicyInfo(groupId uint64, grantee, resourceName string, policyInfo permTypes.Policy) { + var format string + if groupId > 0 { + format = fmt.Sprintf("%%-%ds %%-%ds %%-%ds %%-%ds \n", 15, 40, 10, 20) + } else { + format = fmt.Sprintf("%%-%ds %%-%ds %%-%ds %%-%ds \n", operatorAddressLen+10, 40, 10, 20) + } + + fmt.Printf(format, "principal", "actions", "effect", "resource") + for _, statement := range policyInfo.Statements { + actionName := getActionStr(statement.GetActions()) + effectName := statement.GetEffect().String()[len("EFFECT_"):] + if groupId > 0 { + fmt.Printf(format, "groupID:"+strconv.FormatUint(groupId, 10), actionName, effectName, resourceName) + } else { + fmt.Printf(format, "grantee:"+grantee, actionName, effectName, resourceName) + } + } +} diff --git a/cmd/utils.go b/cmd/utils.go index d144870..2af1d3a 100644 --- a/cmd/utils.go +++ b/cmd/utils.go @@ -30,6 +30,7 @@ import ( const ( Version = "v0.0.9" maxFileSize = 10 * 1024 * 1024 * 1024 + greenfieldPrefix = "gnfd://" publicReadType = "public-read" privateType = "private" inheritType = "inherit" From 5608fbef8aaaf18d9f869f9ca5656af7304e4703 Mon Sep 17 00:00:00 2001 From: flywukong <2229306838@qq.com> Date: Fri, 18 Aug 2023 13:18:25 +0800 Subject: [PATCH 15/18] fix: update dependency and fix example --- cmd/cmd_group.go | 10 ++++++---- cmd/cmd_policy.go | 4 ++-- go.mod | 2 +- go.sum | 2 ++ 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/cmd/cmd_group.go b/cmd/cmd_group.go index c7e4c08..a9d9d1f 100644 --- a/cmd/cmd_group.go +++ b/cmd/cmd_group.go @@ -168,7 +168,7 @@ Returns list of all groups that the account has joined You need also set the account address using --address if you are not the account Examples: -$ gnfd-cmd group --address ls-belong`, +$ gnfd-cmd group ls-belong --address`, Flags: []cli.Flag{ &cli.StringFlag{ Name: addressFlag, @@ -481,7 +481,8 @@ func listGroup(ctx *cli.Context) error { break } - initStartKey = groupList.Groups[memberNum-1].Group.Id.String() + id := groupList.Groups[memberNum-1].Group.Id + initStartKey = strconv.FormatUint(id, 10) } return nil @@ -516,7 +517,8 @@ func listBelongGroup(ctx *cli.Context) error { break } - initStartKey = groupList.Groups[memberNum-1].Group.Id.String() + id := groupList.Groups[memberNum-1].Group.Id + initStartKey = strconv.FormatUint(id, 10) } return nil @@ -543,7 +545,7 @@ func printListGroupResult(listResult *sdktypes.GroupsResult) { location, _ := time.LoadLocation("Asia/Shanghai") t := time.Unix(group.CreateTime, 0).In(location) - fmt.Printf("%s %30s id:%d\n", t.Format(iso8601DateFormat), group.Group.GroupName, group.Group.Id.Uint64()) + fmt.Printf("%s %30s id: %d\n", t.Format(iso8601DateFormat), group.Group.GroupName, group.Group.Id) } } diff --git a/cmd/cmd_policy.go b/cmd/cmd_policy.go index e0a3c81..88c2bbb 100644 --- a/cmd/cmd_policy.go +++ b/cmd/cmd_policy.go @@ -349,8 +349,8 @@ func handleListPolicy(ctx *cli.Context, resource string, policyType ResourceType defer cancelGetPolicy() policyInfo, err := client.GetGroupPolicy(c, groupName, grantee) - if err == nil { - fmt.Printf("latest group policy info: \n %s\n", policyInfo.String()) + if err != nil { + return toCmdErr(err) } resourceName := "group:" + groupName diff --git a/go.mod b/go.mod index 95297f3..83383a0 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( cosmossdk.io/math v1.0.1 github.com/BurntSushi/toml v1.3.2 github.com/bnb-chain/greenfield v0.2.4-alpha.2 - github.com/bnb-chain/greenfield-go-sdk v0.2.4-alpha.2 + github.com/bnb-chain/greenfield-go-sdk v0.2.4-alpha.3 github.com/cosmos/cosmos-sdk v0.47.3 github.com/ethereum/go-ethereum v1.10.22 github.com/urfave/cli/v2 v2.10.2 diff --git a/go.sum b/go.sum index 9437d91..a3c2f9d 100644 --- a/go.sum +++ b/go.sum @@ -170,6 +170,8 @@ github.com/bnb-chain/greenfield-cosmos-sdk/math v0.0.0-20230816082903-b48770f5e2 github.com/bnb-chain/greenfield-cosmos-sdk/math v0.0.0-20230816082903-b48770f5e210/go.mod h1:An0MllWJY6PxibUpnwGk8jOm+a/qIxlKmL5Zyp9NnaM= github.com/bnb-chain/greenfield-go-sdk v0.2.4-alpha.2 h1:lxrcKghW/Qz8mRvLti5R6/VGTpl4O8hd+xhtnr5EL58= github.com/bnb-chain/greenfield-go-sdk v0.2.4-alpha.2/go.mod h1:PO+JKqXkzk2hjC8UDVFExGkscCwmOdAIzNTnQiGrUBU= +github.com/bnb-chain/greenfield-go-sdk v0.2.4-alpha.3 h1:Fr4MV809IE9IjaDSNS0bMSSBqCbq6pAuBVRpY6kKpRw= +github.com/bnb-chain/greenfield-go-sdk v0.2.4-alpha.3/go.mod h1:PO+JKqXkzk2hjC8UDVFExGkscCwmOdAIzNTnQiGrUBU= github.com/bnb-chain/greenfield-iavl v0.20.1 h1:y3L64GU99otNp27/xLVBTDbv4eroR6CzoYz0rbaVotM= github.com/bnb-chain/greenfield-iavl v0.20.1/go.mod h1:oLksTs8dfh7DYIKBro7hbRQ+ewls7ghJ27pIXlbEXyI= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= From 84762d6312541517b0d7578d808d2159538b2fb4 Mon Sep 17 00:00:00 2001 From: flywukong <2229306838@qq.com> Date: Fri, 18 Aug 2023 18:15:54 +0800 Subject: [PATCH 16/18] fix: improve format of group ls --- cmd/cmd_group.go | 17 +++++++++++++++-- cmd/cmd_policy.go | 4 ++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/cmd/cmd_group.go b/cmd/cmd_group.go index a9d9d1f..281e540 100644 --- a/cmd/cmd_group.go +++ b/cmd/cmd_group.go @@ -525,6 +525,10 @@ func listBelongGroup(ctx *cli.Context) error { } func printListMemberResult(listResult *sdktypes.GroupMembersResult) { + var format string + format = fmt.Sprintf("%%-%ds %%-%ds %%-%ds \n", len(iso8601DateFormat), operatorAddressLen, len(iso8601DateFormat)) + fmt.Printf(format, "create-time", "member", "expire-time") + for _, member := range listResult.Groups { if member.Removed { continue @@ -533,11 +537,20 @@ func printListMemberResult(listResult *sdktypes.GroupMembersResult) { location, _ := time.LoadLocation("Asia/Shanghai") t := time.Unix(member.CreateTime, 0).In(location) - fmt.Printf("%s %45s \n", t.Format(iso8601DateFormat), member.AccountID) + expireTime, err := strconv.ParseInt(member.ExpirationTime, 10, 64) + if err != nil { + expireTime = 0 + } + + fmt.Printf(format, t.Format(iso8601DateFormat), member.AccountID, time.Unix(expireTime, 0).In(location).Format(iso8601DateFormat)) } } func printListGroupResult(listResult *sdktypes.GroupsResult) { + var format string + format = fmt.Sprintf("%%-%ds %%-%ds %%-%ds \n", len(iso8601DateFormat)+3, 20, 10) + fmt.Printf(format, "create-time", "group-name", "id") + for _, group := range listResult.Groups { if group.Removed { continue @@ -545,7 +558,7 @@ func printListGroupResult(listResult *sdktypes.GroupsResult) { location, _ := time.LoadLocation("Asia/Shanghai") t := time.Unix(group.CreateTime, 0).In(location) - fmt.Printf("%s %30s id: %d\n", t.Format(iso8601DateFormat), group.Group.GroupName, group.Group.Id) + fmt.Printf(format, t.Format(iso8601DateFormat), group.Group.GroupName, strconv.FormatUint(group.Group.Id, 10)) } } diff --git a/cmd/cmd_policy.go b/cmd/cmd_policy.go index 88c2bbb..23794a0 100644 --- a/cmd/cmd_policy.go +++ b/cmd/cmd_policy.go @@ -631,9 +631,9 @@ func listPolicyInfo(groupId uint64, grantee, resourceName string, policyInfo per actionName := getActionStr(statement.GetActions()) effectName := statement.GetEffect().String()[len("EFFECT_"):] if groupId > 0 { - fmt.Printf(format, "groupID:"+strconv.FormatUint(groupId, 10), actionName, effectName, resourceName) + fmt.Printf(format, "groupID-"+strconv.FormatUint(groupId, 10), actionName, effectName, resourceName) } else { - fmt.Printf(format, "grantee:"+grantee, actionName, effectName, resourceName) + fmt.Printf(format, ""+grantee, actionName, effectName, resourceName) } } } From b2d38acbed9fa0f86dba63ff0f60c150cf85ad18 Mon Sep 17 00:00:00 2001 From: flywukong <2229306838@qq.com> Date: Fri, 18 Aug 2023 18:22:13 +0800 Subject: [PATCH 17/18] fix: fix resource name --- cmd/cmd_policy.go | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/cmd/cmd_policy.go b/cmd/cmd_policy.go index 23794a0..eec2ca4 100644 --- a/cmd/cmd_policy.go +++ b/cmd/cmd_policy.go @@ -325,7 +325,7 @@ func handleListPolicy(ctx *cli.Context, resource string, policyType ResourceType if err != nil { return toCmdErr(err) } - err = listBucketPolicy(ctx, client, bucketName) + err = listBucketPolicy(ctx, client, bucketName, resource) if err != nil { return toCmdErr(err) } @@ -335,7 +335,7 @@ func handleListPolicy(ctx *cli.Context, resource string, policyType ResourceType return toCmdErr(err) } - err = listObjectPolicy(ctx, client, bucketName, objectName) + err = listObjectPolicy(ctx, client, bucketName, objectName, resource) if err != nil { return toCmdErr(err) } @@ -353,8 +353,7 @@ func handleListPolicy(ctx *cli.Context, resource string, policyType ResourceType return toCmdErr(err) } - resourceName := "group:" + groupName - listPolicyInfo(0, grantee, resourceName, *policyInfo) + listPolicyInfo(0, grantee, resource, *policyInfo) } return nil @@ -529,7 +528,7 @@ func printObjectPolicy(ctx *cli.Context, cli client.Client, bucketName, objectNa } } -func listObjectPolicy(ctx *cli.Context, cli client.Client, bucketName, objectName string) error { +func listObjectPolicy(ctx *cli.Context, cli client.Client, bucketName, objectName, resourceName string) error { // get the latest policy from chain groupId := ctx.Uint64(groupIDFlag) grantee := ctx.String(granteeFlag) @@ -545,7 +544,7 @@ func listObjectPolicy(ctx *cli.Context, cli client.Client, bucketName, objectNam if err != nil { return err } - resourceName := greenfieldPrefix + bucketName + "/" + objectName + listPolicyInfo(groupId, grantee, resourceName, *policyInfo) return nil } @@ -569,7 +568,7 @@ func printBucketPolicy(ctx *cli.Context, cli client.Client, bucketName string) { } } -func listBucketPolicy(ctx *cli.Context, cli client.Client, bucketName string) error { +func listBucketPolicy(ctx *cli.Context, cli client.Client, bucketName, resourceName string) error { c, cancelPolicy := context.WithCancel(globalContext) defer cancelPolicy() @@ -586,8 +585,7 @@ func listBucketPolicy(ctx *cli.Context, cli client.Client, bucketName string) er if err != nil { return err } - - resourceName := greenfieldPrefix + bucketName + listPolicyInfo(groupId, grantee, resourceName, *policyInfo) return nil } From a43c858aaaf269ed8c7d92dc6699637b5be484e9 Mon Sep 17 00:00:00 2001 From: flywukong <2229306838@qq.com> Date: Fri, 18 Aug 2023 18:25:23 +0800 Subject: [PATCH 18/18] fix: fix lint --- cmd/cmd_group.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/cmd/cmd_group.go b/cmd/cmd_group.go index 281e540..11b179f 100644 --- a/cmd/cmd_group.go +++ b/cmd/cmd_group.go @@ -525,8 +525,7 @@ func listBelongGroup(ctx *cli.Context) error { } func printListMemberResult(listResult *sdktypes.GroupMembersResult) { - var format string - format = fmt.Sprintf("%%-%ds %%-%ds %%-%ds \n", len(iso8601DateFormat), operatorAddressLen, len(iso8601DateFormat)) + format := fmt.Sprintf("%%-%ds %%-%ds %%-%ds \n", len(iso8601DateFormat), operatorAddressLen, len(iso8601DateFormat)) fmt.Printf(format, "create-time", "member", "expire-time") for _, member := range listResult.Groups { @@ -547,8 +546,7 @@ func printListMemberResult(listResult *sdktypes.GroupMembersResult) { } func printListGroupResult(listResult *sdktypes.GroupsResult) { - var format string - format = fmt.Sprintf("%%-%ds %%-%ds %%-%ds \n", len(iso8601DateFormat)+3, 20, 10) + format := fmt.Sprintf("%%-%ds %%-%ds %%-%ds \n", len(iso8601DateFormat)+3, 20, 10) fmt.Printf(format, "create-time", "group-name", "id") for _, group := range listResult.Groups {