Skip to content

Commit

Permalink
feat: qr scanned event fix (trustbloc#1843)
Browse files Browse the repository at this point in the history
* fix: bdd test for events

Signed-off-by: Misha Sizov <mykhailo.sizov@securekey.com>

* feat: change the verifier.qr-scanned event

Signed-off-by: Misha Sizov <mykhailo.sizov@securekey.com>

---------

Signed-off-by: Misha Sizov <mykhailo.sizov@securekey.com>
  • Loading branch information
mishasizov-SK authored Feb 3, 2025
1 parent 5836181 commit 4a9fa1a
Show file tree
Hide file tree
Showing 5 changed files with 408 additions and 132 deletions.
2 changes: 1 addition & 1 deletion pkg/restapi/v1/oidc4vp/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ func (c *Controller) PresentAuthorizationResponse(e echo.Context) error {

req, err := http.NewRequestWithContext(ctx,
http.MethodPost,
c.internalHostURL+oidc4VPCheckEndpoint,
c.internalHostURL+oidc4VPCheckEndpoint, // verifier.Controller.CheckAuthorizationResponse()
request.Body,
)
if err != nil {
Expand Down
72 changes: 39 additions & 33 deletions pkg/restapi/v1/verifier/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -569,6 +569,11 @@ func (c *Controller) CheckAuthorizationResponse(e echo.Context) error {
return oidc4vpErr.WithComponent(resterr.VerifierOIDC4vpSvcComponent)
}

c.sendOIDC4VPInteractionEvent(
ctx, oidc4vp.TxID(rawAuthResp.State), spi.VerifierOIDCInteractionQRScanned, func() *oidc4vp.EventPayload {
return &oidc4vp.EventPayload{}
})

if rawAuthResp.Error != "" {
// Error authorization response
// Spec: https://openid.net/specs/openid-4-verifiable-presentations-1_0-ID2.html#section-6.4
Expand All @@ -594,9 +599,7 @@ func (c *Controller) CheckAuthorizationResponse(e echo.Context) error {
if oidc4vpErr != nil {
oidc4vpErr = oidc4vpErr.WithComponent(resterr.VerifierOIDC4vpSvcComponent)

if tenantID, authErr := util.GetTenantIDFromRequest(e); authErr == nil {
c.sendFailedEvent(ctx, rawAuthResp.State, tenantID, "", "", oidc4vpErr)
}
c.sendFailedEvent(ctx, rawAuthResp.State, "", "", "", oidc4vpErr)

return oidc4vpErr
}
Expand Down Expand Up @@ -1160,47 +1163,30 @@ func (c *Controller) accessProfile(profileID, profileVersion, tenantID string) (
return profile, nil
}

func createFailedEventPayload(orgID, profileID, profileVersion string, e error) *oidc4vp.EventPayload {
ep := &oidc4vp.EventPayload{
OrgID: orgID,
ProfileID: profileID,
ProfileVersion: profileVersion,
}

var oidc4vpErr *oidc4vperr.Error

if errors.As(e, &oidc4vpErr) {
ep.Error = oidc4vpErr.Error()
ep.ErrorCode = oidc4vpErr.Code()
ep.ErrorComponent = oidc4vpErr.Component()
} else {
ep.Error = e.Error()
}

return ep
}

func (c *Controller) sendFailedEvent(ctx context.Context, txnID, orgID, profileID, profileVersion string, e error) {
c.sendOIDCInteractionFailedEvent(ctx, oidc4vp.TxID(txnID), func() *oidc4vp.EventPayload {
return createFailedEventPayload(orgID, profileID, profileVersion, e)
})
c.sendOIDC4VPInteractionEvent(ctx, oidc4vp.TxID(txnID), spi.VerifierOIDCInteractionFailed,
func() *oidc4vp.EventPayload {
return createFailedEventPayload(orgID, profileID, profileVersion, e)
})
}

func (c *Controller) sendFailedTxnEvent(ctx context.Context, orgID string, tx *oidc4vp.Transaction, e error) {
c.sendOIDCInteractionFailedEvent(ctx, tx.ID, func() *oidc4vp.EventPayload {
ep := createFailedEventPayload(orgID, tx.ProfileID, tx.ProfileVersion, e)
ep.PresentationDefinitionID = tx.PresentationDefinition.ID
c.sendOIDC4VPInteractionEvent(ctx, tx.ID, spi.VerifierOIDCInteractionFailed,
func() *oidc4vp.EventPayload {
ep := createFailedEventPayload(orgID, tx.ProfileID, tx.ProfileVersion, e)
ep.PresentationDefinitionID = tx.PresentationDefinition.ID

return ep
})
return ep
})
}

func (c *Controller) sendOIDCInteractionFailedEvent(
func (c *Controller) sendOIDC4VPInteractionEvent(
ctx context.Context,
txnID oidc4vp.TxID,
eventType spi.EventType,
createPayload func() *oidc4vp.EventPayload,
) {
evt, err := oidc4vp.CreateEvent(spi.VerifierOIDCInteractionFailed, txnID, createPayload())
evt, err := oidc4vp.CreateEvent(eventType, txnID, createPayload())
if err != nil {
logger.Errorc(ctx, "Error creating failure event", log.WithError(err))

Expand All @@ -1215,6 +1201,26 @@ func (c *Controller) sendOIDCInteractionFailedEvent(
}
}

func createFailedEventPayload(orgID, profileID, profileVersion string, e error) *oidc4vp.EventPayload {
ep := &oidc4vp.EventPayload{
OrgID: orgID,
ProfileID: profileID,
ProfileVersion: profileVersion,
}

var oidc4vpErr *oidc4vperr.Error

if errors.As(e, &oidc4vpErr) {
ep.Error = oidc4vpErr.Error()
ep.ErrorCode = oidc4vpErr.Code()
ep.ErrorComponent = oidc4vpErr.Component()
} else {
ep.Error = e.Error()
}

return ep
}

func findPresentationDefinition(
profile *profileapi.Verifier,
pdExternalID string,
Expand Down
Loading

0 comments on commit 4a9fa1a

Please sign in to comment.