Skip to content
Draft
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
8 changes: 6 additions & 2 deletions integration/token/fungible/views/boolpolicy.go
Original file line number Diff line number Diff line change
Expand Up @@ -217,8 +217,12 @@ func (m *PolicyAcceptSpendView) Call(context view.Context) (any, error) {

continue
}
if len(in.Owner) != 0 && sigService.IsMe(context.Context(), in.Owner) {
assert.Fail("received tx consumes additional token [%s] owned by this responder", in.Id)
if len(in.Owner) != 0 {
isMe, err := sigService.IsMe(context.Context(), in.Owner)
assert.NoError(err, "failed to check ownership of input [%s]", in.Id)
if isMe {
assert.Fail("received tx consumes additional token [%s] owned by this responder", in.Id)
}
}
}
assert.True(matched, "received tx does not consume the token named in SpendRequest")
Expand Down
8 changes: 6 additions & 2 deletions integration/token/fungible/views/multisig.go
Original file line number Diff line number Diff line change
Expand Up @@ -206,8 +206,12 @@ func (m *MultiSigAcceptSpendView) Call(context view.Context) (any, error) {
continue
}
// Any other input must NOT belong to this responder.
if len(in.Owner) != 0 && sigService.IsMe(context.Context(), in.Owner) {
assert.Fail("received tx consumes additional token [%s] owned by this responder", in.Id)
if len(in.Owner) != 0 {
isMe, err := sigService.IsMe(context.Context(), in.Owner)
assert.NoError(err, "failed to check ownership of input [%s]", in.Id)
if isMe {
assert.Fail("received tx consumes additional token [%s] owned by this responder", in.Id)
}
}
}
assert.True(matched, "received tx does not consume the token named in SpendRequest")
Expand Down
4 changes: 3 additions & 1 deletion integration/token/fungible/views/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@ func AssertTokens(sp token.ServiceProvider, tx *ttx.Transaction, outputs *token.
assert.NoError(err, "failed to get token db for [%s]", tx.TokenService().ID())
for _, output := range outputs.Outputs() {
tokenID := output.ID(token.RequestAnchor(tx.ID()))
if output.Owner.Equal(id) || tx.TokenService().SigService().IsMe(ctx, output.Owner) {
isMe, err := tx.TokenService().SigService().IsMe(ctx, output.Owner)
assert.NoError(err, "failed to check ownership of [%s]", output.Owner)
if output.Owner.Equal(id) || isMe {
// check it exists
toks, err := db.GetTokens(ctx, tokenID)
assert.NoError(err, "failed to retrieve token [%s]", tokenID)
Expand Down
46 changes: 28 additions & 18 deletions token/driver/mock/ip.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 6 additions & 2 deletions token/driver/wallet.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,14 @@ type IdentityProvider interface {
RegisterSigner(ctx context.Context, identity Identity, signer Signer, verifier Verifier, signerInfo []byte, ephemeral bool) error

// AreMe checks a list of identities and returns those that have signers registered with this provider.
AreMe(ctx context.Context, identities ...Identity) []string
// A non-nil error means the ownership check could not be completed (for example a storage failure);
// in that case the returned slice must not be treated as an authoritative answer.
AreMe(ctx context.Context, identities ...Identity) ([]string, error)

// IsMe returns true if a signer has been registered for the specified identity.
IsMe(ctx context.Context, party Identity) bool
// A non-nil error means ownership could not be determined and the boolean must be ignored;
// callers must not treat a false-with-error as an authoritative "not mine".
IsMe(ctx context.Context, party Identity) (bool, error)

// GetEnrollmentID extracts the enrollment identifier from the provided audit information for a specific identity.
GetEnrollmentID(ctx context.Context, identity Identity, auditInfo []byte) (string, error)
Expand Down
5 changes: 3 additions & 2 deletions token/services/identity/membership/lm.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ type IdentityStoreService interface {
//
//go:generate counterfeiter -o mock/ip.go -fake-name IdentityProvider . IdentityProvider
type IdentityProvider interface {
IsMe(context.Context, idriver.Identity) bool
IsMe(context.Context, idriver.Identity) (bool, error)
// Bind an ephemeral identity to another identity
Bind(ctx context.Context, longTerm idriver.Identity, ephemeralIdentities ...idriver.Identity) error
// RegisterIdentityDescriptor register the passed identity descriptor with an alias
Expand Down Expand Up @@ -293,7 +293,8 @@ func (l *LocalMembership) Close() {

// IsMe reports whether the given identity belongs to this local membership set.
// It delegates to the configured IdentityProvider to determine membership.
func (l *LocalMembership) IsMe(ctx context.Context, id token.Identity) bool {
// A non-nil error means membership could not be determined (the boolean must be ignored).
func (l *LocalMembership) IsMe(ctx context.Context, id token.Identity) (bool, error) {
return l.IdentityProvider.IsMe(ctx, id)
}

Expand Down
2 changes: 1 addition & 1 deletion token/services/identity/membership/lm_security_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ func TestGetIdentityInfo_NotFoundDoesNotLeakOtherIdentities(t *testing.T) {

ip := &mock.IdentityProvider{}
ip.BindReturns(nil)
ip.IsMeReturns(false)
ip.IsMeReturns(false, nil)

iss := &mock.IdentityStoreService{}
iss.ConfigurationExistsReturns(false, nil)
Expand Down
6 changes: 4 additions & 2 deletions token/services/identity/membership/lm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ import (

func TestNewLocalMembership_IsMe(t *testing.T) {
ip := &mock.IdentityProvider{}
ip.IsMeReturns(true)
ip.IsMeReturns(true, nil)

lm := membership.NewLocalMembership(
logging.MustGetLogger("test"),
Expand All @@ -47,7 +47,9 @@ func TestNewLocalMembership_IsMe(t *testing.T) {
ip,
)

assert.True(t, lm.IsMe(t.Context(), []byte("any")))
isMe, err := lm.IsMe(t.Context(), []byte("any"))
require.NoError(t, err)
assert.True(t, isMe)
assert.Equal(t, token.Identity("netid"), lm.DefaultNetworkIdentity())
}

Expand Down
23 changes: 14 additions & 9 deletions token/services/identity/membership/mock/ip.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading