diff --git a/api/spec/openapi.gen.go b/api/spec/openapi.gen.go index a17512a25..960d27180 100644 --- a/api/spec/openapi.gen.go +++ b/api/spec/openapi.gen.go @@ -19,91 +19,89 @@ import ( // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "Pj38XwAAAP//nqXXYzVlAAA=", + "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/cmd/vc-rest/go.mod b/cmd/vc-rest/go.mod index 2dd2799ea..a1e8aa7d8 100644 --- a/cmd/vc-rest/go.mod +++ b/cmd/vc-rest/go.mod @@ -12,7 +12,7 @@ require ( github.com/labstack/echo/v4 v4.9.0 github.com/ory/dockertest/v3 v3.9.0 github.com/piprate/json-gold v0.4.1 - github.com/spf13/cobra v1.5.0 + github.com/spf13/cobra v1.6.0 github.com/stretchr/testify v1.8.0 github.com/trustbloc/vcs v0.0.0-00010101000000-000000000000 github.com/trustbloc/vcs/component/event v0.0.0-00010101000000-000000000000 @@ -27,6 +27,7 @@ require ( github.com/PaesslerAG/gval v1.2.0 // indirect github.com/PaesslerAG/jsonpath v0.1.1 // indirect github.com/VictoriaMetrics/fastcache v1.5.7 // indirect + github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect github.com/aws/aws-sdk-go v1.42.33 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bluele/gcache v0.0.2 // indirect @@ -35,12 +36,17 @@ require ( github.com/cenkalti/backoff v2.2.1+incompatible // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/containerd/continuity v0.3.0 // indirect + github.com/dave/jennifer v1.6.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/dgraph-io/ristretto v0.1.1 // indirect github.com/docker/cli v20.10.14+incompatible // indirect github.com/docker/docker v20.10.9+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.4.0 // indirect + github.com/dustin/go-humanize v1.0.0 // indirect + github.com/ecordell/optgen v0.0.6 // indirect github.com/evanphx/json-patch v4.11.0+incompatible // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/fxamacker/cbor/v2 v2.3.0 // indirect github.com/getkin/kin-openapi v0.94.0 // indirect github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 // indirect @@ -61,6 +67,10 @@ require ( github.com/google/trillian v1.3.14-0.20210520152752-ceda464a95a3 // indirect github.com/google/uuid v1.3.0 // indirect github.com/gorilla/mux v1.8.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-retryablehttp v0.7.1 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect github.com/hyperledger/aries-framework-go-ext/component/storage/couchdb v0.0.0-20220428163625-96d8261511e1 // indirect github.com/hyperledger/aries-framework-go-ext/component/storage/mysql v0.0.0-20220330151152-6bbd64bde42e // indirect github.com/hyperledger/aries-framework-go-ext/component/vdr/orb v1.0.0-rc2.0.20220811162145-47649b185a56 // indirect @@ -79,14 +89,17 @@ require ( github.com/klauspost/compress v1.15.9 // indirect github.com/klauspost/cpuid/v2 v2.0.4 // indirect github.com/labstack/gommon v0.3.1 // indirect + github.com/magiconair/properties v1.8.6 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.12 // indirect github.com/mattn/go-isatty v0.0.14 // indirect + github.com/mattn/goveralls v0.0.11 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 // indirect github.com/minio/sha256-simd v1.0.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 // indirect + github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/montanaflynn/stats v0.6.6 // indirect github.com/mr-tron/base58 v1.2.0 // indirect github.com/multiformats/go-base32 v0.0.4 // indirect @@ -98,6 +111,13 @@ require ( github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 // indirect github.com/opencontainers/runc v1.1.1 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect + github.com/ory/fosite v0.43.0 // indirect + github.com/ory/go-acc v0.2.8 // indirect + github.com/ory/go-convenience v0.1.0 // indirect + github.com/ory/viper v1.7.5 // indirect + github.com/ory/x v0.0.487 // indirect + github.com/pborman/uuid v1.2.1 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/pquerna/cachecontrol v0.1.0 // indirect @@ -109,8 +129,12 @@ require ( github.com/shopspring/decimal v1.3.1 // indirect github.com/sirupsen/logrus v1.8.1 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect + github.com/spf13/afero v1.9.2 // indirect + github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/square/go-jose/v3 v3.0.0-20200630053402-0a67ce9b0693 // indirect + github.com/subosito/gotenv v1.4.1 // indirect github.com/teserakt-io/golang-ed25519 v0.0.0-20210104091850-3888c087a4c8 // indirect github.com/tidwall/gjson v1.14.0 // indirect github.com/tidwall/match v1.1.1 // indirect @@ -134,17 +158,21 @@ require ( go.uber.org/atomic v1.7.0 // indirect go.uber.org/multierr v1.6.0 // indirect go.uber.org/zap v1.17.0 // indirect - golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be // indirect + golang.org/x/crypto v0.0.0-20221012134737-56aed061732a // indirect golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 // indirect - golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect + golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect + golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458 // indirect golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 // indirect - golang.org/x/sys v0.0.0-20220926163933-8cfa568d3c25 // indirect - golang.org/x/text v0.3.7 // indirect + golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43 // indirect + golang.org/x/text v0.3.8 // indirect golang.org/x/time v0.0.0-20220411224347-583f2d630306 // indirect + golang.org/x/tools v0.1.12 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf // indirect google.golang.org/grpc v1.46.2 // indirect - google.golang.org/protobuf v1.28.0 // indirect + google.golang.org/protobuf v1.28.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/square/go-jose.v2 v2.6.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/cmd/vc-rest/go.sum b/cmd/vc-rest/go.sum index 4ca14d6b0..be635a9eb 100644 --- a/cmd/vc-rest/go.sum +++ b/cmd/vc-rest/go.sum @@ -44,6 +44,7 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= code.gitea.io/sdk/gitea v0.11.3/go.mod h1:z3uwDV/b9Ls47NGukYM9XhnHtqPh/J+t40lsUrR6JDY= contrib.go.opencensus.io/exporter/aws v0.0.0-20181029163544-2befc13012d0/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= contrib.go.opencensus.io/exporter/ocagent v0.5.0/go.mod h1:ImxhfLRpxoYiSq891pBrLVhN+qmP8BTVvdH2YLs7Gl0= @@ -121,6 +122,8 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= +github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.19.18/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= @@ -217,8 +220,12 @@ github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7Do github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cristalhq/jwt/v4 v4.0.2 h1:g/AD3h0VicDamtlM70GWGElp8kssQEv+5wYd7L9WOhU= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/dave/jennifer v1.4.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= +github.com/dave/jennifer v1.6.0 h1:MQ/6emI2xM7wt0tJzJzyUik2Q3Tcn2eE0vtYgh4GPVI= +github.com/dave/jennifer v1.6.0/go.mod h1:AxTG893FiZKqxy3FP1kL80VMshSMuz2G+EgvszgGRnk= github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -230,7 +237,13 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeC github.com/deepmap/oapi-codegen v1.11.0 h1:f/X2NdIkaBKsSdpeuwLnY/vDI0AtPUrmB5LMgc7YD+A= github.com/deepmap/oapi-codegen v1.11.0/go.mod h1:k+ujhoQGxmQYBZBbxhOZNZf4j08qv5mC+OH+fFTnKxM= github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= +github.com/dgraph-io/ristretto v0.0.1/go.mod h1:T40EBc7CJke8TkpiYfGGKAeFjSaxuFXhuXRyumBd6RE= +github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= +github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= github.com/docker/cli v20.10.14+incompatible h1:dSBKJOVesDgHo7rbxlYjYsXe7gPzrTT+/cKQgpDAazg= @@ -242,10 +255,13 @@ github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5Xh github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/ecordell/optgen v0.0.6 h1:aSknPe6ZUBrjwHGp2+6XfmfCGYGD6W0ZDfCmmsrS7s4= +github.com/ecordell/optgen v0.0.6/go.mod h1:bAPkLVWcBlTX5EkXW0UTPRj3+yjq2I6VLgH8OasuQEM= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= @@ -274,7 +290,11 @@ github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHqu github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/fullstorydev/grpcurl v1.8.0/go.mod h1:Mn2jWbdMrQGJQ8UD62uNyMumT2acsZUCkZIqFxsQf1o= github.com/fullstorydev/grpcurl v1.8.1/go.mod h1:3BWhvHZwNO7iLXaQlojdg5NA6SxUDePli4ecpK1N7gw= github.com/fxamacker/cbor/v2 v2.3.0 h1:aM45YGMctNakddNNAezPxDUpv38j44Abh+hifNuqXik= @@ -447,6 +467,7 @@ github.com/google/wire v0.3.0/go.mod h1:i1DMg/Lu8Sz5yYl25iOdmc5CT5qusaa+zmRWs167 github.com/googleapis/gax-go v2.0.2+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20180825215210-0210a2f0f73c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 h1:l5lAOZEym3oK3SQ2HBHWsJUfbNBiTXJDeW2QDxw9AQ0= @@ -462,6 +483,8 @@ github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB7 github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= @@ -480,8 +503,11 @@ github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyN github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI= github.com/hashicorp/go-hclog v0.8.0/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v0.9.2 h1:CG6TE5H9/JXsFWJCfoIVpKFIkFe6ysEuHirp4DxCsHI= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= @@ -489,6 +515,8 @@ github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHh github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY= github.com/hashicorp/go-retryablehttp v0.5.4/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-retryablehttp v0.6.4/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/go-retryablehttp v0.7.1 h1:sUiuQAnLlbvmExtFQs72iFW/HXeUn8Z1aJLQ4LJJbTQ= +github.com/hashicorp/go-retryablehttp v0.7.1/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= @@ -501,6 +529,7 @@ github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09 github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= @@ -600,8 +629,10 @@ github.com/klauspost/cpuid/v2 v2.0.4 h1:g0I61F2K2DjRHz1cnxlkNSBIaePVoJIjjnHui8QH github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= @@ -630,7 +661,7 @@ github.com/lestrrat-go/jwx v1.2.24/go.mod h1:zoNuZymNl5lgdcu6P7K6ie2QRll5HVfF4xw github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag= github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.0 h1:Zx5DJFEYQXio93kgXnQ09fXNiUKsqv4OUEu2UtGcB1E= +github.com/lib/pq v1.10.6 h1:jbk+ZieJ0D7EVGJYpL9QTz7/YW6UHbmdnZWYyK5cdBs= github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= github.com/libp2p/go-flow-metrics v0.0.3 h1:8tAs/hSdNvUiLgtlSy3mxwxWP4I9y/jlkPFT7epKdeM= github.com/libp2p/go-libp2p-core v0.6.1 h1:XS+Goh+QegCDojUZp00CaPMfiEADCrLjNZskWE7pvqs= @@ -641,6 +672,8 @@ github.com/lithammer/shortuuid/v3 v3.0.7 h1:trX0KTHy4Pbwo/6ia8fscyHoGA+mf1jWbPJV github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= @@ -670,6 +703,8 @@ github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mattn/go-zglob v0.0.1/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= +github.com/mattn/goveralls v0.0.11 h1:eJXea6R6IFlL1QMKNMzDvvHv/hwGrnvyig4N+0+XiMM= +github.com/mattn/goveralls v0.0.11/go.mod h1:gU8SyhNswsJKchEV93xRQxX6X3Ei4PJdQk/6ZHvrvRk= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= @@ -694,6 +729,7 @@ github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS4 github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= @@ -706,6 +742,7 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/montanaflynn/stats v0.6.6 h1:Duep6KMIDpY4Yo11iFsvyqJDyfzLF9+sndUKT+v64GQ= @@ -747,6 +784,7 @@ github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtb github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/oleiade/reflections v1.0.1 h1:D1XO3LVEYroYskEsoSiGItp9RUxG6jWnCVvrqH0HHQM= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -776,6 +814,16 @@ github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnh github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/ory/dockertest/v3 v3.9.0 h1:U7M9FfYEwF4uqEE6WUSFs7K+Hvb31CsCX5uZUZD3olI= github.com/ory/dockertest/v3 v3.9.0/go.mod h1:jgm0rnguArPXsVduy+oUjzFtD0Na+DDNbUl8W5v+ez8= +github.com/ory/fosite v0.43.0 h1:9H1O3I7CFxS2Y6j9FDAx2W3I5uAyEubc9hECS0UTOgI= +github.com/ory/fosite v0.43.0/go.mod h1:BTd8+oG1mRtezZbQq0S4D2HBc815bedZHjjs2KRs39Y= +github.com/ory/go-acc v0.2.8 h1:rOHHAPQjf0u7eHFGWpiXK+gIu/e0GRSJNr9pDukdNC4= +github.com/ory/go-acc v0.2.8/go.mod h1:iCRZUdGb/7nqvSn8xWZkhfVrtXRZ9Wru2E5rabCjFPI= +github.com/ory/go-convenience v0.1.0 h1:zouLKfF2GoSGnJwGq+PE/nJAE6dj2Zj5QlTgmMTsTS8= +github.com/ory/go-convenience v0.1.0/go.mod h1:uEY/a60PL5c12nYz4V5cHY03IBmwIAEm8TWB0yn9KNs= +github.com/ory/viper v1.7.5 h1:+xVdq7SU3e1vNaCsk/ixsfxE4zylk1TJUiJrY647jUE= +github.com/ory/viper v1.7.5/go.mod h1:ypOuyJmEUb3oENywQZRgeAMwqgOyDqwboO1tj3DjTaM= +github.com/ory/x v0.0.487 h1:A4LxhmfP3hnRhnRUvdo8/s60s473JLQce5Z9VqDJzmo= +github.com/ory/x v0.0.487/go.mod h1:dJ800rWC2/eNECWhXMyI9kSd7lO2LTOu6R8oS0lQZ38= github.com/otiai10/copy v1.0.2/go.mod h1:c7RpqBkwMom4bYTSkLSym4VSJz/XtncWRAj/J4PEIMY= github.com/otiai10/copy v1.2.0 h1:HvG945u96iNadPoG2/Ja2+AUJeW5YuFQMixq9yirC+k= github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= @@ -790,8 +838,12 @@ github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FI github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= +github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= @@ -803,6 +855,7 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -897,14 +950,22 @@ github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasO github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= -github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= +github.com/spf13/cobra v1.6.0 h1:42a0n6jwCot1pUmomAp4T7DeMD+20LFv4Q54pxLf2LI= +github.com/spf13/cobra v1.6.0/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -933,6 +994,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= +github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/teserakt-io/golang-ed25519 v0.0.0-20210104091850-3888c087a4c8 h1:RBkacARv7qY5laaXGlF4wFB/tk5rnthhPb8oIBGoagY= github.com/teserakt-io/golang-ed25519 v0.0.0-20210104091850-3888c087a4c8/go.mod h1:9PdLyPiZIiW3UopXyRnPYyjUXSpiQNHRLu8fOsR3o8M= @@ -1080,17 +1143,20 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191117063200-497ca9f6d64f/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220513210258-46612604a0f9/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be h1:fmw3UbQh+nxngCAHrDCCztao/kbYFnWjoqop8dHx05A= -golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20221012134737-56aed061732a h1:NmSIgad6KjE6VvHciPZuNRTKxGhlPfD6OA87W/PLkqg= +golang.org/x/crypto v0.0.0-20221012134737-56aed061732a/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1129,6 +1195,8 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1186,8 +1254,8 @@ golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220513224357-95641704303c/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458 h1:MgJ6t2zo8v0tbmLCueaCbF1RM+TtB0rs3Lv8DGtOIpY= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1205,6 +1273,7 @@ golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1 h1:3VPzK7eqH25j7GYw5w6g/GzNRc0/fYtrxz27z1gD4W0= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1246,6 +1315,7 @@ golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191119060738-e882bf8e40c2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1256,6 +1326,7 @@ golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1281,6 +1352,7 @@ golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1288,6 +1360,7 @@ golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210412220455-f1c623a9e750/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1301,9 +1374,12 @@ golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220513210249-45d2b4557a2a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220926163933-8cfa568d3c25 h1:nwzwVf0l2Y/lkov/+IYgMMbFyI+QypZDds9RxlSmsFQ= -golang.org/x/sys v0.0.0-20220926163933-8cfa568d3c25/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43 h1:OK7RB6t2WQX54srQQYSXMW8dF5C6/8+oA/s5QBmmto4= +golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1315,8 +1391,9 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8 h1:nAL+RVCQ9uMn3vJZbV+MRnydTJFPf8qqY42YiA6MrqY= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1393,6 +1470,8 @@ golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1438,6 +1517,7 @@ google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -1484,6 +1564,7 @@ google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -1542,8 +1623,9 @@ google.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX7 google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1558,8 +1640,13 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI= +gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g= gopkg.in/src-d/go-git.v4 v4.13.1/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8= diff --git a/component/event/go.mod b/component/event/go.mod index 6b8a3d7a7..d421cb42e 100644 --- a/component/event/go.mod +++ b/component/event/go.mod @@ -6,7 +6,7 @@ module github.com/trustbloc/vcs/component/event go 1.19 require ( - github.com/spf13/cobra v1.5.0 + github.com/spf13/cobra v1.6.0 github.com/stretchr/testify v1.8.0 github.com/trustbloc/vcs v0.0.0-00010101000000-000000000000 ) diff --git a/component/event/go.sum b/component/event/go.sum index 347975b3e..dc8dd3cb1 100644 --- a/component/event/go.sum +++ b/component/event/go.sum @@ -4,7 +4,6 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/hyperledger/aries-framework-go v0.1.9-0.20221017192441-2b9ca433f743 h1:4vDUWvDuFeGSpRC72JPZ+8SoCzcUPNaMJiuX4ba6mmA= github.com/hyperledger/aries-framework-go v0.1.9-0.20221017192441-2b9ca433f743/go.mod h1:bypk9kaZKKrWzeZg9DgGWIc73Il21NB+uw0DhkaHgV4= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -12,8 +11,8 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= +github.com/spf13/cobra v1.6.0 h1:42a0n6jwCot1pUmomAp4T7DeMD+20LFv4Q54pxLf2LI= +github.com/spf13/cobra v1.6.0/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -35,7 +34,6 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/component/profile/reader/file/go.mod b/component/profile/reader/file/go.mod index 3b132f0ec..714ec747e 100644 --- a/component/profile/reader/file/go.mod +++ b/component/profile/reader/file/go.mod @@ -8,7 +8,7 @@ go 1.19 require ( github.com/hyperledger/aries-framework-go v0.1.9-0.20221017192441-2b9ca433f743 github.com/hyperledger/aries-framework-go-ext/component/vdr/orb v1.0.0-rc2.0.20220811162145-47649b185a56 - github.com/spf13/cobra v1.5.0 + github.com/spf13/cobra v1.6.0 github.com/trustbloc/vcs v0.0.0-00010101000000-000000000000 ) @@ -100,14 +100,14 @@ require ( go.uber.org/atomic v1.7.0 // indirect go.uber.org/multierr v1.6.0 // indirect go.uber.org/zap v1.17.0 // indirect - golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be // indirect - golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect + golang.org/x/crypto v0.0.0-20221012134737-56aed061732a // indirect + golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458 // indirect golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 // indirect - golang.org/x/sys v0.0.0-20220926163933-8cfa568d3c25 // indirect - golang.org/x/text v0.3.7 // indirect + golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43 // indirect + golang.org/x/text v0.3.8 // indirect google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf // indirect google.golang.org/grpc v1.46.2 // indirect - google.golang.org/protobuf v1.28.0 // indirect + google.golang.org/protobuf v1.28.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/component/profile/reader/file/go.sum b/component/profile/reader/file/go.sum index dc134c502..07e6f5a1b 100644 --- a/component/profile/reader/file/go.sum +++ b/component/profile/reader/file/go.sum @@ -780,8 +780,8 @@ github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3 github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= -github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= +github.com/spf13/cobra v1.6.0 h1:42a0n6jwCot1pUmomAp4T7DeMD+20LFv4Q54pxLf2LI= +github.com/spf13/cobra v1.6.0/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= @@ -948,8 +948,8 @@ golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be h1:fmw3UbQh+nxngCAHrDCCztao/kbYFnWjoqop8dHx05A= -golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20221012134737-56aed061732a h1:NmSIgad6KjE6VvHciPZuNRTKxGhlPfD6OA87W/PLkqg= +golang.org/x/crypto v0.0.0-20221012134737-56aed061732a/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1040,8 +1040,8 @@ golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458 h1:MgJ6t2zo8v0tbmLCueaCbF1RM+TtB0rs3Lv8DGtOIpY= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1143,8 +1143,8 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220926163933-8cfa568d3c25 h1:nwzwVf0l2Y/lkov/+IYgMMbFyI+QypZDds9RxlSmsFQ= -golang.org/x/sys v0.0.0-20220926163933-8cfa568d3c25/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43 h1:OK7RB6t2WQX54srQQYSXMW8dF5C6/8+oA/s5QBmmto4= +golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1155,8 +1155,9 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8 h1:nAL+RVCQ9uMn3vJZbV+MRnydTJFPf8qqY42YiA6MrqY= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1375,8 +1376,8 @@ google.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX7 google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/docs/v1/openapi.yaml b/docs/v1/openapi.yaml index 9a2fb0135..70e2231f5 100644 --- a/docs/v1/openapi.yaml +++ b/docs/v1/openapi.yaml @@ -40,7 +40,7 @@ paths: description: Returns server health check status. tags: - healthcheck - /{profileType}/profiles/{profileID}/well-known/did-config: + '/{profileType}/profiles/{profileID}/well-known/did-config': parameters: - schema: type: string @@ -67,7 +67,7 @@ paths: description: Returns did-config. tags: - devapi - /request-object/{uuid}: + '/request-object/{uuid}': parameters: - schema: type: string @@ -110,7 +110,7 @@ paths: type: object operationId: post-issue-credentials description: Issuer credentials. - /issuer/profiles/{profileID}/credentials/status/{statusID}: + '/issuer/profiles/{profileID}/credentials/status/{statusID}': get: summary: Retrieves the credential status. parameters: @@ -137,7 +137,7 @@ paths: description: Retrieves the credential status. tags: - issuer - /issuer/profiles/{profileID}/credentials/status: + '/issuer/profiles/{profileID}/credentials/status': parameters: - schema: type: string @@ -189,37 +189,6 @@ paths: $ref: '#/components/schemas/InitiateOIDC4VCRequest' tags: - issuer - '/issuer/profiles/{profileID}/interactions/push-authorization-request': - parameters: - - schema: - type: string - name: profileID - in: path - required: true - post: - summary: Pushed Authorization Request - tags: - - issuer - responses: - '200': - description: OK - content: - application/json: - schema: - $ref: '#/components/schemas/PushedAuthorizationResponse' - operationId: post-issuer-profiles-profileID-interactions-push-authorization-request - description: Used by VCS OIDC public endpoints to push authorization requests (PAR) and to get request URI back for OIDC authorization request redirects. - parameters: [] - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - authorization_details: - type: string - op_state: - type: string '/verifier/profiles/{profileID}/credentials/verify': parameters: - schema: @@ -295,8 +264,7 @@ paths: application/json: schema: $ref: '#/components/schemas/InitiateOIDC4VPResponse' - - '/verifier/interactions/authorization-response': + /verifier/interactions/authorization-response: post: summary: Used by verifier applications to initiate OpenID presentation flow through VCS operationId: check-authorization-response @@ -561,7 +529,7 @@ components: - devapi type: object properties: - "@context": + '@context': type: string description: context. linked_dids: @@ -578,7 +546,7 @@ components: - devapi type: object properties: - "id": + id: type: string description: id. content: diff --git a/go.mod b/go.mod index c1b344675..6a40689e8 100644 --- a/go.mod +++ b/go.mod @@ -25,18 +25,18 @@ require ( github.com/jinzhu/copier v0.3.5 github.com/labstack/echo/v4 v4.8.0 github.com/ory/dockertest/v3 v3.9.0 - github.com/ory/fosite v0.42.3-0.20220923124412-e98c0d745a0c + github.com/ory/fosite v0.43.0 github.com/pborman/uuid v1.2.1 github.com/piprate/json-gold v0.4.1 github.com/samber/lo v1.29.0 - github.com/spf13/cobra v1.5.0 + github.com/spf13/cobra v1.6.0 github.com/square/go-jose/v3 v3.0.0-20200630053402-0a67ce9b0693 github.com/stretchr/testify v1.8.0 github.com/trustbloc/kms v0.1.9-0.20220927102932-412f152996fa github.com/trustbloc/orb v1.0.0-rc2.0.20220811160855-64ffb892b32b go.mongodb.org/mongo-driver v1.10.0 go.uber.org/zap v1.17.0 - golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 + golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1 ) require ( @@ -54,9 +54,9 @@ require ( github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/containerd/continuity v0.3.0 // indirect github.com/cristalhq/jwt/v4 v4.0.2 // indirect - github.com/dave/jennifer v1.5.1 // indirect + github.com/dave/jennifer v1.6.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/dgraph-io/ristretto v0.1.0 // indirect + github.com/dgraph-io/ristretto v0.1.1 // indirect github.com/docker/cli v20.10.14+incompatible // indirect github.com/docker/docker v20.10.9+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect @@ -64,7 +64,7 @@ require ( github.com/dustin/go-humanize v1.0.0 // indirect github.com/ecordell/optgen v0.0.6 // indirect github.com/evanphx/json-patch v4.11.0+incompatible // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/fxamacker/cbor/v2 v2.3.0 // indirect github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 // indirect github.com/go-kivik/couchdb/v3 v3.2.8 // indirect @@ -121,7 +121,7 @@ require ( github.com/ory/go-acc v0.2.8 // indirect github.com/ory/go-convenience v0.1.0 // indirect github.com/ory/viper v1.7.5 // indirect - github.com/ory/x v0.0.477 // indirect + github.com/ory/x v0.0.487 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect @@ -159,19 +159,19 @@ require ( github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect go.uber.org/atomic v1.7.0 // indirect go.uber.org/multierr v1.6.0 // indirect - golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be // indirect + golang.org/x/crypto v0.0.0-20221012134737-56aed061732a // indirect golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 // indirect golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect - golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect + golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458 // indirect golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 // indirect - golang.org/x/sys v0.0.0-20220926163933-8cfa568d3c25 // indirect - golang.org/x/text v0.3.7 // indirect + golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43 // indirect + golang.org/x/text v0.3.8 // indirect golang.org/x/tools v0.1.12 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf // indirect google.golang.org/grpc v1.46.2 // indirect - google.golang.org/protobuf v1.28.0 // indirect + google.golang.org/protobuf v1.28.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/square/go-jose.v2 v2.6.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 9065dbf2f..cac866afb 100644 --- a/go.sum +++ b/go.sum @@ -225,8 +225,8 @@ github.com/cristalhq/jwt/v4 v4.0.2/go.mod h1:HnYraSNKDRag1DZP92rYHyrjyQHnVEHPNqe github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/dave/jennifer v1.4.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= -github.com/dave/jennifer v1.5.1 h1:AI8gaM02nCYRw6/WTH0W+S6UNck9YqPZ05xoIxQtuoE= -github.com/dave/jennifer v1.5.1/go.mod h1:AxTG893FiZKqxy3FP1kL80VMshSMuz2G+EgvszgGRnk= +github.com/dave/jennifer v1.6.0 h1:MQ/6emI2xM7wt0tJzJzyUik2Q3Tcn2eE0vtYgh4GPVI= +github.com/dave/jennifer v1.6.0/go.mod h1:AxTG893FiZKqxy3FP1kL80VMshSMuz2G+EgvszgGRnk= github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -240,8 +240,8 @@ github.com/deepmap/oapi-codegen v1.11.0/go.mod h1:k+ujhoQGxmQYBZBbxhOZNZf4j08qv5 github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= github.com/dgraph-io/ristretto v0.0.1/go.mod h1:T40EBc7CJke8TkpiYfGGKAeFjSaxuFXhuXRyumBd6RE= github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= -github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= +github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= +github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= @@ -294,8 +294,8 @@ github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/fullstorydev/grpcurl v1.8.0/go.mod h1:Mn2jWbdMrQGJQ8UD62uNyMumT2acsZUCkZIqFxsQf1o= github.com/fullstorydev/grpcurl v1.8.1/go.mod h1:3BWhvHZwNO7iLXaQlojdg5NA6SxUDePli4ecpK1N7gw= github.com/fxamacker/cbor/v2 v2.3.0 h1:aM45YGMctNakddNNAezPxDUpv38j44Abh+hifNuqXik= @@ -422,7 +422,7 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-github/v28 v28.1.1/go.mod h1:bsqJWQX05omyWVmc00nEUql9mhQyv38lDZ8kPZcQVoM= github.com/google/go-licenses v0.0.0-20210329231322-ce1d9163b77d/go.mod h1:+TYOmkVoJOpwnS0wfdsJCV9CoD5nJYsHoFk/0CrTK4M= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= @@ -814,16 +814,16 @@ github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnh github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/ory/dockertest/v3 v3.9.0 h1:U7M9FfYEwF4uqEE6WUSFs7K+Hvb31CsCX5uZUZD3olI= github.com/ory/dockertest/v3 v3.9.0/go.mod h1:jgm0rnguArPXsVduy+oUjzFtD0Na+DDNbUl8W5v+ez8= -github.com/ory/fosite v0.42.3-0.20220923124412-e98c0d745a0c h1:o88opz97qYWHvLunBgGEYrODsPrlJ0/sAgL0jZG7QA8= -github.com/ory/fosite v0.42.3-0.20220923124412-e98c0d745a0c/go.mod h1:BTd8+oG1mRtezZbQq0S4D2HBc815bedZHjjs2KRs39Y= +github.com/ory/fosite v0.43.0 h1:9H1O3I7CFxS2Y6j9FDAx2W3I5uAyEubc9hECS0UTOgI= +github.com/ory/fosite v0.43.0/go.mod h1:BTd8+oG1mRtezZbQq0S4D2HBc815bedZHjjs2KRs39Y= github.com/ory/go-acc v0.2.8 h1:rOHHAPQjf0u7eHFGWpiXK+gIu/e0GRSJNr9pDukdNC4= github.com/ory/go-acc v0.2.8/go.mod h1:iCRZUdGb/7nqvSn8xWZkhfVrtXRZ9Wru2E5rabCjFPI= github.com/ory/go-convenience v0.1.0 h1:zouLKfF2GoSGnJwGq+PE/nJAE6dj2Zj5QlTgmMTsTS8= github.com/ory/go-convenience v0.1.0/go.mod h1:uEY/a60PL5c12nYz4V5cHY03IBmwIAEm8TWB0yn9KNs= github.com/ory/viper v1.7.5 h1:+xVdq7SU3e1vNaCsk/ixsfxE4zylk1TJUiJrY647jUE= github.com/ory/viper v1.7.5/go.mod h1:ypOuyJmEUb3oENywQZRgeAMwqgOyDqwboO1tj3DjTaM= -github.com/ory/x v0.0.477 h1:yQA/rFZ4n65eqVuQTRCA6DiZKI9gNZ0+40uwdtLL30A= -github.com/ory/x v0.0.477/go.mod h1:w2gwqgw3XqKTxW8wURVxUFI2NuDyIC2rGxvEsnBJqjs= +github.com/ory/x v0.0.487 h1:A4LxhmfP3hnRhnRUvdo8/s60s473JLQce5Z9VqDJzmo= +github.com/ory/x v0.0.487/go.mod h1:dJ800rWC2/eNECWhXMyI9kSd7lO2LTOu6R8oS0lQZ38= github.com/otiai10/copy v1.0.2/go.mod h1:c7RpqBkwMom4bYTSkLSym4VSJz/XtncWRAj/J4PEIMY= github.com/otiai10/copy v1.2.0 h1:HvG945u96iNadPoG2/Ja2+AUJeW5YuFQMixq9yirC+k= github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= @@ -962,8 +962,8 @@ github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3 github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= -github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= +github.com/spf13/cobra v1.6.0 h1:42a0n6jwCot1pUmomAp4T7DeMD+20LFv4Q54pxLf2LI= +github.com/spf13/cobra v1.6.0/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -1157,8 +1157,8 @@ golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220513210258-46612604a0f9/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be h1:fmw3UbQh+nxngCAHrDCCztao/kbYFnWjoqop8dHx05A= -golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20221012134737-56aed061732a h1:NmSIgad6KjE6VvHciPZuNRTKxGhlPfD6OA87W/PLkqg= +golang.org/x/crypto v0.0.0-20221012134737-56aed061732a/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1256,8 +1256,8 @@ golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220513224357-95641704303c/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458 h1:MgJ6t2zo8v0tbmLCueaCbF1RM+TtB0rs3Lv8DGtOIpY= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1275,8 +1275,8 @@ golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1 h1:3VPzK7eqH25j7GYw5w6g/GzNRc0/fYtrxz27z1gD4W0= +golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1378,10 +1378,11 @@ golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220513210249-45d2b4557a2a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220926163933-8cfa568d3c25 h1:nwzwVf0l2Y/lkov/+IYgMMbFyI+QypZDds9RxlSmsFQ= -golang.org/x/sys v0.0.0-20220926163933-8cfa568d3c25/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43 h1:OK7RB6t2WQX54srQQYSXMW8dF5C6/8+oA/s5QBmmto4= +golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1393,8 +1394,9 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8 h1:nAL+RVCQ9uMn3vJZbV+MRnydTJFPf8qqY42YiA6MrqY= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1623,8 +1625,9 @@ google.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX7 google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/pkg/restapi/v1/issuer/controller.go b/pkg/restapi/v1/issuer/controller.go index 38b4ac2c6..54c17923b 100644 --- a/pkg/restapi/v1/issuer/controller.go +++ b/pkg/restapi/v1/issuer/controller.go @@ -10,7 +10,7 @@ SPDX-License-Identifier: Apache-2.0 package issuer import ( - "encoding/json" + "context" "errors" "fmt" "strings" @@ -28,7 +28,6 @@ import ( "github.com/trustbloc/vcs/pkg/kms" profileapi "github.com/trustbloc/vcs/pkg/profile" "github.com/trustbloc/vcs/pkg/restapi/resterr" - "github.com/trustbloc/vcs/pkg/restapi/v1/common" "github.com/trustbloc/vcs/pkg/restapi/v1/util" "github.com/trustbloc/vcs/pkg/service/credentialstatus" "github.com/trustbloc/vcs/pkg/service/oidc4vc" @@ -61,11 +60,10 @@ type issueCredentialService interface { } type oidc4VCService interface { - InitiateOIDCInteraction(req *oidc4vc.InitiateIssuanceRequest) (*oidc4vc.InitiateIssuanceInfo, error) - HandlePAR( - req *oidc4vc.PushedAuthorizationRequest, - profile *profileapi.Issuer, - ) (*oidc4vc.PushedAuthorizationResponse, error) + InitiateInteraction( + ctx context.Context, + req *oidc4vc.InitiateIssuanceRequest, + ) (*oidc4vc.InitiateIssuanceResponse, error) } type vcStatusManager interface { @@ -207,11 +205,14 @@ func (c *Controller) PostIssuerProfilesProfileIDInteractionsInitiateOidc(ctx ech return err } - return util.WriteOutput(ctx)(c.initiateOidcInteraction(&body, profile)) + return util.WriteOutput(ctx)(c.initiateOidcInteraction(ctx.Request().Context(), &body, profile)) } -func (c *Controller) initiateOidcInteraction(body *InitiateOIDC4VCRequest, - profile *profileapi.Issuer) (*InitiateOIDC4VCResponse, error) { +func (c *Controller) initiateOidcInteraction( + ctx context.Context, + req *InitiateOIDC4VCRequest, + profile *profileapi.Issuer, +) (*InitiateOIDC4VCResponse, error) { if !profile.Active { return nil, resterr.NewValidationError(resterr.ConditionNotMet, "profile.Active", errors.New("profile should be active")) @@ -222,35 +223,37 @@ func (c *Controller) initiateOidcInteraction(body *InitiateOIDC4VCRequest, errors.New("OIDC not configured")) } - template, err := findCredentialTemplate(profile.CredentialTemplates, lo.FromPtr(body.CredentialTemplateId)) + t, err := findCredentialTemplate(profile.CredentialTemplates, lo.FromPtr(req.CredentialTemplateId)) if err != nil { return nil, err } issuanceReq := &oidc4vc.InitiateIssuanceRequest{ - CredentialTemplate: template, - ClientInitiateIssuanceURL: lo.FromPtr(body.ClientInitiateIssuanceUrl), - ClientWellKnownURL: lo.FromPtr(body.ClientWellknown), - ClaimEndpoint: lo.FromPtr(body.ClaimEndpoint), - GrantType: lo.FromPtr(body.GrantType), - ResponseType: lo.FromPtr(body.ResponseType), - Scope: lo.FromPtr(body.Scope), - OpState: lo.FromPtr(body.OpState), + CredentialTemplate: t, + ClientInitiateIssuanceURL: lo.FromPtr(req.ClientInitiateIssuanceUrl), + ClientWellKnownURL: lo.FromPtr(req.ClientWellknown), + ClaimEndpoint: lo.FromPtr(req.ClaimEndpoint), + GrantType: lo.FromPtr(req.GrantType), + ResponseType: lo.FromPtr(req.ResponseType), + Scope: lo.FromPtr(req.Scope), + OpState: lo.FromPtr(req.OpState), } - info, err := c.oidc4VCService.InitiateOIDCInteraction(issuanceReq) + resp, err := c.oidc4VCService.InitiateInteraction(ctx, issuanceReq) if err != nil { return nil, resterr.NewSystemError("OIDC4VCService", "InitiateOIDCInteraction", err) } return &InitiateOIDC4VCResponse{ - InitiateIssuanceUrl: info.InitiateIssuanceURL, - TxId: info.TxID, + InitiateIssuanceUrl: resp.InitiateIssuanceURL, + TxId: string(resp.TxID), }, nil } -func findCredentialTemplate(credentialTemplates []*verifiable.Credential, templateID string) ( - *verifiable.Credential, error) { +func findCredentialTemplate( + credentialTemplates []*verifiable.Credential, + templateID string, +) (*verifiable.Credential, error) { // profile should define at least one credential template if len(credentialTemplates) == 0 || credentialTemplates[0].ID == "" { return nil, resterr.NewValidationError(resterr.ConditionNotMet, "profile.CredentialTemplates", @@ -273,125 +276,6 @@ func findCredentialTemplate(credentialTemplates []*verifiable.Credential, templa errors.New("credential template not found")) } -// PushedAuthorizationRequest is a model for PAR. -type PushedAuthorizationRequest struct { - AuthorizationDetails string `form:"authorization_details"` - OpState string `form:"op_state"` -} - -// PostIssuerProfilesProfileIDInteractionsPushAuthorizationRequest handles Pushed Authorization Request. -// (POST /issuer/profiles/{profileID}/interactions/push-authorization-request). -func (c *Controller) PostIssuerProfilesProfileIDInteractionsPushAuthorizationRequest( - ctx echo.Context, - profileID string, -) error { - oidcOrgID, err := util.GetOrgIDFromOIDC(ctx) - if err != nil { - return err - } - - profile, err := c.accessOIDCProfile(profileID, oidcOrgID) - if err != nil { - return err - } - - var req PushedAuthorizationRequest - - if err = ctx.Bind(&req); err != nil { - return resterr.NewValidationError(resterr.InvalidValue, "request", err) - } - - return util.WriteOutput(ctx)(c.handlePAR(req.AuthorizationDetails, req.OpState, profile)) -} - -func (c *Controller) handlePAR( - authorizationDetails string, - opState string, - profile *profileapi.Issuer, -) (*PushedAuthorizationResponse, error) { - if !profile.Active { - return nil, resterr.NewValidationError(resterr.ConditionNotMet, "profile.Active", - errors.New("profile should be active")) - } - - if profile.OIDCConfig == nil { - return nil, resterr.NewValidationError(resterr.ConditionNotMet, "profile.OIDCConfig", - errors.New("OIDC not configured")) - } - - if profile.VCConfig == nil { - return nil, resterr.NewValidationError(resterr.ConditionNotMet, "profile.VCConfig", - errors.New("VC not configured")) - } - - ad, err := validateAuthorizationDetails(authorizationDetails, profile) - if err != nil { - return nil, err - } - - resp, err := c.oidc4VCService.HandlePAR(&oidc4vc.PushedAuthorizationRequest{ - AuthorizationDetails: ad, - OpState: opState, - }, profile) - if err != nil { - return nil, resterr.NewSystemError("OIDC4VCService", "HandlePAR", err) - } - - return &PushedAuthorizationResponse{ - RequestUri: resp.RequestURI, - }, nil -} - -// AuthorizationDetailsParam is a model for the credential details param the wallet wants to obtain. -type AuthorizationDetailsParam struct { - Type string `json:"type"` - CredentialType string `json:"credential_type"` - Format *string `json:"format,omitempty"` - Locations *[]string `json:"locations,omitempty"` -} - -func validateAuthorizationDetails( - authorizationDetails string, - profile *profileapi.Issuer, -) (*oidc4vc.AuthorizationDetails, error) { - var param AuthorizationDetailsParam - - if err := json.Unmarshal([]byte(authorizationDetails), ¶m); err != nil { - return nil, resterr.NewValidationError(resterr.InvalidValue, "authorization_details", err) - } - - if param.Type != "openid_credential" { - return nil, resterr.NewValidationError(resterr.InvalidValue, "authorization_details.type", - errors.New("type should be 'openid_credential'")) - } - - var ( - vcFormat vcsverifiable.Format - err error - ) - - if param.Format != nil { - vcFormat, err = common.ValidateVCFormat(common.VCFormat(*param.Format)) - if err != nil { - return nil, resterr.NewValidationError(resterr.InvalidValue, "authorization_details.format", err) - } - - if vcFormat != profile.VCConfig.Format { - return nil, resterr.NewValidationError(resterr.InvalidValue, "authorization_details.format", - errors.New("format not supported by profile")) - } - } else { - vcFormat = profile.VCConfig.Format - } - - return &oidc4vc.AuthorizationDetails{ - Type: param.Type, - CredentialType: param.CredentialType, // TODO: Check if credential type is supported by the profile - Format: vcFormat, - Locations: lo.FromPtr(param.Locations), - }, nil -} - func (c *Controller) accessProfile(profileID string) (*profileapi.Issuer, error) { profile, err := c.profileSvc.GetProfile(profileID) if err != nil { diff --git a/pkg/restapi/v1/issuer/controller_test.go b/pkg/restapi/v1/issuer/controller_test.go index 7fc474e4e..ace795569 100644 --- a/pkg/restapi/v1/issuer/controller_test.go +++ b/pkg/restapi/v1/issuer/controller_test.go @@ -14,7 +14,6 @@ import ( "io" "net/http" "net/http/httptest" - "net/url" "testing" "github.com/golang/mock/gomock" @@ -432,7 +431,7 @@ func TestController_PostIssuerProfilesProfileIDInteractionsInitiateOidc(t *testi }) require.NoError(t, err) - info := &oidc4vc.InitiateIssuanceInfo{ + info := &oidc4vc.InitiateIssuanceResponse{ InitiateIssuanceURL: "https://wallet.example.com/initiate_issuance", TxID: "txID", } @@ -445,7 +444,7 @@ func TestController_PostIssuerProfilesProfileIDInteractionsInitiateOidc(t *testi t.Run("Success", func(t *testing.T) { mockProfileSvc.EXPECT().GetProfile("profileID").Times(1).Return(issuerProfile, nil) - mockOIDC4VCSvc.EXPECT().InitiateOIDCInteraction(gomock.Any()).Times(1).Return(info, nil) + mockOIDC4VCSvc.EXPECT().InitiateInteraction(gomock.Any(), gomock.Any()).Times(1).Return(info, nil) controller := NewController(&Config{ ProfileSvc: mockProfileSvc, @@ -468,7 +467,7 @@ func TestController_PostIssuerProfilesProfileIDInteractionsInitiateOidc(t *testi name: "Missing authorization", setup: func() { mockProfileSvc.EXPECT().GetProfile(gomock.Any()).Times(0) - mockOIDC4VCSvc.EXPECT().InitiateOIDCInteraction(gomock.Any()).Times(0) + mockOIDC4VCSvc.EXPECT().InitiateInteraction(gomock.Any(), gomock.Any()).Times(0) c = echoContext(withRequestBody(req), withOrgID("")) }, check: func(t *testing.T, err error) { @@ -479,7 +478,7 @@ func TestController_PostIssuerProfilesProfileIDInteractionsInitiateOidc(t *testi name: "Invalid profile", setup: func() { mockProfileSvc.EXPECT().GetProfile(gomock.Any()).Times(1).Return(issuerProfile, nil) - mockOIDC4VCSvc.EXPECT().InitiateOIDCInteraction(gomock.Any()).Times(0) + mockOIDC4VCSvc.EXPECT().InitiateInteraction(gomock.Any(), gomock.Any()).Times(0) c = echoContext(withRequestBody(req), withOrgID("invalid")) }, check: func(t *testing.T, err error) { @@ -491,7 +490,7 @@ func TestController_PostIssuerProfilesProfileIDInteractionsInitiateOidc(t *testi name: "Profile does not exist in the underlying storage", setup: func() { mockProfileSvc.EXPECT().GetProfile(gomock.Any()).Times(1).Return(nil, errors.New("not found")) - mockOIDC4VCSvc.EXPECT().InitiateOIDCInteraction(gomock.Any()).Times(0) + mockOIDC4VCSvc.EXPECT().InitiateInteraction(gomock.Any(), gomock.Any()).Times(0) c = echoContext(withRequestBody(req)) }, check: func(t *testing.T, err error) { @@ -503,7 +502,7 @@ func TestController_PostIssuerProfilesProfileIDInteractionsInitiateOidc(t *testi name: "Get profile error", setup: func() { mockProfileSvc.EXPECT().GetProfile(gomock.Any()).Times(1).Return(nil, errors.New("get profile error")) - mockOIDC4VCSvc.EXPECT().InitiateOIDCInteraction(gomock.Any()).Times(0) + mockOIDC4VCSvc.EXPECT().InitiateInteraction(gomock.Any(), gomock.Any()).Times(0) c = echoContext(withRequestBody(req)) }, check: func(t *testing.T, err error) { @@ -521,7 +520,7 @@ func TestController_PostIssuerProfilesProfileIDInteractionsInitiateOidc(t *testi OIDCConfig: &profileapi.OIDC4VCConfig{}, }, nil) - mockOIDC4VCSvc.EXPECT().InitiateOIDCInteraction(gomock.Any()).Times(0) + mockOIDC4VCSvc.EXPECT().InitiateInteraction(gomock.Any(), gomock.Any()).Times(0) c = echoContext(withRequestBody(req)) }, check: func(t *testing.T, err error) { @@ -538,7 +537,7 @@ func TestController_PostIssuerProfilesProfileIDInteractionsInitiateOidc(t *testi Active: true, }, nil) - mockOIDC4VCSvc.EXPECT().InitiateOIDCInteraction(gomock.Any()).Times(0) + mockOIDC4VCSvc.EXPECT().InitiateInteraction(gomock.Any(), gomock.Any()).Times(0) c = echoContext(withRequestBody(req)) }, check: func(t *testing.T, err error) { @@ -557,7 +556,7 @@ func TestController_PostIssuerProfilesProfileIDInteractionsInitiateOidc(t *testi CredentialTemplates: []*verifiable.Credential{}, }, nil) - mockOIDC4VCSvc.EXPECT().InitiateOIDCInteraction(gomock.Any()).Times(0) + mockOIDC4VCSvc.EXPECT().InitiateInteraction(gomock.Any(), gomock.Any()).Times(0) c = echoContext(withRequestBody(req)) }, check: func(t *testing.T, err error) { @@ -583,7 +582,7 @@ func TestController_PostIssuerProfilesProfileIDInteractionsInitiateOidc(t *testi }, }, nil) - mockOIDC4VCSvc.EXPECT().InitiateOIDCInteraction(gomock.Any()).Times(0) + mockOIDC4VCSvc.EXPECT().InitiateInteraction(gomock.Any(), gomock.Any()).Times(0) r, marshalErr := json.Marshal(&InitiateOIDC4VCRequest{}) require.NoError(t, marshalErr) @@ -599,7 +598,7 @@ func TestController_PostIssuerProfilesProfileIDInteractionsInitiateOidc(t *testi name: "Credential template not found", setup: func() { mockProfileSvc.EXPECT().GetProfile(gomock.Any()).Times(1).Return(issuerProfile, nil) - mockOIDC4VCSvc.EXPECT().InitiateOIDCInteraction(gomock.Any()).Times(0) + mockOIDC4VCSvc.EXPECT().InitiateInteraction(gomock.Any(), gomock.Any()).Times(0) r, marshalErr := json.Marshal(&InitiateOIDC4VCRequest{CredentialTemplateId: lo.ToPtr("invalid")}) require.NoError(t, marshalErr) @@ -615,7 +614,7 @@ func TestController_PostIssuerProfilesProfileIDInteractionsInitiateOidc(t *testi name: "Service error", setup: func() { mockProfileSvc.EXPECT().GetProfile(gomock.Any()).Times(1).Return(issuerProfile, nil) - mockOIDC4VCSvc.EXPECT().InitiateOIDCInteraction(gomock.Any()).Times(1).Return(nil, errors.New("service error")) + mockOIDC4VCSvc.EXPECT().InitiateInteraction(gomock.Any(), gomock.Any()).Times(1).Return(nil, errors.New("service error")) //nolint:lll c = echoContext(withRequestBody(req)) }, check: func(t *testing.T, err error) { @@ -640,285 +639,9 @@ func TestController_PostIssuerProfilesProfileIDInteractionsInitiateOidc(t *testi }) } -func TestController_PostIssuerProfilesProfileIDInteractionsPushAuthorizationRequest(t *testing.T) { - var ( - mockProfileSvc = NewMockProfileService(gomock.NewController(t)) - mockOIDC4VCSvc = NewMockOIDC4VCService(gomock.NewController(t)) - c echo.Context - ) - - tests := []struct { - name string - setup func() - check func(t *testing.T, err error) - }{ - { - name: "Success", - setup: func() { - mockProfileSvc.EXPECT().GetProfile("profileID").Times(1).Return(&profileapi.Issuer{ - OrganizationID: orgID, - ID: "profileID", - Active: true, - OIDCConfig: &profileapi.OIDC4VCConfig{}, - VCConfig: &profileapi.VCConfig{Format: vcsverifiable.Ldp}, - CredentialTemplates: []*verifiable.Credential{}, - }, nil) - - mockOIDC4VCSvc.EXPECT().HandlePAR(gomock.Any(), gomock.Any()).Times(1). - Return(&oidc4vc.PushedAuthorizationResponse{}, nil) - - q := url.Values{} - q.Set("op_state", "eyJhbGciOiJSU0Et") - q.Set("authorization_details", `{"credential_type":"https://did.example.org/healthCard","format":"ldp_vc","locations":[],"type":"openid_credential"}`) //nolint:lll - - c = echoContext(withRequestBody([]byte(q.Encode())), withContentType(echo.MIMEApplicationForm)) - }, - check: func(t *testing.T, err error) { - require.NoError(t, err) - }, - }, - { - name: "Missing authorization", - setup: func() { - mockProfileSvc.EXPECT().GetProfile(gomock.Any()).Times(0) - mockOIDC4VCSvc.EXPECT().HandlePAR(gomock.Any(), gomock.Any()).Times(0) - - q := url.Values{} - q.Set("op_state", "eyJhbGciOiJSU0Et") - q.Set("authorization_details", `{"credential_type":"https://did.example.org/healthCard","format":"ldp_vc","locations":[],"type":"openid_credential"}`) //nolint:lll - - c = echoContext(withRequestBody([]byte(q.Encode())), withContentType(echo.MIMEApplicationForm), - withOrgID("")) - }, - check: func(t *testing.T, err error) { - require.Error(t, err) - require.Contains(t, err.Error(), "missing authorization") - }, - }, - { - name: "Get profile error", - setup: func() { - mockProfileSvc.EXPECT().GetProfile(gomock.Any()).Times(1).Return(nil, errors.New("get profile error")) - mockOIDC4VCSvc.EXPECT().HandlePAR(gomock.Any(), gomock.Any()).Times(0) - - q := url.Values{} - q.Set("op_state", "eyJhbGciOiJSU0Et") - q.Set("authorization_details", `{"credential_type":"https://did.example.org/healthCard","format":"ldp_vc","locations":[],"type":"openid_credential"}`) //nolint:lll - - c = echoContext(withRequestBody([]byte(q.Encode())), withContentType(echo.MIMEApplicationForm)) - }, - check: func(t *testing.T, err error) { - require.Error(t, err) - require.Contains(t, err.Error(), "get profile error") - }, - }, - { - name: "Profile is not active", - setup: func() { - mockProfileSvc.EXPECT().GetProfile("profileID").Times(1).Return(&profileapi.Issuer{ - OrganizationID: orgID, - ID: "profileID", - Active: false, - }, nil) - - mockOIDC4VCSvc.EXPECT().HandlePAR(gomock.Any(), gomock.Any()).Times(0) - - q := url.Values{} - q.Set("op_state", "eyJhbGciOiJSU0Et") - q.Set("authorization_details", `{"credential_type":"https://did.example.org/healthCard","format":"ldp_vc","locations":[],"type":"openid_credential"}`) //nolint:lll - - c = echoContext(withRequestBody([]byte(q.Encode())), withContentType(echo.MIMEApplicationForm)) - }, - check: func(t *testing.T, err error) { - require.Error(t, err) - require.Contains(t, err.Error(), "profile should be active") - }, - }, - { - name: "OIDC is not configured", - setup: func() { - mockProfileSvc.EXPECT().GetProfile("profileID").Times(1).Return(&profileapi.Issuer{ - OrganizationID: orgID, - ID: "profileID", - Active: true, - }, nil) - - mockOIDC4VCSvc.EXPECT().HandlePAR(gomock.Any(), gomock.Any()).Times(0) - - q := url.Values{} - q.Set("op_state", "eyJhbGciOiJSU0Et") - q.Set("authorization_details", `{"credential_type":"https://did.example.org/healthCard","format":"ldp_vc","locations":[],"type":"openid_credential"}`) //nolint:lll - - c = echoContext(withRequestBody([]byte(q.Encode())), withContentType(echo.MIMEApplicationForm)) - }, - check: func(t *testing.T, err error) { - require.Error(t, err) - require.Contains(t, err.Error(), "OIDC not configured") - }, - }, - { - name: "VC is not configured", - setup: func() { - mockProfileSvc.EXPECT().GetProfile("profileID").Times(1).Return(&profileapi.Issuer{ - OrganizationID: orgID, - ID: "profileID", - Active: true, - OIDCConfig: &profileapi.OIDC4VCConfig{}, - }, nil) - - mockOIDC4VCSvc.EXPECT().HandlePAR(gomock.Any(), gomock.Any()).Times(0) - - q := url.Values{} - q.Set("op_state", "eyJhbGciOiJSU0Et") - q.Set("authorization_details", `{"credential_type":"https://did.example.org/healthCard","format":"ldp_vc","locations":[],"type":"openid_credential"}`) //nolint:lll - - c = echoContext(withRequestBody([]byte(q.Encode())), withContentType(echo.MIMEApplicationForm)) - }, - check: func(t *testing.T, err error) { - require.Error(t, err) - require.Contains(t, err.Error(), "VC not configured") - }, - }, - { - name: "invalid authorization_details", - setup: func() { - mockProfileSvc.EXPECT().GetProfile("profileID").Times(1).Return(&profileapi.Issuer{ - OrganizationID: orgID, - ID: "profileID", - Active: true, - OIDCConfig: &profileapi.OIDC4VCConfig{}, - VCConfig: &profileapi.VCConfig{Format: vcsverifiable.Ldp}, - }, nil) - - mockOIDC4VCSvc.EXPECT().HandlePAR(gomock.Any(), gomock.Any()).Times(0) - - q := url.Values{} - q.Set("op_state", "eyJhbGciOiJSU0Et") - q.Set("authorization_details", "invalid") - - c = echoContext(withRequestBody([]byte(q.Encode())), withContentType(echo.MIMEApplicationForm)) - }, - check: func(t *testing.T, err error) { - require.Error(t, err) - }, - }, - { - name: "invalid authorization_details.type", - setup: func() { - mockProfileSvc.EXPECT().GetProfile("profileID").Times(1).Return(&profileapi.Issuer{ - OrganizationID: orgID, - ID: "profileID", - Active: true, - OIDCConfig: &profileapi.OIDC4VCConfig{}, - VCConfig: &profileapi.VCConfig{Format: vcsverifiable.Ldp}, - }, nil) - - mockOIDC4VCSvc.EXPECT().HandlePAR(gomock.Any(), gomock.Any()).Times(0) - - q := url.Values{} - q.Set("op_state", "eyJhbGciOiJSU0Et") - q.Set("authorization_details", `{"credential_type":"https://did.example.org/healthCard","format":"ldp_vc","locations":[],"type":"invalid"}`) //nolint:lll - - c = echoContext(withRequestBody([]byte(q.Encode())), withContentType(echo.MIMEApplicationForm)) - }, - check: func(t *testing.T, err error) { - require.Error(t, err) - require.Contains(t, err.Error(), "type should be 'openid_credential'") - }, - }, - { - name: "invalid authorization_details.format", - setup: func() { - mockProfileSvc.EXPECT().GetProfile("profileID").Times(1).Return(&profileapi.Issuer{ - OrganizationID: orgID, - ID: "profileID", - Active: true, - OIDCConfig: &profileapi.OIDC4VCConfig{}, - VCConfig: &profileapi.VCConfig{Format: vcsverifiable.Ldp}, - }, nil) - - mockOIDC4VCSvc.EXPECT().HandlePAR(gomock.Any(), gomock.Any()).Times(0) - - q := url.Values{} - q.Set("op_state", "eyJhbGciOiJSU0Et") - q.Set("authorization_details", `{"credential_type":"https://did.example.org/healthCard","format":"invalid","locations":[],"type":"openid_credential"}`) //nolint:lll - - c = echoContext(withRequestBody([]byte(q.Encode())), withContentType(echo.MIMEApplicationForm)) - }, - check: func(t *testing.T, err error) { - require.Error(t, err) - require.Contains(t, err.Error(), "unsupported vc format") - }, - }, - { - name: "format not supported by profile", - setup: func() { - mockProfileSvc.EXPECT().GetProfile("profileID").Times(1).Return(&profileapi.Issuer{ - OrganizationID: orgID, - ID: "profileID", - Active: true, - OIDCConfig: &profileapi.OIDC4VCConfig{}, - VCConfig: &profileapi.VCConfig{Format: vcsverifiable.Jwt}, - }, nil) - - mockOIDC4VCSvc.EXPECT().HandlePAR(gomock.Any(), gomock.Any()).Times(0) - - q := url.Values{} - q.Set("op_state", "eyJhbGciOiJSU0Et") - q.Set("authorization_details", `{"credential_type":"https://did.example.org/healthCard","format":"ldp_vc","locations":[],"type":"openid_credential"}`) //nolint:lll - - c = echoContext(withRequestBody([]byte(q.Encode())), withContentType(echo.MIMEApplicationForm)) - }, - check: func(t *testing.T, err error) { - require.Error(t, err) - require.Contains(t, err.Error(), "format not supported by profile") - }, - }, - { - name: "service error", - setup: func() { - mockProfileSvc.EXPECT().GetProfile("profileID").Times(1).Return(&profileapi.Issuer{ - OrganizationID: orgID, - ID: "profileID", - Active: true, - OIDCConfig: &profileapi.OIDC4VCConfig{}, - VCConfig: &profileapi.VCConfig{Format: vcsverifiable.Ldp}, - }, nil) - - mockOIDC4VCSvc.EXPECT().HandlePAR(gomock.Any(), gomock.Any()).Times(1). - Return(nil, errors.New("service error")) - - q := url.Values{} - q.Set("op_state", "eyJhbGciOiJSU0Et") - q.Set("authorization_details", `{"credential_type":"https://did.example.org/healthCard","locations":[],"type":"openid_credential"}`) //nolint:lll - - c = echoContext(withRequestBody([]byte(q.Encode())), withContentType(echo.MIMEApplicationForm)) - }, - check: func(t *testing.T, err error) { - require.Error(t, err) - require.Contains(t, err.Error(), "service error") - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - tt.setup() - - controller := NewController(&Config{ - ProfileSvc: mockProfileSvc, - OIDC4VCService: mockOIDC4VCSvc, - }) - - err := controller.PostIssuerProfilesProfileIDInteractionsPushAuthorizationRequest(c, "profileID") - tt.check(t, err) - }) - } -} - type options struct { orgID string requestBody []byte - contentType string } type contextOpt func(*options) @@ -935,16 +658,9 @@ func withRequestBody(body []byte) contextOpt { } } -func withContentType(contentType string) contextOpt { //nolint:unparam - return func(o *options) { - o.contentType = contentType - } -} - func echoContext(opts ...contextOpt) echo.Context { o := &options{ - orgID: orgID, - contentType: echo.MIMEApplicationJSON, + orgID: orgID, } for _, fn := range opts { @@ -960,7 +676,7 @@ func echoContext(opts ...contextOpt) echo.Context { } req := httptest.NewRequest(http.MethodPost, "/", body) - req.Header.Set(echo.HeaderContentType, o.contentType) + req.Header.Set(echo.HeaderContentType, echo.MIMEApplicationJSON) if o.orgID != "" { req.Header.Set("X-User", o.orgID) diff --git a/pkg/restapi/v1/issuer/openapi.gen.go b/pkg/restapi/v1/issuer/openapi.gen.go index 974802b17..83a023662 100644 --- a/pkg/restapi/v1/issuer/openapi.gen.go +++ b/pkg/restapi/v1/issuer/openapi.gen.go @@ -88,15 +88,6 @@ type IssueCredentialOptions struct { VerificationMethod *string `json:"verificationMethod,omitempty"` } -// Model for Pushed Authorization Response. -type PushedAuthorizationResponse struct { - // A JSON number that represents the lifetime of the request URI in seconds as a positive integer. The request URI lifetime is at the discretion of the authorization server but will typically be relatively short (e.g., between 5 and 600 seconds). - ExpiresIn int `json:"expires_in"` - - // The request URI corresponding to the authorization request posted. This URI is a single-use reference to the respective request data in the subsequent authorization request. - RequestUri string `json:"request_uri"` -} - // UpdateCredentialStatusRequest request struct for updating VC status. type UpdateCredentialStatusRequest struct { CredentialID string `json:"credentialID"` @@ -137,9 +128,6 @@ type ServerInterface interface { // Initiate OIDC Credential Issuance // (POST /issuer/profiles/{profileID}/interactions/initiate-oidc) PostIssuerProfilesProfileIDInteractionsInitiateOidc(ctx echo.Context, profileID string) error - // Pushed Authorization Request - // (POST /issuer/profiles/{profileID}/interactions/push-authorization-request) - PostIssuerProfilesProfileIDInteractionsPushAuthorizationRequest(ctx echo.Context, profileID string) error } // ServerInterfaceWrapper converts echo contexts to parameters. @@ -219,22 +207,6 @@ func (w *ServerInterfaceWrapper) PostIssuerProfilesProfileIDInteractionsInitiate return err } -// PostIssuerProfilesProfileIDInteractionsPushAuthorizationRequest converts echo context to params. -func (w *ServerInterfaceWrapper) PostIssuerProfilesProfileIDInteractionsPushAuthorizationRequest(ctx echo.Context) error { - var err error - // ------------- Path parameter "profileID" ------------- - var profileID string - - err = runtime.BindStyledParameterWithLocation("simple", false, "profileID", runtime.ParamLocationPath, ctx.Param("profileID"), &profileID) - if err != nil { - return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter profileID: %s", err)) - } - - // Invoke the callback with all the unmarshalled arguments - err = w.Handler.PostIssuerProfilesProfileIDInteractionsPushAuthorizationRequest(ctx, profileID) - return err -} - // This is a simple interface which specifies echo.Route addition functions which // are present on both echo.Echo and echo.Group, since we want to allow using // either of them for path registration @@ -267,6 +239,5 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL router.POST(baseURL+"/issuer/profiles/:profileID/credentials/status", wrapper.PostCredentialsStatus) router.GET(baseURL+"/issuer/profiles/:profileID/credentials/status/:statusID", wrapper.GetCredentialsStatus) router.POST(baseURL+"/issuer/profiles/:profileID/interactions/initiate-oidc", wrapper.PostIssuerProfilesProfileIDInteractionsInitiateOidc) - router.POST(baseURL+"/issuer/profiles/:profileID/interactions/push-authorization-request", wrapper.PostIssuerProfilesProfileIDInteractionsPushAuthorizationRequest) } diff --git a/pkg/restapi/v1/oidc4vc/controller.go b/pkg/restapi/v1/oidc4vc/controller.go index 5d75e8523..778acfab8 100644 --- a/pkg/restapi/v1/oidc4vc/controller.go +++ b/pkg/restapi/v1/oidc4vc/controller.go @@ -5,80 +5,160 @@ SPDX-License-Identifier: Apache-2.0 */ //go:generate oapi-codegen --config=openapi.cfg.yaml ../../../../docs/v1/openapi.yaml +//go:generate mockgen -destination controller_mocks_test.go -self_package mocks -package oidc4vc_test -source=controller.go -mock_names oidc4VCService=MockOIDC4VCService + package oidc4vc import ( + "context" + "encoding/json" + "errors" + "github.com/labstack/echo/v4" "github.com/ory/fosite" + "github.com/samber/lo" + + "github.com/trustbloc/vcs/pkg/restapi/resterr" + "github.com/trustbloc/vcs/pkg/restapi/v1/common" + "github.com/trustbloc/vcs/pkg/service/oidc4vc" ) var _ ServerInterface = (*Controller)(nil) // make sure Controller implements ServerInterface +type oidc4VCService interface { + HandlePAR(ctx context.Context, opState string, ad *oidc4vc.AuthorizationDetails) (oidc4vc.TxID, error) +} + // Config holds configuration options for Controller. type Config struct { OAuth2Provider fosite.OAuth2Provider + OIDC4VCService oidc4VCService } // Controller for OpenID for VC Issuance API. type Controller struct { oauth2Provider fosite.OAuth2Provider + oidc4VCService oidc4VCService } // NewController creates a new Controller instance. func NewController(config *Config) (*Controller, error) { return &Controller{ oauth2Provider: config.OAuth2Provider, + oidc4VCService: config.OIDC4VCService, }, nil } -// GetOidcAuthorize handles Authorization Request (GET /oidc/authorize). -func (c *Controller) GetOidcAuthorize(e echo.Context, params GetOidcAuthorizeParams) error { +// PostOidcPar handles Pushed Authorization Request for OIDC4VC (POST /oidc/par). +func (c *Controller) PostOidcPar(e echo.Context) error { req := e.Request() ctx := req.Context() - ar, err := c.oauth2Provider.NewAuthorizeRequest(ctx, req) + ar, err := c.oauth2Provider.NewPushedAuthorizeRequest(ctx, req) if err != nil { - c.oauth2Provider.WriteAuthorizeError(ctx, e.Response().Writer, ar, err) + c.oauth2Provider.WritePushedAuthorizeError(ctx, e.Response().Writer, ar, err) return nil } - var session fosite.DefaultSession + var par PushedAuthorizationRequest - resp, err := c.oauth2Provider.NewAuthorizeResponse(ctx, ar, &session) + if err = e.Bind(&par); err != nil { + c.oauth2Provider.WritePushedAuthorizeError(ctx, e.Response().Writer, ar, err) + + return nil + } + + ad, err := validateAuthorizationDetails(par.AuthorizationDetails) if err != nil { - c.oauth2Provider.WriteAuthorizeError(ctx, e.Response().Writer, ar, err) + c.oauth2Provider.WritePushedAuthorizeError(ctx, e.Response().Writer, ar, err) return nil } - c.oauth2Provider.WriteAuthorizeResponse(ctx, e.Response().Writer, ar, resp) + txID, err := c.oidc4VCService.HandlePAR(ctx, par.OpState, ad) + if err != nil { + c.oauth2Provider.WritePushedAuthorizeError(ctx, e.Response().Writer, ar, err) + + return nil + } + + session := &oidc4vc.Session{ + DefaultSession: new(fosite.DefaultSession), + TxID: txID, + } + + resp, err := c.oauth2Provider.NewPushedAuthorizeResponse(ctx, ar, session) + if err != nil { + c.oauth2Provider.WritePushedAuthorizeError(ctx, e.Response().Writer, ar, err) + + return nil + } + + c.oauth2Provider.WritePushedAuthorizeResponse(ctx, e.Response().Writer, ar, resp) return nil } -// PostOidcPar handles Pushed Authorization Request (POST /oidc/par). -func (c *Controller) PostOidcPar(e echo.Context) error { +func validateAuthorizationDetails(authorizationDetails string) (*oidc4vc.AuthorizationDetails, error) { + var param AuthorizationDetails + + if err := json.Unmarshal([]byte(authorizationDetails), ¶m); err != nil { + return nil, resterr.NewValidationError(resterr.InvalidValue, "authorization_details", err) + } + + if param.Type != "openid_credential" { + return nil, resterr.NewValidationError(resterr.InvalidValue, "authorization_details.type", + errors.New("type should be 'openid_credential'")) + } + + ad := &oidc4vc.AuthorizationDetails{ + Type: param.Type, + CredentialType: param.CredentialType, + Locations: lo.FromPtr(param.Locations), + } + + if param.Format != nil { + vcFormat, err := common.ValidateVCFormat(common.VCFormat(*param.Format)) + if err != nil { + return nil, resterr.NewValidationError(resterr.InvalidValue, "authorization_details.format", err) + } + + ad.Format = vcFormat + } + + return ad, nil +} + +// GetOidcAuthorize handles Authorization Request (GET /oidc/authorize). +func (c *Controller) GetOidcAuthorize(e echo.Context, params GetOidcAuthorizeParams) error { req := e.Request() ctx := req.Context() - ar, err := c.oauth2Provider.NewPushedAuthorizeRequest(ctx, req) + ar, err := c.oauth2Provider.NewAuthorizeRequest(ctx, req) if err != nil { - c.oauth2Provider.WritePushedAuthorizeError(ctx, e.Response().Writer, ar, err) + c.oauth2Provider.WriteAuthorizeError(ctx, e.Response().Writer, ar, err) return nil } - var session fosite.DefaultSession + // TODO: login and get consent from the user - resp, err := c.oauth2Provider.NewPushedAuthorizeResponse(ctx, ar, &session) + session, ok := ar.GetSession().(*oidc4vc.Session) + if !ok { + session = &oidc4vc.Session{ + DefaultSession: new(fosite.DefaultSession), + } + } + + resp, err := c.oauth2Provider.NewAuthorizeResponse(ctx, ar, session) if err != nil { - c.oauth2Provider.WritePushedAuthorizeError(ctx, e.Response().Writer, ar, err) + c.oauth2Provider.WriteAuthorizeError(ctx, e.Response().Writer, ar, err) return nil } - c.oauth2Provider.WritePushedAuthorizeResponse(ctx, e.Response().Writer, ar, resp) + c.oauth2Provider.WriteAuthorizeResponse(ctx, e.Response().Writer, ar, resp) return nil } @@ -88,9 +168,11 @@ func (c *Controller) PostOidcToken(e echo.Context) error { req := e.Request() ctx := req.Context() - var session fosite.DefaultSession + session := &oidc4vc.Session{ + DefaultSession: new(fosite.DefaultSession), + } - ar, err := c.oauth2Provider.NewAccessRequest(ctx, req, &session) + ar, err := c.oauth2Provider.NewAccessRequest(ctx, req, session) if err != nil { c.oauth2Provider.WriteAccessError(ctx, e.Response().Writer, ar, err) diff --git a/pkg/restapi/v1/oidc4vc/controller_test.go b/pkg/restapi/v1/oidc4vc/controller_test.go index 6ed894fc8..3c7cd137f 100644 --- a/pkg/restapi/v1/oidc4vc/controller_test.go +++ b/pkg/restapi/v1/oidc4vc/controller_test.go @@ -7,9 +7,11 @@ SPDX-License-Identifier: Apache-2.0 package oidc4vc_test import ( + "context" "crypto/rand" "encoding/base64" "encoding/json" + "errors" "io" "net/http" "net/http/httptest" @@ -18,6 +20,7 @@ import ( "testing" "time" + "github.com/golang/mock/gomock" "github.com/labstack/echo/v4" "github.com/ory/fosite" "github.com/ory/fosite/compose" @@ -28,6 +31,7 @@ import ( "golang.org/x/oauth2" "github.com/trustbloc/vcs/pkg/restapi/v1/oidc4vc" + oidc4vcapi "github.com/trustbloc/vcs/pkg/service/oidc4vc" ) const ( @@ -59,6 +63,113 @@ var store = &storage.MemoryStore{ PARSessions: map[string]fosite.AuthorizeRequester{}, } +func TestPushedAuthorizedRequest(t *testing.T) { + mockOIDC4VCService := NewMockOIDC4VCService(gomock.NewController(t)) + + srv := testServer(t, withOIDC4VCService(mockOIDC4VCService)) + defer srv.Close() + + var ( + oauthClient *oauth2.Config + ad string + ) + + tests := []struct { + name string + setup func() + statusCode int + }{ + { + name: "success", + setup: func() { + oauthClient = newOAuth2Client(srv.URL) + + mockOIDC4VCService.EXPECT().HandlePAR(gomock.Any(), gomock.Any(), gomock.Any()). + Return(oidc4vcapi.TxID("txID"), nil) + + ad = `{"type":"openid_credential","credential_type":"https://did.example.org/healthCard","format":"ldp_vc","locations":[]}` //nolint:lll + }, + statusCode: http.StatusCreated, + }, + { + name: "service error", + setup: func() { + oauthClient = newOAuth2Client(srv.URL) + + mockOIDC4VCService.EXPECT().HandlePAR(gomock.Any(), gomock.Any(), gomock.Any()). + Return(oidc4vcapi.TxID(""), errors.New("service error")) + }, + statusCode: http.StatusInternalServerError, + }, + { + name: "invalid client", + setup: func() { + oauthClient = newOAuth2Client(srv.URL, withClientID("invalid-client")) + mockOIDC4VCService.EXPECT().HandlePAR(gomock.Any(), gomock.Any(), gomock.Any()).Times(0) + ad = `{"type":"openid_credential","credential_type":"https://did.example.org/healthCard","locations":[]}` //nolint:lll + }, + statusCode: http.StatusUnauthorized, + }, + { + name: "fail to unmarshal authorization_details", + setup: func() { + oauthClient = newOAuth2Client(srv.URL) + mockOIDC4VCService.EXPECT().HandlePAR(gomock.Any(), gomock.Any(), gomock.Any()).Times(0) + ad = "invalid json" + }, + statusCode: http.StatusInternalServerError, + }, + { + name: "invalid authorization_details.type", + setup: func() { + oauthClient = newOAuth2Client(srv.URL) + mockOIDC4VCService.EXPECT().HandlePAR(gomock.Any(), gomock.Any(), gomock.Any()).Times(0) + ad = `{"type":"invalid","credential_type":"https://did.example.org/healthCard","locations":[]}` + }, + statusCode: http.StatusInternalServerError, + }, + { + name: "invalid authorization_details.format", + setup: func() { + oauthClient = newOAuth2Client(srv.URL) + mockOIDC4VCService.EXPECT().HandlePAR(gomock.Any(), gomock.Any(), gomock.Any()).Times(0) + ad = `{"type":"openid_credential","credential_type":"https://did.example.org/healthCard","format":"invalid","locations":[]}` //nolint:lll + }, + statusCode: http.StatusInternalServerError, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tt.setup() + + query := url.Values{} + query.Set("client_id", oauthClient.ClientID) + query.Set("client_secret", oauthClient.ClientSecret) + query.Set("response_type", "code") + query.Set("state", nonce()) + query.Set("scope", strings.Join(oauthClient.Scopes, " ")) + query.Set("redirect_uri", oauthClient.RedirectURL) + query.Set("authorization_details", ad) + + req, err := http.NewRequest(http.MethodPost, srv.URL+"/oidc/par", strings.NewReader(query.Encode())) + require.NoError(t, err) + + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + + resp, err := http.DefaultClient.Do(req) + require.NoError(t, err) + + defer func() { + if closeErr := resp.Body.Close(); closeErr != nil { + t.Logf("Failed to close response body: %s", closeErr) + } + }() + + require.Equal(t, tt.statusCode, resp.StatusCode) + }) + } +} + func TestAuthorizeRequest(t *testing.T) { srv := testServer(t) defer srv.Close() @@ -177,66 +288,11 @@ func TestTokenRequest(t *testing.T) { } } -func TestPushedAuthorizedRequest(t *testing.T) { - srv := testServer(t) - defer srv.Close() - - var oauthClient *oauth2.Config - - tests := []struct { - name string - setup func() - statusCode int - }{ - { - name: "success", - setup: func() { - oauthClient = newOAuth2Client(srv.URL) - }, - statusCode: http.StatusCreated, - }, - { - name: "invalid client", - setup: func() { - oauthClient = newOAuth2Client(srv.URL, withClientID("invalid-client")) - }, - statusCode: http.StatusUnauthorized, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - tt.setup() - - query := url.Values{} - query.Set("client_id", oauthClient.ClientID) - query.Set("client_secret", oauthClient.ClientSecret) - query.Set("response_type", "code") - query.Set("state", nonce()) - query.Set("scope", strings.Join(oauthClient.Scopes, " ")) - query.Set("redirect_uri", oauthClient.RedirectURL) - - // pushed authorization request - req, err := http.NewRequest(http.MethodPost, srv.URL+"/oidc/par", strings.NewReader(query.Encode())) - require.NoError(t, err) - - req.Header.Add("Content-Type", "application/x-www-form-urlencoded") - - resp, err := http.DefaultClient.Do(req) - require.NoError(t, err) - - defer func() { - if closeErr := resp.Body.Close(); closeErr != nil { - t.Logf("Failed to close response body: %s", closeErr) - } - }() - - require.Equal(t, tt.statusCode, resp.StatusCode) - }) - } -} - func TestAuthorizeCodeGrantFlow(t *testing.T) { - srv := testServer(t) + mockOIDC4VCService := NewMockOIDC4VCService(gomock.NewController(t)) + mockOIDC4VCService.EXPECT().HandlePAR(gomock.Any(), gomock.Any(), gomock.Any()).Times(0) + + srv := testServer(t, withOIDC4VCService(mockOIDC4VCService)) defer srv.Close() oauthClient := newOAuth2Client(srv.URL) @@ -281,7 +337,10 @@ func TestAuthorizeCodeGrantFlow(t *testing.T) { } func TestAuthorizeCodeGrantFlowWithPAR(t *testing.T) { - srv := testServer(t) + mockOIDC4VCService := NewMockOIDC4VCService(gomock.NewController(t)) + mockOIDC4VCService.EXPECT().HandlePAR(gomock.Any(), gomock.Any(), gomock.Any()).Return(oidc4vcapi.TxID("txID"), nil) + + srv := testServer(t, withOIDC4VCService(mockOIDC4VCService)) defer srv.Close() oauthClient := newOAuth2Client(srv.URL) @@ -293,9 +352,11 @@ func TestAuthorizeCodeGrantFlowWithPAR(t *testing.T) { query.Set("state", nonce()) query.Set("scope", strings.Join(oauthClient.Scopes, " ")) query.Set("redirect_uri", oauthClient.RedirectURL) + query.Set("authorization_details", `{"type":"openid_credential","credential_type":"https://did.example.org/healthCard","locations":[]}`) //nolint:lll // pushed authorization request - req, err := http.NewRequest(http.MethodPost, srv.URL+"/oidc/par", strings.NewReader(query.Encode())) + req, err := http.NewRequestWithContext(context.Background(), http.MethodPost, srv.URL+"/oidc/par", + strings.NewReader(query.Encode())) require.NoError(t, err) req.Header.Add("Content-Type", "application/x-www-form-urlencoded") @@ -335,12 +396,46 @@ func TestAuthorizeCodeGrantFlowWithPAR(t *testing.T) { require.NoError(t, err) require.Equal(t, http.StatusOK, resp.StatusCode) - // TODO: exchange authorization code for access token using oauthClient.Exchange() method + _, err = io.ReadAll(resp.Body) + require.NoError(t, err) + + // exchange authorization code for access token + token, err := oauthClient.Exchange( + context.Background(), + resp.Request.URL.Query().Get("code"), + oauth2.SetAuthURLParam("code_verifier", "xalsLDydJtHwIQZukUyj6boam5vMUaJRWv-BnGCAzcZi3ZTs"), + ) + require.NoError(t, err) + require.NotEmpty(t, token.AccessToken) +} + +type oidc4VCService interface { + HandlePAR(ctx context.Context, opState string, ad *oidc4vcapi.AuthorizationDetails) (oidc4vcapi.TxID, error) +} + +// serverOptions to customize test server. +type serverOptions struct { + oidc4VCService oidc4VCService } -func testServer(t *testing.T) *httptest.Server { +// ServerOpt configures test server options. +type ServerOpt func(options *serverOptions) + +func withOIDC4VCService(svc oidc4VCService) ServerOpt { + return func(o *serverOptions) { + o.oidc4VCService = svc + } +} + +func testServer(t *testing.T, opts ...ServerOpt) *httptest.Server { t.Helper() + op := &serverOptions{} + + for _, fn := range opts { + fn(op) + } + e := echo.New() config := new(fosite.Config) @@ -364,7 +459,10 @@ func testServer(t *testing.T) *httptest.Server { compose.PushedAuthorizeHandlerFactory, ) - controller, err := oidc4vc.NewController(&oidc4vc.Config{OAuth2Provider: oauth2Provider}) + controller, err := oidc4vc.NewController(&oidc4vc.Config{ + OAuth2Provider: oauth2Provider, + OIDC4VCService: op.oidc4VCService, + }) require.NoError(t, err) oidc4vc.RegisterHandlers(e, controller) @@ -406,22 +504,22 @@ func testServer(t *testing.T) *httptest.Server { return srv } -// options to customize OAuth2 client. -type options struct { +// clientOptions to customize OAuth2 client. +type clientOptions struct { clientID string } -// Opt configures OAuth2 client options. -type Opt func(*options) +// ClientOpt configures OAuth2 client options. +type ClientOpt func(*clientOptions) -func withClientID(clientID string) Opt { - return func(o *options) { +func withClientID(clientID string) ClientOpt { + return func(o *clientOptions) { o.clientID = clientID } } -func newOAuth2Client(serverURL string, opts ...Opt) *oauth2.Config { - op := &options{ +func newOAuth2Client(serverURL string, opts ...ClientOpt) *oauth2.Config { + op := &clientOptions{ clientID: testClientID, } diff --git a/pkg/restapi/v1/oidc4vc/models.go b/pkg/restapi/v1/oidc4vc/models.go new file mode 100644 index 000000000..1040062d9 --- /dev/null +++ b/pkg/restapi/v1/oidc4vc/models.go @@ -0,0 +1,27 @@ +/* +Copyright Avast Software. All Rights Reserved. + +SPDX-License-Identifier: Apache-2.0 +*/ + +package oidc4vc + +// PushedAuthorizationRequest is a model with custom OIDC4VC-related fields for PAR. +type PushedAuthorizationRequest struct { + AuthorizationDetails string `form:"authorization_details"` + OpState string `form:"op_state"` +} + +// AuthorizationDetails parameter is used to convey the details about VC the Wallet wants to obtain. +// Refer to https://openid.net/specs/openid-4-verifiable-credential-issuance-1_0.html#section-7.1.1 for more details. +type AuthorizationDetails struct { + // Type determines the authorization details type. MUST be set to "openid_credential". + Type string + // CredentialType denotes the type of the requested Credential. + CredentialType string + // Format represents a format in which the Credential is requested to be issued. + Format *string + // Locations param is an array of strings that allows a client to specify the location of the resource server(s) for + // the AS to mint audience restricted access tokens. + Locations *[]string +} diff --git a/pkg/service/oidc4vc/models.go b/pkg/service/oidc4vc/models.go index 3cf05d216..70a9e1363 100644 --- a/pkg/service/oidc4vc/models.go +++ b/pkg/service/oidc4vc/models.go @@ -7,20 +7,20 @@ SPDX-License-Identifier: Apache-2.0 package oidc4vc import ( - "time" - "github.com/hyperledger/aries-framework-go/pkg/doc/verifiable" vcsverifiable "github.com/trustbloc/vcs/pkg/doc/verifiable" ) -// TxID is the transaction ID. +// TxID defines type for transaction ID. type TxID string -// Transaction is the transaction for the initiate issuance interaction. +// Transaction is the credential issuance transaction. Issuer creates a transaction to convey the intention of issuing a +// credential with the given parameters. The transaction is stored in the transaction store and its status is updated as +// the credential issuance progresses. type Transaction struct { - ID TxID - TxData TransactionData + ID TxID + TransactionData } // TransactionData is the transaction data stored in the underlying storage. @@ -34,15 +34,15 @@ type TransactionData struct { OpState string } -// AuthorizationDetails parameter is used to convey the details about VC the wallet wants to obtain. +// AuthorizationDetails are the details for VC issuance. type AuthorizationDetails struct { - Type string + Type string // CredentialType string Format vcsverifiable.Format Locations []string } -// InitiateIssuanceRequest is the request used by the issuer to initiate OIDC VC issuance interaction. +// InitiateIssuanceRequest is the request used by the Issuer to initiate the OIDC VC issuance interaction. type InitiateIssuanceRequest struct { CredentialTemplate *verifiable.Credential ClientInitiateIssuanceURL string @@ -55,20 +55,12 @@ type InitiateIssuanceRequest struct { AuthorizationDetails *AuthorizationDetails } -// InitiateIssuanceInfo is the response from the issuer to the wallet with initiate issuance URL. -type InitiateIssuanceInfo struct { +// InitiateIssuanceResponse is the response from the Issuer to the Wallet with initiate issuance URL. +type InitiateIssuanceResponse struct { InitiateIssuanceURL string - TxID string -} - -// PushedAuthorizationRequest is the request used by VCS OIDC public endpoints to push authorization requests (PAR). -type PushedAuthorizationRequest struct { - AuthorizationDetails *AuthorizationDetails - OpState string + TxID TxID } -// PushedAuthorizationResponse is the response for PAR with request URL for OIDC authorization request redirects. -type PushedAuthorizationResponse struct { - RequestURI string - ExpiresIn time.Duration +type ClientWellKnownConfig struct { + InitiateIssuanceEndpoint string `json:"initiate_issuance_endpoint"` } diff --git a/pkg/service/oidc4vc/oidc4vc_service.go b/pkg/service/oidc4vc/oidc4vc_service.go index 09ca6d7a9..98af33d9e 100644 --- a/pkg/service/oidc4vc/oidc4vc_service.go +++ b/pkg/service/oidc4vc/oidc4vc_service.go @@ -4,7 +4,7 @@ Copyright SecureKey Technologies Inc. All Rights Reserved. SPDX-License-Identifier: Apache-2.0 */ -//go:generate mockgen -destination oidc4vc_service_mocks_test.go -self_package mocks -package oidc4vc_test -source=oidc4vc_service.go -mock_names transactionStorage=MockTransactionStorage,httpClient=MockHTTPClient +//go:generate mockgen -destination oidc4vc_service_mocks_test.go -self_package mocks -package oidc4vc_test -source=oidc4vc_service.go -mock_names transactionStore=MockTransactionStore,httpClient=MockHTTPClient package oidc4vc @@ -16,6 +16,7 @@ import ( "net/url" "github.com/trustbloc/vcs/internal/pkg/log" + profileapi "github.com/trustbloc/vcs/pkg/profile" ) const ( @@ -26,8 +27,9 @@ const ( var logger = log.New("oidc4vc") -type transactionStorage interface { +type transactionStore interface { Store(ctx context.Context, data *TransactionData) (*Transaction, error) + GetByOpState(ctx context.Context, opState string) (*Transaction, error) } type httpClient interface { @@ -36,29 +38,30 @@ type httpClient interface { // Config holds configuration options and dependencies for Service. type Config struct { - TransactionStorage transactionStorage - HTTPClient httpClient + TransactionStore transactionStore + HTTPClient httpClient } // Service implements OIDC for VC issuance functionality. type Service struct { - store transactionStorage + store transactionStore httpClient httpClient } // NewService returns a new Service instance. func NewService(config *Config) (*Service, error) { return &Service{ - store: config.TransactionStorage, + store: config.TransactionStore, httpClient: config.HTTPClient, }, nil } -// InitiateOidcInteraction prepares initiate issuance URL for starting OIDC interaction. -func (s *Service) InitiateOidcInteraction( +// InitiateInteraction creates credential issuance transaction and builds initiate issuance URL. +func (s *Service) InitiateInteraction( ctx context.Context, req *InitiateIssuanceRequest, -) (*InitiateIssuanceInfo, error) { + profile *profileapi.Issuer, +) (*InitiateIssuanceResponse, error) { data := &TransactionData{ CredentialTemplate: req.CredentialTemplate, ClaimEndpoint: req.ClaimEndpoint, @@ -66,6 +69,7 @@ func (s *Service) InitiateOidcInteraction( ResponseType: req.ResponseType, Scope: req.Scope, AuthorizationDetails: req.AuthorizationDetails, + OpState: req.OpState, } if data.GrantType == "" { @@ -82,24 +86,29 @@ func (s *Service) InitiateOidcInteraction( tx, err := s.store.Store(ctx, data) if err != nil { - return nil, fmt.Errorf("store transaction: %w", err) + return nil, fmt.Errorf("store tx: %w", err) } - return &InitiateIssuanceInfo{ - InitiateIssuanceURL: s.buildInitiateIssuanceURL(ctx, req), - TxID: string(tx.ID), + return &InitiateIssuanceResponse{ + InitiateIssuanceURL: s.buildInitiateIssuanceURL(ctx, req, profile), + TxID: tx.ID, }, nil } -func (s *Service) buildInitiateIssuanceURL(ctx context.Context, req *InitiateIssuanceRequest) string { +func (s *Service) buildInitiateIssuanceURL( + ctx context.Context, + req *InitiateIssuanceRequest, + profile *profileapi.Issuer, +) string { var initiateIssuanceURL string if req.ClientInitiateIssuanceURL != "" { initiateIssuanceURL = req.ClientInitiateIssuanceURL } else if req.ClientWellKnownURL != "" { - c, err := s.fetchWellKnownConfig(ctx, req.ClientWellKnownURL) + c, err := s.getClientWellKnownConfig(ctx, req.ClientWellKnownURL) if err != nil { - logger.Error("Failed to fetch well-known config", log.WithError(err)) + logger.Error(fmt.Sprintf("Failed to get well-known config from %q", req.ClientWellKnownURL), + log.WithError(err)) } else { initiateIssuanceURL = c.InitiateIssuanceEndpoint } @@ -110,26 +119,22 @@ func (s *Service) buildInitiateIssuanceURL(ctx context.Context, req *InitiateIss } q := url.Values{} - q.Set("issuer", req.CredentialTemplate.Issuer.ID) - q.Set("credential_type", req.CredentialTemplate.Types[0]) - q.Set("op_state", req.OpState) // TODO: Correlate op_state with txID. + q.Set("issuer", profile.ID) + q.Set("credential_type", req.AuthorizationDetails.CredentialType) + q.Set("op_state", req.OpState) return initiateIssuanceURL + "?" + q.Encode() } -type wellKnownConfig struct { - InitiateIssuanceEndpoint string `json:"initiate_issuance_endpoint"` -} - -func (s *Service) fetchWellKnownConfig(ctx context.Context, url string) (*wellKnownConfig, error) { - req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, http.NoBody) +func (s *Service) getClientWellKnownConfig(ctx context.Context, wellKnownURL string) (*ClientWellKnownConfig, error) { + req, err := http.NewRequestWithContext(ctx, http.MethodGet, wellKnownURL, http.NoBody) if err != nil { - return nil, fmt.Errorf("create well-known request: %w", err) + return nil, fmt.Errorf("create well-known config req: %w", err) } resp, err := s.httpClient.Do(req) if err != nil { - return nil, fmt.Errorf("do well-known request: %w", err) + return nil, fmt.Errorf("do well-known config req: %w", err) } defer func() { @@ -138,13 +143,30 @@ func (s *Service) fetchWellKnownConfig(ctx context.Context, url string) (*wellKn } }() - var config wellKnownConfig + var config ClientWellKnownConfig if resp.StatusCode == http.StatusOK { if err = json.NewDecoder(resp.Body).Decode(&config); err != nil { - return nil, fmt.Errorf("decode well-known config: %w", err) + return nil, fmt.Errorf("unmarshal well-known config: %w", err) } } return &config, nil } + +func (s *Service) HandlePAR(ctx context.Context, opState string, ad *AuthorizationDetails) (TxID, error) { + tx, err := s.store.GetByOpState(ctx, opState) + if err != nil { + return "", fmt.Errorf("get transaction by opstate: %w", err) + } + + if ad.CredentialType != tx.AuthorizationDetails.CredentialType { + return "", fmt.Errorf("authorization details credential type mismatch") + } + + if ad.Format != tx.AuthorizationDetails.Format { + return "", fmt.Errorf("authorization details format mismatch") + } + + return tx.ID, nil +} diff --git a/pkg/service/oidc4vc/oidc4vc_service_test.go b/pkg/service/oidc4vc/oidc4vc_service_test.go index 8eca0d68a..a9c8da863 100644 --- a/pkg/service/oidc4vc/oidc4vc_service_test.go +++ b/pkg/service/oidc4vc/oidc4vc_service_test.go @@ -18,12 +18,14 @@ import ( "github.com/hyperledger/aries-framework-go/pkg/doc/verifiable" "github.com/stretchr/testify/require" + vcsverifiable "github.com/trustbloc/vcs/pkg/doc/verifiable" + profileapi "github.com/trustbloc/vcs/pkg/profile" "github.com/trustbloc/vcs/pkg/service/oidc4vc" ) -func TestService_InitiateOidcInteraction(t *testing.T) { +func TestService_InitiateInteraction(t *testing.T) { var ( - mockTransactionStore = NewMockTransactionStorage(gomock.NewController(t)) + mockTransactionStore = NewMockTransactionStore(gomock.NewController(t)) mockHTTPClient = NewMockHTTPClient(gomock.NewController(t)) credentialTemplate = &verifiable.Credential{ ID: "templateID", @@ -36,14 +38,14 @@ func TestService_InitiateOidcInteraction(t *testing.T) { tests := []struct { name string setup func() - check func(t *testing.T, resp *oidc4vc.InitiateIssuanceInfo, err error) + check func(t *testing.T, resp *oidc4vc.InitiateIssuanceResponse, err error) }{ { name: "Success", setup: func() { mockTransactionStore.EXPECT().Store(gomock.Any(), gomock.Any()).Return(&oidc4vc.Transaction{ - ID: "txID", - TxData: oidc4vc.TransactionData{}, + ID: "txID", + TransactionData: oidc4vc.TransactionData{}, }, nil) mockHTTPClient.EXPECT().Do(gomock.Any()).Return(&http.Response{ Body: io.NopCloser(strings.NewReader( @@ -52,13 +54,14 @@ func TestService_InitiateOidcInteraction(t *testing.T) { }, nil) issuanceReq = &oidc4vc.InitiateIssuanceRequest{ - CredentialTemplate: credentialTemplate, - ClientWellKnownURL: "https://wallet.example.com/.well-known/openid-configuration", - ClaimEndpoint: "https://vcs.pb.example.com/claim", - OpState: "eyJhbGciOiJSU0Et", + CredentialTemplate: credentialTemplate, + ClientWellKnownURL: "https://wallet.example.com/.well-known/openid-configuration", + ClaimEndpoint: "https://vcs.pb.example.com/claim", + OpState: "eyJhbGciOiJSU0Et", + AuthorizationDetails: &oidc4vc.AuthorizationDetails{CredentialType: "UniversityDegreeCredential"}, } }, - check: func(t *testing.T, resp *oidc4vc.InitiateIssuanceInfo, err error) { + check: func(t *testing.T, resp *oidc4vc.InitiateIssuanceResponse, err error) { require.NoError(t, err) require.Contains(t, resp.InitiateIssuanceURL, "https://wallet.example.com/initiate_issuance") }, @@ -67,8 +70,8 @@ func TestService_InitiateOidcInteraction(t *testing.T) { name: "Client initiate issuance URL takes precedence over client_wellknown parameter", setup: func() { mockTransactionStore.EXPECT().Store(gomock.Any(), gomock.Any()).Return(&oidc4vc.Transaction{ - ID: "txID", - TxData: oidc4vc.TransactionData{}, + ID: "txID", + TransactionData: oidc4vc.TransactionData{}, }, nil) mockHTTPClient.EXPECT().Do(gomock.Any()).Times(0) @@ -78,9 +81,10 @@ func TestService_InitiateOidcInteraction(t *testing.T) { ClientWellKnownURL: "https://wallet.example.com/.well-known/openid-configuration", ClaimEndpoint: "https://vcs.pb.example.com/claim", OpState: "eyJhbGciOiJSU0Et", + AuthorizationDetails: &oidc4vc.AuthorizationDetails{CredentialType: "UniversityDegreeCredential"}, } }, - check: func(t *testing.T, resp *oidc4vc.InitiateIssuanceInfo, err error) { + check: func(t *testing.T, resp *oidc4vc.InitiateIssuanceResponse, err error) { require.NoError(t, err) require.Contains(t, resp.InitiateIssuanceURL, "https://wallet.example.com/initiate_issuance") }, @@ -89,19 +93,20 @@ func TestService_InitiateOidcInteraction(t *testing.T) { name: "Custom initiate issuance URL when fail to do well-known request", setup: func() { mockTransactionStore.EXPECT().Store(gomock.Any(), gomock.Any()).Return(&oidc4vc.Transaction{ - ID: "txID", - TxData: oidc4vc.TransactionData{}, + ID: "txID", + TransactionData: oidc4vc.TransactionData{}, }, nil) mockHTTPClient.EXPECT().Do(gomock.Any()).Return(nil, fmt.Errorf("well-known request error")) issuanceReq = &oidc4vc.InitiateIssuanceRequest{ - CredentialTemplate: credentialTemplate, - ClientWellKnownURL: "https://wallet.example.com/.well-known/openid-configuration", - ClaimEndpoint: "https://vcs.pb.example.com/claim", - OpState: "eyJhbGciOiJSU0Et", + CredentialTemplate: credentialTemplate, + ClientWellKnownURL: "https://wallet.example.com/.well-known/openid-configuration", + ClaimEndpoint: "https://vcs.pb.example.com/claim", + OpState: "eyJhbGciOiJSU0Et", + AuthorizationDetails: &oidc4vc.AuthorizationDetails{CredentialType: "UniversityDegreeCredential"}, } }, - check: func(t *testing.T, resp *oidc4vc.InitiateIssuanceInfo, err error) { + check: func(t *testing.T, resp *oidc4vc.InitiateIssuanceResponse, err error) { require.NoError(t, err) require.Contains(t, resp.InitiateIssuanceURL, "openid-initiate-issuance://") }, @@ -110,8 +115,8 @@ func TestService_InitiateOidcInteraction(t *testing.T) { name: "Custom initiate issuance URL when fail to decode well-known config", setup: func() { mockTransactionStore.EXPECT().Store(gomock.Any(), gomock.Any()).Return(&oidc4vc.Transaction{ - ID: "txID", - TxData: oidc4vc.TransactionData{}, + ID: "txID", + TransactionData: oidc4vc.TransactionData{}, }, nil) mockHTTPClient.EXPECT().Do(gomock.Any()).Return(&http.Response{ Body: io.NopCloser(strings.NewReader("invalid json")), @@ -119,13 +124,14 @@ func TestService_InitiateOidcInteraction(t *testing.T) { }, nil) issuanceReq = &oidc4vc.InitiateIssuanceRequest{ - CredentialTemplate: credentialTemplate, - ClientWellKnownURL: "https://wallet.example.com/.well-known/openid-configuration", - ClaimEndpoint: "https://vcs.pb.example.com/claim", - OpState: "eyJhbGciOiJSU0Et", + CredentialTemplate: credentialTemplate, + ClientWellKnownURL: "https://wallet.example.com/.well-known/openid-configuration", + ClaimEndpoint: "https://vcs.pb.example.com/claim", + OpState: "eyJhbGciOiJSU0Et", + AuthorizationDetails: &oidc4vc.AuthorizationDetails{CredentialType: "UniversityDegreeCredential"}, } }, - check: func(t *testing.T, resp *oidc4vc.InitiateIssuanceInfo, err error) { + check: func(t *testing.T, resp *oidc4vc.InitiateIssuanceResponse, err error) { require.NoError(t, err) require.Contains(t, resp.InitiateIssuanceURL, "openid-initiate-issuance://") }, @@ -141,9 +147,10 @@ func TestService_InitiateOidcInteraction(t *testing.T) { ClientInitiateIssuanceURL: "https://wallet.example.com/initiate_issuance", ClaimEndpoint: "https://vcs.pb.example.com/claim", OpState: "eyJhbGciOiJSU0Et", + AuthorizationDetails: &oidc4vc.AuthorizationDetails{CredentialType: "UniversityDegreeCredential"}, } }, - check: func(t *testing.T, resp *oidc4vc.InitiateIssuanceInfo, err error) { + check: func(t *testing.T, resp *oidc4vc.InitiateIssuanceResponse, err error) { require.Nil(t, resp) require.Error(t, err) require.Contains(t, err.Error(), "store error") @@ -155,12 +162,108 @@ func TestService_InitiateOidcInteraction(t *testing.T) { tt.setup() svc, err := oidc4vc.NewService(&oidc4vc.Config{ - TransactionStorage: mockTransactionStore, - HTTPClient: mockHTTPClient, + TransactionStore: mockTransactionStore, + HTTPClient: mockHTTPClient, }) require.NoError(t, err) - resp, err := svc.InitiateOidcInteraction(context.TODO(), issuanceReq) + resp, err := svc.InitiateInteraction(context.TODO(), issuanceReq, &profileapi.Issuer{}) + tt.check(t, resp, err) + }) + } +} + +func TestService_HandlePAR(t *testing.T) { + var ( + mockTransactionStore = NewMockTransactionStore(gomock.NewController(t)) + ad *oidc4vc.AuthorizationDetails + ) + + tests := []struct { + name string + setup func() + check func(t *testing.T, txID oidc4vc.TxID, err error) + }{ + { + name: "Success", + setup: func() { + mockTransactionStore.EXPECT().GetByOpState(gomock.Any(), gomock.Any()).Return(&oidc4vc.Transaction{ + ID: "txID", + TransactionData: oidc4vc.TransactionData{ + AuthorizationDetails: &oidc4vc.AuthorizationDetails{ + CredentialType: "UniversityDegreeCredential", + Format: vcsverifiable.Ldp, + }, + }, + }, nil) + + ad = &oidc4vc.AuthorizationDetails{ + CredentialType: "UniversityDegreeCredential", + Format: vcsverifiable.Ldp, + } + }, + check: func(t *testing.T, txID oidc4vc.TxID, err error) { + require.NoError(t, err) + require.Equal(t, oidc4vc.TxID("txID"), txID) + }, + }, + { + name: "Credential type mismatch", + setup: func() { + mockTransactionStore.EXPECT().GetByOpState(gomock.Any(), gomock.Any()).Return(&oidc4vc.Transaction{ + ID: "txID", + TransactionData: oidc4vc.TransactionData{ + AuthorizationDetails: &oidc4vc.AuthorizationDetails{ + CredentialType: "UniversityDegreeCredential", + Format: vcsverifiable.Ldp, + }, + }, + }, nil) + + ad = &oidc4vc.AuthorizationDetails{ + CredentialType: "NotSupportedCredentialType", + Format: vcsverifiable.Ldp, + } + }, + check: func(t *testing.T, txID oidc4vc.TxID, err error) { + require.Error(t, err) + require.Contains(t, err.Error(), "credential type mismatch") + }, + }, + { + name: "Credential format mismatch", + setup: func() { + mockTransactionStore.EXPECT().GetByOpState(gomock.Any(), gomock.Any()).Return(&oidc4vc.Transaction{ + ID: "txID", + TransactionData: oidc4vc.TransactionData{ + AuthorizationDetails: &oidc4vc.AuthorizationDetails{ + CredentialType: "UniversityDegreeCredential", + Format: vcsverifiable.Ldp, + }, + }, + }, nil) + + ad = &oidc4vc.AuthorizationDetails{ + CredentialType: "UniversityDegreeCredential", + Format: vcsverifiable.Jwt, + } + }, + check: func(t *testing.T, txID oidc4vc.TxID, err error) { + require.Error(t, err) + require.Contains(t, err.Error(), "format mismatch") + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tt.setup() + + svc, err := oidc4vc.NewService(&oidc4vc.Config{ + TransactionStore: mockTransactionStore, + }) + require.NoError(t, err) + + resp, err := svc.HandlePAR(context.Background(), "opState", ad) tt.check(t, resp, err) }) } diff --git a/pkg/service/oidc4vc/session_manager.go b/pkg/service/oidc4vc/session_manager.go new file mode 100644 index 000000000..310b2e477 --- /dev/null +++ b/pkg/service/oidc4vc/session_manager.go @@ -0,0 +1,20 @@ +/* +Copyright Avast Software. All Rights Reserved. + +SPDX-License-Identifier: Apache-2.0 +*/ + +package oidc4vc + +import ( + "github.com/ory/fosite" +) + +var _ fosite.Session = (*Session)(nil) // make sure Session implements fosite.Session + +// Session is the session for the OIDC4VC flow. +type Session struct { + *fosite.DefaultSession `json:"token"` + + TxID TxID `json:"tx"` +} diff --git a/pkg/storage/mongodb/oidc4vcstore/odc4_vc_store_test.go b/pkg/storage/mongodb/oidc4vcstore/odc4_vc_store_test.go index 28062b2a2..ba4ac9ef4 100644 --- a/pkg/storage/mongodb/oidc4vcstore/odc4_vc_store_test.go +++ b/pkg/storage/mongodb/oidc4vcstore/odc4_vc_store_test.go @@ -1,3 +1,9 @@ +/* +Copyright Avast Software. All Rights Reserved. + +SPDX-License-Identifier: Apache-2.0 +*/ + package oidc4vcstore import ( diff --git a/pkg/storage/mongodb/oidc4vcstore/oidc4vc_store.go b/pkg/storage/mongodb/oidc4vcstore/oidc4vc_store.go index b08ec0c7a..612c252ca 100644 --- a/pkg/storage/mongodb/oidc4vcstore/oidc4vc_store.go +++ b/pkg/storage/mongodb/oidc4vcstore/oidc4vc_store.go @@ -1,5 +1,5 @@ /* -Copyright SecureKey Technologies Inc. All Rights Reserved. +Copyright Avast Software. All Rights Reserved. SPDX-License-Identifier: Apache-2.0 */ @@ -133,8 +133,8 @@ func (s *Store) Create( insertedID := result.InsertedID.(primitive.ObjectID) //nolint: errcheck return &oidc4vc.Transaction{ - ID: oidc4vc.TxID(insertedID.Hex()), - TxData: *data, + ID: oidc4vc.TxID(insertedID.Hex()), + TransactionData: *data, }, nil } diff --git a/test/bdd/go.mod b/test/bdd/go.mod index dfcf22c6a..b3f718ae0 100644 --- a/test/bdd/go.mod +++ b/test/bdd/go.mod @@ -19,7 +19,7 @@ require ( github.com/rdumont/assistdog v0.0.0-20201106100018-168b06230d14 github.com/tidwall/gjson v1.14.0 github.com/trustbloc/vcs v0.1.8 - golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1 + golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1 ) require ( @@ -116,15 +116,15 @@ require ( go.uber.org/atomic v1.7.0 // indirect go.uber.org/multierr v1.6.0 // indirect go.uber.org/zap v1.17.0 // indirect - golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be // indirect - golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect + golang.org/x/crypto v0.0.0-20221012134737-56aed061732a // indirect + golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458 // indirect golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 // indirect - golang.org/x/sys v0.0.0-20220926163933-8cfa568d3c25 // indirect - golang.org/x/text v0.3.7 // indirect + golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43 // indirect + golang.org/x/text v0.3.8 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf // indirect google.golang.org/grpc v1.46.2 // indirect - google.golang.org/protobuf v1.28.0 // indirect + google.golang.org/protobuf v1.28.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/test/bdd/go.sum b/test/bdd/go.sum index 50a0e7796..1250a309d 100644 --- a/test/bdd/go.sum +++ b/test/bdd/go.sum @@ -1000,8 +1000,8 @@ golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be h1:fmw3UbQh+nxngCAHrDCCztao/kbYFnWjoqop8dHx05A= -golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20221012134737-56aed061732a h1:NmSIgad6KjE6VvHciPZuNRTKxGhlPfD6OA87W/PLkqg= +golang.org/x/crypto v0.0.0-20221012134737-56aed061732a/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1092,8 +1092,8 @@ golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458 h1:MgJ6t2zo8v0tbmLCueaCbF1RM+TtB0rs3Lv8DGtOIpY= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1111,8 +1111,8 @@ golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1 h1:lxqLZaMad/dJHMFZH0NiNpiEZI/nhgWhe4wgzpE+MuA= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1 h1:3VPzK7eqH25j7GYw5w6g/GzNRc0/fYtrxz27z1gD4W0= +golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1197,8 +1197,8 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220926163933-8cfa568d3c25 h1:nwzwVf0l2Y/lkov/+IYgMMbFyI+QypZDds9RxlSmsFQ= -golang.org/x/sys v0.0.0-20220926163933-8cfa568d3c25/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43 h1:OK7RB6t2WQX54srQQYSXMW8dF5C6/8+oA/s5QBmmto4= +golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1209,8 +1209,9 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8 h1:nAL+RVCQ9uMn3vJZbV+MRnydTJFPf8qqY42YiA6MrqY= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1429,8 +1430,8 @@ google.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX7 google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=