22package owner
33
44import (
5- "github.com/pkg/errors"
5+ "errors"
6+ "fmt"
7+
68 "github.com/s7techlab/cckit/identity"
79 r "github.com/s7techlab/cckit/router"
810)
1618
1719 // ErrOwnerAlreadySetted owner already setted
1820 ErrOwnerAlreadySetted = errors .New (`owner already setted` )
21+
22+ // ErrMSPIdentifierNotEqual occurs when tx creator and cc owner certificate did not match
23+ ErrMSPIdentifierNotEqual = errors .New (`msp identifier not equal` )
1924)
2025
2126func IsSetted (c r.Context ) (bool , error ) {
@@ -49,6 +54,7 @@ func SetFromCreator(c r.Context) (*identity.Entry, error) {
4954 if err != nil {
5055 return nil , err
5156 }
57+
5258 return identityEntry , c .State ().Insert (OwnerStateKey , identityEntry )
5359}
5460
@@ -69,11 +75,11 @@ func SetFromArgs(c r.Context) (*identity.Entry, error) {
6975 return Get (c )
7076}
7177
72- // Insert
78+ // Insert information about owner to chaincode state
7379func Insert (c r.Context , mspID string , cert []byte ) (* identity.Entry , error ) {
7480
7581 if ownerSetted , err := IsSetted (c ); err != nil {
76- return nil , errors . Wrap ( err , `check owner is set` )
82+ return nil , fmt . Errorf ( `check owner is set: %w` , err )
7783 } else if ownerSetted {
7884 return nil , ErrOwnerAlreadySetted
7985 }
@@ -85,15 +91,15 @@ func Insert(c r.Context, mspID string, cert []byte) (*identity.Entry, error) {
8591
8692 identityEntry , err := identity .CreateEntry (id )
8793 if err != nil {
88- return nil , errors . Wrap ( err , `create owner entry` )
94+ return nil , fmt . Errorf ( `create owner entry: %w` , err )
8995 }
9096 return identityEntry , c .State ().Insert (OwnerStateKey , identityEntry )
9197}
9298
9399// IsInvokerOr checks tx creator and compares with owner of another identity
94100func IsInvokerOr (c r.Context , allowedTo ... identity.Identity ) (bool , error ) {
95- if isOwner , err := IsInvoker (c ); isOwner || err ! = nil {
96- return isOwner , err
101+ if err := IsTxCreator (c ); err = = nil {
102+ return true , nil
97103 }
98104 if len (allowedTo ) == 0 {
99105 return false , nil
@@ -111,7 +117,7 @@ func IsInvokerOr(c r.Context, allowedTo ...identity.Identity) (bool, error) {
111117 return false , nil
112118}
113119
114- // IdentityFromState
120+ // IdentityEntryFromState returns identity.Entry with chaincode owner certificate
115121func IdentityEntryFromState (c r.Context ) (identity.Entry , error ) {
116122 res , err := c .State ().Get (OwnerStateKey , & identity.Entry {})
117123 if err != nil {
@@ -121,16 +127,35 @@ func IdentityEntryFromState(c r.Context) (identity.Entry, error) {
121127 return res .(identity.Entry ), nil
122128}
123129
124- // IsInvoker checks than tx creator is chain code owner
125- func IsInvoker ( c r. Context ) ( bool , error ) {
126- invoker , err := identity . FromStub ( c . Stub ())
127- if err != nil {
130+ // Deprecated: IsInvoker checks than tx creator is chain code owner
131+ // use IsTxCreator
132+ func IsInvoker ( ctx r. Context ) ( bool , error ) {
133+ if err := IsTxCreator ( ctx ); err != nil {
128134 return false , err
129135 }
130- ownerEntry , err := IdentityEntryFromState (c )
136+
137+ return true , nil
138+ }
139+
140+ // IsTxCreator returns error if owner identity (msp_id + certificate) did not match tx creator identity
141+ func IsTxCreator (ctx r.Context ) error {
142+ invoker , err := identity .FromStub (ctx .Stub ())
143+ if err != nil {
144+ return err
145+ }
146+
147+ ownerEntry , err := IdentityEntryFromState (ctx )
131148 if err != nil {
132- return false , err
149+ return err
150+ }
151+
152+ if ownerEntry .GetMSPID () != invoker .GetMSPIdentifier () {
153+ return fmt .Errorf (`%s : %w` , ErrMSPIdentifierNotEqual , ErrOwnerOnly )
154+ }
155+
156+ if err = identity .CertEqual (invoker , ownerEntry ); err != nil {
157+ return fmt .Errorf (`%s : %w` , err , ErrOwnerOnly )
133158 }
134159
135- return ownerEntry . MSPId == invoker . MspID && ownerEntry . Subject == invoker . GetSubject (), nil
160+ return nil
136161}
0 commit comments