forked from trustbloc/orb
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: Return alternate links in WebFinger query for DID and CAS
Implemented an anchor acknowledgement handler that stores additional links for anchor credentials from domains that returned a "Like" activity. These additional links are returned in WebFinger queries for DIDs and CAS. closes trustbloc#766 Signed-off-by: Bob Stasyszyn <Bob.Stasyszyn@securekey.com>
- Loading branch information
1 parent
107e3f4
commit 7b6c41e
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.