Skip to content

Commit 5faac8c

Browse files
author
Firas Qutishat
authored
Merge pull request #1694 from skynet2/compose-improvements
feat: compose issuer
2 parents 47bbef6 + 808efa3 commit 5faac8c

File tree

2 files changed

+87
-2
lines changed

2 files changed

+87
-2
lines changed

pkg/service/oidc4ci/composer.go

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"text/template"
1313

1414
"github.com/google/uuid"
15+
util "github.com/trustbloc/did-go/doc/util/time"
1516
"github.com/trustbloc/vc-go/verifiable"
1617
)
1718

@@ -34,7 +35,10 @@ func (c *CredentialComposer) Compose(
3435
}
3536

3637
if idTemplate := txCredentialConfiguration.CredentialComposeConfiguration.IDTemplate; idTemplate != "" {
37-
id, err := c.renderRaw(idTemplate, c.baseParams(tx))
38+
params := c.baseParams(tx)
39+
params["CredentialID"] = credential.Contents().ID
40+
41+
id, err := c.renderRaw(idTemplate, params)
3842
if err != nil {
3943
return nil, err
4044
}
@@ -43,7 +47,14 @@ func (c *CredentialComposer) Compose(
4347
}
4448

4549
if txCredentialConfiguration.CredentialComposeConfiguration.OverrideIssuer {
46-
credential = credential.WithModifiedIssuer(&verifiable.Issuer{ID: tx.DID})
50+
issuer := credential.Contents().Issuer
51+
if issuer == nil {
52+
issuer = &verifiable.Issuer{}
53+
}
54+
55+
issuer.ID = tx.DID
56+
57+
credential = credential.WithModifiedIssuer(issuer)
4758
}
4859

4960
if txCredentialConfiguration.CredentialComposeConfiguration.OverrideSubjectDID {
@@ -57,6 +68,10 @@ func (c *CredentialComposer) Compose(
5768
credential = credential.WithModifiedSubject(newSubjects)
5869
}
5970

71+
if credential.Contents().Expired == nil && txCredentialConfiguration.CredentialExpiresAt != nil {
72+
credential.SetCustomField("expirationDate", util.NewTime(*txCredentialConfiguration.CredentialExpiresAt))
73+
}
74+
6075
return credential, nil
6176
}
6277

pkg/service/oidc4ci/composer_test.go

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@ package oidc4ci_test
33
import (
44
"context"
55
"testing"
6+
"time"
67

8+
"github.com/samber/lo"
79
"github.com/stretchr/testify/assert"
10+
util "github.com/trustbloc/did-go/doc/util/time"
811
"github.com/trustbloc/vc-go/verifiable"
912

1013
"github.com/trustbloc/vcs/pkg/service/oidc4ci"
@@ -15,10 +18,16 @@ func TestComposer(t *testing.T) {
1518
srv := oidc4ci.NewCredentialComposer()
1619

1720
cred, err := verifiable.CreateCredential(verifiable.CredentialContents{
21+
Types: []string{"VerifiableCredential"},
22+
Context: []string{
23+
"https://www.w3.org/2018/credentials/v1",
24+
},
1825
Subject: []verifiable.Subject{{ID: "xxx:yyy"}},
1926
}, verifiable.CustomFields{})
2027
assert.NoError(t, err)
2128

29+
expectedExpiration := time.Now().UTC()
30+
2231
resp, err := srv.Compose(
2332
context.TODO(),
2433
cred,
@@ -34,6 +43,7 @@ func TestComposer(t *testing.T) {
3443
OverrideIssuer: true,
3544
OverrideSubjectDID: true,
3645
},
46+
CredentialExpiresAt: &expectedExpiration,
3747
},
3848
&oidc4ci.PrepareCredentialRequest{
3949
DID: "some-awesome-did",
@@ -43,9 +53,69 @@ func TestComposer(t *testing.T) {
4353
assert.NoError(t, err)
4454
assert.NotNil(t, resp)
4555

56+
credJSON, err := resp.MarshalAsJSONLD()
57+
assert.NoError(t, err)
58+
59+
parsedCred, err := verifiable.ParseCredential(credJSON,
60+
verifiable.WithCredDisableValidation(),
61+
verifiable.WithDisabledProofCheck(),
62+
)
63+
assert.NoError(t, err)
64+
4665
assert.EqualValues(t, "hardcoded:some-awesome-id:suffix", resp.Contents().ID)
4766
assert.EqualValues(t, "did:example:123", resp.Contents().Issuer.ID)
4867
assert.EqualValues(t, "some-awesome-did", resp.Contents().Subject[0].ID)
68+
assert.EqualValues(t, expectedExpiration, parsedCred.Contents().Expired.Time)
69+
})
70+
71+
t.Run("success with prev-id", func(t *testing.T) {
72+
srv := oidc4ci.NewCredentialComposer()
73+
74+
cred, err := verifiable.CreateCredential(verifiable.CredentialContents{
75+
ID: "some-id",
76+
Expired: util.NewTime(time.Now()),
77+
Issuer: &verifiable.Issuer{
78+
ID: "did:example:123",
79+
CustomFields: map[string]interface{}{
80+
"key": "value",
81+
"name": "issuer",
82+
},
83+
},
84+
Subject: []verifiable.Subject{{ID: "xxx:yyy"}},
85+
}, verifiable.CustomFields{})
86+
assert.NoError(t, err)
87+
88+
resp, err := srv.Compose(
89+
context.TODO(),
90+
cred,
91+
&oidc4ci.Transaction{
92+
ID: "some-awesome-id",
93+
TransactionData: oidc4ci.TransactionData{
94+
DID: "did:example:123",
95+
},
96+
},
97+
&oidc4ci.TxCredentialConfiguration{
98+
CredentialComposeConfiguration: &oidc4ci.CredentialComposeConfiguration{
99+
IDTemplate: "{{.CredentialID}}:suffix",
100+
OverrideIssuer: true,
101+
OverrideSubjectDID: true,
102+
},
103+
CredentialExpiresAt: lo.ToPtr(time.Now()),
104+
},
105+
&oidc4ci.PrepareCredentialRequest{
106+
DID: "some-awesome-did",
107+
},
108+
)
109+
110+
assert.NoError(t, err)
111+
assert.NotNil(t, resp)
112+
113+
assert.EqualValues(t, "some-id:suffix", resp.Contents().ID)
114+
assert.EqualValues(t, "did:example:123", resp.Contents().Issuer.ID)
115+
assert.EqualValues(t, "value", resp.Contents().Issuer.CustomFields["key"])
116+
assert.EqualValues(t, "issuer", resp.Contents().Issuer.CustomFields["name"])
117+
118+
assert.EqualValues(t, "some-awesome-did", resp.Contents().Subject[0].ID)
49119
})
50120

51121
t.Run("invalid template", func(t *testing.T) {

0 commit comments

Comments
 (0)