diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ef9ca8e1..00aa5e3fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## v1.4.0 +This release introduces the Ural upgrade to the testnet. + +Features: +* [#560](https://github.com/bnb-chain/greenfield/pull/560) feat: change logic of resource name length check +* [#563](https://github.com/bnb-chain/greenfield/pull/563) feat: set tag by accounts with permission + ## v1.3.0 This release introduces the Hulunbeier upgrade to the Testnet and Mainnet. diff --git a/app/upgrade.go b/app/upgrade.go index 3b818308d..f512a6115 100644 --- a/app/upgrade.go +++ b/app/upgrade.go @@ -28,7 +28,7 @@ func (app *App) RegisterUpgradeHandlers(chainID string, serverCfg *serverconfig. app.registerManchurianUpgradeHandler() app.registerHulunbeierUpgradeHandler() app.registerHulunbeierPatchUpgradeHandler() - + app.registerUralUpgradeHandler() // app.register...() // ... return nil @@ -180,3 +180,19 @@ func (app *App) registerHulunbeierPatchUpgradeHandler() { return nil }) } + +func (app *App) registerUralUpgradeHandler() { + // Register the upgrade handler + app.UpgradeKeeper.SetUpgradeHandler(upgradetypes.Ural, + func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { + app.Logger().Info("upgrade to ", plan.Name) + return app.mm.RunMigrations(ctx, app.configurator, fromVM) + }) + + // Register the upgrade initializer + app.UpgradeKeeper.SetUpgradeInitializer(upgradetypes.Ural, + func() error { + app.Logger().Info("Init Ural upgrade") + return nil + }) +} diff --git a/deployment/localup/localup.sh b/deployment/localup/localup.sh index 6ee1a6f91..84cf10c73 100644 --- a/deployment/localup/localup.sh +++ b/deployment/localup/localup.sh @@ -176,6 +176,7 @@ function generate_genesis() { echo -e '[[upgrade]]\nname = "Manchurian"\nheight = 20\ninfo = ""' >> ${workspace}/.local/validator${i}/config/app.toml echo -e '[[upgrade]]\nname = "Hulunbeier"\nheight = 21\ninfo = ""' >> ${workspace}/.local/validator${i}/config/app.toml echo -e '[[upgrade]]\nname = "HulunbeierPatch"\nheight = 21\ninfo = ""' >> ${workspace}/.local/validator${i}/config/app.toml + echo -e '[[upgrade]]\nname = "Ural"\nheight = 22\ninfo = ""' >> ${workspace}/.local/validator${i}/config/app.toml done # enable swagger API for validator0 diff --git a/e2e/tests/permission_test.go b/e2e/tests/permission_test.go index bf998799e..4f2a3f7d2 100644 --- a/e2e/tests/permission_test.go +++ b/e2e/tests/permission_test.go @@ -2033,3 +2033,107 @@ func (s *StorageTestSuite) TestExpiredGroupPolicyGCAndRePut() { s.Require().Equal(queryPolicyForGroupResp.Policy.ResourceType, resource.RESOURCE_TYPE_BUCKET) s.Require().Equal(types.EFFECT_ALLOW, queryPolicyForGroupResp.Policy.Statements[0].Effect) } + +func (s *StorageTestSuite) TestSetResourceTagWithPermission() { + var err error + owner := s.GenAndChargeAccounts(1, 1000000)[0] + user := s.GenAndChargeAccounts(1, 1000000)[0] + + // CreateBucket + sp := s.BaseSuite.PickStorageProvider() + gvg, found := sp.GetFirstGlobalVirtualGroup() + s.Require().True(found) + + bucketName := storageutil.GenRandomBucketName() + msgCreateBucket := storagetypes.NewMsgCreateBucket( + owner.GetAddr(), bucketName, storagetypes.VISIBILITY_TYPE_PUBLIC_READ, sp.OperatorKey.GetAddr(), + nil, math.MaxUint, nil, 0) + msgCreateBucket.PrimarySpApproval.GlobalVirtualGroupFamilyId = gvg.FamilyId + msgCreateBucket.PrimarySpApproval.Sig, err = sp.ApprovalKey.Sign(msgCreateBucket.GetApprovalBytes()) + s.Require().NoError(err) + + // Put bucket policy, grant the user updateBucket permission + userPrincipal := types.NewPrincipalWithAccount(user.GetAddr()) + bucketStatement := &types.Statement{ + Actions: []types.ActionType{types.ACTION_UPDATE_BUCKET_INFO}, + Effect: types.EFFECT_ALLOW, + } + bucketGRN := types2.NewBucketGRN(bucketName).String() + msgPutBucketPolicy := storagetypes.NewMsgPutPolicy(owner.GetAddr(), bucketGRN, + userPrincipal, []*types.Statement{bucketStatement}, nil) + s.SendTxBlock(owner, msgCreateBucket, msgPutBucketPolicy) + + // set bucket tag by user + var tags storagetypes.ResourceTags + tags.Tags = append(tags.Tags, storagetypes.ResourceTags_Tag{Key: "key1", Value: "value1"}) + msgSetTag := storagetypes.NewMsgSetTag(user.GetAddr(), bucketGRN, &tags) + s.SendTxBlock(user, msgSetTag) + + req := storagetypes.QueryHeadBucketRequest{ + BucketName: bucketName, + } + resp, err := s.Client.HeadBucket(context.Background(), &req) + s.Require().NoError(err) + s.Require().Equal(tags, *resp.BucketInfo.Tags) + + // Create object by owner + objectName := storageutil.GenRandomObjectName() + // create test buffer + var buffer bytes.Buffer + // Create 1MiB content where each line contains 1024 characters. + for i := 0; i < 1024; i++ { + buffer.WriteString(fmt.Sprintf("[%05d] %s\n", i, line)) + } + payloadSize := buffer.Len() + checksum := sdk.Keccak256(buffer.Bytes()) + expectChecksum := [][]byte{checksum, checksum, checksum, checksum, checksum, checksum, checksum} + contextType := "text/event-stream" + msgCreateObject := storagetypes.NewMsgCreateObject(owner.GetAddr(), bucketName, objectName, uint64(payloadSize), storagetypes.VISIBILITY_TYPE_PRIVATE, expectChecksum, contextType, storagetypes.REDUNDANCY_EC_TYPE, math.MaxUint, nil) + msgCreateObject.PrimarySpApproval.Sig, err = sp.ApprovalKey.Sign(msgCreateObject.GetApprovalBytes()) + s.Require().NoError(err) + + // Put object policy, grant the user updateBucket permission + objectStatement := &types.Statement{ + Actions: []types.ActionType{types.ACTION_UPDATE_OBJECT_INFO}, + Effect: types.EFFECT_ALLOW, + } + objectGRN := types2.NewObjectGRN(bucketName, objectName).String() + msgPutObjectPolicy := storagetypes.NewMsgPutPolicy(owner.GetAddr(), objectGRN, + userPrincipal, []*types.Statement{objectStatement}, nil) + s.SendTxBlock(owner, msgCreateObject, msgPutObjectPolicy) + + // set object tag by user + msgSetTag = storagetypes.NewMsgSetTag(user.GetAddr(), objectGRN, &tags) + s.SendTxBlock(user, msgSetTag) + + // Head object, tag shown + objectResp, err := s.Client.HeadObject(context.Background(), &storagetypes.QueryHeadObjectRequest{ + BucketName: bucketName, + ObjectName: objectName, + }) + s.Require().NoError(err) + s.Require().Equal(tags, *objectResp.ObjectInfo.Tags) + + // Create a group by owner + groupName := storageutil.GenRandomGroupName() + msgCreateGroup := storagetypes.NewMsgCreateGroup(owner.GetAddr(), groupName, "") + groupGRN := types2.NewGroupGRN(owner.GetAddr(), groupName).String() + + // Put group policy by owner, grant the user updateGroupMeta permission + groupStatement := &types.Statement{ + Actions: []types.ActionType{types.ACTION_UPDATE_GROUP_INFO}, + Effect: types.EFFECT_ALLOW, + } + msgPutGroupPolicy := storagetypes.NewMsgPutPolicy(owner.GetAddr(), types2.NewGroupGRN(owner.GetAddr(), groupName).String(), + types.NewPrincipalWithAccount(user.GetAddr()), []*types.Statement{groupStatement}, nil) + s.SendTxBlock(owner, msgCreateGroup, msgPutGroupPolicy) + + // // set group tag by user + msgSetTag = storagetypes.NewMsgSetTag(user.GetAddr(), groupGRN, &tags) + s.SendTxBlock(user, msgSetTag) + + // Head group, tag shown + headGroupResponse, err := s.Client.HeadGroup(context.Background(), &storagetypes.QueryHeadGroupRequest{GroupOwner: owner.GetAddr().String(), GroupName: groupName}) + s.Require().NoError(err) + s.Require().Equal(tags, *headGroupResponse.GroupInfo.Tags) +} diff --git a/go.mod b/go.mod index c313a2091..a4a0a6d46 100644 --- a/go.mod +++ b/go.mod @@ -43,6 +43,7 @@ require ( github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.1 // indirect github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d // indirect + github.com/StackExchange/wmi v0.0.0-20210224194228-fe8f1750fd46 // indirect github.com/armon/go-metrics v0.4.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect @@ -65,6 +66,7 @@ require ( github.com/creachadair/taskgroup v0.4.2 // indirect github.com/danieljoos/wincred v1.1.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/deckarep/golang-set v1.8.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect github.com/dgraph-io/badger/v2 v2.2007.4 // indirect @@ -80,6 +82,7 @@ require ( github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-playground/universal-translator v0.18.0 // indirect + github.com/go-stack/stack v1.8.0 // indirect github.com/goccy/go-json v0.10.2 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gogo/googleapis v1.4.1 // indirect @@ -89,6 +92,7 @@ require ( github.com/google/btree v1.1.2 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/orderedcode v0.0.1 // indirect + github.com/google/uuid v1.3.0 // indirect github.com/gorilla/handlers v1.5.1 // indirect github.com/gorilla/mux v1.8.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect @@ -135,10 +139,12 @@ require ( github.com/prysmaticlabs/eth2-types v0.0.0-20210303084904-c9735a06829d // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/rivo/uniseg v0.2.0 // indirect + github.com/rjeczalik/notify v0.9.1 // indirect github.com/rs/cors v1.8.3 // indirect github.com/rs/zerolog v1.29.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/sasha-s/go-deadlock v0.3.1 // indirect + github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/spf13/afero v1.9.3 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect @@ -149,6 +155,7 @@ require ( github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e // indirect github.com/tidwall/btree v1.6.0 // indirect github.com/tklauser/go-sysconf v0.3.10 // indirect + github.com/tklauser/numcpus v0.4.0 // indirect github.com/ugorji/go/codec v1.2.7 // indirect github.com/urfave/cli/v2 v2.10.2 // indirect github.com/wealdtech/go-bytesutil v1.1.1 // indirect @@ -168,6 +175,7 @@ require ( google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/yaml.v3 v3.0.1 // indirect nhooyr.io/websocket v1.8.6 // indirect pgregory.net/rapid v0.5.5 // indirect diff --git a/go.sum b/go.sum index 8345c549d..09f2e0b4a 100644 --- a/go.sum +++ b/go.sum @@ -205,6 +205,7 @@ github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8 github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= +github.com/cespare/cp v1.1.1 h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU= github.com/cespare/cp v1.1.1/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= @@ -297,6 +298,8 @@ github.com/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018/go.mod h1:rQY github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= github.com/deckarep/golang-set v1.7.1/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= +github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= +github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= @@ -340,6 +343,7 @@ github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5m github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= +github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/dot v0.11.0/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= @@ -569,6 +573,7 @@ github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.5/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= @@ -653,7 +658,9 @@ github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3s github.com/herumi/bls-eth-go-binary v0.0.0-20210130185500-57372fb27371/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= github.com/herumi/bls-eth-go-binary v0.0.0-20210917013441-d37c07cfda4e h1:wCMygKUQhmcQAjlk2Gquzq6dLmyMv2kF+llRspoRgrk= github.com/herumi/bls-eth-go-binary v0.0.0-20210917013441-d37c07cfda4e/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= +github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= +github.com/holiman/uint256 v1.2.0 h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM= github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= @@ -1236,6 +1243,7 @@ github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1 github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE= github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= @@ -2035,6 +2043,7 @@ gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eR gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= gopkg.in/jcmturner/gokrb5.v7 v7.5.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= gopkg.in/redis.v4 v4.2.4/go.mod h1:8KREHdypkCEojGKQcjMqAODMICIVwZAONWq8RowTITA= diff --git a/proto/greenfield/permission/common.proto b/proto/greenfield/permission/common.proto index 8d9d56d25..5251d3847 100644 --- a/proto/greenfield/permission/common.proto +++ b/proto/greenfield/permission/common.proto @@ -29,6 +29,7 @@ enum ActionType { ACTION_UPDATE_OBJECT_INFO = 11; ACTION_UPDATE_GROUP_EXTRA = 12; + ACTION_UPDATE_GROUP_INFO = 13; ACTION_TYPE_ALL = 99; } diff --git a/swagger/static/swagger.yaml b/swagger/static/swagger.yaml index a694c0dc5..5915da2a7 100644 --- a/swagger/static/swagger.yaml +++ b/swagger/static/swagger.yaml @@ -5008,6 +5008,7 @@ paths: - ACTION_DELETE_GROUP - ACTION_UPDATE_OBJECT_INFO - ACTION_UPDATE_GROUP_EXTRA + - ACTION_UPDATE_GROUP_INFO - ACTION_TYPE_ALL default: ACTION_UNSPECIFIED title: >- @@ -5202,6 +5203,7 @@ paths: - ACTION_DELETE_GROUP - ACTION_UPDATE_OBJECT_INFO - ACTION_UPDATE_GROUP_EXTRA + - ACTION_UPDATE_GROUP_INFO - ACTION_TYPE_ALL default: ACTION_UNSPECIFIED title: >- @@ -5400,6 +5402,7 @@ paths: - ACTION_DELETE_GROUP - ACTION_UPDATE_OBJECT_INFO - ACTION_UPDATE_GROUP_EXTRA + - ACTION_UPDATE_GROUP_INFO - ACTION_TYPE_ALL default: ACTION_UNSPECIFIED title: >- @@ -5612,6 +5615,7 @@ paths: - ACTION_DELETE_GROUP - ACTION_UPDATE_OBJECT_INFO - ACTION_UPDATE_GROUP_EXTRA + - ACTION_UPDATE_GROUP_INFO - ACTION_TYPE_ALL - name: object_name in: query @@ -34230,6 +34234,7 @@ definitions: - ACTION_DELETE_GROUP - ACTION_UPDATE_OBJECT_INFO - ACTION_UPDATE_GROUP_EXTRA + - ACTION_UPDATE_GROUP_INFO - ACTION_TYPE_ALL default: ACTION_UNSPECIFIED title: >- @@ -34342,6 +34347,7 @@ definitions: - ACTION_DELETE_GROUP - ACTION_UPDATE_OBJECT_INFO - ACTION_UPDATE_GROUP_EXTRA + - ACTION_UPDATE_GROUP_INFO - ACTION_TYPE_ALL default: ACTION_UNSPECIFIED title: >- @@ -34464,6 +34470,7 @@ definitions: - ACTION_DELETE_GROUP - ACTION_UPDATE_OBJECT_INFO - ACTION_UPDATE_GROUP_EXTRA + - ACTION_UPDATE_GROUP_INFO - ACTION_TYPE_ALL default: ACTION_UNSPECIFIED title: >- @@ -36207,6 +36214,7 @@ definitions: - ACTION_DELETE_GROUP - ACTION_UPDATE_OBJECT_INFO - ACTION_UPDATE_GROUP_EXTRA + - ACTION_UPDATE_GROUP_INFO - ACTION_TYPE_ALL default: ACTION_UNSPECIFIED title: >- @@ -36359,6 +36367,7 @@ definitions: - ACTION_DELETE_GROUP - ACTION_UPDATE_OBJECT_INFO - ACTION_UPDATE_GROUP_EXTRA + - ACTION_UPDATE_GROUP_INFO - ACTION_TYPE_ALL default: ACTION_UNSPECIFIED title: >- @@ -36511,6 +36520,7 @@ definitions: - ACTION_DELETE_GROUP - ACTION_UPDATE_OBJECT_INFO - ACTION_UPDATE_GROUP_EXTRA + - ACTION_UPDATE_GROUP_INFO - ACTION_TYPE_ALL default: ACTION_UNSPECIFIED title: >- diff --git a/types/grn.go b/types/grn.go index 64ff85361..beec923e2 100644 --- a/types/grn.go +++ b/types/grn.go @@ -157,7 +157,7 @@ func (r *GRN) ParseFromString(res string, wildcards bool) error { return gnfderrors.ErrInvalidGRN.Wrapf("Not allowed '/' in bucket resource name") } if !wildcards { - err = s3util.CheckValidBucketName(r.name) + err = s3util.CheckValidBucketNameByCharacterLength(r.name) if err != nil { return gnfderrors.ErrInvalidGRN.Wrapf("invalid bucketName: %s, err: %s", r.name, err) } @@ -179,7 +179,7 @@ func (r *GRN) ParseFromString(res string, wildcards bool) error { return gnfderrors.ErrInvalidGRN.Wrapf("invalid group owner account, err : %s", err) } if !wildcards { - err = s3util.CheckValidGroupName(name) + err = s3util.CheckValidGroupNameByCharacterLength(name) if err != nil { return gnfderrors.ErrInvalidGRN.Wrapf("invalid group name, err : %s", err) } @@ -200,11 +200,11 @@ func (r *GRN) parseBucketAndObjectName(name string) (string, string, error) { if !found { return "", "", gnfderrors.ErrInvalidGRN.Wrapf("object name not found, grn: %s", name) } - err := s3util.CheckValidBucketName(bucketName) + err := s3util.CheckValidBucketNameByCharacterLength(bucketName) if err != nil { return "", "", gnfderrors.ErrInvalidGRN.Wrapf("invalid bucketName, err: %s", err) } - err = s3util.CheckValidObjectName(objectName) + err = s3util.CheckValidObjectNameByCharacterLength(objectName) if err != nil { return "", "", gnfderrors.ErrInvalidGRN.Wrapf("invalid objectName, err: %s", err) } diff --git a/types/s3util/s3util.go b/types/s3util/s3util.go index 658e89c7c..2f3107813 100644 --- a/types/s3util/s3util.go +++ b/types/s3util/s3util.go @@ -42,18 +42,9 @@ func CheckValidBucketName(bucketName string) (err error) { return nil } -const ( - // Bad path components to be rejected by the path validity handler. - dotdotComponent = ".." - dotComponent = "." - - // SlashSeparator - slash separator. - SlashSeparator = "/" -) - // CheckValidObjectName checks if we have a valid input object name. // -// http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html +// - http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html func CheckValidObjectName(objectName string) error { // check the length of objectName if len(objectName) == 0 || strings.TrimSpace(objectName) == "" { @@ -98,13 +89,95 @@ func CheckValidGroupName(groupName string) error { return nil } +// CheckValidBucketNameByCharacterLength - checks if we have a valid input bucket name. +// This is a stricter version. +// - http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html +func CheckValidBucketNameByCharacterLength(bucketName string) (err error) { + if len(bucketName) == 0 || strings.TrimSpace(bucketName) == "" { + return errors.Wrap(gnfderrors.ErrInvalidBucketName, "Bucket name cannot be empty") + } + if utf8.RuneCountInString(bucketName) < 3 { + return errors.Wrap(gnfderrors.ErrInvalidBucketName, "Bucket name cannot be shorter than 3 characters") + } + if utf8.RuneCountInString(bucketName) > 63 { + return errors.Wrap(gnfderrors.ErrInvalidBucketName, "Bucket name cannot be longer than 63 characters") + } + if ipAddress.MatchString(bucketName) { + return errors.Wrap(gnfderrors.ErrInvalidBucketName, "Bucket name cannot be an ip address") + } + if strings.Contains(bucketName, "..") || strings.Contains(bucketName, ".-") || strings.Contains(bucketName, "-.") { + return errors.Wrap(gnfderrors.ErrInvalidBucketName, "Bucket name contains invalid characters") + } + if !validBucketName.MatchString(bucketName) { + return errors.Wrap(gnfderrors.ErrInvalidBucketName, "Bucket name contains invalid characters") + } + + return nil +} + +// CheckValidObjectNameByCharacterLength checks if we have a valid input object name. +// +// - http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html +func CheckValidObjectNameByCharacterLength(objectName string) error { + // check the length of objectName + if len(objectName) == 0 || strings.TrimSpace(objectName) == "" { + return errors.Wrap(gnfderrors.ErrInvalidObjectName, "Object name cannot be empty") + } + if utf8.RuneCountInString(objectName) > 1024 { + return errors.Wrap(gnfderrors.ErrInvalidObjectName, "Object name cannot be longer than 1024 characters") + } + + // check bad path component + if hasBadPathComponent(objectName) { + return errors.Wrap(gnfderrors.ErrInvalidObjectName, "Object name with a bad path component is not supported") + } + // check UTF-8 strings + if !utf8.ValidString(objectName) { + return errors.Wrap(gnfderrors.ErrInvalidObjectName, "Object name with non UTF-8 strings is not supported") + } + + if strings.Contains(objectName, `//`) { + // the error description and the judgement condition are not consistent + // `Contains` is not the same as `HasPrefix` + return errors.Wrap(gnfderrors.ErrInvalidObjectName, "Object name contains a \"//\" is not supported") + } + + return nil +} + +func CheckValidGroupNameByCharacterLength(groupName string) error { + if len(groupName) == 0 || strings.TrimSpace(groupName) == "" { + return errors.Wrap(gnfderrors.ErrInvalidGroupName, "Group name cannot be empty") + } + if utf8.RuneCountInString(groupName) < 3 { + return errors.Wrap(gnfderrors.ErrInvalidGroupName, "Group name cannot be shorter than 3 characters") + } + if utf8.RuneCountInString(groupName) > 63 { + return errors.Wrap(gnfderrors.ErrInvalidGroupName, "Group name cannot be longer than 63 characters") + } + if !utf8.ValidString(groupName) { + return errors.Wrap(gnfderrors.ErrInvalidGroupName, "Group name with non UTF-8 strings is not supported") + } + + return nil +} + +const ( + // Bad path components to be rejected by the path validity handler. + dotDotComponent = ".." + dotComponent = "." + + // SlashSeparator - slash separator. + SlashSeparator = "/" +) + // Check if the incoming path has bad path components, // such as ".." and "." func hasBadPathComponent(path string) bool { path = strings.TrimSpace(path) for _, p := range strings.Split(path, SlashSeparator) { switch strings.TrimSpace(p) { - case dotdotComponent: + case dotDotComponent: return true case dotComponent: return true diff --git a/x/challenge/client/cli/tx_submit.go b/x/challenge/client/cli/tx_submit.go index 9c83ed48b..d2ebcdad0 100644 --- a/x/challenge/client/cli/tx_submit.go +++ b/x/challenge/client/cli/tx_submit.go @@ -29,12 +29,12 @@ func CmdSubmit() *cobra.Command { } argBucketName := strings.TrimSpace(args[1]) - if err := s3util.CheckValidBucketName(argBucketName); err != nil { + if err := s3util.CheckValidBucketNameByCharacterLength(argBucketName); err != nil { return fmt.Errorf("bucket-name %s not a valid bucket name, please input a valid bucket-name", argBucketName) } argObjectName := strings.TrimSpace(args[2]) - if err := s3util.CheckValidObjectName(argObjectName); err != nil { + if err := s3util.CheckValidObjectNameByCharacterLength(argObjectName); err != nil { return fmt.Errorf("object-name %s not a valid object name, please input a valid object-name", argObjectName) } diff --git a/x/challenge/types/message_submit.go b/x/challenge/types/message_submit.go index c491b393e..f1a0965c9 100644 --- a/x/challenge/types/message_submit.go +++ b/x/challenge/types/message_submit.go @@ -4,6 +4,7 @@ import ( "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" "github.com/bnb-chain/greenfield/types/s3util" ) @@ -55,12 +56,25 @@ func (msg *MsgSubmit) ValidateBasic() error { return errors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid sp operator address (%s)", err) } - if err = s3util.CheckValidBucketName(msg.BucketName); err != nil { - return err - } + return nil +} - if err = s3util.CheckValidObjectName(msg.ObjectName); err != nil { - return err +func (msg *MsgSubmit) ValidateRuntime(ctx sdk.Context) error { + var err error + if ctx.IsUpgraded(upgradetypes.Ural) { + if err = s3util.CheckValidBucketNameByCharacterLength(msg.BucketName); err != nil { + return err + } + if err = s3util.CheckValidObjectNameByCharacterLength(msg.ObjectName); err != nil { + return err + } + } else { + if err = s3util.CheckValidBucketName(msg.BucketName); err != nil { + return err + } + if err = s3util.CheckValidObjectName(msg.ObjectName); err != nil { + return err + } } return nil diff --git a/x/challenge/types/message_submit_test.go b/x/challenge/types/message_submit_test.go index c3ee86256..943597f4c 100644 --- a/x/challenge/types/message_submit_test.go +++ b/x/challenge/types/message_submit_test.go @@ -3,6 +3,8 @@ package types import ( "testing" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" + sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/stretchr/testify/require" @@ -65,7 +67,14 @@ func TestMsgSubmit_ValidateBasic(t *testing.T) { t.Run(tt.name, func(t *testing.T) { err := tt.msg.ValidateBasic() if tt.err != nil { - require.ErrorIs(t, err, tt.err) + if err != nil { + require.ErrorIs(t, err, tt.err) + } else { + upgradeChecker := func(sdk.Context, string) bool { return true } + ctx := sdk.NewContext(nil, tmproto.Header{}, false, upgradeChecker, nil) + err = tt.msg.ValidateRuntime(ctx) + require.ErrorIs(t, err, tt.err) + } return } require.NoError(t, err) diff --git a/x/permission/types/common.pb.go b/x/permission/types/common.pb.go index 06b4d33c8..16c97910d 100644 --- a/x/permission/types/common.pb.go +++ b/x/permission/types/common.pb.go @@ -46,6 +46,7 @@ const ( ACTION_DELETE_GROUP ActionType = 10 ACTION_UPDATE_OBJECT_INFO ActionType = 11 ACTION_UPDATE_GROUP_EXTRA ActionType = 12 + ACTION_UPDATE_GROUP_INFO ActionType = 13 ACTION_TYPE_ALL ActionType = 99 ) @@ -63,6 +64,7 @@ var ActionType_name = map[int32]string{ 10: "ACTION_DELETE_GROUP", 11: "ACTION_UPDATE_OBJECT_INFO", 12: "ACTION_UPDATE_GROUP_EXTRA", + 13: "ACTION_UPDATE_GROUP_INFO", 99: "ACTION_TYPE_ALL", } @@ -80,6 +82,7 @@ var ActionType_value = map[string]int32{ "ACTION_DELETE_GROUP": 10, "ACTION_UPDATE_OBJECT_INFO": 11, "ACTION_UPDATE_GROUP_EXTRA": 12, + "ACTION_UPDATE_GROUP_INFO": 13, "ACTION_TYPE_ALL": 99, } @@ -304,51 +307,51 @@ func init() { } var fileDescriptor_33a4d646aee30990 = []byte{ - // 691 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x54, 0xcb, 0x4e, 0xdb, 0x4a, - 0x18, 0x8e, 0x93, 0x10, 0xc8, 0xc0, 0x01, 0x9f, 0x01, 0xce, 0x31, 0x69, 0x71, 0x52, 0xd4, 0x45, - 0x84, 0x54, 0x5b, 0x4a, 0x2f, 0xaa, 0xd4, 0x95, 0xe3, 0x4c, 0x90, 0x5b, 0x63, 0x5b, 0x8e, 0xd3, - 0x42, 0xbb, 0xb0, 0x1c, 0x77, 0x12, 0x46, 0x8a, 0x2f, 0xb2, 0x9d, 0x16, 0xd8, 0x57, 0xea, 0x92, - 0x77, 0xe8, 0x13, 0xf4, 0x2d, 0x58, 0xb2, 0xec, 0xaa, 0xad, 0xe0, 0x45, 0x2a, 0x5f, 0x12, 0x27, - 0x05, 0x76, 0x99, 0xef, 0x36, 0xff, 0x37, 0x33, 0x31, 0xd8, 0x1b, 0x05, 0x18, 0xbb, 0x43, 0x82, - 0xc7, 0x1f, 0x79, 0x1f, 0x07, 0x0e, 0x09, 0x43, 0xe2, 0xb9, 0xbc, 0xed, 0x39, 0x8e, 0xe7, 0x72, - 0x7e, 0xe0, 0x45, 0x1e, 0xdc, 0xce, 0x35, 0x5c, 0xae, 0xa9, 0xed, 0xd8, 0x5e, 0xe8, 0x78, 0xa1, - 0x99, 0x88, 0xf8, 0x74, 0x91, 0x3a, 0x6a, 0x5b, 0x23, 0x6f, 0xe4, 0xa5, 0x78, 0xfc, 0x2b, 0x43, - 0xeb, 0x23, 0xcf, 0x1b, 0x8d, 0x31, 0x9f, 0xac, 0x06, 0x93, 0x21, 0x1f, 0x11, 0x07, 0x87, 0x91, - 0xe5, 0xf8, 0x33, 0x41, 0x3e, 0x4c, 0x3a, 0x01, 0xff, 0x39, 0xb0, 0x7c, 0x1f, 0x07, 0xa9, 0x60, - 0xef, 0x7b, 0x11, 0x54, 0x7b, 0x91, 0x15, 0x61, 0x07, 0xbb, 0x11, 0x7c, 0x0e, 0x2a, 0x78, 0x38, - 0xc4, 0x76, 0xc4, 0x50, 0x0d, 0xaa, 0xb9, 0xde, 0xda, 0xe5, 0xee, 0x1c, 0x94, 0x43, 0x89, 0x48, - 0xcf, 0xc4, 0xf0, 0x15, 0x58, 0xb6, 0xec, 0x88, 0x78, 0x6e, 0xc8, 0x14, 0x1b, 0xa5, 0xe6, 0x7a, - 0xeb, 0xd1, 0x3d, 0x3e, 0x21, 0x51, 0x19, 0x67, 0x3e, 0xd6, 0xa7, 0x0e, 0xf8, 0x10, 0x54, 0x03, - 0x1c, 0x7a, 0x93, 0xc0, 0xc6, 0x21, 0x53, 0x6a, 0x94, 0x9a, 0x55, 0x3d, 0x07, 0xe0, 0x21, 0xd8, - 0xc0, 0xa7, 0x3e, 0x09, 0xac, 0x58, 0x6c, 0xc6, 0xf5, 0x98, 0x72, 0x83, 0x6a, 0xae, 0xb6, 0x6a, - 0x5c, 0xda, 0x9d, 0x9b, 0x76, 0xe7, 0x8c, 0x69, 0xf7, 0xf6, 0xca, 0xe5, 0xcf, 0x3a, 0x75, 0xf1, - 0xab, 0x4e, 0xe9, 0xeb, 0xb9, 0x39, 0xa6, 0xa1, 0x08, 0xc0, 0x98, 0x38, 0x24, 0x32, 0x43, 0x72, - 0x8e, 0x99, 0xa5, 0x24, 0x89, 0x9d, 0x1f, 0x36, 0xbb, 0xa6, 0xbe, 0xe4, 0x46, 0x2f, 0x9e, 0xbd, - 0xb5, 0xc6, 0x13, 0xdc, 0x2e, 0xc7, 0x69, 0x7a, 0x35, 0xf1, 0xf5, 0xc8, 0x39, 0xde, 0xfb, 0x00, - 0xaa, 0x5a, 0x40, 0x5c, 0x9b, 0xf8, 0xd6, 0x18, 0xbe, 0x04, 0xe5, 0xe8, 0xcc, 0xc7, 0xd9, 0x81, - 0x3d, 0xbe, 0xa7, 0xf8, 0x4c, 0x9f, 0x74, 0x4f, 0x1c, 0x70, 0x0b, 0x2c, 0x7d, 0x8a, 0x37, 0x60, - 0x8a, 0x0d, 0xaa, 0x59, 0xd5, 0xd3, 0xc5, 0xfe, 0x97, 0x12, 0x00, 0xf9, 0x31, 0xc1, 0xff, 0x00, - 0x14, 0x44, 0x43, 0x52, 0x15, 0xb3, 0xaf, 0xf4, 0x34, 0x24, 0x4a, 0x5d, 0x09, 0x75, 0xe8, 0x02, - 0xdc, 0x05, 0x3b, 0x53, 0x5c, 0xeb, 0x08, 0x06, 0x32, 0xdb, 0x7d, 0xf1, 0x0d, 0x32, 0x4c, 0x49, - 0xe9, 0xaa, 0x34, 0x05, 0x19, 0xb0, 0x95, 0xd1, 0x1d, 0x24, 0xa3, 0x19, 0x4d, 0x17, 0xe7, 0x18, - 0x51, 0x47, 0xb1, 0x51, 0x6d, 0xbf, 0x46, 0xa2, 0x41, 0x97, 0x6e, 0x7b, 0x32, 0xa6, 0x3c, 0x37, - 0x84, 0xa8, 0x6a, 0xc7, 0x53, 0x7c, 0x09, 0x6e, 0x83, 0x7f, 0x33, 0xfc, 0x00, 0x19, 0x53, 0xb8, - 0x02, 0x77, 0xc0, 0x76, 0x06, 0xa3, 0x23, 0x24, 0xf6, 0xf3, 0xa4, 0xe5, 0xb9, 0x24, 0x59, 0xea, - 0xcd, 0x2c, 0x2b, 0x90, 0x05, 0xb5, 0xc5, 0x3a, 0x07, 0xba, 0xda, 0xd7, 0xcc, 0x43, 0x74, 0xd8, - 0x46, 0x3a, 0x5d, 0x85, 0xff, 0x83, 0xcd, 0xc5, 0xd9, 0x12, 0x9e, 0x06, 0xb7, 0xcf, 0x21, 0x8d, - 0x4c, 0xcf, 0x61, 0xf5, 0x36, 0x9d, 0xe6, 0xa2, 0x23, 0x43, 0x17, 0xe8, 0x35, 0xb8, 0x09, 0x36, - 0x32, 0xda, 0x38, 0xd6, 0x90, 0x29, 0xc8, 0x32, 0x6d, 0xd7, 0xca, 0x5f, 0xbf, 0xb1, 0x85, 0x7d, - 0x09, 0x54, 0xd2, 0x57, 0x1e, 0xcf, 0x8c, 0xba, 0xdd, 0x38, 0x74, 0xf1, 0x0a, 0x68, 0xb0, 0x96, - 0xe1, 0x82, 0x2c, 0xab, 0xef, 0x68, 0x0a, 0x6e, 0x80, 0xd5, 0x0c, 0xe9, 0x20, 0xe5, 0x98, 0x2e, - 0x66, 0x51, 0x13, 0xf0, 0xcf, 0xc2, 0xfd, 0xc7, 0x6d, 0x35, 0x5d, 0x52, 0x44, 0x49, 0x13, 0xe4, - 0x74, 0xe7, 0xc5, 0xe4, 0x3a, 0x78, 0xf0, 0x17, 0x7f, 0xa0, 0x74, 0x3b, 0xa6, 0x20, 0x8a, 0x6a, - 0x5f, 0x31, 0x68, 0x2a, 0xae, 0x75, 0x97, 0x20, 0x3d, 0x94, 0x6c, 0xdb, 0xb6, 0x7c, 0x79, 0xcd, - 0x52, 0x57, 0xd7, 0x2c, 0xf5, 0xfb, 0x9a, 0xa5, 0x2e, 0x6e, 0xd8, 0xc2, 0xd5, 0x0d, 0x5b, 0xf8, - 0x71, 0xc3, 0x16, 0xde, 0xb7, 0x46, 0x24, 0x3a, 0x99, 0x0c, 0xe2, 0xc7, 0xce, 0x0f, 0xdc, 0xc1, - 0x13, 0xfb, 0xc4, 0x22, 0x2e, 0x3f, 0xf7, 0xa9, 0x38, 0x9d, 0xff, 0x72, 0xc5, 0x8f, 0x35, 0x1c, - 0x54, 0x92, 0xff, 0xd9, 0xd3, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xfe, 0x10, 0xd3, 0x81, 0xdf, - 0x04, 0x00, 0x00, + // 697 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x54, 0x4b, 0x4e, 0xdb, 0x50, + 0x14, 0x8d, 0x93, 0x10, 0xc8, 0xe5, 0xe7, 0x3e, 0xa0, 0x35, 0x29, 0x38, 0x29, 0xea, 0x20, 0x42, + 0x6a, 0x2c, 0xa5, 0x1f, 0x55, 0xea, 0xc8, 0x71, 0x5e, 0x90, 0x5b, 0x93, 0x58, 0x8e, 0xd3, 0x42, + 0x3b, 0xb0, 0x1c, 0xf7, 0x25, 0x58, 0x8a, 0x3f, 0xb2, 0x9d, 0x16, 0x58, 0x41, 0x87, 0xec, 0x81, + 0x15, 0x74, 0x17, 0x0c, 0x19, 0x76, 0xd4, 0x56, 0xb0, 0x91, 0xca, 0x9f, 0xc4, 0x49, 0x81, 0x99, + 0xdf, 0xf9, 0xdc, 0x7b, 0xcf, 0xb5, 0x9f, 0x61, 0x6f, 0xe8, 0x11, 0x62, 0x0f, 0x4c, 0x32, 0xfa, + 0xca, 0xb9, 0xc4, 0xb3, 0x4c, 0xdf, 0x37, 0x1d, 0x9b, 0x33, 0x1c, 0xcb, 0x72, 0xec, 0x9a, 0xeb, + 0x39, 0x81, 0x83, 0xb6, 0x52, 0x4d, 0x2d, 0xd5, 0x94, 0xb6, 0x0d, 0xc7, 0xb7, 0x1c, 0x5f, 0x8b, + 0x44, 0x5c, 0x7c, 0x88, 0x1d, 0xa5, 0xcd, 0xa1, 0x33, 0x74, 0x62, 0x3c, 0x7c, 0x4a, 0xd0, 0xf2, + 0xd0, 0x71, 0x86, 0x23, 0xc2, 0x45, 0xa7, 0xfe, 0x78, 0xc0, 0x05, 0xa6, 0x45, 0xfc, 0x40, 0xb7, + 0xdc, 0xa9, 0x20, 0x1d, 0x26, 0x9e, 0x80, 0xfb, 0xee, 0xe9, 0xae, 0x4b, 0xbc, 0x58, 0xb0, 0xf7, + 0x33, 0x0b, 0xc5, 0x6e, 0xa0, 0x07, 0xc4, 0x22, 0x76, 0x80, 0x5e, 0x43, 0x81, 0x0c, 0x06, 0xc4, + 0x08, 0x18, 0xaa, 0x42, 0x55, 0xd7, 0xea, 0xbb, 0xb5, 0x7b, 0x07, 0xad, 0xe1, 0x48, 0xa4, 0x24, + 0x62, 0xf4, 0x0e, 0x16, 0x75, 0x23, 0x30, 0x1d, 0xdb, 0x67, 0xb2, 0x95, 0x5c, 0x75, 0xad, 0xfe, + 0xec, 0x01, 0x1f, 0x1f, 0xa9, 0xd4, 0x33, 0x97, 0x28, 0x13, 0x07, 0xda, 0x81, 0xa2, 0x47, 0x7c, + 0x67, 0xec, 0x19, 0xc4, 0x67, 0x72, 0x95, 0x5c, 0xb5, 0xa8, 0xa4, 0x00, 0x3a, 0x84, 0x75, 0x72, + 0xea, 0x9a, 0x9e, 0x1e, 0x8a, 0xb5, 0x30, 0x1e, 0x93, 0xaf, 0x50, 0xd5, 0xe5, 0x7a, 0xa9, 0x16, + 0x67, 0xaf, 0x4d, 0xb2, 0xd7, 0xd4, 0x49, 0xf6, 0xc6, 0xd2, 0xd5, 0xef, 0x32, 0x75, 0xf1, 0xa7, + 0x4c, 0x29, 0x6b, 0xa9, 0x39, 0xa4, 0x91, 0x00, 0x30, 0x32, 0x2d, 0x33, 0xd0, 0x7c, 0xf3, 0x9c, + 0x30, 0x0b, 0x51, 0x25, 0x76, 0x76, 0xd8, 0xe4, 0x35, 0xf5, 0x44, 0x3b, 0x78, 0xf3, 0xea, 0xa3, + 0x3e, 0x1a, 0x93, 0x46, 0x3e, 0xac, 0xa6, 0x14, 0x23, 0x5f, 0xd7, 0x3c, 0x27, 0x7b, 0x5f, 0xa0, + 0x28, 0x7b, 0xa6, 0x6d, 0x98, 0xae, 0x3e, 0x42, 0x6f, 0x21, 0x1f, 0x9c, 0xb9, 0x24, 0x59, 0xd8, + 0xf3, 0x07, 0x82, 0x4f, 0xf5, 0x51, 0xf6, 0xc8, 0x81, 0x36, 0x61, 0xe1, 0x5b, 0xd8, 0x80, 0xc9, + 0x56, 0xa8, 0x6a, 0x51, 0x89, 0x0f, 0xfb, 0x97, 0x39, 0x80, 0x74, 0x4d, 0xe8, 0x31, 0x20, 0x5e, + 0x50, 0xc5, 0x4e, 0x5b, 0xeb, 0xb5, 0xbb, 0x32, 0x16, 0xc4, 0x96, 0x88, 0x9b, 0x74, 0x06, 0xed, + 0xc2, 0xf6, 0x04, 0x97, 0x9b, 0xbc, 0x8a, 0xb5, 0x46, 0x4f, 0xf8, 0x80, 0x55, 0x4d, 0x6c, 0xb7, + 0x3a, 0x34, 0x85, 0x18, 0xd8, 0x4c, 0xe8, 0x26, 0x96, 0xf0, 0x94, 0xa6, 0xb3, 0x33, 0x8c, 0xa0, + 0xe0, 0xd0, 0xd8, 0x69, 0xbc, 0xc7, 0x82, 0x4a, 0xe7, 0xee, 0x7a, 0x12, 0x26, 0x3f, 0x33, 0x84, + 0xd0, 0x91, 0x8f, 0x27, 0xf8, 0x02, 0xda, 0x82, 0x47, 0x09, 0x7e, 0x80, 0xd5, 0x09, 0x5c, 0x40, + 0xdb, 0xb0, 0x95, 0xc0, 0xf8, 0x08, 0x0b, 0xbd, 0xb4, 0xd2, 0xe2, 0x4c, 0x25, 0x49, 0xec, 0x4e, + 0x2d, 0x4b, 0x88, 0x85, 0xd2, 0x7c, 0x9c, 0x03, 0xa5, 0xd3, 0x93, 0xb5, 0x43, 0x7c, 0xd8, 0xc0, + 0x0a, 0x5d, 0x44, 0x4f, 0x60, 0x63, 0x7e, 0xb6, 0x88, 0xa7, 0xe1, 0xee, 0x1e, 0xe2, 0x92, 0xf1, + 0x1e, 0x96, 0xef, 0xd2, 0x71, 0x5d, 0x7c, 0xa4, 0x2a, 0x3c, 0xbd, 0x82, 0x76, 0x80, 0xb9, 0x8f, + 0x8e, 0xcc, 0xab, 0x68, 0x03, 0xd6, 0x13, 0x56, 0x3d, 0x96, 0xb1, 0xc6, 0x4b, 0x12, 0x6d, 0x94, + 0xf2, 0x3f, 0x2e, 0xd9, 0xcc, 0xbe, 0x08, 0x85, 0xf8, 0x0e, 0x84, 0x89, 0x70, 0xab, 0x15, 0xb6, + 0x9c, 0x7f, 0x41, 0x34, 0xac, 0x24, 0x38, 0x2f, 0x49, 0x9d, 0x4f, 0x34, 0x85, 0xd6, 0x61, 0x39, + 0x41, 0x9a, 0xb8, 0x7d, 0x4c, 0x67, 0x93, 0x52, 0x63, 0x58, 0x9d, 0xfb, 0x3a, 0xc2, 0x5d, 0xc8, + 0x8a, 0xd8, 0x16, 0x44, 0x99, 0x97, 0xe2, 0xce, 0xf3, 0x95, 0xcb, 0xf0, 0xf4, 0x3f, 0xfe, 0xa0, + 0xdd, 0x6a, 0x6a, 0xbc, 0x20, 0x74, 0x7a, 0x6d, 0x95, 0xa6, 0xc2, 0xd0, 0xf7, 0x09, 0xe2, 0x95, + 0x25, 0x6d, 0x1b, 0xd2, 0xd5, 0x0d, 0x4b, 0x5d, 0xdf, 0xb0, 0xd4, 0xdf, 0x1b, 0x96, 0xba, 0xb8, + 0x65, 0x33, 0xd7, 0xb7, 0x6c, 0xe6, 0xd7, 0x2d, 0x9b, 0xf9, 0x5c, 0x1f, 0x9a, 0xc1, 0xc9, 0xb8, + 0x1f, 0x5e, 0x05, 0xae, 0x6f, 0xf7, 0x5f, 0x18, 0x27, 0xba, 0x69, 0x73, 0x33, 0x3f, 0x92, 0xd3, + 0xd9, 0xff, 0x5a, 0xf8, 0x29, 0xfb, 0xfd, 0x42, 0x74, 0x0b, 0x5f, 0xfe, 0x0b, 0x00, 0x00, 0xff, + 0xff, 0x95, 0xd5, 0x7a, 0xdd, 0xfd, 0x04, 0x00, 0x00, } func (m *Statement) Marshal() (dAtA []byte, err error) { diff --git a/x/permission/types/types.go b/x/permission/types/types.go index 1f187534d..a4852aaf6 100644 --- a/x/permission/types/types.go +++ b/x/permission/types/types.go @@ -66,6 +66,7 @@ var ( ACTION_UPDATE_GROUP_MEMBER: true, ACTION_UPDATE_GROUP_EXTRA: true, ACTION_DELETE_GROUP: true, + ACTION_UPDATE_GROUP_INFO: true, ACTION_TYPE_ALL: true, } diff --git a/x/storage/keeper/cross_app_bucket.go b/x/storage/keeper/cross_app_bucket.go index 3b9b84870..e3f42ce59 100644 --- a/x/storage/keeper/cross_app_bucket.go +++ b/x/storage/keeper/cross_app_bucket.go @@ -206,31 +206,31 @@ func (app *BucketApp) handleMirrorBucketFailAckPackage(ctx sdk.Context, appCtx * } func (app *BucketApp) handleMirrorBucketSynPackage(ctx sdk.Context, header *sdk.CrossChainAppContext, synPackage *types.MirrorBucketSynPackage) sdk.ExecuteResult { - app.storageKeeper.Logger(ctx).Error("received mirror bucket syn package ") + app.storageKeeper.Logger(ctx).Error("received mirror bucket syn package") return sdk.ExecuteResult{} } func (app *BucketApp) handleCreateBucketAckPackage(ctx sdk.Context, appCtx *sdk.CrossChainAppContext, ackPackage *types.CreateBucketAckPackage) sdk.ExecuteResult { - app.storageKeeper.Logger(ctx).Error("received create bucket ack package ") + app.storageKeeper.Logger(ctx).Error("received create bucket ack package") return sdk.ExecuteResult{} } func (app *BucketApp) handleCreateBucketFailAckPackage(ctx sdk.Context, appCtx *sdk.CrossChainAppContext, synPackage *types.CreateBucketSynPackage) sdk.ExecuteResult { - app.storageKeeper.Logger(ctx).Error("received create bucket fail ack package ") + app.storageKeeper.Logger(ctx).Error("received create bucket fail ack package") return sdk.ExecuteResult{} } func (app *BucketApp) handleCreateBucketFailAckPackageV2(ctx sdk.Context, appCtx *sdk.CrossChainAppContext, synPackage *types.CreateBucketSynPackageV2) sdk.ExecuteResult { - app.storageKeeper.Logger(ctx).Error("received create bucket fail ack package ") + app.storageKeeper.Logger(ctx).Error("received create bucket fail ack package") return sdk.ExecuteResult{} } func (app *BucketApp) handleCreateBucketSynPackage(ctx sdk.Context, appCtx *sdk.CrossChainAppContext, createBucketPackage *types.CreateBucketSynPackage) sdk.ExecuteResult { - err := createBucketPackage.ValidateBasic() + err := createBucketPackage.ValidateBasic(ctx) if err != nil { return sdk.ExecuteResult{ Payload: types.CreateBucketAckPackage{ @@ -288,7 +288,7 @@ func (app *BucketApp) handleCreateBucketSynPackage(ctx sdk.Context, appCtx *sdk. } func (app *BucketApp) handleCreateBucketSynPackageV2(ctx sdk.Context, appCtx *sdk.CrossChainAppContext, createBucketPackageV2 *types.CreateBucketSynPackageV2) sdk.ExecuteResult { - err := createBucketPackageV2.ValidateBasic() + err := createBucketPackageV2.ValidateBasic(ctx) if err != nil { return sdk.ExecuteResult{ Payload: types.CreateBucketAckPackage{ diff --git a/x/storage/keeper/cross_app_bucket_test.go b/x/storage/keeper/cross_app_bucket_test.go index 228c2da20..ee407e9bc 100644 --- a/x/storage/keeper/cross_app_bucket_test.go +++ b/x/storage/keeper/cross_app_bucket_test.go @@ -58,12 +58,17 @@ func (s *TestSuite) TestSynCreateBucket() { storageKeeper.EXPECT().Logger(gomock.Any()).Return(s.ctx.Logger()).AnyTimes() app := keeper.NewBucketApp(storageKeeper) - createSynPackage := types.CreateBucketSynPackage{ - Creator: sample.RandAccAddress(), - BucketName: "bucketname", - ExtraData: []byte("extra data"), - PaymentAddress: sample.RandAccAddress(), - PrimarySpAddress: sample.RandAccAddress(), + createSynPackage := types.CreateBucketSynPackageV2{ + Creator: sample.RandAccAddress(), + BucketName: "bucketname", + Visibility: 0, + PaymentAddress: sample.RandAccAddress(), + PrimarySpAddress: sample.RandAccAddress(), + PrimarySpApprovalExpiredHeight: 0, + GlobalVirtualGroupFamilyId: 0, + PrimarySpApprovalSignature: nil, + ChargedReadQuota: 0, + ExtraData: []byte("extra data"), } serializedSynPackage := createSynPackage.MustSerialize() serializedSynPackage = append([]byte{types.OperationCreateBucket}, serializedSynPackage...) @@ -228,19 +233,24 @@ func (s *TestSuite) TestFailAckCreateBucket() { storageKeeper.EXPECT().Logger(gomock.Any()).Return(s.ctx.Logger()).AnyTimes() app := keeper.NewBucketApp(storageKeeper) - createSynPackage := types.CreateBucketSynPackage{ - Creator: sample.RandAccAddress(), - BucketName: "bucketname", - ExtraData: []byte("extra data"), - PaymentAddress: sample.RandAccAddress(), - PrimarySpAddress: sample.RandAccAddress(), + createSynPackage := types.CreateBucketSynPackageV2{ + Creator: sample.RandAccAddress(), + BucketName: "bucketname", + Visibility: 0, + PaymentAddress: sample.RandAccAddress(), + PrimarySpAddress: sample.RandAccAddress(), + PrimarySpApprovalExpiredHeight: 0, + GlobalVirtualGroupFamilyId: 0, + PrimarySpApprovalSignature: nil, + ChargedReadQuota: 0, + ExtraData: []byte("extra data"), } serializedSynPackage := createSynPackage.MustSerialize() serializedSynPackage = append([]byte{types.OperationCreateBucket}, serializedSynPackage...) storageKeeper.EXPECT().GetSourceTypeByChainId(gomock.Any(), gomock.Any()).Return(types.SOURCE_TYPE_BSC_CROSS_CHAIN, nil).AnyTimes() - // case 1: normal case + // case 1: normal case res := app.ExecuteFailAckPackage(s.ctx, &sdk.CrossChainAppContext{}, serializedSynPackage) s.Require().NoError(res.Err) } diff --git a/x/storage/keeper/cross_app_group.go b/x/storage/keeper/cross_app_group.go index 938b61f76..a115097aa 100644 --- a/x/storage/keeper/cross_app_group.go +++ b/x/storage/keeper/cross_app_group.go @@ -217,7 +217,7 @@ func (app *GroupApp) handleCreateGroupFailAckPackage(ctx sdk.Context, appCtx *sd } func (app *GroupApp) handleCreateGroupSynPackage(ctx sdk.Context, appCtx *sdk.CrossChainAppContext, createGroupPackage *types.CreateGroupSynPackage) sdk.ExecuteResult { - err := createGroupPackage.ValidateBasic() + err := createGroupPackage.ValidateBasic(ctx) if err != nil { return sdk.ExecuteResult{ Payload: types.CreateGroupAckPackage{ diff --git a/x/storage/keeper/keeper.go b/x/storage/keeper/keeper.go index d3f0cc228..f8903c87a 100644 --- a/x/storage/keeper/keeper.go +++ b/x/storage/keeper/keeper.go @@ -2230,13 +2230,21 @@ func (k Keeper) SetTag(ctx sdk.Context, operator sdk.AccAddress, grn types2.GRN, if !found { return types.ErrNoSuchBucket.Wrapf("bucketName: %s", bucketName) } - resOwner := sdk.MustAccAddressFromHex(bucketInfo.Owner) - if !operator.Equals(resOwner) { - return types.ErrAccessDenied.Wrapf( - "Only resource owner can set tag, operator (%s), owner(%s)", - operator.String(), resOwner.String()) + if ctx.IsUpgraded(upgradetypes.Ural) { + // check permission + effect := k.VerifyBucketPermission(ctx, bucketInfo, operator, permtypes.ACTION_UPDATE_BUCKET_INFO, nil) + if effect != permtypes.EFFECT_ALLOW { + return types.ErrAccessDenied.Wrapf("The operator(%s) has no updateBucketInfo permission of the bucket(%s)", + operator.String(), bucketName) + } + } else { + resOwner := sdk.MustAccAddressFromHex(bucketInfo.Owner) + if !operator.Equals(resOwner) { + return types.ErrAccessDenied.Wrapf( + "Only resource owner can set tag, operator (%s), owner(%s)", + operator.String(), resOwner.String()) + } } - bucketInfo.Tags = tags bz := k.cdc.MustMarshal(bucketInfo) store.Set(types.GetBucketByIDKey(bucketInfo.Id), bz) @@ -2249,13 +2257,25 @@ func (k Keeper) SetTag(ctx sdk.Context, operator sdk.AccAddress, grn types2.GRN, if !found { return types.ErrNoSuchObject.Wrapf("BucketName: %s, objectName: %s", bucketName, objectName) } - resOwner := sdk.MustAccAddressFromHex(objectInfo.Owner) - if !operator.Equals(resOwner) { - return types.ErrAccessDenied.Wrapf( - "Only resource owner can set tag, operator (%s), owner(%s)", - operator.String(), resOwner.String()) + if ctx.IsUpgraded(upgradetypes.Ural) { + bucketInfo, found := k.GetBucketInfo(ctx, bucketName) + if !found { + return types.ErrNoSuchBucket.Wrapf("bucketName: %s", bucketName) + } + effect := k.VerifyObjectPermission(ctx, bucketInfo, objectInfo, operator, permtypes.ACTION_UPDATE_OBJECT_INFO) + if effect != permtypes.EFFECT_ALLOW { + return types.ErrAccessDenied.Wrapf( + "The operator(%s) has no updateObjectInfo permission of the bucket(%s), object(%s)", + operator.String(), bucketName, objectName) + } + } else { + resOwner := sdk.MustAccAddressFromHex(objectInfo.Owner) + if !operator.Equals(resOwner) { + return types.ErrAccessDenied.Wrapf( + "Only resource owner can set tag, operator (%s), owner(%s)", + operator.String(), resOwner.String()) + } } - objectInfo.Tags = tags obz := k.cdc.MustMarshal(objectInfo) store.Set(types.GetObjectByIDKey(objectInfo.Id), obz) @@ -2268,13 +2288,22 @@ func (k Keeper) SetTag(ctx sdk.Context, operator sdk.AccAddress, grn types2.GRN, if !found { return types.ErrNoSuchBucket.Wrapf("groupOwner: %s, groupName: %s", groupOwner.String(), groupName) } - resOwner := sdk.MustAccAddressFromHex(groupInfo.Owner) - if !operator.Equals(resOwner) { - return types.ErrAccessDenied.Wrapf( - "Only resource owner can set tag, operator (%s), owner(%s)", - operator.String(), resOwner.String()) - } + if ctx.IsUpgraded(upgradetypes.Ural) { + effect := k.VerifyGroupPermission(ctx, groupInfo, operator, permtypes.ACTION_UPDATE_GROUP_INFO) + if effect != permtypes.EFFECT_ALLOW { + return types.ErrAccessDenied.Wrapf( + "The operator(%s) has no updateGroupInfo permission of the group(%s), owner(%s)", + operator.String(), groupInfo.GroupName, groupInfo.Owner) + } + } else { + resOwner := sdk.MustAccAddressFromHex(groupInfo.Owner) + if !operator.Equals(resOwner) { + return types.ErrAccessDenied.Wrapf( + "Only resource owner can set tag, operator (%s), owner(%s)", + operator.String(), resOwner.String()) + } + } groupInfo.Tags = tags gbz := k.cdc.MustMarshal(groupInfo) store.Set(types.GetGroupByIDKey(groupInfo.Id), gbz) diff --git a/x/storage/keeper/payment_test.go b/x/storage/keeper/payment_test.go index 3599114d1..9a8b0e302 100644 --- a/x/storage/keeper/payment_test.go +++ b/x/storage/keeper/payment_test.go @@ -45,11 +45,12 @@ type TestSuite struct { func (s *TestSuite) SetupTest() { encCfg := moduletestutil.MakeTestEncodingConfig(challenge.AppModuleBasic{}) key := storetypes.NewKVStoreKey(types.StoreKey) + upgradeChecker := func(sdk.Context, string) bool { return true } testCtx := testutil.DefaultContextWithDB(s.T(), key, storetypes.NewTransientStoreKey("transient_test")) header := testCtx.Ctx.BlockHeader() header.Time = time.Now() testCtx = testutil.TestContext{ - Ctx: sdk.NewContext(testCtx.CMS, header, false, nil, testCtx.Ctx.Logger()), + Ctx: sdk.NewContext(testCtx.CMS, header, false, upgradeChecker, testCtx.Ctx.Logger()), DB: testCtx.DB, CMS: testCtx.CMS, } diff --git a/x/storage/keeper/permission.go b/x/storage/keeper/permission.go index 2d74996ab..317b2e952 100644 --- a/x/storage/keeper/permission.go +++ b/x/storage/keeper/permission.go @@ -138,8 +138,6 @@ func (k Keeper) VerifyPolicy(ctx sdk.Context, resourceID math.Uint, resourceType policy, found := k.permKeeper.GetPolicyForAccount(ctx, resourceID, resourceType, operator) if found { effect, newPolicy := policy.Eval(action, ctx.BlockTime(), opts) - k.Logger(ctx).Info(fmt.Sprintf("CreateObject LimitSize update: %s, effect: %s, ctx.TxBytes : %d", - newPolicy.String(), effect, ctx.TxSize())) if effect != permtypes.EFFECT_UNSPECIFIED { if effect == permtypes.EFFECT_ALLOW && action == permtypes.ACTION_CREATE_OBJECT && newPolicy != nil && ctx.TxBytes() != nil { _, err := k.permKeeper.PutPolicy(ctx, newPolicy) diff --git a/x/storage/types/crosschain.go b/x/storage/types/crosschain.go index 5b1d3e95c..be823dd4a 100644 --- a/x/storage/types/crosschain.go +++ b/x/storage/types/crosschain.go @@ -548,7 +548,7 @@ func (p CreateBucketSynPackage) MustSerialize() []byte { return encodedBytes } -func (p CreateBucketSynPackage) ValidateBasic() error { +func (p CreateBucketSynPackage) ValidateBasic(ctx sdk.Context) error { msg := MsgCreateBucket{ Creator: p.Creator.String(), BucketName: p.BucketName, @@ -562,7 +562,11 @@ func (p CreateBucketSynPackage) ValidateBasic() error { ChargedReadQuota: p.ChargedReadQuota, } - return msg.ValidateBasic() + if err := msg.ValidateBasic(); err != nil { + return err + } + + return msg.ValidateRuntime(ctx) } func (p CreateBucketSynPackage) GetApprovalBytes() []byte { @@ -608,7 +612,7 @@ func DeserializeCreateBucketSynPackage(serializedPackage []byte) (interface{}, e } func (p CreateBucketSynPackageV2) MustSerialize() []byte { - encodedBytes, err := createBucketSynPackageStructArgs.Pack(&CreateBucketSynPackageV2Struct{ + encodedBytes, err := createBucketSynPackageV2StructArgs.Pack(&CreateBucketSynPackageV2Struct{ Creator: common.BytesToAddress(p.Creator), BucketName: p.BucketName, Visibility: p.Visibility, @@ -626,7 +630,7 @@ func (p CreateBucketSynPackageV2) MustSerialize() []byte { return encodedBytes } -func (p CreateBucketSynPackageV2) ValidateBasic() error { +func (p CreateBucketSynPackageV2) ValidateBasic(ctx sdk.Context) error { msg := MsgCreateBucket{ Creator: p.Creator.String(), BucketName: p.BucketName, @@ -641,7 +645,11 @@ func (p CreateBucketSynPackageV2) ValidateBasic() error { ChargedReadQuota: p.ChargedReadQuota, } - return msg.ValidateBasic() + if err := msg.ValidateBasic(); err != nil { + return err + } + + return msg.ValidateRuntime(ctx) } func (p CreateBucketSynPackageV2) GetApprovalBytes() []byte { @@ -883,12 +891,17 @@ var ( } ) -func (p CreateGroupSynPackage) ValidateBasic() error { +func (p CreateGroupSynPackage) ValidateBasic(ctx sdk.Context) error { msg := MsgCreateGroup{ Creator: p.Creator.String(), GroupName: p.GroupName, } - return msg.ValidateBasic() + + if err := msg.ValidateBasic(); err != nil { + return err + } + + return msg.ValidateRuntime(ctx) } func (p CreateGroupSynPackage) MustSerialize() []byte { diff --git a/x/storage/types/message.go b/x/storage/types/message.go index 0821510b5..827476231 100644 --- a/x/storage/types/message.go +++ b/x/storage/types/message.go @@ -4,6 +4,7 @@ import ( "fmt" "strings" "time" + "unicode/utf8" "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" @@ -180,10 +181,20 @@ func (msg *MsgCreateBucket) ValidateBasic() error { return errors.Wrapf(ErrInvalidVisibility, "Unspecified visibility is not allowed.") } - err = s3util.CheckValidBucketName(msg.BucketName) + return nil +} + +func (msg *MsgCreateBucket) ValidateRuntime(ctx sdk.Context) error { + var err error + if ctx.IsUpgraded(upgradetypes.Ural) { + err = s3util.CheckValidBucketNameByCharacterLength(msg.BucketName) + } else { + err = s3util.CheckValidBucketName(msg.BucketName) + } if err != nil { return err } + return nil } @@ -227,7 +238,16 @@ func (msg *MsgDeleteBucket) ValidateBasic() error { return errors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) } - err = s3util.CheckValidBucketName(msg.BucketName) + return nil +} + +func (msg *MsgDeleteBucket) ValidateRuntime(ctx sdk.Context) error { + var err error + if ctx.IsUpgraded(upgradetypes.Ural) { + err = s3util.CheckValidBucketNameByCharacterLength(msg.BucketName) + } else { + err = s3util.CheckValidBucketName(msg.BucketName) + } if err != nil { return err } @@ -279,10 +299,6 @@ func (msg *MsgUpdateBucketInfo) ValidateBasic() error { return errors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) } - if err = s3util.CheckValidBucketName(msg.BucketName); err != nil { - return err - } - if msg.PaymentAddress != "" { _, err = sdk.AccAddressFromHexUnsafe(msg.PaymentAddress) if err != nil { @@ -293,6 +309,21 @@ func (msg *MsgUpdateBucketInfo) ValidateBasic() error { return nil } +func (msg *MsgUpdateBucketInfo) ValidateRuntime(ctx sdk.Context) error { + var err error + + if ctx.IsUpgraded(upgradetypes.Ural) { + err = s3util.CheckValidBucketNameByCharacterLength(msg.BucketName) + } else { + err = s3util.CheckValidBucketName(msg.BucketName) + } + if err != nil { + return err + } + + return nil +} + // NewMsgCreateObject creates a new MsgCreateObject instance. func NewMsgCreateObject( creator sdk.AccAddress, bucketName, objectName string, payloadSize uint64, Visibility VisibilityType, @@ -347,16 +378,6 @@ func (msg *MsgCreateObject) ValidateBasic() error { return errors.Wrapf(ErrInvalidApproval, "Empty approvals are not allowed.") } - err = s3util.CheckValidBucketName(msg.BucketName) - if err != nil { - return err - } - - err = s3util.CheckValidObjectName(msg.ObjectName) - if err != nil { - return err - } - err = s3util.CheckValidExpectChecksums(msg.ExpectChecksums) if err != nil { return err @@ -373,6 +394,28 @@ func (msg *MsgCreateObject) ValidateBasic() error { return nil } +func (msg *MsgCreateObject) ValidateRuntime(ctx sdk.Context) error { + var err error + + if ctx.IsUpgraded(upgradetypes.Ural) { + if err = s3util.CheckValidBucketNameByCharacterLength(msg.BucketName); err != nil { + return err + } + if err = s3util.CheckValidObjectNameByCharacterLength(msg.ObjectName); err != nil { + return err + } + } else { + if err = s3util.CheckValidBucketName(msg.BucketName); err != nil { + return err + } + if err = s3util.CheckValidObjectName(msg.ObjectName); err != nil { + return err + } + } + + return nil +} + // GetApprovalBytes returns the message bytes of approval info. func (msg *MsgCreateObject) GetApprovalBytes() []byte { fakeMsg := proto.Clone(msg).(*MsgCreateObject) @@ -414,14 +457,27 @@ func (msg *MsgCancelCreateObject) ValidateBasic() error { if err != nil { return errors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) } - err = s3util.CheckValidBucketName(msg.BucketName) - if err != nil { - return err - } - err = s3util.CheckValidObjectName(msg.ObjectName) - if err != nil { - return err + return nil +} + +func (msg *MsgCancelCreateObject) ValidateRuntime(ctx sdk.Context) error { + var err error + + if ctx.IsUpgraded(upgradetypes.Ural) { + if err = s3util.CheckValidBucketNameByCharacterLength(msg.BucketName); err != nil { + return err + } + if err = s3util.CheckValidObjectNameByCharacterLength(msg.ObjectName); err != nil { + return err + } + } else { + if err = s3util.CheckValidBucketName(msg.BucketName); err != nil { + return err + } + if err = s3util.CheckValidObjectName(msg.ObjectName); err != nil { + return err + } } return nil @@ -467,15 +523,28 @@ func (msg *MsgDeleteObject) ValidateBasic() error { return errors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) } - err = s3util.CheckValidBucketName(msg.BucketName) - if err != nil { - return err - } + return nil +} - err = s3util.CheckValidObjectName(msg.ObjectName) - if err != nil { - return err +func (msg *MsgDeleteObject) ValidateRuntime(ctx sdk.Context) error { + var err error + + if ctx.IsUpgraded(upgradetypes.Ural) { + if err = s3util.CheckValidBucketNameByCharacterLength(msg.BucketName); err != nil { + return err + } + if err = s3util.CheckValidObjectNameByCharacterLength(msg.ObjectName); err != nil { + return err + } + } else { + if err = s3util.CheckValidBucketName(msg.BucketName); err != nil { + return err + } + if err = s3util.CheckValidObjectName(msg.ObjectName); err != nil { + return err + } } + return nil } @@ -524,16 +593,6 @@ func (msg *MsgSealObject) ValidateBasic() error { return errors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) } - err = s3util.CheckValidBucketName(msg.BucketName) - if err != nil { - return err - } - - err = s3util.CheckValidObjectName(msg.ObjectName) - if err != nil { - return err - } - if len(msg.GetSecondarySpBlsAggSignatures()) != sdk.BLSSignatureLength { return errors.Wrap(gnfderrors.ErrInvalidBlsSignature, fmt.Sprintf("length of signature should be %d", sdk.BLSSignatureLength), @@ -543,6 +602,28 @@ func (msg *MsgSealObject) ValidateBasic() error { return nil } +func (msg *MsgSealObject) ValidateRuntime(ctx sdk.Context) error { + var err error + + if ctx.IsUpgraded(upgradetypes.Ural) { + if err = s3util.CheckValidBucketNameByCharacterLength(msg.BucketName); err != nil { + return err + } + if err = s3util.CheckValidObjectNameByCharacterLength(msg.ObjectName); err != nil { + return err + } + } else { + if err = s3util.CheckValidBucketName(msg.BucketName); err != nil { + return err + } + if err = s3util.CheckValidObjectName(msg.ObjectName); err != nil { + return err + } + } + + return nil +} + func NewMsgCopyObject( operator sdk.AccAddress, srcBucketName, dstBucketName string, srcObjectName, dstObjectName string, timeoutHeight uint64, sig []byte, @@ -599,25 +680,42 @@ func (msg *MsgCopyObject) ValidateBasic() error { return errors.Wrapf(ErrInvalidApproval, "Empty approvals are not allowed.") } - err = s3util.CheckValidBucketName(msg.SrcBucketName) - if err != nil { - return err - } + return nil +} - err = s3util.CheckValidObjectName(msg.SrcObjectName) - if err != nil { - return err - } +func (msg *MsgCopyObject) ValidateRuntime(ctx sdk.Context) error { + var err error - err = s3util.CheckValidBucketName(msg.DstBucketName) - if err != nil { - return err - } + if ctx.IsUpgraded(upgradetypes.Ural) { + if err = s3util.CheckValidBucketNameByCharacterLength(msg.SrcBucketName); err != nil { + return err + } + if err = s3util.CheckValidObjectNameByCharacterLength(msg.SrcObjectName); err != nil { + return err + } - err = s3util.CheckValidObjectName(msg.DstObjectName) - if err != nil { - return err + if err = s3util.CheckValidBucketNameByCharacterLength(msg.DstBucketName); err != nil { + return err + } + if err = s3util.CheckValidObjectNameByCharacterLength(msg.DstObjectName); err != nil { + return err + } + } else { + if err = s3util.CheckValidBucketName(msg.SrcBucketName); err != nil { + return err + } + if err = s3util.CheckValidObjectName(msg.SrcObjectName); err != nil { + return err + } + + if err = s3util.CheckValidBucketNameByCharacterLength(msg.DstBucketName); err != nil { + return err + } + if err = s3util.CheckValidObjectNameByCharacterLength(msg.DstObjectName); err != nil { + return err + } } + return nil } @@ -660,14 +758,27 @@ func (msg *MsgRejectSealObject) ValidateBasic() error { if err != nil { return errors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) } - err = s3util.CheckValidBucketName(msg.BucketName) - if err != nil { - return err - } - err = s3util.CheckValidObjectName(msg.ObjectName) - if err != nil { - return err + return nil +} + +func (msg *MsgRejectSealObject) ValidateRuntime(ctx sdk.Context) error { + var err error + + if ctx.IsUpgraded(upgradetypes.Ural) { + if err = s3util.CheckValidBucketNameByCharacterLength(msg.BucketName); err != nil { + return err + } + if err = s3util.CheckValidObjectNameByCharacterLength(msg.ObjectName); err != nil { + return err + } + } else { + if err = s3util.CheckValidBucketName(msg.BucketName); err != nil { + return err + } + if err = s3util.CheckValidObjectName(msg.ObjectName); err != nil { + return err + } } return nil @@ -714,11 +825,6 @@ func (msg *MsgDiscontinueObject) ValidateBasic() error { return errors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid operator address (%s)", err) } - err = s3util.CheckValidBucketName(msg.BucketName) - if err != nil { - return err - } - if len(msg.ObjectIds) == 0 || len(msg.ObjectIds) > MaxDiscontinueObjects { return errors.Wrapf(ErrInvalidObjectIds, "length of ids is %d", len(msg.ObjectIds)) } @@ -730,6 +836,21 @@ func (msg *MsgDiscontinueObject) ValidateBasic() error { return nil } +func (msg *MsgDiscontinueObject) ValidateRuntime(ctx sdk.Context) error { + var err error + + if ctx.IsUpgraded(upgradetypes.Ural) { + err = s3util.CheckValidBucketNameByCharacterLength(msg.BucketName) + } else { + err = s3util.CheckValidBucketName(msg.BucketName) + } + if err != nil { + return err + } + + return nil +} + func NewMsgDiscontinueBucket(operator sdk.AccAddress, bucketName, reason string) *MsgDiscontinueBucket { return &MsgDiscontinueBucket{ Operator: operator.String(), @@ -770,11 +891,6 @@ func (msg *MsgDiscontinueBucket) ValidateBasic() error { return errors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid operator address (%s)", err) } - err = s3util.CheckValidBucketName(msg.BucketName) - if err != nil { - return err - } - if len(msg.Reason) > MaxDiscontinueReasonLen { return errors.Wrapf(ErrInvalidReason, "reason is too long with length %d", len(msg.Reason)) } @@ -782,6 +898,21 @@ func (msg *MsgDiscontinueBucket) ValidateBasic() error { return nil } +func (msg *MsgDiscontinueBucket) ValidateRuntime(ctx sdk.Context) error { + var err error + + if ctx.IsUpgraded(upgradetypes.Ural) { + err = s3util.CheckValidBucketNameByCharacterLength(msg.BucketName) + } else { + err = s3util.CheckValidBucketName(msg.BucketName) + } + if err != nil { + return err + } + + return nil +} + func NewMsgUpdateObjectInfo( operator sdk.AccAddress, bucketName, objectName string, visibility VisibilityType, @@ -825,18 +956,30 @@ func (msg *MsgUpdateObjectInfo) ValidateBasic() error { return errors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) } - err = s3util.CheckValidBucketName(msg.BucketName) - if err != nil { - return err + if msg.Visibility == VISIBILITY_TYPE_UNSPECIFIED { + return errors.Wrapf(ErrInvalidVisibility, "Unspecified visibility is not allowed.") } - err = s3util.CheckValidObjectName(msg.ObjectName) - if err != nil { - return err - } + return nil +} - if msg.Visibility == VISIBILITY_TYPE_UNSPECIFIED { - return errors.Wrapf(ErrInvalidVisibility, "Unspecified visibility is not allowed.") +func (msg *MsgUpdateObjectInfo) ValidateRuntime(ctx sdk.Context) error { + var err error + + if ctx.IsUpgraded(upgradetypes.Ural) { + if err = s3util.CheckValidBucketNameByCharacterLength(msg.BucketName); err != nil { + return err + } + if err = s3util.CheckValidObjectNameByCharacterLength(msg.ObjectName); err != nil { + return err + } + } else { + if err = s3util.CheckValidBucketName(msg.BucketName); err != nil { + return err + } + if err = s3util.CheckValidObjectName(msg.ObjectName); err != nil { + return err + } } return nil @@ -882,17 +1025,27 @@ func (msg *MsgCreateGroup) ValidateBasic() error { return errors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) } - err = s3util.CheckValidGroupName(msg.GroupName) - if err != nil { - return gnfderrors.ErrInvalidGroupName.Wrapf("invalid groupName (%s)", err) - } - if len(msg.Extra) > MaxGroupExtraInfoLimit { return errors.Wrapf(gnfderrors.ErrInvalidParameter, "extra is too long with length %d, limit to %d", len(msg.Extra), MaxGroupExtraInfoLimit) } return nil } +func (msg *MsgCreateGroup) ValidateRuntime(ctx sdk.Context) error { + var err error + + if ctx.IsUpgraded(upgradetypes.Ural) { + err = s3util.CheckValidGroupNameByCharacterLength(msg.GroupName) + } else { + err = s3util.CheckValidGroupName(msg.GroupName) + } + if err != nil { + return err + } + + return nil +} + func NewMsgDeleteGroup(operator sdk.AccAddress, groupName string) *MsgDeleteGroup { return &MsgDeleteGroup{ Operator: operator.String(), @@ -932,10 +1085,21 @@ func (msg *MsgDeleteGroup) ValidateBasic() error { return errors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) } - err = s3util.CheckValidGroupName(msg.GroupName) + return nil +} + +func (msg *MsgDeleteGroup) ValidateRuntime(ctx sdk.Context) error { + var err error + + if ctx.IsUpgraded(upgradetypes.Ural) { + err = s3util.CheckValidGroupNameByCharacterLength(msg.GroupName) + } else { + err = s3util.CheckValidGroupName(msg.GroupName) + } if err != nil { - return errors.Wrapf(gnfderrors.ErrInvalidGroupName, "invalid groupName (%s)", err) + return err } + return nil } @@ -984,10 +1148,21 @@ func (msg *MsgLeaveGroup) ValidateBasic() error { return errors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid group owner (%s)", err) } - err = s3util.CheckValidGroupName(msg.GroupName) + return nil +} + +func (msg *MsgLeaveGroup) ValidateRuntime(ctx sdk.Context) error { + var err error + + if ctx.IsUpgraded(upgradetypes.Ural) { + err = s3util.CheckValidGroupNameByCharacterLength(msg.GroupName) + } else { + err = s3util.CheckValidGroupName(msg.GroupName) + } if err != nil { return err } + return nil } @@ -1045,11 +1220,6 @@ func (msg *MsgUpdateGroupMember) ValidateBasic() error { return errors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid group owner address (%s)", err) } - err = s3util.CheckValidGroupName(msg.GroupName) - if err != nil { - return err - } - if len(msg.MembersToAdd)+len(msg.MembersToDelete) > MaxGroupMemberLimitOnce { return gnfderrors.ErrInvalidParameter.Wrapf("Once update group member limit exceeded") } @@ -1069,6 +1239,22 @@ func (msg *MsgUpdateGroupMember) ValidateBasic() error { return errors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid member address (%s)", err) } } + + return nil +} + +func (msg *MsgUpdateGroupMember) ValidateRuntime(ctx sdk.Context) error { + var err error + + if ctx.IsUpgraded(upgradetypes.Ural) { + err = s3util.CheckValidGroupNameByCharacterLength(msg.GroupName) + } else { + err = s3util.CheckValidGroupName(msg.GroupName) + } + if err != nil { + return err + } + return nil } @@ -1118,10 +1304,6 @@ func (msg *MsgUpdateGroupExtra) ValidateBasic() error { return errors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid group owner address (%s)", err) } - err = s3util.CheckValidGroupName(msg.GroupName) - if err != nil { - return err - } if len(msg.Extra) > MaxGroupExtraInfoLimit { return errors.Wrapf(gnfderrors.ErrInvalidParameter, "extra is too long with length %d, limit to %d", len(msg.Extra), MaxGroupExtraInfoLimit) } @@ -1129,6 +1311,21 @@ func (msg *MsgUpdateGroupExtra) ValidateBasic() error { return nil } +func (msg *MsgUpdateGroupExtra) ValidateRuntime(ctx sdk.Context) error { + var err error + + if ctx.IsUpgraded(upgradetypes.Ural) { + err = s3util.CheckValidGroupNameByCharacterLength(msg.GroupName) + } else { + err = s3util.CheckValidGroupName(msg.GroupName) + } + if err != nil { + return err + } + + return nil +} + func NewMsgPutPolicy(operator sdk.AccAddress, resource string, principal *permtypes.Principal, statements []*permtypes.Statement, expirationTime *time.Time, ) *MsgPutPolicy { @@ -1312,6 +1509,12 @@ func (msg *MsgMirrorBucket) ValidateBasic() error { return errors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) } + return nil +} + +func (msg *MsgMirrorBucket) ValidateRuntime(ctx sdk.Context) error { + var err error + if !msg.Id.IsNil() && msg.Id.GT(sdk.NewUint(0)) { if msg.BucketName != "" { return errors.Wrap(gnfderrors.ErrInvalidBucketName, "Bucket name should be empty") @@ -1319,7 +1522,11 @@ func (msg *MsgMirrorBucket) ValidateBasic() error { return nil } - err = s3util.CheckValidBucketName(msg.BucketName) + if ctx.IsUpgraded(upgradetypes.Ural) { + err = s3util.CheckValidBucketNameByCharacterLength(msg.BucketName) + } else { + err = s3util.CheckValidBucketName(msg.BucketName) + } if err != nil { return err } @@ -1370,6 +1577,12 @@ func (msg *MsgMirrorObject) ValidateBasic() error { return errors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) } + return nil +} + +func (msg *MsgMirrorObject) ValidateRuntime(ctx sdk.Context) error { + var err error + if !msg.Id.IsNil() && msg.Id.GT(sdk.NewUint(0)) { if msg.BucketName != "" { return errors.Wrap(gnfderrors.ErrInvalidBucketName, "Bucket name should be empty") @@ -1380,14 +1593,20 @@ func (msg *MsgMirrorObject) ValidateBasic() error { return nil } - err = s3util.CheckValidBucketName(msg.BucketName) - if err != nil { - return err - } - - err = s3util.CheckValidObjectName(msg.ObjectName) - if err != nil { - return err + if ctx.IsUpgraded(upgradetypes.Ural) { + if err = s3util.CheckValidBucketNameByCharacterLength(msg.BucketName); err != nil { + return err + } + if err = s3util.CheckValidObjectNameByCharacterLength(msg.ObjectName); err != nil { + return err + } + } else { + if err = s3util.CheckValidBucketName(msg.BucketName); err != nil { + return err + } + if err = s3util.CheckValidObjectName(msg.ObjectName); err != nil { + return err + } } return nil @@ -1435,6 +1654,12 @@ func (msg *MsgMirrorGroup) ValidateBasic() error { return errors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) } + return nil +} + +func (msg *MsgMirrorGroup) ValidateRuntime(ctx sdk.Context) error { + var err error + if !msg.Id.IsNil() && msg.Id.GT(sdk.NewUint(0)) { if msg.GroupName != "" { return errors.Wrap(gnfderrors.ErrInvalidGroupName, "Group name should be empty") @@ -1442,9 +1667,13 @@ func (msg *MsgMirrorGroup) ValidateBasic() error { return nil } - err = s3util.CheckValidGroupName(msg.GroupName) + if ctx.IsUpgraded(upgradetypes.Ural) { + err = s3util.CheckValidGroupNameByCharacterLength(msg.GroupName) + } else { + err = s3util.CheckValidGroupName(msg.GroupName) + } if err != nil { - return gnfderrors.ErrInvalidGroupName.Wrapf("invalid groupName (%s)", err) + return err } return nil @@ -1522,11 +1751,6 @@ func (msg *MsgRenewGroupMember) ValidateBasic() error { return errors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid group owner address (%s)", err) } - err = s3util.CheckValidGroupName(msg.GroupName) - if err != nil { - return err - } - if len(msg.Members) > MaxGroupMemberLimitOnce { return gnfderrors.ErrInvalidParameter.Wrapf("Once renew group member limit exceeded") } @@ -1543,6 +1767,21 @@ func (msg *MsgRenewGroupMember) ValidateBasic() error { return nil } +func (msg *MsgRenewGroupMember) ValidateRuntime(ctx sdk.Context) error { + var err error + + if ctx.IsUpgraded(upgradetypes.Ural) { + err = s3util.CheckValidGroupNameByCharacterLength(msg.GroupName) + } else { + err = s3util.CheckValidGroupName(msg.GroupName) + } + if err != nil { + return err + } + + return nil +} + func NewMsgSetTag(operator sdk.AccAddress, resource string, tags *ResourceTags) *MsgSetTag { return &MsgSetTag{ Operator: operator.String(), @@ -1592,13 +1831,27 @@ func (msg *MsgSetTag) ValidateBasic() error { if len(msg.Tags.GetTags()) > MaxTagCount { return gnfderrors.ErrInvalidParameter.Wrapf("Tags count limit exceeded") } + + return nil +} + +func (msg *MsgSetTag) ValidateRuntime(ctx sdk.Context) error { if len(msg.Tags.GetTags()) > 0 { for _, tag := range msg.Tags.GetTags() { - if len(tag.GetKey()) > MaxTagKeyLength { - return gnfderrors.ErrInvalidParameter.Wrapf("Tag key length exceeded") - } - if len(tag.GetValue()) > MaxTagValueLength { - return gnfderrors.ErrInvalidParameter.Wrapf("Tag value length exceeded") + if ctx.IsUpgraded(upgradetypes.Ural) { + if utf8.RuneCountInString(tag.GetKey()) > MaxTagKeyLength { + return gnfderrors.ErrInvalidParameter.Wrapf("Tag key length exceeded") + } + if utf8.RuneCountInString(tag.GetValue()) > MaxTagValueLength { + return gnfderrors.ErrInvalidParameter.Wrapf("Tag value length exceeded") + } + } else { + if len(tag.GetKey()) > MaxTagKeyLength { + return gnfderrors.ErrInvalidParameter.Wrapf("Tag key length exceeded") + } + if len(tag.GetValue()) > MaxTagValueLength { + return gnfderrors.ErrInvalidParameter.Wrapf("Tag value length exceeded") + } } } } diff --git a/x/storage/types/message_cancel_migrate_bucket.go b/x/storage/types/message_cancel_migrate_bucket.go index 7e6214e2b..8f0724cb1 100644 --- a/x/storage/types/message_cancel_migrate_bucket.go +++ b/x/storage/types/message_cancel_migrate_bucket.go @@ -3,6 +3,7 @@ package types import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" "github.com/bnb-chain/greenfield/types/s3util" ) @@ -45,9 +46,19 @@ func (msg *MsgCancelMigrateBucket) ValidateBasic() error { return sdkerrors.ErrInvalidAddress.Wrapf("invalid creator address (%s)", err) } - err = s3util.CheckValidBucketName(msg.BucketName) + return nil +} + +func (msg *MsgCancelMigrateBucket) ValidateRuntime(ctx sdk.Context) error { + var err error + if ctx.IsUpgraded(upgradetypes.Ural) { + err = s3util.CheckValidBucketNameByCharacterLength(msg.BucketName) + } else { + err = s3util.CheckValidBucketName(msg.BucketName) + } if err != nil { return err } + return nil } diff --git a/x/storage/types/message_complete_migrate_bucket.go b/x/storage/types/message_complete_migrate_bucket.go index b3d7c648d..d02869ac9 100644 --- a/x/storage/types/message_complete_migrate_bucket.go +++ b/x/storage/types/message_complete_migrate_bucket.go @@ -4,6 +4,7 @@ import ( "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" gnfderrors "github.com/bnb-chain/greenfield/types/errors" "github.com/bnb-chain/greenfield/types/s3util" @@ -49,10 +50,7 @@ func (msg *MsgCompleteMigrateBucket) ValidateBasic() error { if err != nil { return errors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) } - err = s3util.CheckValidBucketName(msg.BucketName) - if err != nil { - return err - } + if msg.GlobalVirtualGroupFamilyId == types.NoSpecifiedFamilyId { return gnfderrors.ErrInvalidMessage.Wrap("the global virtual group family id not specify.") } @@ -72,5 +70,20 @@ func (msg *MsgCompleteMigrateBucket) ValidateBasic() error { } mappingMap[gvgMapping.SrcGlobalVirtualGroupId] = gvgMapping.DstGlobalVirtualGroupId } + + return nil +} + +func (msg *MsgCompleteMigrateBucket) ValidateRuntime(ctx sdk.Context) error { + var err error + if ctx.IsUpgraded(upgradetypes.Ural) { + err = s3util.CheckValidBucketNameByCharacterLength(msg.BucketName) + } else { + err = s3util.CheckValidBucketName(msg.BucketName) + } + if err != nil { + return err + } + return nil } diff --git a/x/storage/types/message_migrate_bucket.go b/x/storage/types/message_migrate_bucket.go index d6998338d..0038a7d2f 100644 --- a/x/storage/types/message_migrate_bucket.go +++ b/x/storage/types/message_migrate_bucket.go @@ -3,6 +3,7 @@ package types import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" "github.com/cosmos/gogoproto/proto" "github.com/bnb-chain/greenfield/types/common" @@ -56,11 +57,6 @@ func (msg *MsgMigrateBucket) ValidateBasic() error { return sdkerrors.ErrInvalidAddress.Wrapf("invalid creator address (%s)", err) } - err = s3util.CheckValidBucketName(msg.BucketName) - if err != nil { - return err - } - if msg.DstPrimarySpId == 0 { return errors.ErrInvalidMessage.Wrapf("Invalid dst primary sp id: %d", msg.DstPrimarySpId) } @@ -70,3 +66,17 @@ func (msg *MsgMigrateBucket) ValidateBasic() error { } return nil } + +func (msg *MsgMigrateBucket) ValidateRuntime(ctx sdk.Context) error { + var err error + if ctx.IsUpgraded(upgradetypes.Ural) { + err = s3util.CheckValidBucketNameByCharacterLength(msg.BucketName) + } else { + err = s3util.CheckValidBucketName(msg.BucketName) + } + if err != nil { + return err + } + + return nil +} diff --git a/x/storage/types/message_object_test.go b/x/storage/types/message_object_test.go index 0a6d38a14..642315e0b 100644 --- a/x/storage/types/message_object_test.go +++ b/x/storage/types/message_object_test.go @@ -5,6 +5,8 @@ import ( "testing" "cosmossdk.io/math" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" + sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/prysmaticlabs/prysm/crypto/bls" "github.com/stretchr/testify/require" @@ -77,7 +79,14 @@ func TestMsgCreateObject_ValidateBasic(t *testing.T) { t.Run(tt.name, func(t *testing.T) { err := tt.msg.ValidateBasic() if tt.err != nil { - require.ErrorIs(t, err, tt.err) + if err != nil { + require.ErrorIs(t, err, tt.err) + } else { + upgradeChecker := func(sdk.Context, string) bool { return true } + ctx := sdk.NewContext(nil, tmproto.Header{}, false, upgradeChecker, nil) + err = tt.msg.ValidateRuntime(ctx) + require.ErrorIs(t, err, tt.err) + } return } require.NoError(t, err) @@ -251,7 +260,14 @@ func TestMsgCopyObject_ValidateBasic(t *testing.T) { t.Run(tt.name, func(t *testing.T) { err := tt.msg.ValidateBasic() if tt.err != nil { - require.ErrorIs(t, err, tt.err) + if err != nil { + require.ErrorIs(t, err, tt.err) + } else { + upgradeChecker := func(sdk.Context, string) bool { return true } + ctx := sdk.NewContext(nil, tmproto.Header{}, false, upgradeChecker, nil) + err = tt.msg.ValidateRuntime(ctx) + require.ErrorIs(t, err, tt.err) + } return } require.NoError(t, err) @@ -323,7 +339,14 @@ func TestMsgSealObject_ValidateBasic(t *testing.T) { t.Run(tt.name, func(t *testing.T) { err := tt.msg.ValidateBasic() if tt.err != nil { - require.ErrorIs(t, err, tt.err) + if err != nil { + require.ErrorIs(t, err, tt.err) + } else { + upgradeChecker := func(sdk.Context, string) bool { return true } + ctx := sdk.NewContext(nil, tmproto.Header{}, false, upgradeChecker, nil) + err = tt.msg.ValidateRuntime(ctx) + require.ErrorIs(t, err, tt.err) + } return } require.NoError(t, err) @@ -377,7 +400,14 @@ func TestMsgRejectSealObject_ValidateBasic(t *testing.T) { t.Run(tt.name, func(t *testing.T) { err := tt.msg.ValidateBasic() if tt.err != nil { - require.ErrorIs(t, err, tt.err) + if err != nil { + require.ErrorIs(t, err, tt.err) + } else { + upgradeChecker := func(sdk.Context, string) bool { return true } + ctx := sdk.NewContext(nil, tmproto.Header{}, false, upgradeChecker, nil) + err = tt.msg.ValidateRuntime(ctx) + require.ErrorIs(t, err, tt.err) + } return } require.NoError(t, err) @@ -445,7 +475,14 @@ func TestMsgUpdateObjectInfo_ValidateBasic(t *testing.T) { t.Run(tt.name, func(t *testing.T) { err := tt.msg.ValidateBasic() if tt.err != nil { - require.ErrorIs(t, err, tt.err) + if err != nil { + require.ErrorIs(t, err, tt.err) + } else { + upgradeChecker := func(sdk.Context, string) bool { return true } + ctx := sdk.NewContext(nil, tmproto.Header{}, false, upgradeChecker, nil) + err = tt.msg.ValidateRuntime(ctx) + require.ErrorIs(t, err, tt.err) + } return } require.NoError(t, err) @@ -558,7 +595,14 @@ func TestMsgDiscontinueObject_ValidateBasic(t *testing.T) { t.Run(tt.name, func(t *testing.T) { err := tt.msg.ValidateBasic() if tt.err != nil { - require.ErrorIs(t, err, tt.err) + if err != nil { + require.ErrorIs(t, err, tt.err) + } else { + upgradeChecker := func(sdk.Context, string) bool { return true } + ctx := sdk.NewContext(nil, tmproto.Header{}, false, upgradeChecker, nil) + err = tt.msg.ValidateRuntime(ctx) + require.ErrorIs(t, err, tt.err) + } return } require.NoError(t, err) diff --git a/x/storage/types/message_reject_migrate_bucket.go b/x/storage/types/message_reject_migrate_bucket.go index ae8af2fa5..97f07008d 100644 --- a/x/storage/types/message_reject_migrate_bucket.go +++ b/x/storage/types/message_reject_migrate_bucket.go @@ -3,6 +3,7 @@ package types import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" "github.com/bnb-chain/greenfield/types/s3util" ) @@ -45,9 +46,19 @@ func (msg *MsgRejectMigrateBucket) ValidateBasic() error { return sdkerrors.ErrInvalidAddress.Wrapf("invalid operator address (%s)", err) } - err = s3util.CheckValidBucketName(msg.BucketName) + return nil +} + +func (msg *MsgRejectMigrateBucket) ValidateRuntime(ctx sdk.Context) error { + var err error + if ctx.IsUpgraded(upgradetypes.Ural) { + err = s3util.CheckValidBucketNameByCharacterLength(msg.BucketName) + } else { + err = s3util.CheckValidBucketName(msg.BucketName) + } if err != nil { return err } + return nil } diff --git a/x/storage/types/message_test.go b/x/storage/types/message_test.go index 9c1fef405..171d4a3b0 100644 --- a/x/storage/types/message_test.go +++ b/x/storage/types/message_test.go @@ -5,6 +5,7 @@ import ( "testing" "cosmossdk.io/math" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/stretchr/testify/require" @@ -87,7 +88,9 @@ func TestMsgCreateBucket_ValidateBasic(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - err := tt.msg.ValidateBasic() + upgradeChecker := func(sdk.Context, string) bool { return true } + ctx := sdk.NewContext(nil, tmproto.Header{}, false, upgradeChecker, nil) + err := tt.msg.ValidateRuntime(ctx) if tt.err != nil { require.ErrorIs(t, err, tt.err) return @@ -120,7 +123,9 @@ func TestMsgDeleteBucket_ValidateBasic(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - err := tt.msg.ValidateBasic() + upgradeChecker := func(sdk.Context, string) bool { return true } + ctx := sdk.NewContext(nil, tmproto.Header{}, false, upgradeChecker, nil) + err := tt.msg.ValidateRuntime(ctx) if tt.err != nil { require.ErrorIs(t, err, tt.err) return