@@ -17,6 +17,7 @@ import (
1717 "github.com/hyperledger-labs/fabric-token-sdk/token/driver"
1818 idriver "github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/driver"
1919 "github.com/hyperledger-labs/fabric-token-sdk/token/services/logging"
20+ cache2 "github.com/hyperledger-labs/fabric-token-sdk/token/services/utils/cache"
2021 "go.uber.org/zap/zapcore"
2122)
2223
@@ -73,7 +74,6 @@ type Provider struct {
7374
7475 isMeCache cache [bool ]
7576 signers cache [* SignerEntry ]
76- verifiers cache [* VerifierEntry ]
7777}
7878
7979// NewProvider creates a new identity provider implementing the driver.IdentityProvider interface.
@@ -91,9 +91,8 @@ func NewProvider(
9191 enrollmentIDUnmarshaler : enrollmentIDUnmarshaler ,
9292 deserializer : deserializer ,
9393 storage : storage ,
94- isMeCache : secondcache.NewTyped [bool ](5000 ),
95- signers : secondcache.NewTyped [* SignerEntry ](5000 ),
96- verifiers : secondcache.NewTyped [* VerifierEntry ](5000 ),
94+ isMeCache : cache2 .NewNoCache [bool ](),
95+ signers : secondcache.NewTyped [* SignerEntry ](50 ),
9796 }
9897}
9998
@@ -113,20 +112,6 @@ func (p *Provider) RegisterIdentityDescriptor(ctx context.Context, identityDescr
113112 return nil
114113}
115114
116- func (p * Provider ) RegisterVerifier (ctx context.Context , identity driver.Identity , v driver.Verifier ) error {
117- if v == nil {
118- return errors .New ("invalid verifier, expected a valid instance" )
119- }
120- idHash := identity .UniqueID ()
121- entry := & VerifierEntry {Verifier : v }
122- if p .Logger .IsEnabledFor (zapcore .DebugLevel ) {
123- entry .DebugStack = debug .Stack ()
124- }
125- p .verifiers .Add (idHash , entry )
126- p .Logger .DebugfContext (ctx , "register verifier to [%s]:[%s]" , idHash , logging .Identifier (v ))
127- return nil
128- }
129-
130115func (p * Provider ) RegisterAuditInfo (ctx context.Context , identity driver.Identity , info []byte ) error {
131116 return p .storage .StoreIdentityData (ctx , identity , info , nil , nil )
132117}
@@ -261,55 +246,64 @@ func (p *Provider) areMe(ctx context.Context, identities ...driver.Identity) []s
261246}
262247
263248func (p * Provider ) getSigner (ctx context.Context , identity driver.Identity , idHash string ) (driver.Signer , error ) {
264- // check again the cache
265- entry , ok := p .signers .Get (idHash )
266- if ok {
249+ signer , _ , err := p .getSignerAndCache (ctx , identity , idHash , true )
250+ return signer , err
251+ }
252+
253+ func (p * Provider ) getSignerAndCache (ctx context.Context , identity driver.Identity , idHash string , shouldCache bool ) (driver.Signer , bool , error ) {
254+ // check cache
255+ if entry , ok := p .signers .Get (idHash ); ok {
267256 p .Logger .DebugfContext (ctx , "signer for [%s] found" , idHash )
268- return entry .Signer , nil
257+ return entry .Signer , false , nil
269258 }
270259
271- p .Logger .DebugfContext (ctx , "signer for [%s] not found, try to deserialize" , idHash )
272- // ask the deserializer
273- signer , err := p .deserializeSigner (ctx , identity )
274- if err != nil {
275- return nil , errors .Wrapf (err , "failed deserializing identity for signer [%s]" , identity )
276- }
277- entry = & SignerEntry {Signer : signer }
278- if p .Logger .IsEnabledFor (zapcore .DebugLevel ) {
279- entry .DebugStack = debug .Stack ()
280- }
281- p .signers .Add (idHash , entry )
282- if err := p .storage .StoreSignerInfo (ctx , identity , nil ); err != nil {
283- return nil , errors .Wrap (err , "failed to store entry in storage for the passed signer" )
284- }
285- return entry .Signer , nil
286- }
260+ p .Logger .DebugfContext (ctx , "signer for [%s] not found, attempting to deserialize" , idHash )
287261
288- func ( p * Provider ) deserializeSigner ( ctx context. Context , identity driver. Identity ) (driver. Signer , error ) {
262+ // check that we have a deserializer
289263 if p .deserializer == nil {
290- return nil , errors .Errorf ("cannot find signer for [%s], no deserializer set" , identity )
264+ return nil , false , errors .Errorf ("cannot find signer for [%s], no deserializer set" , identity )
291265 }
292- var err error
266+
267+ // try direct deserialization
293268 signer , err := p .deserializer .DeserializeSigner (ctx , identity )
294- if err == nil {
295- return signer , nil
296- }
269+ if err != nil {
270+ // second chance: try a TypedIdentity
271+ typed , err2 := UnmarshalTypedIdentity (identity )
272+ if err2 != nil {
273+ // neither deserializable nor a typed wrapper
274+ return nil , false , errors .Wrapf (
275+ err2 ,
276+ "failed to unmarshal typed identity for [%s] and failed deserialization [%s]" ,
277+ identity .String (), err ,
278+ )
279+ }
297280
298- // give it a second chance
281+ if typed .Type == "x509" {
282+ shouldCache = false
283+ }
299284
300- // is the identity wrapped in TypedIdentity?
301- ro , err2 := UnmarshalTypedIdentity ( identity )
302- if err2 != nil {
303- // No
304- return nil , errors . Wrapf ( err2 , "failed to unmarshal raw owner for identity [%s] and failed deserialization [%s]" , identity . String (), err )
285+ // recursively resolve the inner identity
286+ signer , shouldCache , err = p . getSignerAndCache ( ctx , typed . Identity , typed . Identity . UniqueID (), shouldCache )
287+ if err != nil {
288+ return nil , false , errors . Wrapf ( err , "failed getting signer for identity [%s]" , typed . Identity )
289+ }
305290 }
306291
307- // yes, check ro.Identity
308- signer , err = p .getSigner (ctx , ro .Identity , ro .Identity .UniqueID ())
309- if err != nil {
310- return nil , errors .Wrapf (err , "failed getting signer for identity [%s]" , ro .Identity )
292+ // Cache the signer for the current idHash
293+ if shouldCache {
294+ entry := & SignerEntry {Signer : signer }
295+ if p .Logger .IsEnabledFor (zapcore .DebugLevel ) {
296+ entry .DebugStack = debug .Stack ()
297+ }
298+ p .signers .Add (idHash , entry )
311299 }
312- return signer , nil
300+
301+ // Persist signer info for the current identity
302+ if err := p .storage .StoreSignerInfo (ctx , identity , nil ); err != nil {
303+ return nil , false , errors .Wrap (err , "failed to store entry in storage for the passed signer" )
304+ }
305+
306+ return signer , shouldCache , nil
313307}
314308
315309func (p * Provider ) updateCaches (descriptor * idriver.IdentityDescriptor , alias driver.Identity ) {
@@ -331,15 +325,4 @@ func (p *Provider) updateCaches(descriptor *idriver.IdentityDescriptor, alias dr
331325 p .signers .Add (aliasID , entry )
332326 }
333327 }
334- // verifiers
335- if descriptor .Verifier != nil {
336- entry := & VerifierEntry {Verifier : descriptor .Verifier }
337- if p .Logger .IsEnabledFor (zapcore .DebugLevel ) {
338- entry .DebugStack = debug .Stack ()
339- }
340- p .verifiers .Add (id , entry )
341- if setAlias {
342- p .verifiers .Add (aliasID , entry )
343- }
344- }
345328}
0 commit comments