Skip to content

Commit d4c67f2

Browse files
authored
move authorization to the driver space (#666)
Signed-off-by: Angelo De Caro <[email protected]>
1 parent a2a7f2c commit d4c67f2

File tree

18 files changed

+268
-249
lines changed

18 files changed

+268
-249
lines changed

token/authorization.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/*
2+
Copyright IBM Corp. All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package token
8+
9+
import "github.com/hyperledger-labs/fabric-token-sdk/token/driver"
10+
11+
// Authorization defines method to check the relation between a token
12+
// and wallets (owner, auditor, etc.)
13+
type Authorization struct {
14+
driver.Authorization
15+
}

token/core/common/authrorization.go

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
/*
2+
Copyright IBM Corp. All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package common
8+
9+
import (
10+
"github.com/hyperledger-labs/fabric-token-sdk/token"
11+
"github.com/hyperledger-labs/fabric-token-sdk/token/driver"
12+
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity"
13+
token2 "github.com/hyperledger-labs/fabric-token-sdk/token/token"
14+
)
15+
16+
type Authorization interface {
17+
// IsMine returns true if the passed token is owned by an owner wallet in the passed TMS
18+
IsMine(tok *token2.Token) ([]string, bool)
19+
// AmIAnAuditor return true if the passed TMS contains an auditor wallet for any of the auditor identities
20+
// defined in the public parameters of the passed TMS.
21+
AmIAnAuditor() bool
22+
// Issued returns true if the passed issuer issued the passed token
23+
Issued(issuer token.Identity, tok *token2.Token) bool
24+
}
25+
26+
// WalletBasedAuthorization is a wallet-based authorization implementation
27+
type WalletBasedAuthorization struct {
28+
PublicParameters driver.PublicParameters
29+
WalletService driver.WalletService
30+
amIAnAuditor bool
31+
}
32+
33+
func NewTMSAuthorization(publicParameters driver.PublicParameters, walletService driver.WalletService) *WalletBasedAuthorization {
34+
amIAnAuditor := false
35+
for _, identity := range publicParameters.Auditors() {
36+
if _, err := walletService.AuditorWallet(identity); err == nil {
37+
amIAnAuditor = true
38+
break
39+
}
40+
}
41+
return &WalletBasedAuthorization{PublicParameters: publicParameters, WalletService: walletService, amIAnAuditor: amIAnAuditor}
42+
}
43+
44+
// IsMine returns true if the passed token is owned by an owner wallet in the passed TMS
45+
func (w *WalletBasedAuthorization) IsMine(tok *token2.Token) ([]string, bool) {
46+
wallet, err := w.WalletService.OwnerWallet(tok.Owner.Raw)
47+
if err != nil {
48+
return nil, false
49+
}
50+
return []string{wallet.ID()}, true
51+
}
52+
53+
// AmIAnAuditor return true if the passed TMS contains an auditor wallet for any of the auditor identities
54+
// defined in the public parameters of the passed TMS.
55+
func (w *WalletBasedAuthorization) AmIAnAuditor() bool {
56+
return w.amIAnAuditor
57+
}
58+
59+
func (w *WalletBasedAuthorization) Issued(issuer token.Identity, tok *token2.Token) bool {
60+
_, err := w.WalletService.IssuerWallet(issuer)
61+
return err == nil
62+
}
63+
64+
// AuthorizationMultiplexer iterates over multiple authorization checker
65+
type AuthorizationMultiplexer struct {
66+
authorizations []Authorization
67+
}
68+
69+
// NewAuthorizationMultiplexer returns a new AuthorizationMultiplexer for the passed ownership checkers
70+
func NewAuthorizationMultiplexer(ownerships ...Authorization) *AuthorizationMultiplexer {
71+
return &AuthorizationMultiplexer{authorizations: ownerships}
72+
}
73+
74+
// IsMine returns true it there exists an authorization checker that returns true
75+
func (o *AuthorizationMultiplexer) IsMine(tok *token2.Token) ([]string, bool) {
76+
for _, authorization := range o.authorizations {
77+
ids, mine := authorization.IsMine(tok)
78+
if mine {
79+
return ids, true
80+
}
81+
}
82+
return nil, false
83+
}
84+
85+
// AmIAnAuditor returns true it there exists an authorization checker that returns true
86+
func (o *AuthorizationMultiplexer) AmIAnAuditor() bool {
87+
for _, authorization := range o.authorizations {
88+
yes := authorization.AmIAnAuditor()
89+
if yes {
90+
return true
91+
}
92+
}
93+
return false
94+
}
95+
96+
func (o *AuthorizationMultiplexer) Issued(issuer token.Identity, tok *token2.Token) bool {
97+
for _, authorization := range o.authorizations {
98+
yes := authorization.Issued(issuer, tok)
99+
if yes {
100+
return true
101+
}
102+
}
103+
return false
104+
}
105+
106+
// OwnerType returns the type of owner (e.g. 'idemix' or 'htlc') and the identity bytes
107+
func (o *AuthorizationMultiplexer) OwnerType(raw []byte) (string, []byte, error) {
108+
owner, err := identity.UnmarshalTypedIdentity(raw)
109+
if err != nil {
110+
return "", nil, err
111+
}
112+
return owner.Type, owner.Identity, nil
113+
}

token/core/common/tms.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ type Service[T driver.PublicParameters] struct {
3030
transferService driver.TransferService
3131
auditorService driver.AuditorService
3232
tokensService driver.TokensService
33+
authorization driver.Authorization
3334
}
3435

3536
func NewTokenService[T driver.PublicParameters](
@@ -45,6 +46,7 @@ func NewTokenService[T driver.PublicParameters](
4546
transferService driver.TransferService,
4647
auditorService driver.AuditorService,
4748
tokensService driver.TokensService,
49+
authorization driver.Authorization,
4850
) (*Service[T], error) {
4951
s := &Service[T]{
5052
Logger: logger,
@@ -59,6 +61,7 @@ func NewTokenService[T driver.PublicParameters](
5961
transferService: transferService,
6062
auditorService: auditorService,
6163
tokensService: tokensService,
64+
authorization: authorization,
6265
}
6366
return s, nil
6467
}
@@ -119,6 +122,10 @@ func (s *Service[T]) TokensService() driver.TokensService {
119122
return s.tokensService
120123
}
121124

125+
func (s *Service[T]) Authorization() driver.Authorization {
126+
return s.authorization
127+
}
128+
122129
// Done releases all the resources allocated by this service
123130
func (s *Service[T]) Done() error {
124131
return nil

token/core/fabtoken/driver/driver.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"github.com/hyperledger-labs/fabric-token-sdk/token/driver"
1919
"github.com/hyperledger-labs/fabric-token-sdk/token/services/config"
2020
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity"
21+
"github.com/hyperledger-labs/fabric-token-sdk/token/services/interop/htlc"
2122
"github.com/hyperledger-labs/fabric-token-sdk/token/services/network"
2223
"github.com/pkg/errors"
2324
"go.opentelemetry.io/otel/trace"
@@ -102,7 +103,10 @@ func (d *Driver) NewTokenService(_ driver.ServiceProvider, networkID string, cha
102103

103104
metricsProvider := metrics.NewTMSProvider(tmsConfig.ID(), d.metricsProvider)
104105
tracerProvider := tracing2.NewTracerProviderWithBackingProvider(d.tracerProvider, metricsProvider)
105-
106+
authorization := common.NewAuthorizationMultiplexer(
107+
common.NewTMSAuthorization(publicParamsManager.PublicParams(), ws),
108+
htlc.NewScriptAuth(ws),
109+
)
106110
service, err := fabtoken.NewService(
107111
logger,
108112
ws,
@@ -124,6 +128,7 @@ func (d *Driver) NewTokenService(_ driver.ServiceProvider, networkID string, cha
124128
observables.NewAudit(tracerProvider),
125129
),
126130
fabtoken.NewTokensService(),
131+
authorization,
127132
)
128133
if err != nil {
129134
return nil, errors.WithMessage(err, "failed to create token service")

token/core/fabtoken/service.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ func NewService(
3333
transferService driver.TransferService,
3434
auditorService driver.AuditorService,
3535
tokensService driver.TokensService,
36+
authorization driver.Authorization,
3637
) (*Service, error) {
3738
root, err := common.NewTokenService[*PublicParams](
3839
logger,
@@ -47,6 +48,7 @@ func NewService(
4748
transferService,
4849
auditorService,
4950
tokensService,
51+
authorization,
5052
)
5153
if err != nil {
5254
return nil, err

token/core/zkatdlog/nogh/driver/driver.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"github.com/hyperledger-labs/fabric-token-sdk/token/driver"
2121
"github.com/hyperledger-labs/fabric-token-sdk/token/services/config"
2222
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity"
23+
"github.com/hyperledger-labs/fabric-token-sdk/token/services/interop/htlc"
2324
"github.com/hyperledger-labs/fabric-token-sdk/token/services/network"
2425
"github.com/pkg/errors"
2526
"go.opentelemetry.io/otel/trace"
@@ -102,6 +103,10 @@ func (d *Driver) NewTokenService(_ driver.ServiceProvider, networkID string, cha
102103
ip := ws.IdentityProvider
103104

104105
tokDeserializer := &TokenDeserializer{}
106+
authorization := common.NewAuthorizationMultiplexer(
107+
common.NewTMSAuthorization(ppm.PublicParams(), ws),
108+
htlc.NewScriptAuth(ws),
109+
)
105110

106111
metricsProvider := metrics.NewTMSProvider(tmsConfig.ID(), d.metricsProvider)
107112
tracerProvider := tracing2.NewTracerProviderWithBackingProvider(d.tracerProvider, metricsProvider)
@@ -141,6 +146,7 @@ func (d *Driver) NewTokenService(_ driver.ServiceProvider, networkID string, cha
141146
observables.NewAudit(tracerProvider),
142147
),
143148
zkatdlog.NewTokensService(ppm),
149+
authorization,
144150
)
145151
if err != nil {
146152
return nil, errors.WithMessage(err, "failed to create token service")

token/core/zkatdlog/nogh/service.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ func NewTokenService(
4444
transferService driver.TransferService,
4545
auditorService driver.AuditorService,
4646
tokensService driver.TokensService,
47+
authorization driver.Authorization,
4748
) (*Service, error) {
4849
root, err := common.NewTokenService[*crypto.PublicParams](
4950
logger,
@@ -58,6 +59,7 @@ func NewTokenService(
5859
transferService,
5960
auditorService,
6061
tokensService,
62+
authorization,
6163
)
6264
if err != nil {
6365
return nil, err

token/driver/tms.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ type TokenManagerService interface {
4242
PublicParamsManager() PublicParamsManager
4343
Configuration() Configuration
4444
WalletService() WalletService
45+
Authorization() Authorization
4546
// Done releases all the resources allocated by this service
4647
Done() error
4748
}

token/driver/wallet.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,20 @@ type IdentityConfiguration struct {
129129
// Ultimately, it is the token driver to decide which types are allowed.
130130
type WalletLookupID = any
131131

132+
// Authorization defines method to check the relation between a token
133+
// and wallets (owner, auditor, etc.)
134+
type Authorization interface {
135+
// IsMine returns true if the passed token is owned by an owner wallet in the passed TMS
136+
IsMine(tok *token.Token) ([]string, bool)
137+
// AmIAnAuditor return true if the passed TMS contains an auditor wallet for any of the auditor identities
138+
// defined in the public parameters of the passed TMS.
139+
AmIAnAuditor() bool
140+
// Issued returns true if the passed issuer issued the passed token
141+
Issued(issuer Identity, tok *token.Token) bool
142+
// OwnerType returns the type of owner (e.g. 'idemix' or 'htlc') and the identity bytes
143+
OwnerType(raw []byte) (string, []byte, error)
144+
}
145+
132146
//go:generate counterfeiter -o mock/ws.go -fake-name WalletService . WalletService
133147

134148
// WalletService models the wallet service that handles issuer, recipient, auditor and certifier wallets

token/sdk/dig/sdk.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import (
3030
"github.com/hyperledger-labs/fabric-token-sdk/token/sdk/identity"
3131
network2 "github.com/hyperledger-labs/fabric-token-sdk/token/sdk/network"
3232
"github.com/hyperledger-labs/fabric-token-sdk/token/sdk/tms"
33-
tokens2 "github.com/hyperledger-labs/fabric-token-sdk/token/sdk/tokens"
3433
"github.com/hyperledger-labs/fabric-token-sdk/token/sdk/vault"
3534
"github.com/hyperledger-labs/fabric-token-sdk/token/services/auditdb"
3635
"github.com/hyperledger-labs/fabric-token-sdk/token/services/auditor"
@@ -39,7 +38,6 @@ import (
3938
identity2 "github.com/hyperledger-labs/fabric-token-sdk/token/services/identity"
4039
kvs2 "github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/kvs"
4140
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identitydb"
42-
"github.com/hyperledger-labs/fabric-token-sdk/token/services/interop/htlc"
4341
logging2 "github.com/hyperledger-labs/fabric-token-sdk/token/services/logging"
4442
"github.com/hyperledger-labs/fabric-token-sdk/token/services/network"
4543
"github.com/hyperledger-labs/fabric-token-sdk/token/services/network/common"
@@ -126,10 +124,6 @@ func (p *SDK) Install() error {
126124
p.Container().Provide(digutils.Identity[*identity.DBStorageProvider](), dig.As(new(identity2.StorageProvider))),
127125
p.Container().Provide(auditor.NewManager),
128126
p.Container().Provide(ttx.NewManager),
129-
p.Container().Provide(func() *tokens2.AuthorizationMultiplexer {
130-
return tokens2.NewAuthorizationMultiplexer(&tokens2.TMSAuthorization{}, &htlc.ScriptOwnership{})
131-
}, dig.As(new(tokens.Authorization))),
132-
p.Container().Provide(func() *tokens2.IssuedMultiplexer { return tokens2.NewIssuedMultiplexer(&tokens2.WalletIssued{}) }, dig.As(new(tokens.Issued))),
133127
p.Container().Provide(tokens.NewManager),
134128
p.Container().Provide(digutils.Identity[*tokens.Manager](), dig.As(new(ttx.TokensProvider), new(auditor.TokenDBProvider))),
135129
p.Container().Provide(vault.NewVaultProvider),

token/sdk/tokens/authrorization.go

Lines changed: 0 additions & 87 deletions
This file was deleted.

0 commit comments

Comments
 (0)