Skip to content
This repository was archived by the owner on Jan 20, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions proto/cosmos/accesscontrol_x/gov.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
syntax = "proto3";
package cosmos.accesscontrol.v1beta1;

import "gogoproto/gogo.proto";
import "cosmos/accesscontrol/constants.proto";
import "cosmos/accesscontrol/accesscontrol.proto";

option go_package = "github.com/cosmos/cosmos-sdk/x/accesscontrol/types";

message MsgUpdateResourceDependencyMappingProposal {
option (gogoproto.equal) = false;
option (gogoproto.goproto_stringer) = false;
option (gogoproto.stringer) = false;
option (gogoproto.goproto_getters) = false;

string title = 1 [
(gogoproto.moretags) = "yaml:\"title\"",
(gogoproto.jsontag) = "title"
];
string description = 2 [
(gogoproto.moretags) = "yaml:\"description\"",
(gogoproto.jsontag) = "description"
];
repeated cosmos.accesscontrol.v1beta1.MessageDependencyMapping message_dependency_mapping = 3 [
(gogoproto.nullable) = false,
(gogoproto.moretags) = "yaml:\"message_dependency_mapping\""
];
}

message MsgUpdateResourceDependencyMappingProposalJsonFile {
string title = 1 [
(gogoproto.moretags) = "yaml:\"title\"",
(gogoproto.jsontag) = "title"
];
string description = 2 [
(gogoproto.moretags) = "yaml:\"description\"",
(gogoproto.jsontag) = "description"
];
string deposit = 3 [
(gogoproto.moretags) = "yaml:\"deposit\"",
(gogoproto.jsontag) = "deposit"
];
repeated cosmos.accesscontrol.v1beta1.MessageDependencyMapping message_dependency_mapping = 4 [
(gogoproto.nullable) = false,
(gogoproto.moretags) = "yaml:\"message_dependency_mapping\""
];
}

message MsgUpdateResourceDependencyMappingProposalResponse {}
26 changes: 13 additions & 13 deletions proto/cosmos/accesscontrol_x/query.proto
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,16 @@ service Query {
option (google.api.http).get = "/cosmos/cosmos-sdk/accesscontrol/params";
}

rpc ResourceDepedencyMappingFromMessageKey(ResourceDepedencyMappingFromMessageKeyRequest)
returns (ResourceDepedencyMappingFromMessageKeyResponse) {
rpc ResourceDependencyMappingFromMessageKey(ResourceDependencyMappingFromMessageKeyRequest)
returns (ResourceDependencyMappingFromMessageKeyResponse) {
option (google.api.http).get =
"/cosmos/cosmos-sdk/accesscontrol/resource_depedency_mapping_from_message_key/{message_key}";
"/cosmos/cosmos-sdk/accesscontrol/resource_dependency_mapping_from_message_key/{message_key}";
}

rpc ListResourceDepedencyMapping(ListResourceDepedencyMappingRequest)
returns (ListResourceDepedencyMappingResponse) {
rpc ListResourceDependencyMapping(ListResourceDependencyMappingRequest)
returns (ListResourceDependencyMappingResponse) {
option (google.api.http).get =
"/cosmos/cosmos-sdk/accesscontrol/list_resource_depedency_mapping";
"/cosmos/cosmos-sdk/accesscontrol/list_resource_dependency_mapping";
}
}

Expand All @@ -37,21 +37,21 @@ message QueryParamsResponse {
cosmos.accesscontrol_x.v1beta1.Params params = 1 [ (gogoproto.nullable) = false ];
}

message ResourceDepedencyMappingFromMessageKeyRequest {
message ResourceDependencyMappingFromMessageKeyRequest {
string message_key = 1 [ (gogoproto.moretags) = "yaml:\"message_key\"" ];
}

message ResourceDepedencyMappingFromMessageKeyResponse {
cosmos.accesscontrol.v1beta1.MessageDependencyMapping message_dependency_mapping = 1 [
message ResourceDependencyMappingFromMessageKeyResponse {
cosmos.accesscontrol.v1beta1.MessageDependencyMapping message_dependency_mapping = 1 [
(gogoproto.nullable) = false,
(gogoproto.moretags) = "yaml:\"message_dependency_mapping\""
];
}

message ListResourceDepedencyMappingRequest {}
message ListResourceDepedencyMappingResponse {
repeated cosmos.accesscontrol.v1beta1.MessageDependencyMapping message_dependency_mapping_list = 1 [
message ListResourceDependencyMappingRequest {}

message ListResourceDependencyMappingResponse {
repeated cosmos.accesscontrol.v1beta1.MessageDependencyMapping message_dependency_mapping_list = 1 [
(gogoproto.nullable) = false,
(gogoproto.moretags) = "yaml:\"message_dependency_mapping_list\""
];
Expand Down
2 changes: 1 addition & 1 deletion x/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ parent:

Here are some production-grade modules that can be used in Cosmos SDK applications, along with their respective documentation:

- [Accesscontrol] - Resource depedency access control module used for managing concurrent read/write access to resources.
- [Accesscontrol] - Resource dependency access control module used for managing concurrent read/write access to resources.
- [Auth](auth/spec/README.md) - Authentication of accounts and transactions for Cosmos SDK application.
- [Authz](authz/spec/README.md) - Authorization for accounts to perform actions on behalf of other accounts.
- [Bank](bank/spec/README.md) - Token transfer functionalities.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,9 @@ func GetResourceDependencyMapping() *cobra.Command {
}
queryClient := types.NewQueryClient(clientCtx)

res, err := queryClient.ResourceDepedencyMappingFromMessageKey(
res, err := queryClient.ResourceDependencyMappingFromMessageKey(
cmd.Context(),
&types.ResourceDepedencyMappingFromMessageKeyRequest{MessageKey: args[0]},
&types.ResourceDependencyMappingFromMessageKeyRequest{MessageKey: args[0]},
)
if err != nil {
return err
Expand All @@ -84,7 +84,6 @@ func GetResourceDependencyMapping() *cobra.Command {
return cmd
}


func ListResourceDependencyMapping() *cobra.Command {
cmd := &cobra.Command{
Use: "list-resource-dependency-mapping [flags]",
Expand All @@ -97,9 +96,9 @@ func ListResourceDependencyMapping() *cobra.Command {
}
queryClient := types.NewQueryClient(clientCtx)

res, err := queryClient.ListResourceDepedencyMapping(
res, err := queryClient.ListResourceDependencyMapping(
cmd.Context(),
&types.ListResourceDepedencyMappingRequest{},
&types.ListResourceDependencyMappingRequest{},
)
if err != nil {
return err
Expand Down
77 changes: 77 additions & 0 deletions x/accesscontrol/client/cli/tx.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package cli

import (
"fmt"

"github.com/cosmos/cosmos-sdk/x/accesscontrol/client/utils"
"github.com/cosmos/cosmos-sdk/x/accesscontrol/types"

"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/client/flags"
"github.com/cosmos/cosmos-sdk/client/tx"
sdk "github.com/cosmos/cosmos-sdk/types"
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"

"github.com/spf13/cobra"
)

func GetTxCmd() *cobra.Command {
cmd := &cobra.Command{
Use: types.ModuleName,
Short: fmt.Sprintf("%s transactions subcommands", types.ModuleName),
DisableFlagParsing: true,
SuggestionsMinimumDistance: 2,
RunE: client.ValidateCmd,
}

updateResourceDependencyMappingProposalCmd := MsgUpdateResourceDependencyMappingProposalCmd()
flags.AddTxFlagsToCmd(updateResourceDependencyMappingProposalCmd)

cmd.AddCommand(
updateResourceDependencyMappingProposalCmd,
)

return cmd
}

func MsgUpdateResourceDependencyMappingProposalCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "update-resource-dependency-mapping [proposal-file]",
Args: cobra.ExactArgs(1),
Short: "Submit an UpdateResourceDependencyMapping proposal",
RunE: func(cmd *cobra.Command, args []string) error {
clientCtx, err := client.GetClientTxContext(cmd)
if err != nil {
return err
}

proposal, err := utils.ParseMsgUpdateResourceDependencyMappingProposalFile(clientCtx.Codec, args[0])
if err != nil {
return err
}

from := clientCtx.GetFromAddress()

content := types.MsgUpdateResourceDependencyMappingProposal{
Title: proposal.Title,
Description: proposal.Description,
MessageDependencyMapping: proposal.MessageDependencyMapping,
}

deposit, err := sdk.ParseCoinsNormalized(proposal.Deposit)
if err != nil {
return err
}

msg, err := govtypes.NewMsgSubmitProposal(&content, deposit, from)
if err != nil {

return err
}

return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg)
},
}

return cmd
}
9 changes: 9 additions & 0 deletions x/accesscontrol/client/proposal_handler.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package client

import (
"github.com/cosmos/cosmos-sdk/x/accesscontrol/client/cli"
"github.com/cosmos/cosmos-sdk/x/accesscontrol/client/rest"
govclient "github.com/cosmos/cosmos-sdk/x/gov/client"
)

var ProposalHandler = govclient.NewProposalHandler(cli.MsgUpdateResourceDependencyMappingProposalCmd, rest.ProposalRESTHandler)
66 changes: 66 additions & 0 deletions x/accesscontrol/client/rest/rest.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package rest

import (
"net/http"

"github.com/cosmos/cosmos-sdk/client/tx"

govrest "github.com/cosmos/cosmos-sdk/x/gov/client/rest"

"github.com/cosmos/cosmos-sdk/client"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/accesscontrol"
"github.com/cosmos/cosmos-sdk/types/rest"
"github.com/cosmos/cosmos-sdk/x/accesscontrol/types"
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
)

// PlanRequest defines a proposal for a new upgrade plan.
type UpdateResourceDependencyMappingRequest struct {
BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"`
Title string `json:"title" yaml:"title"`
Description string `json:"description" yaml:"description"`
Deposit sdk.Coins `json:"deposit" yaml:"deposit"`
MessageDependencyMapping []accesscontrol.MessageDependencyMapping `json:"message_dependency_mapping" yaml:"message_dependency_mapping"`

}

func ProposalRESTHandler(clientCtx client.Context) govrest.ProposalRESTHandler {
return govrest.ProposalRESTHandler{
SubRoute: "update_resource_dependency_mapping",
Handler: newPostPlanHandler(clientCtx),
}
}

func newPostPlanHandler(clientCtx client.Context) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req UpdateResourceDependencyMappingRequest

if !rest.ReadRESTReq(w, r, clientCtx.LegacyAmino, &req) {
return
}

req.BaseReq = req.BaseReq.Sanitize()
if !req.BaseReq.ValidateBasic(w) {
return
}

fromAddr, err := sdk.AccAddressFromBech32(req.BaseReq.From)
if rest.CheckBadRequestError(w, err) {
return
}

content := types.NewMsgUpdateResourceDependencyMappingProposal(
req.Title, req.Description, req.MessageDependencyMapping,
)
msg, err := govtypes.NewMsgSubmitProposal(content, req.Deposit, fromAddr)
if rest.CheckBadRequestError(w, err) {
return
}
if rest.CheckBadRequestError(w, msg.ValidateBasic()) {
return
}

tx.WriteGeneratedTxResponse(clientCtx, w, req.BaseReq, msg)
}
}
21 changes: 21 additions & 0 deletions x/accesscontrol/client/utils/utils.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package utils

import (
"io/ioutil"

"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/cosmos-sdk/x/accesscontrol/types"
)

func ParseMsgUpdateResourceDependencyMappingProposalFile(cdc codec.JSONCodec, proposalFile string) (types.MsgUpdateResourceDependencyMappingProposalJsonFile, error) {
proposal := types.MsgUpdateResourceDependencyMappingProposalJsonFile{}

contents, err := ioutil.ReadFile(proposalFile)
if err != nil {
return proposal, err
}

cdc.MustUnmarshalJSON(contents, &proposal)

return proposal, nil
}
22 changes: 22 additions & 0 deletions x/accesscontrol/examples/update-access-dep-mapping-proposal.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nice

"title": "Updating Resource Dependency Mapping",
"description": "Updating mapping for message key 'testing'",
"deposit": "10sei",
"message_dependency_mapping": [
{
"message_key": "testing",
"access_ops": [
{
"access_type": "UNKNOWN",
"resource_type": "ANY",
"identifier_template": "*"
},
{
"access_type": "COMMIT",
"resource_type": "ANY",
"identifier_template": "*"
}
]
}
]
}
28 changes: 28 additions & 0 deletions x/accesscontrol/handler.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package accesscontrol

import (
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"

"github.com/cosmos/cosmos-sdk/x/accesscontrol/keeper"
"github.com/cosmos/cosmos-sdk/x/accesscontrol/types"
)

func HandleMsgUpdateResourceDependencyMappingProposal(ctx sdk.Context, k *keeper.Keeper, p *types.MsgUpdateResourceDependencyMappingProposal) error {
for _, resourceDepMapping := range p.MessageDependencyMapping {
k.SetResourceDependencyMapping(ctx, resourceDepMapping)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do we do any checks over resourceDepMapping?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mainly just the proto serialization checks -- all the fields that are not free form are ENUMs so the proto serialization should also cover those cases

}
return nil
}

func NewProposalHandler(k keeper.Keeper) govtypes.Handler {
return func(ctx sdk.Context, content govtypes.Content) error {
switch c := content.(type) {
case *types.MsgUpdateResourceDependencyMappingProposal:
return HandleMsgUpdateResourceDependencyMappingProposal(ctx, &k, c)
default:
return sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "unrecognized accesscontrol proposal content type: %T", c)
}
}
}
10 changes: 5 additions & 5 deletions x/accesscontrol/keeper/genesis.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,19 @@ import (

func (k Keeper) InitGenesis(ctx sdk.Context, genState types.GenesisState) {
k.SetParams(ctx, genState.Params)
for _, resourceDepedencyMapping := range genState.GetMessageDependencyMapping() {
k.SetResourceDependencyMapping(ctx, resourceDepedencyMapping)
for _, resourceDependencyMapping := range genState.GetMessageDependencyMapping() {
k.SetResourceDependencyMapping(ctx, resourceDependencyMapping)
}
}

func (k Keeper) ExportGenesis(ctx sdk.Context) *types.GenesisState {
resourceDepedencyMappings := []acltypes.MessageDependencyMapping{}
resourceDependencyMappings := []acltypes.MessageDependencyMapping{}
k.IterateResourceKeys(ctx, func(dependencyMapping acltypes.MessageDependencyMapping) (stop bool) {
resourceDepedencyMappings = append(resourceDepedencyMappings, dependencyMapping)
resourceDependencyMappings = append(resourceDependencyMappings, dependencyMapping)
return false
})
return &types.GenesisState{
Params: k.GetParams(ctx),
MessageDependencyMapping: resourceDepedencyMappings,
MessageDependencyMapping: resourceDependencyMappings,
}
}
Loading