-
Notifications
You must be signed in to change notification settings - Fork 22
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #781 from bstasyszyn/766
feat: Return alternate links in WebFinger for DID and CAS
- Loading branch information
Showing
21 changed files
with
1,303 additions
and
193 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
/* | ||
Copyright SecureKey Technologies Inc. All Rights Reserved. | ||
SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
package acknowlegement | ||
|
||
import ( | ||
"fmt" | ||
"net/url" | ||
|
||
"github.com/trustbloc/edge-core/pkg/log" | ||
|
||
"github.com/trustbloc/orb/pkg/hashlink" | ||
) | ||
|
||
var logger = log.New("anchor-acknowledgement-handler") | ||
|
||
type anchorLinkStore interface { | ||
PutLinks(links []*url.URL) error | ||
} | ||
|
||
// Handler handles notifications of successful anchor events processed from an Orb server. | ||
type Handler struct { | ||
anchorLinkStore anchorLinkStore | ||
} | ||
|
||
// New returns a new handler. | ||
func New(store anchorLinkStore) *Handler { | ||
return &Handler{anchorLinkStore: store} | ||
} | ||
|
||
// AnchorEventAcknowledged handles a notification of a successful anchor event processed from an Orb server. | ||
// The given additional references are added to the anchor link store so that they are available for | ||
// WebFinger requests. | ||
func (p *Handler) AnchorEventAcknowledged(actor, anchorRef *url.URL, additionalAnchorRefs []*url.URL) error { | ||
logger.Infof("Anchor event was acknowledged by [%s] for anchor %s. Additional anchors: %s", | ||
actor, hashlink.ToString(anchorRef), hashlink.ToString(additionalAnchorRefs...)) | ||
|
||
parser := hashlink.New() | ||
|
||
info, err := parser.ParseHashLink(anchorRef.String()) | ||
if err != nil { | ||
return fmt.Errorf("parse hashlink [%s]: %w", anchorRef, err) | ||
} | ||
|
||
var links []*url.URL | ||
|
||
for _, hl := range additionalAnchorRefs { | ||
hlInfo, err := parser.ParseHashLink(hl.String()) | ||
if err != nil { | ||
logger.Warnf("Error parsing hashlink [%s]: %s", anchorRef, err) | ||
|
||
continue | ||
} | ||
|
||
if hlInfo.ResourceHash != info.ResourceHash { | ||
logger.Warnf("Hash in additional anchor ref [%s] does not match the hash of the acknowledged anchor event [%s]", | ||
hlInfo.ResourceHash, info.ResourceHash) | ||
|
||
continue | ||
} | ||
|
||
links = append(links, hl) | ||
} | ||
|
||
if err := p.anchorLinkStore.PutLinks(links); err != nil { | ||
return fmt.Errorf("put links [%s]: %w", info.ResourceHash, err) | ||
} | ||
|
||
return nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
/* | ||
Copyright SecureKey Technologies Inc. All Rights Reserved. | ||
SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
package acknowlegement | ||
|
||
import ( | ||
"errors" | ||
"net/url" | ||
"testing" | ||
|
||
"github.com/stretchr/testify/require" | ||
|
||
"github.com/trustbloc/orb/pkg/internal/testutil" | ||
"github.com/trustbloc/orb/pkg/mocks" | ||
) | ||
|
||
func TestHandler(t *testing.T) { | ||
actor := testutil.MustParseURL("https://domain1.com") | ||
anchorRef := testutil.MustParseURL("hl:uEiALYp_C4wk2WegpfnCSoSTBdKZ1MVdDadn4rdmZl5GKzQ:uoQ-BeDVpcGZzOi8vUW1jcTZKV0RVa3l4ZWhxN1JWWmtQM052aUU0SHFSdW5SalgzOXZ1THZFSGFRTg") //nolint:lll | ||
|
||
additionalRefs := []*url.URL{ | ||
// Valid hashlink. | ||
testutil.MustParseURL("hl:uEiALYp_C4wk2WegpfnCSoSTBdKZ1MVdDadn4rdmZl5GKzQ:uoQ-BeEtodHRwczovL29yYi5kb21haW4yLmNvbS9jYXMvdUVpQlVRRFJJNXR0SXpYYmUxTFpLVWFaV2I2eUZzbk1ucmdEa3NBdFEtd0NhS3c"), //nolint:lll | ||
// Hash in hashlink doesn't match anchor hash. | ||
testutil.MustParseURL("hl:uEiBUQDRI5ttIzXbe1LZKUaZWb6yFsnMnrgDksAtQ-wCaKw:uoQ-BeEtodHRwczovL29yYi5kb21haW4yLmNvbS9jYXMvdUVpQlVRRFJJNXR0SXpYYmUxTFpLVWFaV2I2eUZzbk1ucmdEa3NBdFEtd0NhS3c"), //nolint:lll | ||
// Invalid hashlink. | ||
testutil.MustParseURL("xx:invalid"), | ||
} | ||
|
||
linkStore := &mocks.AnchorLinkStore{} | ||
|
||
h := New(linkStore) | ||
|
||
t.Run("Success", func(t *testing.T) { | ||
linkStore.PutLinksReturns(nil) | ||
|
||
require.NoError(t, h.AnchorEventAcknowledged(actor, anchorRef, additionalRefs)) | ||
}) | ||
|
||
t.Run("Anchor link storage error", func(t *testing.T) { | ||
errExpected := errors.New("injected storage error") | ||
|
||
linkStore.PutLinksReturns(errExpected) | ||
|
||
err := h.AnchorEventAcknowledged(actor, anchorRef, additionalRefs) | ||
|
||
require.Error(t, err) | ||
require.Contains(t, err.Error(), errExpected.Error()) | ||
}) | ||
|
||
t.Run("Invalid anchor link", func(t *testing.T) { | ||
require.Error(t, h.AnchorEventAcknowledged(actor, testutil.MustParseURL("xx:invalid"), additionalRefs)) | ||
}) | ||
} |
Oops, something went wrong.