Skip to content

Commit 3dd59b9

Browse files
committed
fix: add missing provider status checks in plan message handler
1 parent c09d69d commit 3dd59b9

File tree

6 files changed

+48
-36
lines changed

6 files changed

+48
-36
lines changed

x/lease/keeper/msg_handler.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -213,12 +213,23 @@ func (k *Keeper) HandleMsgStartLease(ctx sdk.Context, msg *v1.MsgStartLeaseReque
213213
return nil, types.NewErrorInvalidHours(msg.Hours)
214214
}
215215

216+
// Parse and validate the node address
217+
nodeAddr, err := base.NodeAddressFromBech32(msg.NodeAddress)
218+
if err != nil {
219+
return nil, err
220+
}
221+
216222
// Parse and validate the provider's Bech32 address
217223
provAddr, err := base.ProvAddressFromBech32(msg.From)
218224
if err != nil {
219225
return nil, err
220226
}
221227

228+
// Check if a lease already exists between this provider and node
229+
if k.HasAnyLeaseForNodeByProvider(ctx, nodeAddr, provAddr) {
230+
return nil, types.NewErrorDuplicateLease(nodeAddr, provAddr)
231+
}
232+
222233
// Ensure provider exists and is currently active
223234
provider, found := k.GetProvider(ctx, provAddr)
224235
if !found {
@@ -229,12 +240,6 @@ func (k *Keeper) HandleMsgStartLease(ctx sdk.Context, msg *v1.MsgStartLeaseReque
229240
return nil, types.NewErrorInvalidProviderStatus(provAddr, provider.Status)
230241
}
231242

232-
// Parse and validate the node address
233-
nodeAddr, err := base.NodeAddressFromBech32(msg.NodeAddress)
234-
if err != nil {
235-
return nil, err
236-
}
237-
238243
// Confirm the node exists and is active
239244
node, found := k.GetNode(ctx, nodeAddr)
240245
if !found {
@@ -262,11 +267,6 @@ func (k *Keeper) HandleMsgStartLease(ctx sdk.Context, msg *v1.MsgStartLeaseReque
262267
return nil, types.NewErrorInvalidPrice(price)
263268
}
264269

265-
// Check if a lease already exists between this provider and node
266-
if k.HasAnyLeaseForNodeByProvider(ctx, nodeAddr, provAddr) {
267-
return nil, types.NewErrorDuplicateLease(nodeAddr, provAddr)
268-
}
269-
270270
// Generate a new lease ID and construct the lease object
271271
count := k.GetLeaseCount(ctx)
272272
lease := v1.Lease{

x/plan/keeper/alias.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
base "github.com/sentinel-official/sentinelhub/v12/types"
77
leasetypes "github.com/sentinel-official/sentinelhub/v12/x/lease/types/v1"
88
nodetypes "github.com/sentinel-official/sentinelhub/v12/x/node/types/v3"
9+
providertypes "github.com/sentinel-official/sentinelhub/v12/x/provider/types/v2"
910
)
1011

1112
func (k *Keeper) GetLease(ctx sdk.Context, id uint64) (leasetypes.Lease, bool) {
@@ -36,8 +37,8 @@ func (k *Keeper) HasNodeForPlan(ctx sdk.Context, id uint64, addr base.NodeAddres
3637
return k.node.HasNodeForPlan(ctx, id, addr)
3738
}
3839

39-
func (k *Keeper) HasProvider(ctx sdk.Context, addr base.ProvAddress) bool {
40-
return k.provider.HasProvider(ctx, addr)
40+
func (k *Keeper) GetProvider(ctx sdk.Context, addr base.ProvAddress) (providertypes.Provider, bool) {
41+
return k.provider.GetProvider(ctx, addr)
4142
}
4243

4344
func (k *Keeper) PlanUnlinkNodePreHook(ctx sdk.Context, id uint64, addr base.NodeAddress) error {

x/plan/keeper/expected.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
base "github.com/sentinel-official/sentinelhub/v12/types"
88
leasetypes "github.com/sentinel-official/sentinelhub/v12/x/lease/types/v1"
99
nodetypes "github.com/sentinel-official/sentinelhub/v12/x/node/types/v3"
10+
providertypes "github.com/sentinel-official/sentinelhub/v12/x/provider/types/v2"
1011
subscriptiontypes "github.com/sentinel-official/sentinelhub/v12/x/subscription/types/v3"
1112
)
1213

@@ -32,7 +33,7 @@ type NodeKeeper interface {
3233
}
3334

3435
type ProviderKeeper interface {
35-
HasProvider(ctx sdk.Context, addr base.ProvAddress) bool
36+
GetProvider(ctx sdk.Context, addr base.ProvAddress) (providertypes.Provider, bool)
3637
}
3738

3839
type SessionKeeper interface {

x/plan/keeper/msg_handler.go

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,16 @@ func (k *Keeper) HandleMsgCreatePlan(ctx sdk.Context, msg *v3.MsgCreatePlanReque
1919
return nil, err
2020
}
2121

22-
// Ensure provider exists in the state
23-
if !k.HasProvider(ctx, provAddr) {
22+
// Verify the provider exists and is in an active state
23+
provider, found := k.GetProvider(ctx, provAddr)
24+
if !found {
2425
return nil, types.NewErrorProviderNotFound(provAddr)
2526
}
2627

28+
if !provider.Status.Equal(v1base.StatusActive) {
29+
return nil, types.NewErrorInvalidProviderStatus(provAddr, provider.Status)
30+
}
31+
2732
// Construct the new plan with an incremented ID and inactive status
2833
count := k.GetPlanCount(ctx)
2934
plan := v3.Plan{
@@ -76,16 +81,6 @@ func (k *Keeper) HandleMsgLinkNode(ctx sdk.Context, msg *v3.MsgLinkNodeRequest)
7681
return nil, err
7782
}
7883

79-
// Ensure the node exists and is active
80-
node, found := k.GetNode(ctx, nodeAddr)
81-
if !found {
82-
return nil, types.NewErrorNodeNotFound(nodeAddr)
83-
}
84-
85-
if !node.Status.Equal(v1base.StatusActive) {
86-
return nil, types.NewErrorInvalidNodeStatus(nodeAddr, node.Status)
87-
}
88-
8984
// Prevent duplicate node linkage for the same plan
9085
if k.HasNodeForPlan(ctx, plan.ID, nodeAddr) {
9186
return nil, types.NewErrorDuplicateNodeForPlan(plan.ID, nodeAddr)
@@ -111,7 +106,7 @@ func (k *Keeper) HandleMsgLinkNode(ctx sdk.Context, msg *v3.MsgLinkNodeRequest)
111106
&v3.EventLinkNode{
112107
PlanID: plan.ID,
113108
ProvAddress: plan.ProvAddress,
114-
NodeAddress: node.Address,
109+
NodeAddress: nodeAddr.String(),
115110
},
116111
)
117112

@@ -182,6 +177,23 @@ func (k *Keeper) HandleMsgUpdatePlanStatus(ctx sdk.Context, msg *v3.MsgUpdatePla
182177
return nil, types.NewErrorUnauthorized(msg.From)
183178
}
184179

180+
if msg.Status.Equal(v1base.StatusActive) {
181+
provAddr, err := base.ProvAddressFromBech32(plan.ProvAddress)
182+
if err != nil {
183+
return nil, err
184+
}
185+
186+
// Ensure provider exists and is currently active
187+
provider, found := k.GetProvider(ctx, provAddr)
188+
if !found {
189+
return nil, types.NewErrorProviderNotFound(provAddr)
190+
}
191+
192+
if !provider.Status.Equal(v1base.StatusActive) {
193+
return nil, types.NewErrorInvalidProviderStatus(provAddr, provider.Status)
194+
}
195+
}
196+
185197
// Remove old status index if transitioning state
186198
if msg.Status.Equal(v1base.StatusActive) {
187199
if plan.Status.Equal(v1base.StatusInactive) {

x/plan/types/errors.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ const (
1212
ErrCodeDuplicateNodeForPlan
1313
ErrCodeInvalidMessage
1414
ErrCodeInvalidNodeStatus
15+
ErrCodeInvalidProviderStatus
1516
ErrCodeLeaseForNodeByProviderNotFound
1617
ErrCodeLeaseNotFound
1718
ErrCodeNodeForPlanNotFound
@@ -25,6 +26,7 @@ var (
2526
ErrDuplicateNodeForPlan = sdkerrors.Register(ModuleName, ErrCodeDuplicateNodeForPlan, "duplicate node for plan")
2627
ErrInvalidMessage = sdkerrors.Register(ModuleName, ErrCodeInvalidMessage, "invalid message")
2728
ErrInvalidNodeStatus = sdkerrors.Register(ModuleName, ErrCodeInvalidNodeStatus, "invalid node status")
29+
ErrInvalidProviderStatus = sdkerrors.Register(ModuleName, ErrCodeInvalidProviderStatus, "invalid provider status")
2830
ErrLeaseForNodeByProviderNotFound = sdkerrors.Register(ModuleName, ErrCodeLeaseForNodeByProviderNotFound, "lease for node by provider not found")
2931
ErrLeaseNotFound = sdkerrors.Register(ModuleName, ErrCodeLeaseNotFound, "lease not found")
3032
ErrNodeForPlanNotFound = sdkerrors.Register(ModuleName, ErrCodeNodeForPlanNotFound, "node for plan not found")
@@ -49,6 +51,11 @@ func NewErrorInvalidNodeStatus(addr base.NodeAddress, status v1base.Status) erro
4951
return sdkerrors.Wrapf(ErrInvalidNodeStatus, "invalid status %s for node %s", status, addr)
5052
}
5153

54+
// NewErrorInvalidProviderStatus returns an error indicating that the provided status is invalid for the given provider.
55+
func NewErrorInvalidProviderStatus(addr base.ProvAddress, status v1base.Status) error {
56+
return sdkerrors.Wrapf(ErrInvalidProviderStatus, "invalid status %s for provider %s", status, addr)
57+
}
58+
5259
// NewErrorLeaseForNodeByProviderNotFound returns an error indicating that the specified lease does not exist.
5360
func NewErrorLeaseForNodeByProviderNotFound(nodeAddr base.NodeAddress, provAddr base.ProvAddress) error {
5461
return sdkerrors.Wrapf(ErrLeaseForNodeByProviderNotFound, "lease for node %s by provider %s does not exist", nodeAddr, provAddr)

x/subscription/keeper/msg_handler.go

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -466,15 +466,6 @@ func (k *Keeper) HandleMsgStartSession(ctx sdk.Context, msg *v3.MsgStartSessionR
466466
return nil, err
467467
}
468468

469-
node, found := k.GetNode(ctx, nodeAddr)
470-
if !found {
471-
return nil, types.NewErrorNodeNotFound(nodeAddr)
472-
}
473-
474-
if !node.Status.Equal(v1base.StatusActive) {
475-
return nil, types.NewErrorInvalidNodeStatus(nodeAddr, node.Status)
476-
}
477-
478469
// Ensure the node is authorized to serve this plan
479470
if !k.HasNodeForPlan(ctx, subscription.PlanID, nodeAddr) {
480471
return nil, types.NewErrorNodeForPlanNotFound(subscription.PlanID, nodeAddr)

0 commit comments

Comments
 (0)