Skip to content

Commit 88b6d35

Browse files
YanYuanFEadecaro
authored andcommitted
fix(token): preserve auditor signatures in Request.AppendSignatures
Since LFDT-Panurus#1717 action and auditor signatures share the unified Actions.Signatures slice, but SetSignatures still assigned the whole field, silently dropping auditor signatures attached beforehand via AddAuditorSignature. Endorsement then fails with 'auditor signatures missing' when auditing runs before endorsement collection. Append the action signatures to the ones already attached, restoring the pre-LFDT-Panurus#1717 order-independence of the two calls, and rename SetSignatures to AppendSignatures so the name states that contract. Fixes LFDT-Panurus#1897 Signed-off-by: YanYuan <yan950414@gmail.com>
1 parent 6ef9ce5 commit 88b6d35

3 files changed

Lines changed: 66 additions & 12 deletions

File tree

token/request.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1168,9 +1168,11 @@ func (r *Request) AddAuditorSignature(identity Identity, sigma []byte) {
11681168
})
11691169
}
11701170

1171-
// SetSignatures assigns signatures to all signers. Returns true if all signatures are present.
1172-
// This method now correctly preserves the action context by using SignerWithAction information.
1173-
func (r *Request) SetSignatures(sigmas map[string][]byte) bool {
1171+
// AppendSignatures appends the action signatures for all issue and transfer
1172+
// signers from sigmas, keyed by signer unique ID. Signatures already attached
1173+
// to the request, e.g. via AddAuditorSignature, are left in place. Returns
1174+
// true if every signer has a signature in sigmas.
1175+
func (r *Request) AppendSignatures(sigmas map[string][]byte) bool {
11741176
issueSignersWithActions := r.IssueSignersWithActions()
11751177
transferSignersWithActions := r.TransferSignersWithActions()
11761178

@@ -1198,7 +1200,7 @@ func (r *Request) SetSignatures(sigmas map[string][]byte) bool {
11981200
signatures = append(signatures, signature)
11991201
}
12001202

1201-
r.Actions.Signatures = signatures
1203+
r.Actions.Signatures = append(r.Actions.Signatures, signatures...)
12021204

12031205
return all
12041206
}

token/request_test.go

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -890,8 +890,8 @@ func TestRequest_IssueSigners(t *testing.T) {
890890
assert.Equal(t, Identity("issuer2"), signers[3])
891891
}
892892

893-
// TestRequest_SetSignatures tests SetSignatures method
894-
func TestRequest_SetSignatures(t *testing.T) {
893+
// TestRequest_AppendSignatures tests AppendSignatures method
894+
func TestRequest_AppendSignatures(t *testing.T) {
895895
r := &Request{
896896
Actions: &driver.TokenRequest{
897897
Actions: []*driver.TypedAction{
@@ -941,7 +941,7 @@ func TestRequest_SetSignatures(t *testing.T) {
941941
Identity("sender1").UniqueID(): []byte("sig2"),
942942
}
943943

944-
allPresent := r.SetSignatures(sigmas)
944+
allPresent := r.AppendSignatures(sigmas)
945945
assert.True(t, allPresent)
946946
require.Len(t, r.Actions.Signatures, 2)
947947
require.NotNil(t, r.Actions.Signatures[0].Action)
@@ -957,7 +957,7 @@ func TestRequest_SetSignatures(t *testing.T) {
957957
Identity("issuer1").UniqueID(): []byte("sig1"),
958958
}
959959

960-
allPresent = r.SetSignatures(sigmas)
960+
allPresent = r.AppendSignatures(sigmas)
961961
assert.False(t, allPresent)
962962
require.Len(t, r.Actions.Signatures, 2)
963963
require.NotNil(t, r.Actions.Signatures[0].Action)
@@ -966,6 +966,58 @@ func TestRequest_SetSignatures(t *testing.T) {
966966
assert.Nil(t, r.Actions.Signatures[1].Action.Signature)
967967
}
968968

969+
// TestRequest_AppendSignatures_PreservesAuditorSignatures tests that AppendSignatures
970+
// keeps auditor signatures attached before it is called
971+
func TestRequest_AppendSignatures_PreservesAuditorSignatures(t *testing.T) {
972+
r := &Request{
973+
Actions: &driver.TokenRequest{
974+
Actions: []*driver.TypedAction{
975+
{Type: request.ActionType_ACTION_TYPE_ISSUE, Raw: []byte("issue1")},
976+
},
977+
},
978+
Metadata: &driver.TokenRequestMetadata{
979+
Actions: []*driver.ActionMetadataEntry{
980+
{
981+
ActionID: 0,
982+
IssueMetadata: &driver.IssueMetadata{
983+
Issuer: driver.AuditableIdentity{
984+
Identity: Identity("issuer1"),
985+
},
986+
},
987+
},
988+
},
989+
},
990+
TokenService: &ManagementService{
991+
logger: logging.MustGetLogger(),
992+
},
993+
}
994+
995+
r.AddAuditorSignature(Identity("auditor1"), []byte("auditor-sig"))
996+
997+
allPresent := r.AppendSignatures(map[string][]byte{
998+
Identity("issuer1").UniqueID(): []byte("sig1"),
999+
})
1000+
assert.True(t, allPresent)
1001+
require.Len(t, r.Actions.Signatures, 2)
1002+
require.NotNil(t, r.Actions.Signatures[0].Auditor)
1003+
assert.Equal(t, Identity("auditor1"), r.Actions.Signatures[0].Auditor.Identity)
1004+
assert.Equal(t, []byte("auditor-sig"), r.Actions.Signatures[0].Auditor.Signature)
1005+
require.NotNil(t, r.Actions.Signatures[1].Action)
1006+
assert.Equal(t, []byte("sig1"), r.Actions.Signatures[1].Action.Signature)
1007+
1008+
// calling AppendSignatures again appends another action signature and
1009+
// leaves the auditor signature in place
1010+
allPresent = r.AppendSignatures(map[string][]byte{
1011+
Identity("issuer1").UniqueID(): []byte("sig2"),
1012+
})
1013+
assert.True(t, allPresent)
1014+
require.Len(t, r.Actions.Signatures, 3)
1015+
require.NotNil(t, r.Actions.Signatures[0].Auditor)
1016+
assert.Equal(t, Identity("auditor1"), r.Actions.Signatures[0].Auditor.Identity)
1017+
require.NotNil(t, r.Actions.Signatures[2].Action)
1018+
assert.Equal(t, []byte("sig2"), r.Actions.Signatures[2].Action.Signature)
1019+
}
1020+
9691021
// TestRequest_cleanupInputIDs tests the cleanupInputIDs utility function
9701022
func TestRequest_cleanupInputIDs(t *testing.T) {
9711023
r := &Request{}

token/services/ttx/collectendorsements.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,8 @@ func (c *CollectEndorsementsView) Call(context view.Context) (any, error) {
118118

119119
// Add the signatures to the token request
120120
logger.DebugfContext(context.Context(), "Add the signatures to the token request")
121-
if !c.tx.TokenRequest.SetSignatures(mergeSigmas(issueSigmas, transferSigmas)) {
122-
return nil, errors.New("failed setting signatures on token request, some signatures are missing")
121+
if !c.tx.TokenRequest.AppendSignatures(mergeSigmas(issueSigmas, transferSigmas)) {
122+
return nil, errors.New("failed appending signatures to token request, some signatures are missing")
123123
}
124124

125125
// 2. Audit
@@ -165,7 +165,7 @@ func (c *CollectEndorsementsView) Call(context view.Context) (any, error) {
165165
func (c *CollectEndorsementsView) requestSignaturesOnIssues(context view.Context, externalWallets map[string]ExternalWalletSigner) (map[string][]byte, error) {
166166
logger.DebugfContext(context.Context(), "collecting signature on [%d] request issue", c.tx.TokenRequest.Metadata.NumIssues())
167167

168-
// Use IssueSigners() - the action context is preserved in metadata and used by SetSignatures()
168+
// Use IssueSigners() - the action context is preserved in metadata and used by AppendSignatures()
169169
return c.requestSignatures(
170170
c.tx.TokenRequest.IssueSigners(),
171171
c.tx.TokenService().SigService().IssuerVerifier,
@@ -179,7 +179,7 @@ func (c *CollectEndorsementsView) requestSignaturesOnIssues(context view.Context
179179
func (c *CollectEndorsementsView) requestSignaturesOnTransfers(context view.Context, externalWallets map[string]ExternalWalletSigner) (map[string][]byte, error) {
180180
logger.DebugfContext(context.Context(), "collecting signature on [%d] request transfer", c.tx.TokenRequest.Metadata.NumTransfers())
181181

182-
// Use TransferSigners() - the action context is preserved in metadata and used by SetSignatures()
182+
// Use TransferSigners() - the action context is preserved in metadata and used by AppendSignatures()
183183
return c.requestSignatures(
184184
c.tx.TokenRequest.TransferSigners(),
185185
c.tx.TokenService().SigService().OwnerVerifier,

0 commit comments

Comments
 (0)