-
Notifications
You must be signed in to change notification settings - Fork 586
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
imp: allow memo strings instead of keys for transfer authorizations #6268
Changes from 7 commits
a41d67e
af98008
ecaf37f
772c7e6
dd89517
99f46d8
34735f0
388b7ef
3b72af7
7e80b22
b44d371
7241686
c0f920a
19e5453
d8be449
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -22,7 +22,7 @@ It takes: | |||||
|
||||||
- an `AllowList` list that specifies the list of addresses that are allowed to receive funds. If this list is empty, then all addresses are allowed to receive funds from the `TransferAuthorization`. | ||||||
|
||||||
- an `AllowedPacketData` list that specifies the list of memo packet data keys that are allowed to send the packet. If this list is empty, then only an empty memo is allowed (a `memo` field with non-empty content will be denied). If this list includes a single element equal to `"*"`, then any content in `memo` field will be allowed. | ||||||
- an `AllowedPacketData` list that specifies the list of memo strings that are allowed to be included in the memo field of the packet. If this list is empty, then only an empty memo is allowed (a `memo` field with non-empty content will be denied). If this list includes a single element equal to `"*"`, then any content in `memo` field will be allowed. | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Consider adding the article "the" before " - then any content in `memo` field will be allowed.
+ then any content in the `memo` field will be allowed. Committable suggestion
Suggested change
|
||||||
|
||||||
Setting a `TransferAuthorization` is expected to fail if: | ||||||
|
||||||
|
@@ -51,9 +51,8 @@ type Allocation struct { | |||||
SpendLimit sdk.Coins | ||||||
// allow list of receivers, an empty allow list permits any receiver address | ||||||
AllowList []string | ||||||
// allow list of packet data keys, an empty list prohibits all packet data keys; | ||||||
// a list only with "*" permits any packet data key | ||||||
// allow list of memo strings, an empty list prohibits all memo strings; | ||||||
// a list only with "*" permits any memo string | ||||||
AllowedPacketData []string | ||||||
} | ||||||
|
||||||
``` |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -30,7 +30,7 @@ const ( | |
// DenomPrefix is the prefix used for internal SDK coin representation. | ||
DenomPrefix = "ibc" | ||
|
||
// AllowAllPacketDataKeys holds the string key that allows all packet data keys in authz transfer messages | ||
// AllowAllPacketDataKeys holds the string key that allows all memo strings in authz transfer messages | ||
AllowAllPacketDataKeys = "*" | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe this constant can also be renamed in v9? We could also add a new constant with a more accurate name for the back ports. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah, maybe you can rename it on this PR and then change it back in the backport There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I am going to rename it in a followup PR, just to make the backport easier. |
||
|
||
KeyTotalEscrowPrefix = "totalEscrowForDenom" | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,9 +2,7 @@ package types | |
|
||
import ( | ||
"context" | ||
"encoding/json" | ||
"math/big" | ||
"sort" | ||
"strings" | ||
|
||
"github.com/cosmos/gogoproto/proto" | ||
|
@@ -166,39 +164,22 @@ func validateMemo(ctx sdk.Context, memo string, allowedPacketDataList []string) | |
} | ||
|
||
// if allowedPacketDataList has only 1 element and it equals AllowAllPacketDataKeys | ||
// then accept all the packet data keys | ||
// then accept all the memo strings | ||
if len(allowedPacketDataList) == 1 && allowedPacketDataList[0] == AllowAllPacketDataKeys { | ||
return nil | ||
} | ||
|
||
jsonObject := make(map[string]interface{}) | ||
err := json.Unmarshal([]byte(memo), &jsonObject) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
gasCostPerIteration := ctx.KVGasConfig().IterNextCostFlat | ||
|
||
for _, key := range allowedPacketDataList { | ||
for _, allowedMemo := range allowedPacketDataList { | ||
crodriguezvega marked this conversation as resolved.
Show resolved
Hide resolved
|
||
ctx.GasMeter().ConsumeGas(gasCostPerIteration, "transfer authorization") | ||
|
||
_, ok := jsonObject[key] | ||
if ok { | ||
delete(jsonObject, key) | ||
if strings.TrimSpace(memo) == strings.TrimSpace(allowedMemo) { | ||
crodriguezvega marked this conversation as resolved.
Show resolved
Hide resolved
crodriguezvega marked this conversation as resolved.
Show resolved
Hide resolved
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thinking more about this, I think trim spaces doesn't make much sense in here. We are allowing a specific memo string, and not making any assumptions about the format such as it being json. It makes no sense that if a user allowed Maybe worth asking others, but I'm starting to feel more strongly about this. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ah ok, I'm back to being indifferent about it then. Still ran be removed imo. We shouldn't be cleaning up user mess XD |
||
return nil | ||
} | ||
} | ||
|
||
keys := make([]string, 0, len(jsonObject)) | ||
for k := range jsonObject { | ||
keys = append(keys, k) | ||
} | ||
sort.Strings(keys) | ||
|
||
if len(jsonObject) != 0 { | ||
return errorsmod.Wrapf(ErrInvalidAuthorization, "not allowed packet data keys: %s", keys) | ||
} | ||
|
||
return nil | ||
return errorsmod.Wrapf(ErrInvalidAuthorization, "not allowed memo: %s", memo) | ||
crodriguezvega marked this conversation as resolved.
Show resolved
Hide resolved
|
||
} | ||
|
||
// UnboundedSpendLimit returns the sentinel value that can be used | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -19,8 +19,8 @@ message Allocation { | |
[(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; | ||
// allow list of receivers, an empty allow list permits any receiver address | ||
repeated string allow_list = 4; | ||
// allow list of packet data keys, an empty list prohibits all packet data keys; | ||
// a list only with "*" permits any packet data key | ||
// allow list of memo strings, an empty list prohibits all memo strings; | ||
// a list only with "*" permits any memo string | ||
repeated string allowed_packet_data = 5; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe in v9 we can rename this field? |
||
} | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
State machine breaking, right?