Skip to content

Commit

Permalink
chore: Add handler for did:orb in
Browse files Browse the repository at this point in the history
We are currently exposing two DID resolution endpoints:

protected endpoint /sidetree/v1/identifiers for did:orb

unprotected endpoint /1.0/identifiers for did:web and did:orb

Closes #1459

Signed-off-by: Sandra Vrtikapa <sandra.vrtikapa@securekey.com>
  • Loading branch information
sandrask committed Sep 6, 2022
1 parent 008fee0 commit 08cfc35
Show file tree
Hide file tree
Showing 9 changed files with 373 additions and 146 deletions.
9 changes: 6 additions & 3 deletions cmd/orb-server/startcmd/start.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ import (
localdiscovery "github.com/trustbloc/orb/pkg/discovery/did/local"
discoveryclient "github.com/trustbloc/orb/pkg/discovery/endpoint/client"
discoveryrest "github.com/trustbloc/orb/pkg/discovery/endpoint/restapi"
"github.com/trustbloc/orb/pkg/document/didresolver"
"github.com/trustbloc/orb/pkg/document/remoteresolver"
"github.com/trustbloc/orb/pkg/document/resolvehandler"
"github.com/trustbloc/orb/pkg/document/updatehandler"
Expand Down Expand Up @@ -1174,7 +1175,7 @@ func startOrbServices(parameters *orbParameters) error {

didDiscovery := localdiscovery.New(parameters.didNamespace, observer.Publisher(), endpointClient)

orbDocResolveHandler := resolvehandler.NewResolveHandler(
orbResolveHandler := resolvehandler.NewResolveHandler(
parameters.didNamespace,
didDocHandler,
didDiscovery,
Expand All @@ -1199,7 +1200,7 @@ func startOrbServices(parameters *orbParameters) error {
}

webResolveHandler := webresolver.NewResolveHandler(u, parameters.didNamespace,
unpublishedDIDLabel, orbDocResolveHandler, metrics.Get())
unpublishedDIDLabel, orbResolveHandler, metrics.Get())

// create discovery rest api
endpointDiscoveryOp, err := discoveryrest.New(
Expand Down Expand Up @@ -1245,9 +1246,11 @@ func startOrbServices(parameters *orbParameters) error {

handlers := make([]restcommon.HTTPHandler, 0)

didResolveHandler := didresolver.NewResolveHandler(orbResolveHandler, webResolveHandler)

handlers = append(handlers,
auth.NewHandlerWrapper(diddochandler.NewUpdateHandler(baseUpdatePath, orbDocUpdateHandler, pc, metrics.Get()), authTokenManager),
signature.NewHandlerWrapper(diddochandler.NewResolveHandler(baseResolvePath, orbDocResolveHandler, metrics.Get()),
signature.NewHandlerWrapper(diddochandler.NewResolveHandler(baseResolvePath, didResolveHandler, metrics.Get()),
&aphandler.Config{
ObjectIRI: apServiceIRI,
VerifyActorInSignature: parameters.httpSignaturesEnabled,
Expand Down
24 changes: 0 additions & 24 deletions pkg/discovery/endpoint/restapi/operations.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,6 @@ const (
orbWebDIDFileEndpoint = "/scid/{id}/did.json"
nodeInfoEndpoint = "/.well-known/nodeinfo"

orbWebDIDResolverEndpoint = "/1.0/identifiers/did:web:%s:scid:{id}"

selfRelation = "self"
alternateRelation = "alternate"
viaRelation = "via"
Expand Down Expand Up @@ -194,7 +192,6 @@ func (o *Operation) GetRESTHandlers() []common.HTTPHandler {
newHTTPHandler(webDIDEndpoint, o.webDIDHandler),
newHTTPHandler(nodeInfoEndpoint, o.nodeInfoHandler),
newHTTPHandler(orbWebDIDFileEndpoint, o.orbWebDIDFileHandler),
newHTTPHandler(fmt.Sprintf(orbWebDIDResolverEndpoint, o.domainWithPort), o.orbWebDIDResolverHandler),
}

// Only expose a service DID endpoint if the service ID is configured to be a DID.
Expand Down Expand Up @@ -241,27 +238,6 @@ func (o *Operation) orbWebDIDFileHandler(rw http.ResponseWriter, r *http.Request
writeResponse(rw, result.Document)
}

func (o *Operation) orbWebDIDResolverHandler(rw http.ResponseWriter, r *http.Request) {
id := mux.Vars(r)["id"]

result, err := o.webResolver.ResolveDocument(id)
if err != nil {
if errors.Is(err, orberrors.ErrContentNotFound) {
logger.Debugf("web resource[%s] not found", id)

writeErrorResponse(rw, http.StatusNotFound, "resource not found")
} else {
logger.Warnf("error returning web resource [%s]: %s", id, err)

writeErrorResponse(rw, http.StatusInternalServerError, "error retrieving resource")
}

return
}

writeResponse(rw, result)
}

// webDIDHandler swagger:route Get /.well-known/did.json discovery wellKnownDIDReq
//
// webDIDHandler.
Expand Down
113 changes: 4 additions & 109 deletions pkg/discovery/endpoint/restapi/operations_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,7 @@ const (
hostMetaEndpoint = "/.well-known/host-meta"
nodeInfoEndpoint = "/.well-known/nodeinfo"

orbWebDIDFileEndpoint = "/scid/{id}/did.json"
orbWebDIDResolverEndpoint = "/1.0/identifiers/did:web:base:scid:{id}"
orbWebDIDFileEndpoint = "/scid/{id}/did.json"

suffix = "suffix"
)
Expand Down Expand Up @@ -133,7 +132,7 @@ func TestGetRESTHandlers(t *testing.T) {
&restapi.Providers{},
)
require.NoError(t, err)
require.Equal(t, 8, len(c.GetRESTHandlers()))
require.Equal(t, 7, len(c.GetRESTHandlers()))
})

t.Run("HTTP service ID Success", func(t *testing.T) {
Expand All @@ -145,8 +144,8 @@ func TestGetRESTHandlers(t *testing.T) {

c, err := restapi.New(cfg, &restapi.Providers{})
require.NoError(t, err)
require.Equal(t, 9, len(c.GetRESTHandlers()),
"Expecting 9 handlers, including the service did handler")
require.Equal(t, 8, len(c.GetRESTHandlers()),
"Expecting 8 handlers, including the service did handler")
})
}

Expand Down Expand Up @@ -761,110 +760,6 @@ func TestWellKnownServiceDID(t *testing.T) {
require.Equal(t, "https://example.com", u)
}

func TestOrbWebDIDResolver(t *testing.T) {
t.Run("success", func(t *testing.T) {
didDoc := make(document.Document)

wr := &endpointmocks.WebResolver{}
wr.ResolveDocumentReturns(&document.ResolutionResult{Document: didDoc}, nil)

c, err := restapi.New(&restapi.Config{
OperationPath: "/op",
ResolutionPath: "/resolve",
WebCASPath: "/cas",
ServiceEndpointURL: testutil.MustParseURL("http://base/services/orb"),
},
&restapi.Providers{WebResolver: wr})
require.NoError(t, err)

handler := getHandler(t, c, orbWebDIDResolverEndpoint)

urlVars := make(map[string]string)
urlVars["id"] = suffix

rr := serveHTTP(t, handler.Handler(), http.MethodGet, orbWebDIDResolverEndpoint,
nil, urlVars, false)

require.Equal(t, http.StatusOK, rr.Code)
})

t.Run("success - port provided", func(t *testing.T) {
didDoc := make(document.Document)

wr := &endpointmocks.WebResolver{}
wr.ResolveDocumentReturns(&document.ResolutionResult{Document: didDoc}, nil)

c, err := restapi.New(&restapi.Config{
OperationPath: "/op",
ResolutionPath: "/resolve",
WebCASPath: "/cas",
ServiceEndpointURL: testutil.MustParseURL("http://base:8080/services/orb"),
},
&restapi.Providers{WebResolver: wr})
require.NoError(t, err)

handler := getHandler(t, c, "/1.0/identifiers/did:web:base%3A8080:scid:{id}")

urlVars := make(map[string]string)
urlVars["id"] = suffix

rr := serveHTTP(t, handler.Handler(), http.MethodGet, orbWebDIDResolverEndpoint,
nil, urlVars, false)

require.Equal(t, http.StatusOK, rr.Code)
})

t.Run("error - resource not found", func(t *testing.T) {
wr := &endpointmocks.WebResolver{}
wr.ResolveDocumentReturns(nil, orberrors.ErrContentNotFound)

c, err := restapi.New(&restapi.Config{
OperationPath: "/op",
ResolutionPath: "/resolve",
WebCASPath: "/cas",
ServiceEndpointURL: testutil.MustParseURL("http://base/services/orb"),
},
&restapi.Providers{WebResolver: wr})
require.NoError(t, err)

handler := getHandler(t, c, orbWebDIDResolverEndpoint)

urlVars := make(map[string]string)
urlVars["id"] = suffix

rr := serveHTTP(t, handler.Handler(), http.MethodGet, orbWebDIDResolverEndpoint,
nil, urlVars, false)

require.Equal(t, http.StatusNotFound, rr.Code)
require.Contains(t, rr.Body.String(), "resource not found")
})

t.Run("error - internal server error", func(t *testing.T) {
wr := &endpointmocks.WebResolver{}
wr.ResolveDocumentReturns(nil, fmt.Errorf("internal error"))

c, err := restapi.New(&restapi.Config{
OperationPath: "/op",
ResolutionPath: "/resolve",
WebCASPath: "/cas",
ServiceEndpointURL: testutil.MustParseURL("http://base/services/orb"),
},
&restapi.Providers{WebResolver: wr})
require.NoError(t, err)

handler := getHandler(t, c, orbWebDIDResolverEndpoint)

urlVars := make(map[string]string)
urlVars["id"] = suffix

rr := serveHTTP(t, handler.Handler(), http.MethodGet, orbWebDIDResolverEndpoint,
nil, urlVars, false)

require.Equal(t, http.StatusInternalServerError, rr.Code)
require.Contains(t, rr.Body.String(), "error retrieving resource")
})
}

func TestOrbWebDIDFile(t *testing.T) {
t.Run("success", func(t *testing.T) {
didDoc := make(document.Document)
Expand Down
115 changes: 115 additions & 0 deletions pkg/document/didresolver/mocks/orbresolver.gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 08cfc35

Please sign in to comment.