diff --git a/.env b/.env index 0193a1caa..1a859c1bb 100644 --- a/.env +++ b/.env @@ -2,19 +2,18 @@ uniresolver_driver_did_btcr_bitcoinConnection=blockcypherapi uniresolver_driver_did_btcr_rpcUrlMainnet=http://user:pass@localhost:8332/ uniresolver_driver_did_btcr_rpcUrlTestnet=http://user:pass@localhost:18332/ -uniresolver_driver_did_sov_libIndyPath=./sovrin/lib/ -uniresolver_driver_did_sov_poolConfigs=_;./sovrin/live.txn;stn;./sovrin/stn.txn;danube;./sovrin/11347-05.txn;myidsafe;./sovrin/myidsafe.txn -uniresolver_driver_did_sov_poolVersions=_;2;stn;2;danube;2;myidsafe;1 +uniresolver_driver_did_sov_libIndyPath= +uniresolver_driver_did_sov_poolConfigs=_;./sovrin/mainnet.txn;staging;./sovrin/stagingnet.txn;builder;./sovrin/buildernet.txn;danube;./sovrin/danube.txn +uniresolver_driver_did_sov_poolVersions=_;2;staging;2;builder;2;danube;2 uniresolver_driver_did_sov_walletName=default -uniresolver_driver_did_erc725_ethereumConnection=hybrid -uniresolver_driver_did_erc725_rpcUrlMainnet=https://mainnet.infura.io/v3/fd9e225bc1234f49b48b295c611078eb -uniresolver_driver_did_erc725_rpcUrlRopsten=https://ropsten.infura.io/v3/fd9e225bc1234f49b48b295c611078eb -uniresolver_driver_did_erc725_rpcUrlRinkeby=https://rinkeby.infura.io/v3/fd9e225bc1234f49b48b295c611078eb -uniresolver_driver_did_erc725_rpcUrlKovan=https://kovan.infura.io/v3/fd9e225bc1234f49b48b295c611078eb -uniresolver_driver_did_erc725_etherscanApiMainnet=http://api.etherscan.io/api -uniresolver_driver_did_erc725_etherscanApiRopsten=http://api-ropsten.etherscan.io/api -uniresolver_driver_did_erc725_etherscanApiRinkeby=http://api-rinkeby.etherscan.io/api -uniresolver_driver_did_erc725_etherscanApiKovan=http://api-kovan.etherscan.io/api +uniresolver_driver_did_erc725_ethereumConnections=mainnet;hybrid;ropsten;hybrid;rinkeby;hybrid;kovan;hybrid +uniresolver_driver_did_erc725_rpcUrls=mainnet;https://mainnet.infura.io/v3/fd9e225bc1234f49b48b295c611078eb;ropsten;https://ropsten.infura.io/v3/fd9e225bc1234f49b48b295c611078eb;rinkeby;https://rinkeby.infura.io/v3/fd9e225bc1234f49b48b295c611078eb;kovan;https://kovan.infura.io/v3/fd9e225bc1234f49b48b295c611078eb +uniresolver_driver_did_erc725_etherscanApis=mainnet;http://api.etherscan.io/api;ropsten;http://api-ropsten.etherscan.io/api;rinkeby;http://api-rinkeby.etherscan.io/api;kovan;http://api-kovan.etherscan.io/api + +uniresolver_driver_did_work_apikey=sxVQUoDE015VhAs5ep4b57DFA5vT3zqvf1Dm1sGe +uniresolver_driver_did_work_domain=https://credentials.id.workday.com + +uniresolver_driver_kilt_did_node=wss://full-nodes.kilt.io:9944 uniresolver_driver_dns_dnsServers= diff --git a/.gitignore b/.gitignore index 3cd6a6953..a46bdf9dc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,8 @@ .project +.classpath /.settings/ -/target +/target/ /bin/ +docker-compose.override.yml +/.idea/ +*.iml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 000000000..bdaf0a7b2 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,33 @@ +image: docker:git + +services: +- docker:dind + +variables: + DOCKER_HOST: tcp://docker:2375 + DOCKER_DRIVER: overlay2 + REGISTRY: registry.gitlab.com + TAG_ROOT: $REGISTRY/universalresolver + +before_script: + - echo -n $CI_JOB_TOKEN | docker login -u gitlab-ci-token --password-stdin $CI_REGISTRY +stages: + - build and stage + +job 1: + stage: build and stage + script: + - cd resolver/java/ + - docker build -f ./docker/Dockerfile-base-alpine . -t $TAG_ROOT/base-alpine:$CI_COMMIT_SHA + - docker build -f ./docker/Dockerfile-base-ubuntu . -t $TAG_ROOT/base-ubuntu:$CI_COMMIT_SHA + - docker build -f ./docker/Dockerfile-uni-resolver-web . -t $TAG_ROOT/uni-resolver-web:$CI_COMMIT_SHA + - cd ../.. + - cd drivers/ + - cd sov && docker build -f ./docker/Dockerfile . -t $TAG_ROOT/driver-did-sov && cd .. + - cd btcr && docker build -f ./docker/Dockerfile . -t $TAG_ROOT/driver-did-btcr && cd .. + - cd erc725 && docker build -f ./docker/Dockerfile . -t $TAG_ROOT/driver-did-erc725 && cd .. + - cd stack && docker build -f ./docker/Dockerfile . -t $TAG_ROOT/driver-did-stack && cd .. + - cd dom && docker build -f ./docker/Dockerfile . -t $TAG_ROOT/driver-did-dom && cd .. + - cd dns && docker build -f ./docker/Dockerfile . -t $TAG_ROOT/driver-did-dns && cd .. + - cd ccp && docker build -f ./docker/Dockerfile . -t $TAG_ROOT/driver-did-ccp && cd .. + - cd .. diff --git a/README.md b/README.md index 91d91781c..553a2fcb6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![DIF Logo](https://raw.githubusercontent.com/decentralized-identity/decentralized-identity.github.io/master/images/logo-small.png) +![DIF Logo](https://raw.githubusercontent.com/decentralized-identity/universal-resolver/master/docs/logo-dif.png) # Universal Resolver @@ -12,57 +12,77 @@ See https://uniresolver.io/ for a publicly hosted instance of a Universal Resolv You can deploy the Universal Resolver on your local machine by cloning this Github repository, and using `docker-compose` to build and run the Universal Resolver as well as its drivers: - git clone https://github.com/decentralized-identity/universal-resolver + git clone https://github.com/FactomProject/universal-resolver cd universal-resolver/ docker-compose -f docker-compose.yml pull docker-compose -f docker-compose.yml up You should then be able to resolve identifiers locally using simple `curl` requests as follows: - curl -X GET http://localhost:8080/1.0/identifiers/did:sov:WRfXPg8dantKVubE3HX8pw - curl -X GET http://localhost:8080/1.0/identifiers/did:btcr:xkrn-xzcr-qqlv-j6sl - curl -X GET http://localhost:8080/1.0/identifiers/did:v1:test:nym:3AEJTDMSxDDQpyUftjuoeZ2Bazp4Bswj1ce7FJGybCUu - curl -X GET http://localhost:8080/1.0/identifiers/did:ipid:QmYA7p467t4BGgBL4NmyHtsXMoPrYH9b3kSG6dbgFYskJm - curl -X GET http://localhost:8080/1.0/identifiers/did:uport:2omWsSGspY7zhxaG6uHyoGtcYxoGeeohQXz - curl -X GET http://localhost:8080/1.0/identifiers/did:jolo:e76fb4b4900e43891f613066b9afca366c6d22f7d87fc9f78a91515be24dfb21 - curl -X GET http://localhost:8080/1.0/identifiers/did:stack:v0:16EMaNw3pkn3v6f2BgnSSs53zAKH4Q8YJg-0 + curl -X GET http://localhost:8080/1.0/identifiers/did:sov:WRfXPg8dantKVubE3HX8pw + curl -X GET http://localhost:8080/1.0/identifiers/did:btcr:xz35-jznz-q6mr-7q6 + curl -X GET http://localhost:8080/1.0/identifiers/did:v1:test:nym:3AEJTDMSxDDQpyUftjuoeZ2Bazp4Bswj1ce7FJGybCUu + curl -X GET http://localhost:8080/1.0/identifiers/did:ipid:12D3KooWMHdrzcwpjbdrZs5GGqERAvcgqX3b5dpuPtPa9ot69yew + curl -X GET http://localhost:8080/1.0/identifiers/did:web:uport.me + curl -X GET http://localhost:8080/1.0/identifiers/did:ethr:0x3b0BC51Ab9De1e5B7B6E34E5b960285805C41736 + curl -X GET http://localhost:8080/1.0/identifiers/did:nacl:Md8JiMIwsapml_FtQ2ngnGftNP5UmVCAUuhnLyAsPxI + curl -X GET http://localhost:8080/1.0/identifiers/did:jolo:e76fb4b4900e43891f613066b9afca366c6d22f7d87fc9f78a91515be24dfb21 + curl -X GET http://localhost:8080/1.0/identifiers/did:stack:v0:16EMaNw3pkn3v6f2BgnSSs53zAKH4Q8YJg-0 curl -X GET http://localhost:8080/1.0/identifiers/did:erc725:ropsten:2F2B37C890824242Cb9B0FE5614fA2221B79901E curl -X GET http://localhost:8080/1.0/identifiers/did:hcr:0f674e7e-4b49-4898-85f6-96176c1e30de - + curl -X GET http://localhost:8080/1.0/identifiers/did:neoid:priv:b4eeeb80d20bfb38b23001d0659ce0c1d96be0aa + curl -X GET http://localhost:8080/1.0/identifiers/did:elem:EiAS3mqC4OLMKOwcz3ItIL7XfWduPT7q3Fa4vHgiCfSG2A + curl -X GET http://localhost:8080/1.0/identifiers/did:github:gjgd + curl -X GET http://localhost:8080/1.0/identifiers/did:ccp:ceNobbK6Me9F5zwyE3MKY88QZLw + curl -X GET http://localhost:8080/1.0/identifiers/did:work:2UUHQCd4psvkPLZGnWY33L + curl -X GET http://localhost:8080/1.0/identifiers/did:ont:AN5g6gz9EoQ3sCNu7514GEghZurrktCMiH + curl -X GET http://localhost:8080/1.0/identifiers/did:kilt:5CDct4QDpQYfAVDrskNuiEdXyiE38oPfTHEJ65ZLSpz9WasE If this doesn't work, see [Troubleshooting](/docs/troubleshooting.md). -## Implementations - -The following resolver implementations are available here: - - * [Java](https://github.com/decentralized-identity/universal-resolver/tree/master/resolver/java) - * [Python3](https://github.com/decentralized-identity/universal-resolver/tree/master/resolver/python) - ## Drivers Are you developing a DID method and Universal Resolver driver? Click [Driver Development](/docs/driver-development.md) for instructions. | Driver Name | Driver Version | DID Spec Version | DID Method Spec Version | Docker Image | | ----------- | -------------- | ---------------- | ----------------------- | ------------ | -| [did-btcr](https://github.com/decentralized-identity/universal-resolver/tree/master/drivers/btcr/) | 0.1-SNAPSHOT | [0.11](https://w3c-ccg.github.io/did-spec/) | [0.1](https://w3c-ccg.github.io/didm-btcr) | [universalresolver/driver-did-btcr](https://hub.docker.com/r/universalresolver/driver-did-btcr/) -| [did-sov](https://github.com/decentralized-identity/universal-resolver/tree/master/drivers/sov/) | 0.1-SNAPSHOT | [0.11](https://w3c-ccg.github.io/did-spec/) | [0.1](https://github.com/mikelodder7/sovrin/blob/master/spec/did-method-spec-template.html) | [universalresolver/driver-did-sov](https://hub.docker.com/r/universalresolver/driver-did-sov/) -| [did-erc725](https://github.com/decentralized-identity/universal-resolver/tree/master/drivers/erc725/) | 0.1-SNAPSHOT | [0.11](https://w3c-ccg.github.io/did-spec/) | [0.1](https://github.com/WebOfTrustInfo/rebooting-the-web-of-trust-spring2018/blob/master/topics-and-advance-readings/DID-Method-erc725.md) | [universalresolver/driver-did-erc725](https://hub.docker.com/r/universalresolver/driver-did-erc725/) -| [did-stack](https://github.com/decentralized-identity/universal-resolver/tree/master/drivers/stack/) | 0.1 | [0.11](https://w3c-ccg.github.io/did-spec/) | (missing) | [universalresolver/driver-did-stack](https://hub.docker.com/r/universalresolver/driver-did-stack/) -| [did-dom](https://github.com/decentralized-identity/universal-resolver/tree/master/drivers/dom/) | 0.1-SNAPSHOT | [0.11](https://w3c-ccg.github.io/did-spec/) | (missing) | [universalresolver/driver-did-dom](https://hub.docker.com/r/universalresolver/driver-did-dom/) -| [did-uport](https://github.com/uport-project/uport-did-driver) | 1.1.0 | [0.11](https://w3c-ccg.github.io/did-spec/) | [1.0](https://docs.google.com/document/d/1vS6UBUDwxYR8tLTNo4HUhGe2qb9Q95QLiJTt9NkwZ8M/) | [uport/uni-resolver-driver-did-uport](https://hub.docker.com/r/uport/uni-resolver-driver-did-uport/) -| did-v1 | | [0.11](https://w3c-ccg.github.io/did-spec/) | [1.0](https://w3c-ccg.github.io/didm-veres-one/) | -| did-ipid | | [0.11](https://w3c-ccg.github.io/did-spec/) | [0.1](https://github.com/jonnycrunch/ipid) | -| [did-jolo](https://github.com/jolocom/jolocom-did-driver) | 0.1 | [0.11](https://w3c-ccg.github.io/did-spec/) | [0.1](https://github.com/jolocom/jolocom-did-driver/blob/master/jolocom-did-method-specification.md) | [jolocomgmbh/jolocom-did-driver](https://hub.docker.com/r/jolocomgmbh/jolocom-did-driver) | -| [did-hacera](https://github.com/hacera/hacera-did-driver) | 0.1 | [0.11](https://w3c-ccg.github.io/did-spec/) | (missing) | [hacera/hacera-did-driver](https://hub.docker.com/r/hacera/hacera-did-driver) | +| [did-btcr](https://github.com/decentralized-identity/uni-resolver-driver-did-btcr/) | 0.1-SNAPSHOT | [1.0 WD](https://w3c.github.io/did-core/) | [0.1](https://w3c-ccg.github.io/didm-btcr) | [universalresolver/driver-did-btcr](https://hub.docker.com/r/universalresolver/driver-did-btcr/) +| [did-sov](https://github.com/decentralized-identity/uni-resolver-driver-did-sov/) | 0.1-SNAPSHOT | [1.0 WD](https://w3c.github.io/did-core/) | [0.1](https://sovrin-foundation.github.io/sovrin/spec/did-method-spec-template.html) | [universalresolver/driver-did-sov](https://hub.docker.com/r/universalresolver/driver-did-sov/) +| [did-erc725](https://github.com/decentralized-identity/uni-resolver-driver-did-erc725/) | 0.1-SNAPSHOT | [1.0 WD](https://w3c.github.io/did-core/) | [0.1](https://github.com/WebOfTrustInfo/rebooting-the-web-of-trust-spring2018/blob/master/topics-and-advance-readings/DID-Method-erc725.md) | [universalresolver/driver-did-erc725](https://hub.docker.com/r/universalresolver/driver-did-erc725/) +| [did-stack](https://github.com/decentralized-identity/uni-resolver-driver-did-stack/) | 0.1 | [1.0 WD](https://w3c.github.io/did-core/) | (missing) | [universalresolver/driver-did-stack](https://hub.docker.com/r/universalresolver/driver-did-stack/) +| [did-dom](https://github.com/decentralized-identity/uni-resolver-driver-did-dom/) | 0.1-SNAPSHOT | [1.0 WD](https://w3c.github.io/did-core/) | (missing) | [universalresolver/driver-did-dom](https://hub.docker.com/r/universalresolver/driver-did-dom/) +| [did-uport](https://github.com/uport-project/uport-did-driver) | 1.2.1 | [1.0 WD](https://w3c.github.io/did-core/) | [1.0](https://docs.google.com/document/d/1vS6UBUDwxYR8tLTNo4HUhGe2qb9Q95QLiJTt9NkwZ8M/) | [uport/uni-resolver-driver-did-uport](https://hub.docker.com/r/uport/uni-resolver-driver-did-uport/) +| did-v1 | | [1.0 WD](https://w3c.github.io/did-core/) | [1.0](https://w3c-ccg.github.io/did-method-v1/) | +| did-ipid | | [1.0 WD](https://w3c.github.io/did-core/) | [0.1](https://github.com/jonnycrunch/ipid) | +| [did-jolo](https://github.com/jolocom/jolo-did-method/tree/master/jolocom-did-driver) | 0.1 | [1.0 WD](https://w3c.github.io/did-core/) | [0.1](https://github.com/jolocom/jolocom-did-driver/blob/master/jolocom-did-method-specification.md) | [jolocomgmbh/jolocom-did-driver](https://hub.docker.com/r/jolocomgmbh/jolocom-did-driver) | +| [did-hacera](https://github.com/hacera/hacera-did-driver) | 0.1 | [1.0 WD](https://w3c.github.io/did-core/) | (missing) | [hacera/hacera-did-driver](https://hub.docker.com/r/hacera/hacera-did-driver) | +| [did-elem](https://github.com/decentralized-identity/element) | 0.1 | [1.0 WD](https://w3c.github.io/did-core/) | (missing) | | +| [did-seraphid](https://github.com/swisscom-blockchain/seraph-id-did-driver) | 0.1 | [1.0 WD](https://w3c.github.io/did-core/) | (missing) | [swisscomblockchainag/seraph-id-did-driver](https://hub.docker.com/r/swisscomblockchainag/seraph-id-did-driver) | +| [did-github](https://github.com/decentralized-identity/github-did) | 0.1 | [1.0 WD](https://w3c.github.io/did-core/) | (missing) | | +| [did-ccp](https://github.com/decentralized-identity/uni-resolver-driver-did-ccp/) | 0.1-SNAPSHOT | [1.0 WD](https://w3c.github.io/did-core/) | [0.1](https://did.baidu.com/did-spec/) | [hello2mao/driver-did-ccp](https://hub.docker.com/r/hello2mao/driver-did-ccp/) +| [did-work](https://github.com/decentralized-identity/uni-resolver-driver-did-work/) | 0.1 | [1.0 WD](https://w3c.github.io/did-core/) | [1.0](https://workday.github.io/work-did-method-spec/) | [didwork/work-did-driver](https://hub.docker.com/r/didwork/work-did-driver)| +| [did-ont](https://github.com/ontio/ontid-driver) | 0.1 | [1.0 WD](https://w3c.github.io/did-core/) | [1.0](https://github.com/ontio/ontology-DID/blob/master/docs/en/DID-ONT-method.md) | [ontio/ontid-driver](https://hub.docker.com/r/ontio/ontid-driver) | +| [did-kilt](https://github.com/KILTprotocol/kilt-did-driver) | 0.1 | [1.0 WD](https://w3c.github.io/did-core/) | [1.0](https://github.com/KILTprotocol/kilt-did-driver/blob/master/DID%20Method%20Specification.md) | [kiltprotocol/kilt-did-driver](https://hub.docker.com/r/kiltprotocol/kilt-did-driver)| ## More Information - * [Design Goals](/docs/design-goals.md) * [Driver Development](/docs/driver-development.md) + * [Continuous Integration and Delivery](/docs/continuous-integration-and-delivery.md) + * [Development System](/docs/dev-system.md) + * [Creating Releases](/docs/creating-releases.md) + * [Branching Strategy](/docs/branching-strategy.md) + * [Design Goals](/docs/design-goals.md) * [Troubleshooting](/docs/troubleshooting.md) + * [Java Components](/resolver/java) ## About + + Decentralized Identity Foundation - http://identity.foundation/ - + +
+ + + +Supported by [NLnet](https://nlnet.nl/) and [NGI0 PET](https://nlnet.nl/PET/#NGI), which is made possible with financial support from the European Commission's [Next Generation Internet](https://ngi.eu/) programme. diff --git a/config.json b/config.json index 4913fe66b..81f90a58f 100644 --- a/config.json +++ b/config.json @@ -3,44 +3,29 @@ { "pattern": "^(did:btcr:.+)$", "image": "universalresolver/driver-did-btcr", + "imageProperties": "true", "tag": "latest", - "testIdentifiers": [ "did:btcr:xz35-jzv2-qqs2-9wjt", "did:btcr:x705-jzv2-qqaz-7vuz", "did:btcr:xkrn-xzcr-qqlv-j6sl" ], - "env": { - "uniresolver_driver_did_btcr_bitcoinConnection": "blockcypherapi", - "uniresolver_driver_did_btcr_rpcUrlMainnet": "http://user:pass@localhost:8332/", - "uniresolver_driver_did_btcr_rpcUrlTestnet": "http://user:pass@localhost:18332/" - } - }, { - "pattern": "^(did:sov:(?:(\\w[-\\w]*(?::\\w[-\\w]*)*):)?([1-9A-HJ-NP-Za-km-z]{21,22}))$", + "testIdentifiers": [ "did:btcr:xz35-jznz-q6mr-7q6", "did:btcr:xkrn-xz7q-q0mx-4cl", "did:btcr:x705-jznz-qwvq-0uw" ] + }, { + "pattern": "^(did:sov:(?:(?:\\w[-\\w]*(?::\\w[-\\w]*)*):)?(?:[1-9A-HJ-NP-Za-km-z]{21,22}))$", "image": "universalresolver/driver-did-sov", + "imageProperties": "true", "tag": "latest", - "testIdentifiers": [ "did:sov:WRfXPg8dantKVubE3HX8pw" ], - "env": { - "uniresolver_driver_did_sov_libIndyPath": "./sovrin/lib/", - "uniresolver_driver_did_sov_poolConfigs": ";./sovrin/live.txn;stn;./sovrin/stn.txn;danube;./sovrin/11347-05.txn", - "uniresolver_driver_did_sov_poolVersions": ";1;stn;2;danube;2", - "uniresolver_driver_did_sov_walletName": "default" - } + "testIdentifiers": [ "did:sov:WRfXPg8dantKVubE3HX8pw" ] }, { "pattern": "^(did:erc725:.+)$", "image": "universalresolver/driver-did-erc725", + "imageProperties": "true", "tag": "latest", - "testIdentifiers": [ "did:erc725:ropsten:2F2B37C890824242Cb9B0FE5614fA2221B79901E" ], - "env": { - "uniresolver_driver_did_erc725_ethereumConnection": "jsonrpc", - "uniresolver_driver_did_erc725_rpcUrlMainnet": "https://mainnet.infura.io/9W2fvWQMP6cJCMH3ESqP", - "uniresolver_driver_did_erc725_rpcUrlRopsten": "https://ropsten.infura.io/9W2fvWQMP6cJCMH3ESqP", - "uniresolver_driver_did_erc725_rpcUrlRinkeby": "https://rinkeby.infura.io/9W2fvWQMP6cJCMH3ESqP", - "uniresolver_driver_did_erc725_rpcUrlKovan": "https://kovan.infura.io/9W2fvWQMP6cJCMH3ESqP", - "uniresolver_driver_did_erc725_etherscanApiMainnet": "http://api.etherscan.io/api", - "uniresolver_driver_did_erc725_etherscanApiRopsten": "http://api-ropsten.etherscan.io/api", - "uniresolver_driver_did_erc725_etherscanApiRinkeby": "http://api-rinkeby.etherscan.io/api", - "uniresolver_driver_did_erc725_etherscanApiKovan": "http://api-kovan.etherscan.io/api" - } - }, { - "pattern": "^(did:v1:.+)$", + "testIdentifiers": [ "did:erc725:ropsten:2F2B37C890824242Cb9B0FE5614fA2221B79901E" ] + }, { + "pattern": "^(did:v1:nym:.+)$", "url": "https://genesis.testnet.veres.one/dids/$1", "testIdentifiers": [ "did:v1:test:nym:3AEJTDMSxDDQpyUftjuoeZ2Bazp4Bswj1ce7FJGybCUu", "did:v1:test:nym:UxYjr6F3hqwiF3yffplpcsV3pXSWSzVQ2396WT65e2E" ] + }, { + "pattern": "^(did:v1:test:nym:.+)$", + "url": "https://genesis.bee.veres.one/dids/$1", + "testIdentifiers": [ "did:v1:test:nym:3AEJTDMSxDDQpyUftjuoeZ2Bazp4Bswj1ce7FJGybCUu", "did:v1:test:nym:UxYjr6F3hqwiF3yffplpcsV3pXSWSzVQ2396WT65e2E" ] }, { "pattern": "^did:ipid:(.+)$", "url": "https://ipfs.io/ipns/$1", @@ -48,26 +33,21 @@ }, { "pattern": "^(did:stack:.+)$", "image": "universalresolver/driver-did-stack", + "imageProperties": "true", "tag": "latest", "testIdentifiers": [ "did:stack:v0:16EMaNw3pkn3v6f2BgnSSs53zAKH4Q8YJg-0" ] }, { - "pattern": "^(did:uport:.+)$|^(did:muport:.+)$|^(did:eth:.+)$|^(did:ethr:.+)$", + "pattern": "^(did:web:.+)$|^(did:ethr:.+)$|^(did:nacl:.+)$", "image": "uport/uni-resolver-driver-did-uport", + "imagePort": "8081", "tag": "latest", - "testIdentifiers": [ "did:uport:2omWsSGspY7zhxaG6uHyoGtcYxoGeeohQXz", "did:muport:Qmbrpc3gKtapsL5k6nZuzYvoMQZwMup5qWvss1q4XuaRJd", "did:eth:0x3b0BC51Ab9De1e5B7B6E34E5b960285805C41736", "did:ethr:0x3b0BC51Ab9De1e5B7B6E34E5b960285805C41736" ] - }, { - "pattern": "^(did:dom:.+)$", - "image": "universalresolver/driver-did-dom", - "tag": "latest", - "testIdentifiers": [ "did:dom:Jjbfgyu7My4RrbRNrXTPBz4PnhnMEE" ] + "testIdentifiers": [ "did:web:uport.me", "did:ethr:0x3b0BC51Ab9De1e5B7B6E34E5b960285805C41736", "did:nacl:Md8JiMIwsapml_FtQ2ngnGftNP5UmVCAUuhnLyAsPxI" ] }, { "pattern": "^((?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*(?:[A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9]))$", "image": "universalresolver/driver-dns", + "imageProperties": "true", "tag": "latest", - "testIdentifiers": [ "ssi.labs.nic.at" ], - "env": { - "uniresolver_driver_dns_dnsServers": "" - } + "testIdentifiers": [ "ssi.labs.nic.at" ] }, { "pattern": "^(did:jolo:.+)$", "image": "jolocomgmbh/jolocom-did-driver", @@ -78,6 +58,43 @@ "image": "hacera/hacera-did-driver", "tag": "latest", "testIdentifiers": [ "did:hcr:0f674e7e-4b49-4898-85f6-96176c1e30de" ] - } + }, { + "pattern": "^did:elem:(.+)$", + "url": "https://element-did.com/api/v1/sidetree/$1", + "testIdentifiers": [ "did:elem:EiAS3mqC4OLMKOwcz3ItIL7XfWduPT7q3Fa4vHgiCfSG2A" ] + }, { + "pattern": "^(did:github:.+)$", + "url": "https://github-did.com/api/v1/did/$1", + "testIdentifiers": [ "did:github:gjgd" ] + }, { + "pattern": "^(did:neoid:.+)$", + "image": "swisscomblockchainag/seraph-id-did-driver", + "tag": "latest", + "testIdentifiers" : [ "did:neoid:priv:b4eeeb80d20bfb38b23001d0659ce0c1d96be0aa" ] + }, { + "pattern": "^(did:ccp:.+)$", + "image": "hello2mao/driver-did-ccp", + "tag": "latest", + "testIdentifiers": ["did:ccp:ceNobbK6Me9F5zwyE3MKY88QZLw", "did:ccp:3CzQLF3qfFVQ1CjGVzVRZaFXrjAd"] + }, { + "pattern": "^(did:work:.+)$", + "image": "didwork/work-did-driver", + "tag": "latest", + "testIdentifiers" : [ "did:work:2UUHQCd4psvkPLZGnWY33L" ] + }, { + "pattern": "^(did:ont:.+)$", + "image": "ontio/ontid-driver", + "tag": "latest", + "testIdentifiers": [ "did:ont:AN5g6gz9EoQ3sCNu7514GEghZurrktCMiH" ] + }, { + "pattern": "^(did:key:.+)$", + "url": "https://did-key.web.app/api/dids/$1", + "testIdentifiers": [ "did:key:z6MksQ35B5bwZDQq4QKuhQW2Sv6dcqwg4PqcSFf67pdgrtjB" ] + }, { + "pattern": "^(did:kilt:.+)$", + "image": "kiltprotocol/kilt-did-driver", + "tag": "latest", + "testIdentifiers" : [ "did:kilt:5CDct4QDpQYfAVDrskNuiEdXyiE38oPfTHEJ65ZLSpz9WasE" ] + } ] } diff --git a/docker-compose.yml b/docker-compose.yml index 348fd9678..c89e7a73f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,7 @@ -version: "2" +version: "3.5" +networks: + default: + name: universal-resolver services: driver-did-btcr: image: universalresolver/driver-did-btcr:latest @@ -17,7 +20,7 @@ services: uniresolver_driver_did_sov_walletName: ${uniresolver_driver_did_sov_walletName} ports: - "8082:8080" - driver-did-uport: + uni-resolver-driver-did-uport: image: uport/uni-resolver-driver-did-uport:latest ports: - "8083:8081" @@ -28,35 +31,50 @@ services: driver-did-erc725: image: universalresolver/driver-did-erc725:latest environment: - uniresolver_driver_did_erc725_ethereumConnection: ${uniresolver_driver_did_erc725_ethereumConnection} - uniresolver_driver_did_erc725_rpcUrlMainnet: ${uniresolver_driver_did_erc725_rpcUrlMainnet} - uniresolver_driver_did_erc725_rpcUrlRopsten: ${uniresolver_driver_did_erc725_rpcUrlRopsten} - uniresolver_driver_did_erc725_rpcUrlRinkeby: ${uniresolver_driver_did_erc725_rpcUrlRinkeby} - uniresolver_driver_did_erc725_rpcUrlKovan: ${uniresolver_driver_did_erc725_rpcUrlKovan} - uniresolver_driver_did_erc725_etherscanApiMainnet: ${uniresolver_driver_did_erc725_etherscanApiMainnet} - uniresolver_driver_did_erc725_etherscanApiRopsten: ${uniresolver_driver_did_erc725_etherscanApiRopsten} - uniresolver_driver_did_erc725_etherscanApiRinkeby: ${uniresolver_driver_did_erc725_etherscanApiRinkeby} - uniresolver_driver_did_erc725_etherscanApiKovan: ${uniresolver_driver_did_erc725_etherscanApiKovan} + uniresolver_driver_did_erc725_ethereumConnections: ${uniresolver_driver_did_erc725_ethereumConnections} + uniresolver_driver_did_erc725_rpcUrls: ${uniresolver_driver_did_erc725_rpcUrls} + uniresolver_driver_did_erc725_etherscanApis: ${uniresolver_driver_did_erc725_etherscanApis} ports: - "8085:8080" - driver-did-dom: - image: universalresolver/driver-did-dom:latest - ports: - - "8086:8080" driver-dns: image: universalresolver/driver-dns:latest environment: uniresolver_driver_dns_dnsServers: ${uniresolver_driver_dns_dnsServers} ports: - "8087:8080" - driver-did-jolo: + jolocom-did-driver: image: jolocomgmbh/jolocom-did-driver:latest ports: - "8088:8080" - driver-did-hacera: + hacera-did-driver: image: hacera/hacera-did-driver:latest ports: - "8089:8080" + seraph-id-did-driver: + image: swisscomblockchainag/seraph-id-did-driver:latest + ports: + - "8090:8080" + driver-did-ccp: + image: hello2mao/driver-did-ccp:latest + ports: + - "8091:8080" + work-did-driver: + image: didwork/work-did-driver:latest + environment: + uniresolver_driver_did_work_apikey: ${uniresolver_driver_did_work_apikey} + uniresolver_driver_did_work_domain: ${uniresolver_driver_did_work_domain} + ports: + - "8092:8080" + ontid-driver: + image: ontio/ontid-driver:latest + ports: + - "8093:8080" + kilt-did-driver: + image: kiltprotocol/kilt-did-driver:latest + environment: + uniresolver_driver_kilt_did_node: ${uniresolver_driver_kilt_did_node} + ports: + - "8094:8080" uni-resolver-web: image: universalresolver/uni-resolver-web:latest ports: diff --git a/docker/Dockerfile-base-alpine b/docker/Dockerfile-base-alpine new file mode 100644 index 000000000..e85178c6c --- /dev/null +++ b/docker/Dockerfile-base-alpine @@ -0,0 +1,27 @@ +# Dockerfile for universalresolver/base-alpine + +FROM openjdk:8-alpine +MAINTAINER Markus Sabadello + +USER root + +RUN apk update && apk upgrade && \ + apk add --no-cache maven git + +ENV PATH $JAVA_HOME/bin:$PATH + +# build dependencies + +RUN cd /opt/ && git clone https://github.com/decentralized-identity/did-common-java.git +RUN cd /opt/did-common-java/ && mvn clean install -DskipTests && mvn clean + +RUN mvn org.apache.maven.plugins:maven-dependency-plugin:3.1.1:get -DrepoUrl=https://repo.maven.apache.org/maven2 -Dartifact=org.eclipse.jetty:jetty-maven-plugin:9.4.18.v20190429 +RUN mvn org.apache.maven.plugins:maven-dependency-plugin:3.1.1:get -DrepoUrl=https://repo.maven.apache.org/maven2 -Dartifact=org.apache.maven.plugins:maven-war-plugin:3.2.2 + +# build driver + +ADD ./resolver/java/ /opt/uni-resolver-java + +RUN cd /opt/uni-resolver-java && mvn clean install -N -DskipTests && mvn clean && \ + cd /opt/uni-resolver-java/uni-resolver-core && mvn clean install -N -DskipTests && mvn clean && \ + cd /opt/uni-resolver-java/driver && mvn clean install -N -DskipTests && mvn clean diff --git a/docker/Dockerfile-base-ubuntu b/docker/Dockerfile-base-ubuntu new file mode 100644 index 000000000..8de506e68 --- /dev/null +++ b/docker/Dockerfile-base-ubuntu @@ -0,0 +1,29 @@ +# Dockerfile for universalresolver/base-ubuntu + +FROM ubuntu:18.04 +MAINTAINER Markus Sabadello + +USER root + +RUN apt-get -y update && \ + apt-get install -y --no-install-recommends openjdk-8-jdk-headless maven git && \ + apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/ +ENV PATH $JAVA_HOME/bin:$PATH + +# build dependencies + +RUN cd /opt/ && git clone https://github.com/decentralized-identity/did-common-java.git +RUN cd /opt/did-common-java/ && mvn clean install -DskipTests + +RUN mvn org.apache.maven.plugins:maven-dependency-plugin:3.1.1:get -DrepoUrl=https://repo.maven.apache.org/maven2 -Dartifact=org.eclipse.jetty:jetty-maven-plugin:9.4.18.v20190429 +RUN mvn org.apache.maven.plugins:maven-dependency-plugin:3.1.1:get -DrepoUrl=https://repo.maven.apache.org/maven2 -Dartifact=org.apache.maven.plugins:maven-war-plugin:3.2.2 + +# build driver + +ADD ./resolver/java/ /opt/uni-resolver-java + +RUN cd /opt/uni-resolver-java && mvn clean install -N -DskipTests && mvn clean && \ + cd /opt/uni-resolver-java/uni-resolver-core && mvn clean install -N -DskipTests && mvn clean && \ + cd /opt/uni-resolver-java/driver && mvn clean install -N -DskipTests && mvn clean diff --git a/docs/branching-strategy.md b/docs/branching-strategy.md new file mode 100644 index 000000000..f32ca561a --- /dev/null +++ b/docs/branching-strategy.md @@ -0,0 +1,18 @@ +# Universal Resolver — Branching Strategy + +The goals for our branching strategy are: +* The master-branch should be deployable at any time. This implies a stable build and the assurance that the core-functionality is provided at any time when cloning the master. +* The master-branch should stay active. As collaboratively working with multiple developers, we encourage merging the code as frequently as possible. This will potentially disclose issues at an early stage and facilitate the repair. Furthermore, it makes clear that the master-branch is the preferred choice that newcomers want to clone. +* In order not to waste time the branching strategy should stay as simple as possible. + +Among a bunch of various strategies we have chosen *GitHub Flow*, which is a lightweight branching-strategy encouraged by the GitHub dev-teams. Details can be found here: https://guides.github.com/introduction/flow/ +The following recipe shortly describes the typical steps that developers need to be take into account when updating the code base: + +![](https://hackernoon.com/hn-images/1*iHPPa72N11sBI_JSDEGxEA.png) + +1. ***Create a branch***: When implementing a new feature, some improvement or a bugfix, a new branch should be created of the master-branch. In order to preserve an organized git-repo, the new branches should go under: `topic/` , whereas the name of the branch should reflect the intention of the branch itself. Use the GitHub-issue name as part of the branch-name, if there is a corresponding issue available. + +2. ***Commit some code***: Add your changes to the new branch and commit regularly with a descriptive commit-message. This builds up a transparent history of work and makes a roll back of changes easier. +3. ***Open a Pull Request (PR)***: Once your changes are complete (or you want some feedback at an early stage of development) open a PR against the master-branch. A PR initiates a discussion with the maintainer, which will review your code at this point. Furthermore, the [[CI/CD process|Continuous-Integration-and-Delivery]] will be kicked off and your code will be deployed to the dev-system. +4. ***Discuss, review code and deployment***: Wait for feedback of the maintainer and check the deployment at the dev-system. In case of contributing a new driver the maintainer will also add the deployment-scripts in the scope of this PR. You may also be requested to make some changes to your code. Finally, the new changes should be safely incorporated to the master-branch and the updated universal-resolver is running smoothly in dev-environment. +5. ***Merge to the master-branch***: If all parties involved in the discussion are satisfied, the maintainer will merge the PR into the master-branch and will close the PR itself. You are free to delete your branch as all changes have already been incorporated in the master. diff --git a/docs/continuous-integration-and-delivery.md b/docs/continuous-integration-and-delivery.md new file mode 100644 index 000000000..880237443 --- /dev/null +++ b/docs/continuous-integration-and-delivery.md @@ -0,0 +1,36 @@ +# Universal Resolver — Continuous Integration and Delivery + +This section describes the building-blocks and ideas of the implemented CI/CD pipeline. In case of issues or requests in the scope of CI/CD, please directly consult the maintainers of the repository. + +## Intro + +The CI/CD pipeline helps achieving the following goals: +* Detection of problems asap +* Short and robust release cycles +* Avoidance of repetitive, manual tasks +* Increase of Software Quality + +After every code change the CI/CD pipeline builds all software packages/Docker containers automatically. Once the containers are built, they are automatically deployed to the dev-system. By these measures building as well as deployment issues are immediately discovered. Once the freshly built containers are deployed, automatic tests are run in order to verify the software and to detect functional issues. + +## Building Blocks + +The CI/CD pipeline is constructed by using GitHub Actions. The workflow (workflow file https://github.com/philpotisk/universal-resolver/blob/master/.github/workflows/universal-resolver-ws.yml ) is run after every push to the master and on ever PR against master. +The workflow consists of several steps. Each step is implemented as Docker container that performs the relevant actions. Currently, the two main steps are: + +1. Building the resolver +2. Deploying the resolver + +The build-step uses this container https://github.com/philpotisk/github-action-docker-build-push, which generically builds a Docker image and pushes it to Docker Hub at https://hub.docker.com/u/universalresolver +The second step takes the image and deploys it (create or update) to the configured Kubernetes cluster. The Docker container fulfilling this step can be found here: https://github.com/philpotisk/github-action-deploy-eks + +## Steps of the CI/CD Workflow + +![](https://user-images.githubusercontent.com/55081379/68245944-2a78db00-0018-11ea-8ebe-22c19d5ad096.PNG) + +1. Dev pushes code to GitHub +2. GitHub Actions (GHA) is triggerd by the „push“ event, clones the repo and runs the workflow for every container: + * (a) Docker build + * (b) Docker push (Docker image goes to DockerHub) + * (c) Deploy to Kubernetes + * (d) Runs a test-container +3. Manual and automated feedback diff --git a/docs/creating-releases.md b/docs/creating-releases.md new file mode 100644 index 000000000..2b6849e13 --- /dev/null +++ b/docs/creating-releases.md @@ -0,0 +1,39 @@ +# Universal Resolver — Creating Releases + +This guide explains the release process of the universal resolver. + +## Version Number + +The concept of versioning is in-line with Semantic Versioning as described here https://semver.org/. +Each release is defined by the version number, which is composed by the three parts MAJOR.MINOR.PATCH. +1. MAJOR version for incompatible API changes. +2. MINOR version when adding functionality in a backwards compatible manner. +3. PATCH version when making backwards compatible bug fixes. +Further details should be taken from the link above. + +## Release Process +According to the [roadmap](https://github.com/philpotisk/universal-resolver/wiki/Roadmap-Universal-Resolver) major and minor releases are planned and scheduled. Patch-versions, may have happened spontaneously according to urgent bugfixes. +For each minor release there is a dedicated branch following the naming pattern: MAJOR.MINOR.x (e.g. 3.1.x). In this branch the code-base for this particular release will be hardened. The code has to pass the static code analysis, which detects potential issues with the code in terms of quality and security. Furthermore, this code will be manually deployed in a staging/ production-like environment, where manual and automatic testing are taking place. Once the release fulfills the desired standards, it will be packaged and released to the GitHub release page, and announced at (TODO: wiki/whats-new-in-universal-resolver-.x). + +Steps for releasing a new version: +1. Create a release branch from the master. + + `git checkout -b 3.1.x` + + `git push --set-upstream origin 3.1.x` + +Open universal-resolver/.github/workflows/universal-resolver-ws.yml and adjust the CONTAINER_TAG to the specific release number. For example: 3.1.0 +In the same file, change also the branch the CI/CD workflow is listening on, to 3.1.x. In future, when there will be a staging-system in place, also the KUBE_KONFIG_DATA needs to be changed, so the deployment will go to the staging system, rather to the dev-system. + +2. Run Sonar Cube analytics and review results in the online dashboard. Consider all issues and make sure, that no critical issues are flagged, before releasing the software. + +3. After the build-job got executed, the Docker image should be stored at Docker Hub. You can check the website or simply run the container by specifying the tag: docker pull phil21/uni-resolver-web:3.1.0 + +4. Tag the release: + + `git tag v3.1.0.RELEASE` + + `git push origin --tags` + +Afterwards the release will be automatically shown on GitHub under the releases. + diff --git a/docs/design-goals.md b/docs/design-goals.md index ffb5e256d..0d2a129ff 100644 --- a/docs/design-goals.md +++ b/docs/design-goals.md @@ -1,4 +1,4 @@ -# Universal Resolver - Design Goals +# Universal Resolver — Design Goals The main design objectives of the UR are: diff --git a/docs/dev-system.md b/docs/dev-system.md new file mode 100644 index 000000000..382f78151 --- /dev/null +++ b/docs/dev-system.md @@ -0,0 +1,38 @@ +# Universal Resolver — Development System + +The dev-system or the sandbox installation, which runs the latest code-base of the Universal Resolver project, is hosted at: + +http://dev.uniresolver.io + +The drivers are exposed by their subdomains (DID method-names). For example: btcr.dev.uniresolver.io +> Note for driver-developers: The subdomains are automatically generated based on the Docker image tag e.g.: driver-did-btcr, which consequently must have the DID-method name as part of the tag-name (pattern: driver-di-``). + +DIDs can be resolved by calling the resolver: + +http://dev.uniresolver.io/1.0/identifiers/did:btcr:xz35-jznz-q6mr-7q6 + +or by directly accessing the driver’s endpoint: + +http://btcr.dev.uniresolver.io/1.0/identifiers/did:btcr:xz35-jznz-q6mr-7q6 + + +The software is automatically updated on every commit and PR on the master branch. See [CI-CD](/docs/continuous-integration-and-delivery.md) for more details + + +Currently the system is deployed in the AWS cloud by the use of the Elastic Kubernetes Service (EKS). Please be aware that the use of AWS is not mandatory for hosting the resolver. Any environment that supports Docker Compose or Kubernetes will be capable of running an instance of the Universal Resolver. + + +## AWS Architecture + +This picture illustrates the AWS architecture for hosting the Universal resolver as well as the traffic-flow through the system. + +

+ +The entry-point to the system is the public Internet facing Application Load Balancer (ALB), that sits at the edge of the AWS cloud and is bound to the DNS name “dev.uniresolver.io”. When resolving DIDs the traffic flows through the ALB to the resolver. Based on the configuration of each DID-method the resolver calls the corresponding DID-driver (typical scenario) or may call another HTTP endpoint (another resolver or directly the DLT if HTTP is supported). In order to gain performance, blockchain nodes may also be added to the deployment, as sketched at Driver C. + +The Kubernetes cluster is spanned across multiple Availability Zones (AZ), which are essential parts for providing fault-tolerance and achieving a high-availability HA of the system. This means that no downtime is to be expected in case of failing parts of the system, as the healthy parts will take over operations reliably. + +If containers, like DID-Drivers, are added or removed, the ALB ingress controller https://kubernetes-sigs.github.io/aws-alb-ingress-controller/ takes care of notifying the ALB. Due to this mechanism the ALB stays aware of the system state and is able to keep traffic-routes healthy. +By use of https://github.com/kubernetes-sigs/external-dns the DNS Service Route 53 is updated. Further details regarding the automated system-update are described at [CI-CD](/docs/continuous-integration-and-delivery.md). + + diff --git a/docs/driver-development.md b/docs/driver-development.md index c7c583b41..55ac2e2df 100644 --- a/docs/driver-development.md +++ b/docs/driver-development.md @@ -1,3 +1,5 @@ +# Universal Resolver — Driver Development + ## Introduction The Universal Resolver's main function is wrapping an API around a number of colocated Docker containers running DID-method-specific resolvers. As such, the resolver supports all open-source drivers which have been contributed to-date. The Universal Resolver is meant to support additional DID methods as they are developed by members of various communities. The contribution for a new DID method consists of a Docker image which exposes an HTTP GET interface for resolving DIDs. Although drivers can be implemented in whichever language and architecture the contributor prefers, drivers that are contributed will share a few common characteristics. @@ -60,3 +62,33 @@ As with contributing a driver, there are a few documentation requirements that s * config.json (update driver version) * docker-compose.yml (update driver version) * README.md (update driver version, DID spec version, DID Resolution spec version, Docker Hub link) + +## How to test a driver locally with the Universal Resolver + +Once your driver is implemented and published as a docker container on dockerhub, you may want to test that it is running properly within the universal resolver. + +To do so, follow these steps: + +- clone the universal resolver (this) repository: + + ```bash + git clone https://github.com/decentralized-identity/universal-resolver + cd universal-resolver/ + ``` + +- make the required changes mentioned above ("How to contribute a driver") to the `.env`, `config.json` and `docker-compose.yml` files. +- build uni-resolver-web locally: + + ```bash + docker build -f ./resolver/java/uni-resolver-web/docker/Dockerfile . -t universalresolver/uni-resolver-web + ``` + +- run the uni-resolver-web locally: + + ```bash + docker-compose -f docker-compose.yml pull + docker-compose -f docker-compose.yml up + ``` + +You can now resolve DID Documents via `curl` commands as documented in the [Quick Start](https://github.com/decentralized-identity/universal-resolver#quick-start) notes. + diff --git a/docs/figures/aws-architecture.png b/docs/figures/aws-architecture.png new file mode 100644 index 000000000..b997c5cc2 Binary files /dev/null and b/docs/figures/aws-architecture.png differ diff --git a/docs/logo-dif.png b/docs/logo-dif.png new file mode 100644 index 000000000..a5ffa5d4f Binary files /dev/null and b/docs/logo-dif.png differ diff --git a/docs/logo-ngi0pet.png b/docs/logo-ngi0pet.png new file mode 100644 index 000000000..7bf975473 Binary files /dev/null and b/docs/logo-ngi0pet.png differ diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index e81889291..5042f05f2 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -1,4 +1,4 @@ -## Troubleshooting +# Universal Resolver — Troubleshooting If docker-compose complains about wrong versions then you probably have a too old docker-compose version. diff --git a/drivers/btcr/.gitignore b/drivers/btcr/.gitignore deleted file mode 100644 index 697e1e157..000000000 --- a/drivers/btcr/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -.project -.classpath -/.settings/ -/target -/bin/ diff --git a/drivers/btcr/README.md b/drivers/btcr/README.md deleted file mode 100644 index 1f5a9e771..000000000 --- a/drivers/btcr/README.md +++ /dev/null @@ -1,64 +0,0 @@ -![DIF Logo](https://raw.githubusercontent.com/decentralized-identity/decentralized-identity.github.io/master/images/logo-small.png) - -# Universal Resolver Driver: did:btcr - -This is a [Universal Resolver](https://github.com/decentralized-identity/universal-resolver/) driver for **did:btcr** identifiers. - -## Specifications - -* [Decentralized Identifiers](https://w3c-ccg.github.io/did-spec/) -* [BTCR DID Method 0.1](https://w3c-ccg.github.io/didm-btcr) - -## Example DIDs - -``` -did:btcr:xz35-jzv2-qqs2-9wjt -did:btcr:x705-jzv2-qqaz-7vuz -did:btcr:xkrn-xzcr-qqlv-j6sl -``` - -## Build and Run (Docker) - -``` -docker build -f ./docker/Dockerfile . -t universalresolver/driver-did-btcr -docker run -p 8080:8080 universalresolver/driver-did-btcr -curl -X GET http://localhost:8080/1.0/identifiers/did:btcr:xz35-jzv2-qqs2-9wjt -``` - -## Build (native Java) - - 1. First, build https://github.com/decentralized-identity/universal-resolver/tree/master/resolver/java - 1. Then, run `mvn clean install` - -## Driver Environment Variables - -The driver recognizes the following environment variables: - -### `uniresolver_driver_did_btcr_bitcoinConnection` - - * Specifies how the driver interacts with the Bitcoin blockchain. - * Possible values: - * `bitcoind`: Connects to a [bitcoind](https://bitcoin.org/en/full-node) instance via JSON-RPC - * `btcd`: Connects to a [btcd](https://github.com/btcsuite/btcd) instance via JSON-RPC - * `bitcoinj`: Connects to Bitcoin using a local [bitcoinj](https://bitcoinj.github.io/) client - * `blockcypherapi`: Connects to [BlockCypher's API](https://www.blockcypher.com/dev/bitcoin/) - * Default value: `blockcypherapi` - -### `uniresolver_driver_did_btcr_rpcUrlMainnet` - - * Specifies the JSON-RPC URL of a bitcoind/btcd instance running on Mainnet. - * Default value: `http://user:pass@localhost:8332/` - -### `uniresolver_driver_did_btcr_rpcUrlTestnet` - - * Specifies the JSON-RPC URL of a bitcoind/btcd instance running on Testnet. - * Default value: `http://user:pass@localhost:18332/` - -## Driver Metadata - -The driver returns the following metadata in addition to a DID document: - -* `fragmentUri`: ... -* `chain`: ... -* `blockHeight`: ... -* `blockIndex`: ... diff --git a/drivers/btcr/docker/Dockerfile b/drivers/btcr/docker/Dockerfile deleted file mode 100644 index 9b4832887..000000000 --- a/drivers/btcr/docker/Dockerfile +++ /dev/null @@ -1,31 +0,0 @@ -# Dockerfile for universalresolver/driver-did-btcr - -FROM universalresolver/driver -MAINTAINER Markus Sabadello - -# build dependencies - -RUN cd /opt/ && git clone https://github.com/WebOfTrustInfo/txref-conversion-java.git -RUN cd /opt/txref-conversion-java/ && mvn clean install -DskipTests - -# build driver-did-btcr - -ADD . /opt/driver-did-btcr -RUN cd /opt/driver-did-btcr && mvn install package -N -DskipTests - -# clean up - -RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* - -# variables - -ENV uniresolver_driver_did_btcr_bitcoinConnection=blockcypherapi -ENV uniresolver_driver_did_btcr_rpcUrlMainnet=http://user:pass@localhost:8332/ -ENV uniresolver_driver_did_btcr_rpcUrlTestnet=http://user:pass@localhost:18332/ - -# done - -EXPOSE 8080 - -RUN chmod a+rx /opt/driver-did-btcr/docker/run-driver-did-btcr.sh -CMD "/opt/driver-did-btcr/docker/run-driver-did-btcr.sh" diff --git a/drivers/btcr/docker/run-driver-did-btcr.sh b/drivers/btcr/docker/run-driver-did-btcr.sh deleted file mode 100755 index 669617d5b..000000000 --- a/drivers/btcr/docker/run-driver-did-btcr.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -cd /opt/driver-did-btcr/ -mvn jetty:run -P war diff --git a/drivers/btcr/pom.xml b/drivers/btcr/pom.xml deleted file mode 100644 index 89a3bf784..000000000 --- a/drivers/btcr/pom.xml +++ /dev/null @@ -1,119 +0,0 @@ - - - 4.0.0 - uni-resolver-driver-did-btcr - ${packaging.type} - uni-resolver-driver-did-btcr - - - decentralized-identity - uni-resolver - 0.1-SNAPSHOT - - - - - - - default - true - jar - - - - - - war - war - - - - org.apache.maven.plugins - maven-war-plugin - 2.4 - - - org.eclipse.jetty - jetty-maven-plugin - 9.4.0.M1 - - - ${basedir}/src/test/resources/jetty.xml - - - ${basedir}/src/test/resources/jetty-env.xml - - / - true - - - jetty.port - 8080 - - - slf4j - true - - - log4j.configuration - file:${basedir}/src/test/resources/log4j.properties - - - - - - org.slf4j - slf4j-api - 1.7.5 - compile - - - org.slf4j - jcl-over-slf4j - 1.7.5 - compile - - - org.slf4j - slf4j-log4j12 - 1.7.5 - compile - - - - - - - - - - - - - decentralized-identity - uni-resolver-driver - 0.1-SNAPSHOT - compile - - - info.weboftrust - txref-conversion-java - 0.1-SNAPSHOT - compile - - - org.bitcoinj - bitcoinj-core - 0.14.7 - compile - - - commons-codec - commons-codec - 1.10 - compile - - - - diff --git a/drivers/btcr/src/main/java/uniresolver/driver/did/btcr/DidBtcrDriver.java b/drivers/btcr/src/main/java/uniresolver/driver/did/btcr/DidBtcrDriver.java deleted file mode 100644 index 07eef1011..000000000 --- a/drivers/btcr/src/main/java/uniresolver/driver/did/btcr/DidBtcrDriver.java +++ /dev/null @@ -1,325 +0,0 @@ -package uniresolver.driver.did.btcr; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.http.HttpEntity; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.util.EntityUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import did.Authentication; -import did.DIDDocument; -import did.Encryption; -import did.PublicKey; -import did.Service; -import info.weboftrust.txrefconversion.Bech32; -import info.weboftrust.txrefconversion.ChainAndBlockLocation; -import info.weboftrust.txrefconversion.TxrefConverter; -import uniresolver.ResolutionException; -import uniresolver.driver.Driver; -import uniresolver.driver.did.btcr.bitcoinconnection.BTCDRPCBitcoinConnection; -import uniresolver.driver.did.btcr.bitcoinconnection.BitcoinConnection; -import uniresolver.driver.did.btcr.bitcoinconnection.BitcoinConnection.BtcrData; -import uniresolver.driver.did.btcr.bitcoinconnection.BitcoindRPCBitcoinConnection; -import uniresolver.driver.did.btcr.bitcoinconnection.BitcoinjSPVBitcoinConnection; -import uniresolver.driver.did.btcr.bitcoinconnection.BlockcypherAPIBitcoinConnection; -import uniresolver.result.ResolveResult; - -public class DidBtcrDriver implements Driver { - - private static Logger log = LoggerFactory.getLogger(DidBtcrDriver.class); - - public static final Pattern DID_BTCR_PATTERN = Pattern.compile("^did:btcr:(\\S*)$"); - - public static final String[] DIDDOCUMENT_PUBLICKEY_TYPES = new String[] { "EdDsaSAPublicKeySecp256k1" }; - public static final String[] DIDDOCUMENT_AUTHENTICATION_TYPES = new String[] { "EdDsaSASignatureAuthentication2018" }; - - private Map properties; - - private BitcoinConnection bitcoinConnection; - - private HttpClient httpClient = HttpClients.createDefault(); - - public DidBtcrDriver(Map properties) { - - this.setProperties(properties); - } - - public DidBtcrDriver() { - - this.setProperties(getPropertiesFromEnvironment()); - } - - private static Map getPropertiesFromEnvironment() { - - if (log.isDebugEnabled()) log.debug("Loading from environment: " + System.getenv()); - - Map properties = new HashMap (); - - try { - - String env_bitcoinConnection = System.getenv("uniresolver_driver_did_btcr_bitcoinConnection"); - String env_rpcUrlMainnet = System.getenv("uniresolver_driver_did_btcr_rpcUrlMainnet"); - String env_rpcUrlTestnet = System.getenv("uniresolver_driver_did_btcr_rpcUrlTestnet"); - - if (env_bitcoinConnection != null) properties.put("bitcoinConnection", env_bitcoinConnection); - if (env_rpcUrlMainnet != null) properties.put("rpcUrlMainnet", env_rpcUrlMainnet); - if (env_rpcUrlTestnet != null) properties.put("rpcUrlTestnet", env_rpcUrlTestnet); - } catch (Exception ex) { - - throw new IllegalArgumentException(ex.getMessage(), ex); - } - - return properties; - } - - private void configureFromProperties() { - - if (log.isDebugEnabled()) log.debug("Configuring from properties: " + this.getProperties()); - - try { - - String prop_bitcoinConnection = (String) this.getProperties().get("bitcoinConnection"); - - if ("bitcoind".equals(prop_bitcoinConnection)) { - - this.setBitcoinConnection(new BitcoindRPCBitcoinConnection()); - - String prop_rpcUrlMainnet = (String) this.getProperties().get("rpcUrlMainnet"); - String prop_rpcUrlTestnet = (String) this.getProperties().get("rpcUrlTestnet"); - - if (prop_rpcUrlMainnet != null) ((BitcoindRPCBitcoinConnection) this.getBitcoinConnection()).setRpcUrlMainnet(prop_rpcUrlMainnet); - if (prop_rpcUrlTestnet != null) ((BitcoindRPCBitcoinConnection) this.getBitcoinConnection()).setRpcUrlTestnet(prop_rpcUrlTestnet); - } else if ("btcd".equals(prop_bitcoinConnection)) { - - this.setBitcoinConnection(new BTCDRPCBitcoinConnection()); - - String prop_rpcUrlMainnet = (String) this.getProperties().get("rpcUrlMainnet"); - String prop_rpcUrlTestnet = (String) this.getProperties().get("rpcUrlTestnet"); - - if (prop_rpcUrlMainnet != null) ((BTCDRPCBitcoinConnection) this.getBitcoinConnection()).setRpcUrlMainnet(prop_rpcUrlMainnet); - if (prop_rpcUrlTestnet != null) ((BTCDRPCBitcoinConnection) this.getBitcoinConnection()).setRpcUrlTestnet(prop_rpcUrlTestnet); - } else if ("bitcoinj".equals(prop_bitcoinConnection)) { - - this.setBitcoinConnection(new BitcoinjSPVBitcoinConnection()); - } else if ("blockcypherapi".equals(prop_bitcoinConnection)) { - - this.setBitcoinConnection(new BlockcypherAPIBitcoinConnection()); - } - } catch (Exception ex) { - - throw new IllegalArgumentException(ex.getMessage(), ex); - } - } - - @Override - public ResolveResult resolve(String identifier) throws ResolutionException { - - // parse identifier - - Matcher matcher = DID_BTCR_PATTERN.matcher(identifier); - if (! matcher.matches()) return null; - - String targetDid = matcher.group(1); - - // determine txref - - String txref = null; - if (targetDid.charAt(0) == TxrefConverter.MAGIC_BTC_MAINNET_BECH32_CHAR) txref = TxrefConverter.TXREF_BECH32_HRP_MAINNET + Bech32.SEPARATOR + "-" + targetDid; - if (targetDid.charAt(0) == TxrefConverter.MAGIC_BTC_TESTNET_BECH32_CHAR) txref = TxrefConverter.TXREF_BECH32_HRP_TESTNET + Bech32.SEPARATOR + "-" + targetDid; - if (txref == null) throw new ResolutionException("Invalid magic byte in " + targetDid); - - // retrieve btcr data - - ChainAndBlockLocation initialChainAndBlockLocation; - ChainAndBlockLocation chainAndBlockLocation; - String initialTxid; - String txid; - BtcrData btcrData = null; - List spentInTxids = new ArrayList (); - - try { - - chainAndBlockLocation = TxrefConverter.get().txrefDecode(txref); - txid = this.getBitcoinConnection().getTxid(chainAndBlockLocation); - - initialTxid = txid; - initialChainAndBlockLocation = chainAndBlockLocation; - - while (true) { - - btcrData = this.getBitcoinConnection().getBtcrData(chainAndBlockLocation.getChain(), txid); - if (btcrData == null) break; - - // check if we need to follow the tip - - if (btcrData.getSpentInTxid() == null) { - - break; - } else { - - spentInTxids.add(btcrData.getSpentInTxid()); - txid = btcrData.getSpentInTxid(); - chainAndBlockLocation = this.getBitcoinConnection().getChainAndBlockLocation(chainAndBlockLocation.getChain(), txid); - } - } - } catch (IOException ex) { - - throw new ResolutionException("Cannot retrieve BTCR data for " + txref + ": " + ex.getMessage(), ex); - } - - if (log.isInfoEnabled()) log.info("Retrieved BTCR data for " + txref + " ("+ txid + " on chain " + chainAndBlockLocation.getChain() + "): " + btcrData); - - // retrieve DID DOCUMENT CONTINUATION - - DIDDocument didDocumentContinuation = null; - - if (btcrData != null && btcrData.getContinuationUri() != null) { - - HttpGet httpGet = new HttpGet(btcrData.getContinuationUri()); - - try (CloseableHttpResponse httpResponse = (CloseableHttpResponse) this.getHttpClient().execute(httpGet)) { - - if (httpResponse.getStatusLine().getStatusCode() > 200) throw new ResolutionException("Cannot retrieve DID DOCUMENT CONTINUATION for " + txref + " from " + btcrData.getContinuationUri() + ": " + httpResponse.getStatusLine()); - - HttpEntity httpEntity = httpResponse.getEntity(); - - didDocumentContinuation = DIDDocument.fromJson(EntityUtils.toString(httpEntity)); - EntityUtils.consume(httpEntity); - } catch (IOException ex) { - - throw new ResolutionException("Cannot retrieve DID DOCUMENT CONTINUATION for " + txref + " from " + btcrData.getContinuationUri() + ": " + ex.getMessage(), ex); - } - - if (log.isInfoEnabled()) log.info("Retrieved DID DOCUMENT CONTINUATION for " + txref + " (" + btcrData.getContinuationUri() + "): " + didDocumentContinuation); - } - - // DID DOCUMENT id - - String id = identifier; - - // DID DOCUMENT publicKeys - - int keyNum = 0; - List publicKeys; - List authentications; - List encryptions; - - if (btcrData != null) { - - String keyId = id + "#key-" + (++keyNum); - - PublicKey publicKey = PublicKey.build(keyId, DIDDOCUMENT_PUBLICKEY_TYPES, null, null, btcrData.getInputScriptPubKey(), null); - publicKeys = Collections.singletonList(publicKey); - - Authentication authentication = Authentication.build(null, DIDDOCUMENT_AUTHENTICATION_TYPES, keyId); - authentications = Collections.singletonList(authentication); - - encryptions = Collections.emptyList(); - } else { - - publicKeys = Collections.emptyList(); - authentications = Collections.emptyList(); - encryptions = Collections.emptyList(); - } - - // DID DOCUMENT services - - List services; - - if (didDocumentContinuation != null) { - - services = didDocumentContinuation.getServices(); - } else { - - services = Collections.emptyList(); - } - - // create DID DOCUMENT - - DIDDocument didDocument = DIDDocument.build(id, publicKeys, authentications, encryptions, services); - - // revoked? - - if ((! spentInTxids.isEmpty()) && didDocumentContinuation == null) { - - didDocument = null; - } - - // create METHOD METADATA - - Map methodMetadata = new LinkedHashMap (); - if (btcrData != null) methodMetadata.put("inputScriptPubKey", btcrData.getInputScriptPubKey()); - if (btcrData != null) methodMetadata.put("continuationUri", btcrData.getContinuationUri()); - if (didDocumentContinuation != null) methodMetadata.put("continuation", didDocumentContinuation); - if (chainAndBlockLocation != null) methodMetadata.put("chain", chainAndBlockLocation.getChain()); - if (initialChainAndBlockLocation != null) methodMetadata.put("initialBlockHeight", initialChainAndBlockLocation.getBlockHeight()); - if (initialChainAndBlockLocation != null) methodMetadata.put("initialBlockIndex", initialChainAndBlockLocation.getBlockIndex()); - if (initialTxid != null) methodMetadata.put("initialTxid", initialTxid); - if (chainAndBlockLocation != null) methodMetadata.put("blockHeight", chainAndBlockLocation.getBlockHeight()); - if (chainAndBlockLocation != null) methodMetadata.put("blockIndex", chainAndBlockLocation.getBlockIndex()); - if (txid != null) methodMetadata.put("txid", txid); - if (spentInTxids != null) methodMetadata.put("spentInTxids", spentInTxids); - - // create RESOLVE RESULT - - ResolveResult resolveResult = ResolveResult.build(didDocument, null, methodMetadata); - - // done - - return resolveResult; - } - - @Override - public Map properties() { - - return this.getProperties(); - } - - /* - * Getters and setters - */ - - public Map getProperties() { - - return this.properties; - } - - public void setProperties(Map properties) { - - this.properties = properties; - this.configureFromProperties(); - } - - public BitcoinConnection getBitcoinConnection() { - - return this.bitcoinConnection; - } - - public void setBitcoinConnection(BitcoinConnection bitcoinConnection) { - - this.bitcoinConnection = bitcoinConnection; - } - - public HttpClient getHttpClient() { - - return this.httpClient; - } - - public void setHttpClient(HttpClient httpClient) { - - this.httpClient = httpClient; - } -} diff --git a/drivers/btcr/src/main/java/uniresolver/driver/did/btcr/bitcoinconnection/BTCDRPCBitcoinConnection.java b/drivers/btcr/src/main/java/uniresolver/driver/did/btcr/bitcoinconnection/BTCDRPCBitcoinConnection.java deleted file mode 100644 index 43249e354..000000000 --- a/drivers/btcr/src/main/java/uniresolver/driver/did/btcr/bitcoinconnection/BTCDRPCBitcoinConnection.java +++ /dev/null @@ -1,261 +0,0 @@ -package uniresolver.driver.did.btcr.bitcoinconnection; - -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.URI; -import java.net.URL; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.commons.codec.DecoderException; -import org.apache.commons.codec.binary.Hex; -import org.bitcoinj.core.ECKey; -import org.bitcoinj.core.NetworkParameters; -import org.bitcoinj.params.MainNetParams; -import org.bitcoinj.params.TestNet3Params; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.googlecode.jsonrpc4j.JsonRpcHttpClient; - -import info.weboftrust.txrefconversion.Chain; - -public class BTCDRPCBitcoinConnection extends info.weboftrust.txrefconversion.bitcoinconnection.BTCDRPCBitcoinConnection implements BitcoinConnection { - - private static Logger log = LoggerFactory.getLogger(BTCDRPCBitcoinConnection.class); - - private static final BTCDRPCBitcoinConnection instance = new BTCDRPCBitcoinConnection(); - - private static final Pattern patternAsmInputScriptPubKey = Pattern.compile("^[^\\s]+ ([0-9a-fA-F]+)$"); - private static final Pattern patternAsmContinuationUri = Pattern.compile("^OP_RETURN ([0-9a-fA-F]+)$"); - - public BTCDRPCBitcoinConnection(URL rpcUrlMainnet, URL rpcUrlTestnet) { - - super(rpcUrlMainnet, rpcUrlTestnet); - } - - public BTCDRPCBitcoinConnection() { - - super(); - } - - public static BTCDRPCBitcoinConnection get() { - - return instance; - } - - @SuppressWarnings("unchecked") - @Override - public BtcrData getBtcrData(Chain chain, String txid) throws IOException { - - JsonRpcHttpClient btcdRpcClient = chain == Chain.MAINNET ? this.btcdRpcClientMainnet : this.btcdRpcClientTestnet; - - // retrieve transaction data - - LinkedHashMap getrawtransaction_result; - - try { - - getrawtransaction_result = btcdRpcClient.invoke("getrawtransaction", new Object[] { txid, 1 }, LinkedHashMap.class); - } catch (IOException ex) { - - throw ex; - } catch (Throwable ex) { - - throw new IOException("getrawtransaction() exception: " + ex.getMessage(), ex); - } - - // find input script pub key - - String inputScriptPubKey = null; - - ArrayList vIn = (ArrayList) getrawtransaction_result.get("vin"); - if (vIn == null || vIn.size() < 1) return null; - - for (int i=0; i in = (LinkedHashMap) vIn.get(i); - - LinkedHashMap scriptSig = (LinkedHashMap) in.get("scriptSig"); - if (scriptSig == null) continue; - - String asm = (String) scriptSig.get("asm"); - if (asm == null) continue; - - Matcher matcher = patternAsmInputScriptPubKey.matcher(asm); - - if (log.isDebugEnabled()) log.debug("IN: " + asm + " (MATCHES: " + matcher.matches() + ")"); - - if (matcher.matches() && matcher.groupCount() == 1) { - - if (log.isDebugEnabled()) log.debug("inputScriptPubKey: " + matcher.group(1)); - - inputScriptPubKey = matcher.group(1); - break; - } - } - - if (inputScriptPubKey == null) return null; - if (inputScriptPubKey.length() > 66) inputScriptPubKey = inputScriptPubKey.substring(inputScriptPubKey.length() - 66); - - // find DID DOCUMENT CONTINUATION URI - - URI continuationUri = null; - - ArrayList vOut = (ArrayList) getrawtransaction_result.get("vout"); - if (vOut == null || vOut.size() < 1) return null; - - for (int i=0; i out = (LinkedHashMap) vOut.get(i); - - LinkedHashMap scriptPubKey = (LinkedHashMap) out.get("scriptPubKey"); - if (scriptPubKey == null) continue; - - String asm = (String) scriptPubKey.get("asm"); - if (asm == null) continue; - - Matcher matcher = patternAsmContinuationUri.matcher(asm); - - if (log.isDebugEnabled()) log.debug("OUT: " + asm + " (MATCHES: " + matcher.matches() + ")"); - - if (matcher.matches() && matcher.groupCount() == 1) { - - if (log.isDebugEnabled()) log.debug("continuationUri: " + matcher.group(1)); - - try { - - continuationUri = URI.create(new String(Hex.decodeHex(matcher.group(1).toCharArray()), "UTF-8")); - break; - } catch (UnsupportedEncodingException | DecoderException ex) { - - continue; - } - } - } - - // find spent in tx - - String spentInTxid = null; - - spentInTxid: for (int i=0; i out = (LinkedHashMap) vOut.get(i); - - LinkedHashMap scriptPubKey = (LinkedHashMap) out.get("scriptPubKey"); - if (scriptPubKey == null) continue; - - ArrayList addresses = (ArrayList) scriptPubKey.get("addresses"); - if (addresses == null) continue; - - for (int ii=0; ii searchrawtransactions_result; - - try { - - searchrawtransactions_result = btcdRpcClient.invoke("searchrawtransactions", new Object[] { address, 1 }, ArrayList.class); - } catch (IOException ex) { - - throw ex; - } catch (Throwable ex) { - - throw new IOException("searchrawtransactions() exception: " + ex.getMessage(), ex); - } - - // search transactions to see if they spent the address - - for (int iii=0; iii outTx = (LinkedHashMap) searchrawtransactions_result.get(iii); - String outTxid = (String) outTx.get("txid"); - - if (log.isDebugEnabled()) log.debug("SEARCH OUT: transaction: " + outTxid); - - String outInputScriptPubKey = null; - String outInTxid = null; - Integer outInVout = null; - - ArrayList outTxvIn = (ArrayList) outTx.get("vin"); - if (outTxvIn == null || outTxvIn.size() < 1) return null; - - for (int iiii=0; iiii outTxIn = (LinkedHashMap) outTxvIn.get(iiii); - - outInTxid = (String) outTxIn.get("txid"); - if (log.isDebugEnabled()) log.debug("SEARCH OUT: outInTxid: " + outInTxid); - if (outInTxid == null) continue; - - outInVout = (Integer) outTxIn.get("vout"); - if (log.isDebugEnabled()) log.debug("SEARCH OUT: outInVout: " + outInVout); - if (outInVout == null) continue; - - LinkedHashMap scriptSig = (LinkedHashMap) outTxIn.get("scriptSig"); - if (scriptSig == null) continue; - - String asm = (String) scriptSig.get("asm"); - if (asm == null) continue; - - Matcher matcher = patternAsmInputScriptPubKey.matcher(asm); - - if (log.isDebugEnabled()) log.debug("SEARCH OUT: IN: " + asm + " (MATCHES: " + matcher.matches() + ")"); - - if (matcher.matches() && matcher.groupCount() == 1) { - - if (log.isDebugEnabled()) log.debug("SEARCH OUT: outInputScriptPubKey: " + matcher.group(1)); - - outInputScriptPubKey = matcher.group(1); - break; - } - } - - if (outInputScriptPubKey == null) continue; - if (outInputScriptPubKey.length() > 66) outInputScriptPubKey = outInputScriptPubKey.substring(outInputScriptPubKey.length() - 66); - - if (address.equals(pubKeyToAddress(chain, outInputScriptPubKey)) && txid.equals(outInTxid) && i == outInVout.intValue()) { - - spentInTxid = outTxid; - break spentInTxid; - } - } - } - } - - // done - - return new BtcrData(spentInTxid, inputScriptPubKey, continuationUri); - } - - /* - * Helper methods - */ - - private static String pubKeyToAddress(Chain chain, String pubKey) throws IOException { - - NetworkParameters params = null; - - if (Chain.MAINNET == chain) params = MainNetParams.get(); - if (Chain.TESTNET == chain) params = TestNet3Params.get(); - if (params == null) throw new IllegalArgumentException("Unknown chain " + chain + " for public key " + pubKey); - - ECKey eckey; - - try { - - eckey = ECKey.fromPublicOnly(Hex.decodeHex(pubKey.toCharArray())); - } catch (DecoderException ex) { - - throw new IOException("Cannot decode public key " + pubKey + ": " + ex.getMessage(), ex); - } - - return eckey.toAddress(params).toBase58(); - } -} diff --git a/drivers/btcr/src/main/java/uniresolver/driver/did/btcr/bitcoinconnection/BitcoinConnection.java b/drivers/btcr/src/main/java/uniresolver/driver/did/btcr/bitcoinconnection/BitcoinConnection.java deleted file mode 100644 index 9a39f9545..000000000 --- a/drivers/btcr/src/main/java/uniresolver/driver/did/btcr/bitcoinconnection/BitcoinConnection.java +++ /dev/null @@ -1,27 +0,0 @@ -package uniresolver.driver.did.btcr.bitcoinconnection; - -import java.io.IOException; -import java.net.URI; - -import info.weboftrust.txrefconversion.Chain; - -public interface BitcoinConnection extends info.weboftrust.txrefconversion.bitcoinconnection.BitcoinConnection { - - public BtcrData getBtcrData(Chain chain, String txid) throws IOException; - - public static class BtcrData { - - private String spentInTxid; - private String inputScriptPubKey; - private URI continuationUri; - - public BtcrData(String spentInTxid, String inputScriptPubKey, URI continuationUri) { this.spentInTxid = spentInTxid; this.inputScriptPubKey = inputScriptPubKey; this.continuationUri = continuationUri; } - - public String getSpentInTxid() { return this.spentInTxid; } - public String getInputScriptPubKey() { return this.inputScriptPubKey; } - public URI getContinuationUri() { return this.continuationUri; } - - @Override - public String toString() { return "BtcrData [spentInTxid=" + spentInTxid + ", inputScriptPubKey=" + inputScriptPubKey + ", continuationUri=" + continuationUri + "]"; } - } -} diff --git a/drivers/btcr/src/main/java/uniresolver/driver/did/btcr/bitcoinconnection/BitcoindRPCBitcoinConnection.java b/drivers/btcr/src/main/java/uniresolver/driver/did/btcr/bitcoinconnection/BitcoindRPCBitcoinConnection.java deleted file mode 100644 index 1f92d7a27..000000000 --- a/drivers/btcr/src/main/java/uniresolver/driver/did/btcr/bitcoinconnection/BitcoindRPCBitcoinConnection.java +++ /dev/null @@ -1,118 +0,0 @@ -package uniresolver.driver.did.btcr.bitcoinconnection; - -import java.io.UnsupportedEncodingException; -import java.net.URI; -import java.net.URL; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.commons.codec.DecoderException; -import org.apache.commons.codec.binary.Hex; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import info.weboftrust.txrefconversion.Chain; -import wf.bitcoin.javabitcoindrpcclient.BitcoindRpcClient; -import wf.bitcoin.javabitcoindrpcclient.BitcoindRpcClient.RawTransaction; -import wf.bitcoin.javabitcoindrpcclient.BitcoindRpcClient.RawTransaction.In; -import wf.bitcoin.javabitcoindrpcclient.BitcoindRpcClient.RawTransaction.Out; - -public class BitcoindRPCBitcoinConnection extends info.weboftrust.txrefconversion.bitcoinconnection.BitcoindRPCBitcoinConnection implements BitcoinConnection { - - private static Logger log = LoggerFactory.getLogger(BitcoindRPCBitcoinConnection.class); - - private static final BitcoindRPCBitcoinConnection instance = new BitcoindRPCBitcoinConnection(); - - private static final Pattern patternAsmInputScriptPubKey = Pattern.compile("^[^\\s]+ ([0-9a-fA-F]+)$"); - private static final Pattern patternAsmContinuationUri = Pattern.compile("^OP_RETURN ([0-9a-fA-F]+)$"); - - public BitcoindRPCBitcoinConnection(URL rpcUrlMainnet, URL rpcUrlTestnet) { - - super(rpcUrlMainnet, rpcUrlTestnet); - } - - public BitcoindRPCBitcoinConnection() { - - super(); - } - - public static BitcoindRPCBitcoinConnection get() { - - return instance; - } - - @Override - public BtcrData getBtcrData(Chain chain, String txid) { - - // retrieve transaction data - - BitcoindRpcClient bitcoindRpcClient = chain == Chain.MAINNET ? this.bitcoindRpcClientMainnet : this.bitcoindRpcClientTestnet; - - RawTransaction rawTransaction = bitcoindRpcClient.getRawTransaction(txid); - if (rawTransaction == null) return null; - - // find input script pub key - - String inputScriptPubKey = null; - - List vIn = rawTransaction.vIn(); - if (vIn == null || vIn.size() < 1) return null; - - for (In in : vIn) { - - if (in.scriptSig() != null && in.scriptSig().get("asm") != null) { - - Matcher matcher = patternAsmInputScriptPubKey.matcher((String) in.scriptSig().get("asm")); - - if (log.isDebugEnabled()) log.debug("IN: " + in.scriptSig().get("asm") + " (MATCHES: " + matcher.matches() + ")"); - - if (matcher.matches() && matcher.groupCount() == 1) { - - if (log.isDebugEnabled()) log.debug("inputScriptPubKey: " + matcher.group(1)); - - inputScriptPubKey = matcher.group(1); - break; - } - } - } - - if (inputScriptPubKey == null) return null; - if (inputScriptPubKey.length() > 66) inputScriptPubKey = inputScriptPubKey.substring(inputScriptPubKey.length() - 66); - - // find DID DOCUMENT CONTINUATION URI - - URI continuationUri = null; - - List vOut = rawTransaction.vOut(); - if (vOut == null || vOut.size() < 1) return null; - - for (Out out : vOut) { - - if (out.scriptPubKey() != null && out.scriptPubKey().asm() != null) { - - Matcher matcher = patternAsmContinuationUri.matcher(out.scriptPubKey().asm()); - - if (log.isDebugEnabled()) log.debug("OUT: " + out.scriptPubKey().asm() + " (MATCHES: " + matcher.matches() + ")"); - - if (matcher.matches() && matcher.groupCount() == 1) { - - if (log.isDebugEnabled()) log.debug("continuationUri: " + matcher.group(1)); - - try { - - continuationUri = URI.create(new String(Hex.decodeHex(matcher.group(1).toCharArray()), "UTF-8")); - break; - } catch (UnsupportedEncodingException | DecoderException ex) { - - continue; - } - } - } - } - - // done - - return new BtcrData(null, inputScriptPubKey, continuationUri); - } -} diff --git a/drivers/btcr/src/main/java/uniresolver/driver/did/btcr/bitcoinconnection/BitcoinjSPVBitcoinConnection.java b/drivers/btcr/src/main/java/uniresolver/driver/did/btcr/bitcoinconnection/BitcoinjSPVBitcoinConnection.java deleted file mode 100644 index 0a5e525e9..000000000 --- a/drivers/btcr/src/main/java/uniresolver/driver/did/btcr/bitcoinconnection/BitcoinjSPVBitcoinConnection.java +++ /dev/null @@ -1,33 +0,0 @@ -package uniresolver.driver.did.btcr.bitcoinconnection; - -import java.io.IOException; - -import org.bitcoinj.core.BlockChain; - -import info.weboftrust.txrefconversion.Chain; - -public class BitcoinjSPVBitcoinConnection extends info.weboftrust.txrefconversion.bitcoinconnection.BitcoinjSPVBitcoinConnection implements BitcoinConnection { - - private static final BitcoinjSPVBitcoinConnection instance = new BitcoinjSPVBitcoinConnection(); - - public BitcoinjSPVBitcoinConnection(BlockChain blockChain) { - - super(blockChain); - } - - public BitcoinjSPVBitcoinConnection() { - - super(); - } - - public static BitcoinjSPVBitcoinConnection get() { - - return instance; - } - - @Override - public BtcrData getBtcrData(Chain chain, String txid) throws IOException { - - throw new RuntimeException("Not implemented."); - } -} diff --git a/drivers/btcr/src/main/java/uniresolver/driver/did/btcr/bitcoinconnection/BlockcypherAPIBitcoinConnection.java b/drivers/btcr/src/main/java/uniresolver/driver/did/btcr/bitcoinconnection/BlockcypherAPIBitcoinConnection.java deleted file mode 100644 index 6ee1d5581..000000000 --- a/drivers/btcr/src/main/java/uniresolver/driver/did/btcr/bitcoinconnection/BlockcypherAPIBitcoinConnection.java +++ /dev/null @@ -1,131 +0,0 @@ -package uniresolver.driver.did.btcr.bitcoinconnection; - -import java.io.IOException; -import java.net.URI; -import java.nio.charset.StandardCharsets; -import java.util.Iterator; - -import org.apache.commons.codec.DecoderException; -import org.apache.commons.codec.binary.Hex; -import org.bitcoinj.core.ScriptException; -import org.bitcoinj.script.Script; -import org.bitcoinj.script.ScriptChunk; - -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; - -import info.weboftrust.txrefconversion.Chain; - -public class BlockcypherAPIBitcoinConnection extends info.weboftrust.txrefconversion.bitcoinconnection.BlockcypherAPIBitcoinConnection implements BitcoinConnection { - - private static final BlockcypherAPIBitcoinConnection instance = new BlockcypherAPIBitcoinConnection(); - - public BlockcypherAPIBitcoinConnection() { - - } - - public static BlockcypherAPIBitcoinConnection get() { - - return instance; - } - - @Override - public BtcrData getBtcrData(Chain chain, String txid) throws IOException { - - // retrieve transaction data - - URI uri; - if (chain == Chain.MAINNET) { - uri = URI.create("https://api.blockcypher.com/v1/btc/main/txs/" + txid + "?limit=500"); - } else { - uri = URI.create("https://api.blockcypher.com/v1/btc/test3/txs/" + txid + "?limit=500"); - } - - JsonObject txData = retrieveJson(uri); - - // find input script pub key - - String inputScriptPubKey = null; - - for (Iterator i = ((JsonArray) txData.get("inputs")).iterator(); i.hasNext(); ) { - - JsonObject input = i.next().getAsJsonObject(); - JsonElement script = input.get("script"); - JsonElement scriptType = input.get("script_type"); - if (script == null || ! script.isJsonPrimitive()) continue; - if (scriptType == null || ! scriptType.isJsonPrimitive()) continue; - - if ("pay-to-pubkey-hash".equals(scriptType.getAsString())) { - - Script payToPubKeyHashScript; - - try { - - payToPubKeyHashScript = new Script(Hex.decodeHex(script.getAsString().toCharArray())); - } catch (ScriptException | DecoderException ex) { - - throw new IOException("Cannot decode script " + script.getAsString() + ": " + ex.getMessage(), ex); - } - - inputScriptPubKey = Hex.encodeHexString(payToPubKeyHashScript.getPubKey()); - break; - } - } - - if (inputScriptPubKey == null) return null; - if (inputScriptPubKey.length() > 66) inputScriptPubKey = inputScriptPubKey.substring(inputScriptPubKey.length() - 66); - - // find DID DOCUMENT CONTINUATION URI - - URI continuationUri = null; - - for (Iterator i = ((JsonArray) txData.get("outputs")).iterator(); i.hasNext(); ) { - - JsonObject output = i.next().getAsJsonObject(); - JsonElement script = output.get("script"); - JsonElement scriptType = output.get("script_type"); - if (script == null || ! script.isJsonPrimitive()) continue; - if (scriptType == null || ! scriptType.isJsonPrimitive()) continue; - - if ("null-data".equals(scriptType.getAsString())) { - - Script nullDataScript; - - try { - - nullDataScript = new Script(Hex.decodeHex(script.getAsString().toCharArray())); - } catch (ScriptException | DecoderException ex) { - - throw new IOException("Cannot decode script " + script.getAsString() + ": " + ex.getMessage(), ex); - } - - ScriptChunk scriptChunk = nullDataScript.getChunks().size() == 2 ? nullDataScript.getChunks().get(1) : null; - byte[] data = scriptChunk == null ? null : scriptChunk.data; - - if (data == null || data.length < 1) throw new IOException("Cannot find data in script " + script.getAsString()); - - continuationUri = URI.create(new String(data, StandardCharsets.UTF_8)); - break; - } - } - - // find spent in tx - - String spentInTxid = null; - - for (Iterator i = ((JsonArray) txData.get("outputs")).iterator(); i.hasNext(); ) { - - JsonObject output = i.next().getAsJsonObject(); - JsonElement spentBy = output.get("spent_by"); - if (spentBy == null || ! spentBy.isJsonPrimitive()) continue; - - spentInTxid = spentBy.getAsString(); - break; - } - - // done - - return new BtcrData(spentInTxid, inputScriptPubKey, continuationUri); - } -} diff --git a/drivers/btcr/src/main/webapp/WEB-INF/web.xml b/drivers/btcr/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index 400e1884b..000000000 --- a/drivers/btcr/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - uni-resolver-driver-did-btcr - - - - - InitServlet - InitServlet - uniresolver.driver.servlet.InitServlet - - Driver - uniresolver.driver.did.btcr.DidBtcrDriver - - 1 - - - - ResolveServlet - ResolveServlet - uniresolver.driver.servlet.ResolveServlet - - - PropertiesServlet - PropertiesServlet - uniresolver.driver.servlet.PropertiesServlet - - - ResolveServlet - /1.0/identifiers/* - - - PropertiesServlet - /1.0/properties - /1.0/properties/* - - - diff --git a/drivers/btcr/src/test/resources/jetty-env.xml b/drivers/btcr/src/test/resources/jetty-env.xml deleted file mode 100644 index 2746628e2..000000000 --- a/drivers/btcr/src/test/resources/jetty-env.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - org.eclipse.jetty.server.webapp.WebInfIncludeJarPattern - ^$ - - diff --git a/drivers/btcr/src/test/resources/jetty.xml b/drivers/btcr/src/test/resources/jetty.xml deleted file mode 100644 index c24808c45..000000000 --- a/drivers/btcr/src/test/resources/jetty.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/drivers/btcr/src/test/resources/log4j.properties b/drivers/btcr/src/test/resources/log4j.properties deleted file mode 100644 index 5f95c67ea..000000000 --- a/drivers/btcr/src/test/resources/log4j.properties +++ /dev/null @@ -1,11 +0,0 @@ -log4j.rootLogger=DEBUG, STDOUT - -log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender -log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout -log4j.appender.STDOUT.layout.ConversionPattern=%d{HH:mm:ss,SSS} - %5p [%c] - %m%n - -log4j.logger.org.apache=INFO, STDOUT -log4j.logger.org.eclipse=INFO, STDOUT -log4j.logger.org.mortbay=INFO, STDOUT -log4j.logger.org.springframework=INFO, STDOUT -log4j.logger.uniresolver=DEBUG, STDOUT diff --git a/drivers/dns/.gitignore b/drivers/dns/.gitignore deleted file mode 100644 index 697e1e157..000000000 --- a/drivers/dns/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -.project -.classpath -/.settings/ -/target -/bin/ diff --git a/drivers/dns/README.md b/drivers/dns/README.md deleted file mode 100644 index 4a515dd00..000000000 --- a/drivers/dns/README.md +++ /dev/null @@ -1,44 +0,0 @@ -![DIF Logo](https://raw.githubusercontent.com/decentralized-identity/decentralized-identity.github.io/master/images/logo-small.png) - -# Universal Resolver Driver: dns - -This is a [Universal Resolver](https://github.com/decentralized-identity/universal-resolver/) driver for **DNS** identifiers. - -## Specifications - -* [Decentralized Identifiers](https://w3c-ccg.github.io/did-spec/) -* [The Decentralized Identifier (DID) in the DNS](https://datatracker.ietf.org/doc/draft-mayrhofer-did-dns/) - -## Example Identifiers - -``` -ssi.labs.nic.at -``` - -## Build and Run (Docker) - -``` -docker build -f ./docker/Dockerfile . -t universalresolver/driver-dns -docker run -p 8080:8080 universalresolver/driver-dns -curl -X GET http://localhost:8080/1.0/identifiers/ssi.labs.nic.at -``` - -## Build (native Java) - - 1. First, build https://github.com/decentralized-identity/universal-resolver/tree/master/resolver/java - 1. Then, `mvn clean install` - -## Driver Environment Variables - -The driver recognizes the following environment variables: - -### `uniresolver_driver_dns_dnsServers` - - * Specifies a semicolon-separated list of DNS servers to use for lookups. - * Default value: (empty string) - -## Driver Metadata - -The driver returns the following metadata in addition to a DID document: - -* `did`: A DID that was found for the given DNS identifier. diff --git a/drivers/dns/docker/Dockerfile b/drivers/dns/docker/Dockerfile deleted file mode 100644 index 870292551..000000000 --- a/drivers/dns/docker/Dockerfile +++ /dev/null @@ -1,24 +0,0 @@ -# Dockerfile for universalresolver/driver-dns - -FROM universalresolver/driver -MAINTAINER Markus Sabadello - -# build driver-dns - -ADD . /opt/driver-dns -RUN cd /opt/driver-dns && mvn install package -N -DskipTests - -# clean up - -RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* - -# variables - -ENV uniresolver_driver_dns_dnsServers= - -# done - -EXPOSE 8080 - -RUN chmod a+rx /opt/driver-dns/docker/run-driver-dns.sh -CMD "/opt/driver-dns/docker/run-driver-dns.sh" diff --git a/drivers/dns/docker/run-driver-dns.sh b/drivers/dns/docker/run-driver-dns.sh deleted file mode 100644 index 0e9d21bbe..000000000 --- a/drivers/dns/docker/run-driver-dns.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -cd /opt/driver-dns/ -mvn jetty:run -P war diff --git a/drivers/dns/pom.xml b/drivers/dns/pom.xml deleted file mode 100644 index 361d55981..000000000 --- a/drivers/dns/pom.xml +++ /dev/null @@ -1,107 +0,0 @@ - - - 4.0.0 - uni-resolver-driver-dns - ${packaging.type} - uni-resolver-driver-dns - - - decentralized-identity - uni-resolver - 0.1-SNAPSHOT - - - - - - - default - true - jar - - - - - - war - war - - - - org.apache.maven.plugins - maven-war-plugin - 2.4 - - - org.eclipse.jetty - jetty-maven-plugin - 9.4.0.M1 - - - ${basedir}/src/test/resources/jetty.xml - - - ${basedir}/src/test/resources/jetty-env.xml - - / - true - - - jetty.port - 8080 - - - slf4j - true - - - log4j.configuration - file:${basedir}/src/test/resources/log4j.properties - - - - - - org.slf4j - slf4j-api - 1.7.5 - compile - - - org.slf4j - jcl-over-slf4j - 1.7.5 - compile - - - org.slf4j - slf4j-log4j12 - 1.7.5 - compile - - - - - - - - - - - - - decentralized-identity - uni-resolver-driver - 0.1-SNAPSHOT - compile - - - dnsjava - dnsjava - 2.1.8 - compile - - - - diff --git a/drivers/dns/src/main/java/uniresolver/driver/dns/DnsDriver.java b/drivers/dns/src/main/java/uniresolver/driver/dns/DnsDriver.java deleted file mode 100644 index 2b2d559a7..000000000 --- a/drivers/dns/src/main/java/uniresolver/driver/dns/DnsDriver.java +++ /dev/null @@ -1,202 +0,0 @@ -package uniresolver.driver.dns; - -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.xbill.DNS.ExtendedResolver; -import org.xbill.DNS.Lookup; -import org.xbill.DNS.Record; -import org.xbill.DNS.Resolver; -import org.xbill.DNS.Type; -import org.xbill.DNS.URIRecord; - -import uniresolver.ResolutionException; -import uniresolver.driver.Driver; -import uniresolver.result.ResolveResult; - -public class DnsDriver implements Driver { - - private static Logger log = LoggerFactory.getLogger(DnsDriver.class); - - public static final Pattern DNS_PATTERN = Pattern.compile("^((?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*(?:[A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9]))$"); - - private Map properties; - - private String dnsServers; - - private Resolver resolver = null; - - public DnsDriver(Map properties) { - - this.setProperties(properties); - } - - public DnsDriver() { - - this.setProperties(getPropertiesFromEnvironment()); - } - - private static Map getPropertiesFromEnvironment() { - - if (log.isDebugEnabled()) log.debug("Loading from environment: " + System.getenv()); - - Map properties = new HashMap (); - - try { - - String env_dnsServers = System.getenv("uniresolver_driver_dns_dnsServers"); - - if (env_dnsServers != null) properties.put("dnsServers", env_dnsServers); - } catch (Exception ex) { - - throw new IllegalArgumentException(ex.getMessage(), ex); - } - - return properties; - } - - private void configureFromProperties() { - - if (log.isDebugEnabled()) log.debug("Configuring from properties: " + this.getProperties()); - - try { - - String prop_dnsServers = (String) this.getProperties().get("dnsServers"); - - if (prop_dnsServers != null) this.setDnsServers(prop_dnsServers); - } catch (Exception ex) { - - throw new IllegalArgumentException(ex.getMessage(), ex); - } - } - - @Override - public ResolveResult resolve(String identifier) throws ResolutionException { - - // open pool - - if (this.getResolver() == null) this.openResolver(); - - // parse identifier - - Matcher matcher = DNS_PATTERN.matcher(identifier); - if (! matcher.matches()) return null; - - // DNS lookup - - Lookup lookup = null; - Record[] records; - - try { - - lookup = new Lookup("_did." + identifier, Type.URI); - lookup.setResolver(this.getResolver()); - records = lookup.run(); - } catch (Exception ex) { - - throw new ResolutionException("DNS resolution problem: " + ex.getMessage() + (lookup != null ? (" (" + lookup.getErrorString() + ")") : "")); - } - - if (lookup.getErrorString() != null && ! "successful".equals(lookup.getErrorString())) { - - if (log.isDebugEnabled()) log.debug("For identifier " + identifier + " got error: " + lookup.getErrorString()); - throw new ResolutionException("DNS resolution error: " + lookup.getErrorString()); - } - - if (records == null) return null; - - for (int i=0; i 0 ? ((URIRecord) records[0]).getTarget() : null; - Integer priority = records.length > 0 ? Integer.valueOf(((URIRecord) records[0]).getPriority()) : null; - - // create METHOD METADATA - - Map methodMetadata = new LinkedHashMap (); - if (did != null) methodMetadata.put("did", did); - if (priority != null) methodMetadata.put("priority", priority); - - // create RESOLVE RESULT - - ResolveResult resolveResult = ResolveResult.build(did, null, null, methodMetadata); - - // done - - return resolveResult; - } - - @Override - public Map properties() { - - return this.getProperties(); - } - - private void openResolver() throws ResolutionException { - - // create resolver - - try { - - if (this.getDnsServers() != null && ! this.getDnsServers().trim().isEmpty()) { - - String[] dnsServers = this.getDnsServers().split(";"); - this.resolver = new ExtendedResolver(dnsServers); - if (log.isInfoEnabled()) log.info("Created DNS resolver with servers " + Arrays.asList(dnsServers) + "."); - } else { - - this.resolver = new ExtendedResolver(); - if (log.isInfoEnabled()) log.info("Created default DNS resolver."); - } - } catch (UnknownHostException ex) { - - throw new ResolutionException("Unable to create DNS resolver: " + ex.getMessage(), ex); - } - - } - - /* - * Getters and setters - */ - - public Map getProperties() { - - return this.properties; - } - - public void setProperties(Map properties) { - - this.properties = properties; - this.configureFromProperties(); - } - - public String getDnsServers() { - - return this.dnsServers; - } - - public void setDnsServers(String dnsServers) { - - this.dnsServers = dnsServers; - } - - public Resolver getResolver() { - - return this.resolver; - } - - public void setResolver(Resolver resolver) { - - this.resolver = resolver; - } -} diff --git a/drivers/dns/src/main/webapp/WEB-INF/web.xml b/drivers/dns/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index 064c8a273..000000000 --- a/drivers/dns/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - uni-resolver-driver-dns - - - - - InitServlet - InitServlet - uniresolver.driver.servlet.InitServlet - - Driver - uniresolver.driver.dns.DnsDriver - - 1 - - - - ResolveServlet - ResolveServlet - uniresolver.driver.servlet.ResolveServlet - - - PropertiesServlet - PropertiesServlet - uniresolver.driver.servlet.PropertiesServlet - - - ResolveServlet - /1.0/identifiers/* - - - PropertiesServlet - /1.0/properties - /1.0/properties/* - - - diff --git a/drivers/dns/src/test/resources/jetty-env.xml b/drivers/dns/src/test/resources/jetty-env.xml deleted file mode 100644 index 2746628e2..000000000 --- a/drivers/dns/src/test/resources/jetty-env.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - org.eclipse.jetty.server.webapp.WebInfIncludeJarPattern - ^$ - - diff --git a/drivers/dns/src/test/resources/jetty.xml b/drivers/dns/src/test/resources/jetty.xml deleted file mode 100644 index c24808c45..000000000 --- a/drivers/dns/src/test/resources/jetty.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/drivers/dns/src/test/resources/log4j.properties b/drivers/dns/src/test/resources/log4j.properties deleted file mode 100644 index 5f95c67ea..000000000 --- a/drivers/dns/src/test/resources/log4j.properties +++ /dev/null @@ -1,11 +0,0 @@ -log4j.rootLogger=DEBUG, STDOUT - -log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender -log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout -log4j.appender.STDOUT.layout.ConversionPattern=%d{HH:mm:ss,SSS} - %5p [%c] - %m%n - -log4j.logger.org.apache=INFO, STDOUT -log4j.logger.org.eclipse=INFO, STDOUT -log4j.logger.org.mortbay=INFO, STDOUT -log4j.logger.org.springframework=INFO, STDOUT -log4j.logger.uniresolver=DEBUG, STDOUT diff --git a/drivers/dom/.gitignore b/drivers/dom/.gitignore deleted file mode 100644 index 697e1e157..000000000 --- a/drivers/dom/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -.project -.classpath -/.settings/ -/target -/bin/ diff --git a/drivers/dom/README.md b/drivers/dom/README.md deleted file mode 100644 index 841771675..000000000 --- a/drivers/dom/README.md +++ /dev/null @@ -1,41 +0,0 @@ -![DIF Logo](https://raw.githubusercontent.com/decentralized-identity/decentralized-identity.github.io/master/images/logo-small.png) - -# Universal Resolver Driver: did:dom - -This is a [Universal Resolver](https://github.com/decentralized-identity/universal-resolver/) driver for **did:dom** identifiers. - -## Specifications - -* [Decentralized Identifiers](https://w3c-ccg.github.io/did-spec/) -* Dominode DID Method Specification (missing) - -## Example DIDs - -``` -did:dom:Jjbfgyu7My4RrbRNrXTPBz4PnhnMEE -``` - -## Build and Run (Docker) - -``` -docker build -f ./docker/Dockerfile . -t universalresolver/driver-did-dom -docker run -p 8080:8080 universalresolver/driver-did-dom -curl -X GET http://localhost:8080/1.0/identifiers/did:dom:Jjbfgyu7My4RrbRNrXTPBz4PnhnMEE -``` - -## Build (native Java) - - 1. First, build https://github.com/decentralized-identity/universal-resolver/tree/master/resolver/java - 1. Then, `mvn clean install` - -## Driver Environment Variables - -The driver recognizes the following environment variables: - -(none) - -## Driver Metadata - -The driver returns the following metadata in addition to a DID document: - -(none) diff --git a/drivers/dom/docker/Dockerfile b/drivers/dom/docker/Dockerfile deleted file mode 100644 index 73e8f12d4..000000000 --- a/drivers/dom/docker/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -# Dockerfile for universalresolver/driver-did-dom - -FROM universalresolver/driver -MAINTAINER Ricardo Cosme - -# build driver-did-dom - -ADD . /opt/driver-did-dom -RUN cd /opt/driver-did-dom && mvn install package -N -DskipTests - -# done - -RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* - -EXPOSE 8086 - -RUN chmod a+rx /opt/driver-did-dom/docker/run-driver-did-dom.sh -CMD "/opt/driver-did-dom/docker/run-driver-did-dom.sh" diff --git a/drivers/dom/docker/run-driver-did-dom.sh b/drivers/dom/docker/run-driver-did-dom.sh deleted file mode 100644 index ca006a84c..000000000 --- a/drivers/dom/docker/run-driver-did-dom.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -cd /opt/driver-did-dom/ -mvn jetty:run -P war diff --git a/drivers/dom/pom.xml b/drivers/dom/pom.xml deleted file mode 100644 index e7905ad39..000000000 --- a/drivers/dom/pom.xml +++ /dev/null @@ -1,107 +0,0 @@ - - - 4.0.0 - uni-resolver-driver-did-dom - ${packaging.type} - uni-resolver-driver-did-dom - - - decentralized-identity - uni-resolver - 0.1-SNAPSHOT - - - - - - - default - true - jar - - - - - - war - war - - - - org.apache.maven.plugins - maven-war-plugin - 2.4 - - - org.eclipse.jetty - jetty-maven-plugin - 9.4.0.M1 - - - ${basedir}/src/test/resources/jetty.xml - - - ${basedir}/src/test/resources/jetty-env.xml - - / - true - - - jetty.port - 8080 - - - slf4j - true - - - log4j.configuration - file:${basedir}/src/test/resources/log4j.properties - - - - - - org.slf4j - slf4j-api - 1.7.5 - compile - - - org.slf4j - jcl-over-slf4j - 1.7.5 - compile - - - org.slf4j - slf4j-log4j12 - 1.7.5 - compile - - - - - - - - - - - - - decentralized-identity - uni-resolver-driver - 0.1-SNAPSHOT - compile - - - org.json - json - 20171018 - compile - - - - diff --git a/drivers/dom/src/main/java/uniresolver/driver/did/dom/DidDomDriver.java b/drivers/dom/src/main/java/uniresolver/driver/did/dom/DidDomDriver.java deleted file mode 100644 index 6b402736e..000000000 --- a/drivers/dom/src/main/java/uniresolver/driver/did/dom/DidDomDriver.java +++ /dev/null @@ -1,227 +0,0 @@ -package uniresolver.driver.did.dom; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.http.HttpEntity; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.impl.client.LaxRedirectStrategy; -import org.apache.http.util.EntityUtils; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import did.Authentication; -import did.DIDDocument; -import did.PublicKey; -import did.Service; -import uniresolver.ResolutionException; -import uniresolver.driver.Driver; -import uniresolver.result.ResolveResult; - -public class DidDomDriver implements Driver { - - public static final Pattern DID_DOM_PATTERN = Pattern.compile("^did:dom:[a-km-zA-HJ-NP-Z1-9]{30,30}$"); - - private final String DID_DOM_RESOLVER_URL = "https://did-resolver.dominode.com"; - - public static final HashMap DIDDOCUMENT_PUBLICKEY_TYPES = new HashMap(); - public static final String[] DIDDOCUMENT_AUTHENTICATION_TYPES = new String[] { "Ed25519SignatureAuthentication2018", "RsaSignatureAuthentication2018", "Secp256k1SignatureAuthentication2018"}; - - public static final HttpClient DEFAULT_HTTP_CLIENT = HttpClientBuilder.create().setRedirectStrategy(new LaxRedirectStrategy()).build(); - - private HttpClient httpClient = DEFAULT_HTTP_CLIENT; - - public DidDomDriver() { - DIDDOCUMENT_PUBLICKEY_TYPES.put("Ed25519VerificationKey2018", "publicKeyBase58"); - DIDDOCUMENT_PUBLICKEY_TYPES.put("RsaVerificationKey2018", "publicKeyPem"); - DIDDOCUMENT_PUBLICKEY_TYPES.put("Secp256k1VerificationKey2018", "publicKeyHex"); - } - - @Override - public ResolveResult resolve(String identifier) throws ResolutionException { - - // match - Matcher matcher = DID_DOM_PATTERN.matcher(identifier); - if(!matcher.matches()) { - return null; - } - - // DDO id - String id = identifier; - - // fetch DDO - String nameUri = this.getDomUrl()+ "/ddo/" + identifier; - HttpGet httpGet = new HttpGet(nameUri); - - List publicKeys = new ArrayList (); - List authentications = new ArrayList (); - List services = new ArrayList (); - - try (CloseableHttpResponse httpResponse = (CloseableHttpResponse) this.getHttpClient().execute(httpGet)) { - - if(httpResponse.getStatusLine().getStatusCode() != 200) { - throw new ResolutionException("Cannot retrieve DDO for `" + identifier + "` from `" + nameUri + ": " + httpResponse.getStatusLine()); - } - - // extract payload - HttpEntity httpEntity = httpResponse.getEntity(); - String entityString = EntityUtils.toString(httpEntity); - EntityUtils.consume(httpEntity); - - // got to be JSON - JSONObject jo = new JSONObject(entityString); - - if(jo.isNull("publicKey")) { - // no public keys defined - throw new ResolutionException("Cannot retrieve public key(s) for `" + identifier + "`"); - } - else { - // extract public_key(s) - JSONArray propPublicKey = jo.getJSONArray("publicKey"); - - int keyNum = 0; - - for (Object itemPubKey: propPublicKey) { - - JSONObject objPubKey = (JSONObject) itemPubKey; - - String lblPublicKey = ""; - - String typePublicKey[] = new String[1]; - - for (Map.Entry entry : DIDDOCUMENT_PUBLICKEY_TYPES.entrySet()) { - if (objPubKey.getString("type").equals(entry.getKey())) { - typePublicKey[0] = entry.getKey(); - lblPublicKey = entry.getValue(); - } - } - - String pubKeyValue = objPubKey.getString(lblPublicKey); - String keyId = objPubKey.getString("id"); - - if (!keyId.contains("#key")) { - keyId = id + "#key-" + (++keyNum); - } - - PublicKey publicKey; - - switch (typePublicKey[0]) { - case "Ed25519VerificationKey2018": - publicKey = PublicKey.build(keyId, typePublicKey, null, pubKeyValue, null, null); - break; - case "RsaVerificationKey2018": - publicKey = PublicKey.build(keyId, typePublicKey, null, null, null, pubKeyValue); - break; - case "Secp256k1VerificationKey2018": - publicKey = PublicKey.build(keyId, typePublicKey, null, null, pubKeyValue, null); - break; - default: - publicKey = null; - break; - } - - if (publicKey != null) { - publicKeys.add(publicKey); - } - - } - } - - if(jo.isNull("authentication")) { - // no authentication(s) defined - throw new ResolutionException("Cannot retrieve authentication for `" + identifier + "`"); - } - else { - // extract authentication(s) - JSONArray propAuthentication = jo.getJSONArray("authentication"); - - int keyNum = 0; - - for (Object itemAuthentication: propAuthentication) { - - JSONObject objAuthentication = (JSONObject) itemAuthentication; - - String typeAuthentication[] = new String[1]; - - for (String entry : DIDDOCUMENT_AUTHENTICATION_TYPES) { - if (objAuthentication.getString("type").equals(entry)) { - typeAuthentication[0] = entry; - } - } - - String keyId = objAuthentication.getString("publicKey"); - - if (!keyId.contains("#key")) { - keyId = id + "#key-" + (++keyNum); - } - - Authentication authentication = Authentication.build(null, typeAuthentication, keyId); - authentications.add(authentication); - } - - } - - if (!jo.isNull("service")) { - - JSONArray propService = jo.getJSONArray("service"); - - for (Object itemService: propService) { - - JSONObject objService = (JSONObject) itemService; - - Service service = Service.build(objService.getString("type"), null, objService.getString("serviceEndpoint")); - services.add(service); - } - } - - - } catch (IOException ex) { - throw new ResolutionException("Cannot retrieve DDO info for `" + identifier + "` from `" + nameUri + "`: " + ex.getMessage(), ex); - } catch (JSONException jex) { - throw new ResolutionException("Cannot parse JSON response from `" + nameUri + "`: " + jex.getMessage(), jex); - } - - // create DDO - DIDDocument didDocument = DIDDocument.build(id, publicKeys, authentications, null, services); - - // done - return ResolveResult.build(didDocument); - } - - public Map properties() { - - Map properties = new HashMap (); - properties.put("domUrl", this.getDomUrl()); - - return properties; - } - - /* - * Getters and setters - */ - - public HttpClient getHttpClient() { - - return this.httpClient; - } - - public void setHttpClient(HttpClient httpClient) { - - this.httpClient = httpClient; - } - - public String getDomUrl() { - - return this.DID_DOM_RESOLVER_URL; - } - -} diff --git a/drivers/dom/src/main/webapp/WEB-INF/web.xml b/drivers/dom/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index fdd7bd3da..000000000 --- a/drivers/dom/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - uni-resolver-driver-did-dom - - - - - InitServlet - InitServlet - uniresolver.driver.servlet.InitServlet - - Driver - uniresolver.driver.did.dom.DidDomDriver - - 1 - - - - ResolveServlet - ResolveServlet - uniresolver.driver.servlet.ResolveServlet - - - PropertiesServlet - PropertiesServlet - uniresolver.driver.servlet.PropertiesServlet - - - ResolveServlet - /1.0/identifiers/* - - - PropertiesServlet - /1.0/properties - /1.0/properties/* - - - diff --git a/drivers/dom/src/test/resources/jetty-env.xml b/drivers/dom/src/test/resources/jetty-env.xml deleted file mode 100644 index 2746628e2..000000000 --- a/drivers/dom/src/test/resources/jetty-env.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - org.eclipse.jetty.server.webapp.WebInfIncludeJarPattern - ^$ - - diff --git a/drivers/dom/src/test/resources/jetty.xml b/drivers/dom/src/test/resources/jetty.xml deleted file mode 100644 index c24808c45..000000000 --- a/drivers/dom/src/test/resources/jetty.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/drivers/dom/src/test/resources/log4j.properties b/drivers/dom/src/test/resources/log4j.properties deleted file mode 100644 index 5f95c67ea..000000000 --- a/drivers/dom/src/test/resources/log4j.properties +++ /dev/null @@ -1,11 +0,0 @@ -log4j.rootLogger=DEBUG, STDOUT - -log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender -log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout -log4j.appender.STDOUT.layout.ConversionPattern=%d{HH:mm:ss,SSS} - %5p [%c] - %m%n - -log4j.logger.org.apache=INFO, STDOUT -log4j.logger.org.eclipse=INFO, STDOUT -log4j.logger.org.mortbay=INFO, STDOUT -log4j.logger.org.springframework=INFO, STDOUT -log4j.logger.uniresolver=DEBUG, STDOUT diff --git a/drivers/erc725/.gitignore b/drivers/erc725/.gitignore deleted file mode 100644 index 697e1e157..000000000 --- a/drivers/erc725/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -.project -.classpath -/.settings/ -/target -/bin/ diff --git a/drivers/erc725/README.md b/drivers/erc725/README.md deleted file mode 100644 index b7b91fdbe..000000000 --- a/drivers/erc725/README.md +++ /dev/null @@ -1,94 +0,0 @@ -![DIF Logo](https://raw.githubusercontent.com/decentralized-identity/decentralized-identity.github.io/master/images/logo-small.png) - -# Universal Resolver Driver: did:erc725 - -This is a [Universal Resolver](https://github.com/decentralized-identity/universal-resolver/) driver for **did:erc725** identifiers. - -## Specifications - -* [Decentralized Identifiers](https://w3c-ccg.github.io/did-spec/) -* [ERC725 DID Method Specification](https://github.com/WebOfTrustInfo/rebooting-the-web-of-trust-spring2018/blob/master/topics-and-advance-readings/DID-Method-erc725.md) - -## Example DIDs - -``` -did:erc725:ropsten:2F2B37C890824242Cb9B0FE5614fA2221B79901E -``` - -## Build and Run (Docker) - -``` -docker build -f ./docker/Dockerfile . -t universalresolver/driver-did-erc725 -docker run -p 8080:8080 universalresolver/driver-did-erc725 -curl -X GET http://localhost:8080/1.0/identifiers/did:erc725:ropsten:2F2B37C890824242Cb9B0FE5614fA2221B79901E -``` - -## Build (native Java) - - 1. First, build https://github.com/decentralized-identity/universal-resolver/tree/master/resolver/java - 1. Then, `mvn clean install` - -## Driver Environment Variables - -The driver recognizes the following environment variables: - -### `uniresolver_driver_did_erc725_ethereumConnection` - - * Specifies how the driver interacts with the Ethereum blockchain. - * Possible values: - * `jsonrpc`: Connects to a [geth](https://geth.ethereum.org/downloads/) instance via JSON-RPC - * `hybrid`: Connects to a [geth](https://geth.ethereum.org/downloads/) instance via JSON-RPC as well as to the [EtherScan API](https://etherscan.io/apis) - * Default value: `hybrid` - -### `uniresolver_driver_did_erc725_rpcUrlMainnet` - - * Specifies the JSON-RPC URL of a geth instance running on Mainnet. - * Default value: `https://mainnet.infura.io/v3/fd9e225bc1234f49b48b295c611078eb` - -### `uniresolver_driver_did_erc725_rpcUrlRopsten` - - * Specifies the JSON-RPC URL of a geth instance running on Ropsten. - * Default value: `https://ropsten.infura.io/v3/fd9e225bc1234f49b48b295c611078eb` - -### `uniresolver_driver_did_erc725_rpcUrlRinkeby` - - * Specifies the JSON-RPC URL of a geth instance running on Rinkeby. - * Default value: `https://rinkeby.infura.io/v3/fd9e225bc1234f49b48b295c611078eb` - -### `uniresolver_driver_did_erc725_rpcUrlKovan` - - * Specifies the JSON-RPC URL of a geth instance running on Kovan. - * Default value: `https://kovan.infura.io/v3/fd9e225bc1234f49b48b295c611078eb` - -### `uniresolver_driver_did_erc725_etherscanApiMainnet` - - * Specifies the URL of the EtherScan API for Mainnet. - * Default value: `http://api.etherscan.io/api` - -### `uniresolver_driver_did_erc725_etherscanApiRopsten` - - * Specifies the URL of the EtherScan API for Ropsten. - * Default value: `http://api-ropsten.etherscan.io/api` - -### `uniresolver_driver_did_erc725_etherscanApiRinkeby` - - * Specifies the URL of the EtherScan API for Rinkeby. - * Default value: `http://api-rinkeby.etherscan.io/api` - -### `uniresolver_driver_did_erc725_etherscanApiKovan` - - * Specifies the URL of the EtherScan API for Kovan. - * Default value: `http://api-kovan.etherscan.io/api` - -## Driver Metadata - -The driver returns the following metadata in addition to a DID document: - -* `managementKeys`: MANAGEMENT keys as defined by ERC725. -* `managementAddresses`: MANAGEMENT key addresses as defined by ERC725. -* `actionKeys`: ACTION keys as defined by ERC725. -* `actionAddresses`: ACTION key addresses as defined by ERC725. -* `claimKeys`: CLAIM keys as defined by ERC725. -* `claimAddresses`: CLAIM key addresses as defined by ERC725. -* `encryptionKeys`: ENCRYPTION keys as defined by ERC725. -* `encryptionAddresses`: ENCRYPTION key addresses as defined by ERC725. diff --git a/drivers/erc725/docker/Dockerfile b/drivers/erc725/docker/Dockerfile deleted file mode 100644 index 4f3cde38a..000000000 --- a/drivers/erc725/docker/Dockerfile +++ /dev/null @@ -1,32 +0,0 @@ -# Dockerfile for universalresolver/driver-did-erc725 - -FROM universalresolver/driver -MAINTAINER Markus Sabadello - -# build driver-did-erc725 - -ADD . /opt/driver-did-erc725 -RUN cd /opt/driver-did-erc725 && mvn install package -N -DskipTests - -# clean up - -RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* - -# variables - -ENV uniresolver_driver_did_erc725_ethereumConnection=hybrid -ENV uniresolver_driver_did_erc725_rpcUrlMainnet=https://mainnet.infura.io/v3/fd9e225bc1234f49b48b295c611078eb -ENV uniresolver_driver_did_erc725_rpcUrlRopsten=https://ropsten.infura.io/v3/fd9e225bc1234f49b48b295c611078eb -ENV uniresolver_driver_did_erc725_rpcUrlRinkeby=https://rinkeby.infura.io/v3/fd9e225bc1234f49b48b295c611078eb -ENV uniresolver_driver_did_erc725_rpcUrlKovan=https://kovan.infura.io/v3/fd9e225bc1234f49b48b295c611078eb -ENV uniresolver_driver_did_erc725_etherscanApiMainnet=http://api.etherscan.io/api -ENV uniresolver_driver_did_erc725_etherscanApiRopsten=http://api-ropsten.etherscan.io/api -ENV uniresolver_driver_did_erc725_etherscanApiRinkeby=http://api-rinkeby.etherscan.io/api -ENV uniresolver_driver_did_erc725_etherscanApiKovan=http://api-kovan.etherscan.io/api - -# done - -EXPOSE 8080 - -RUN chmod a+rx /opt/driver-did-erc725/docker/run-driver-did-erc725.sh -CMD "/opt/driver-did-erc725/docker/run-driver-did-erc725.sh" diff --git a/drivers/erc725/docker/run-driver-did-erc725.sh b/drivers/erc725/docker/run-driver-did-erc725.sh deleted file mode 100644 index ebe6b253c..000000000 --- a/drivers/erc725/docker/run-driver-did-erc725.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -cd /opt/driver-did-erc725/ -mvn jetty:run -P war diff --git a/drivers/erc725/pom.xml b/drivers/erc725/pom.xml deleted file mode 100644 index ed70de7de..000000000 --- a/drivers/erc725/pom.xml +++ /dev/null @@ -1,117 +0,0 @@ - - - 4.0.0 - uni-resolver-driver-did-erc725 - ${packaging.type} - uni-resolver-driver-did-erc725 - - - decentralized-identity - uni-resolver - 0.1-SNAPSHOT - - - - - - - default - true - jar - - - - - - war - war - - - - org.apache.maven.plugins - maven-war-plugin - 2.4 - - - org.eclipse.jetty - jetty-maven-plugin - 9.4.0.M1 - - - ^$ - ^$ - - - ${basedir}/src/test/resources/jetty.xml - - - ${basedir}/src/test/resources/jetty-env.xml - - / - true - - - jetty.port - 8080 - - - slf4j - true - - - log4j.configuration - file:${basedir}/src/test/resources/log4j.properties - - - - - - org.slf4j - slf4j-api - 1.7.5 - compile - - - org.slf4j - jcl-over-slf4j - 1.7.5 - compile - - - org.slf4j - slf4j-log4j12 - 1.7.5 - compile - - - - - - - - - - - - - decentralized-identity - uni-resolver-driver - 0.1-SNAPSHOT - compile - - - org.web3j - core - 3.2.0 - compile - - - commons-codec - commons-codec - 1.10 - compile - - - - diff --git a/drivers/erc725/src/main/java/uniresolver/driver/did/erc725/DidErc725Driver.java b/drivers/erc725/src/main/java/uniresolver/driver/did/erc725/DidErc725Driver.java deleted file mode 100644 index fcf498c9f..000000000 --- a/drivers/erc725/src/main/java/uniresolver/driver/did/erc725/DidErc725Driver.java +++ /dev/null @@ -1,275 +0,0 @@ -package uniresolver.driver.did.erc725; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.commons.codec.binary.Hex; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import did.Authentication; -import did.DIDDocument; -import did.Encryption; -import did.PublicKey; -import did.Service; -import uniresolver.ResolutionException; -import uniresolver.driver.Driver; -import uniresolver.driver.did.erc725.ethereumconnection.EthereumConnection; -import uniresolver.driver.did.erc725.ethereumconnection.EthereumConnection.ERC725Keys; -import uniresolver.driver.did.erc725.ethereumconnection.HybridEthereumConnection; -import uniresolver.driver.did.erc725.ethereumconnection.JsonRPCEthereumConnection; -import uniresolver.result.ResolveResult; - -public class DidErc725Driver implements Driver { - - private static Logger log = LoggerFactory.getLogger(DidErc725Driver.class); - - public static final Pattern DID_ERC725_PATTERN = Pattern.compile("^did:erc725:(\\S+)?:(\\S+)$"); - - public static final String[] DIDDOCUMENT_PUBLICKEY_TYPES = new String[] { "Secp256k1VerificationKey2018" }; - public static final String[] DIDDOCUMENT_AUTHENTICATION_TYPES = new String[] { "Secp256k1SignatureAuthentication2018" }; - public static final String[] DIDDOCUMENT_ENCRYPTION_TYPES = new String[] { "Secp256k1Encryption2018" }; - - private Map properties; - - private EthereumConnection ethereumConnection; - - public DidErc725Driver(Map properties) { - - this.setProperties(properties); - } - - public DidErc725Driver() { - - this.setProperties(getPropertiesFromEnvironment()); - } - - private static Map getPropertiesFromEnvironment() { - - if (log.isDebugEnabled()) log.debug("Loading from environment: " + System.getenv()); - - Map properties = new HashMap (); - - try { - - String env_ethereumConnection = System.getenv("uniresolver_driver_did_erc725_ethereumConnection"); - String env_rpcUrlMainnet = System.getenv("uniresolver_driver_did_erc725_rpcUrlMainnet"); - String env_rpcUrlRopsten = System.getenv("uniresolver_driver_did_erc725_rpcUrlRopsten"); - String env_rpcUrlRinkeby = System.getenv("uniresolver_driver_did_erc725_rpcUrlRinkeby"); - String env_rpcUrlKovan = System.getenv("uniresolver_driver_did_erc725_rpcUrlKovan"); - String env_etherscanApiMainnet = System.getenv("uniresolver_driver_did_erc725_etherscanApiMainnet"); - String env_etherscanApiRopsten = System.getenv("uniresolver_driver_did_erc725_etherscanApiRopsten"); - String env_etherscanApiRinkeby = System.getenv("uniresolver_driver_did_erc725_etherscanApiRinkeby"); - String env_etherscanApiKovan = System.getenv("uniresolver_driver_did_erc725_etherscanApiKovan"); - - if (env_ethereumConnection != null) properties.put("ethereumConnection", env_ethereumConnection); - if (env_rpcUrlMainnet != null) properties.put("rpcUrlMainnet", env_rpcUrlMainnet); - if (env_rpcUrlRopsten != null) properties.put("rpcUrlRopsten", env_rpcUrlRopsten); - if (env_rpcUrlRinkeby != null) properties.put("rpcUrlRinkeby", env_rpcUrlRinkeby); - if (env_rpcUrlKovan != null) properties.put("rpcUrlKovan", env_rpcUrlKovan); - if (env_etherscanApiMainnet != null) properties.put("etherscanApiMainnet", env_etherscanApiMainnet); - if (env_etherscanApiRopsten != null) properties.put("etherscanApiRopsten", env_etherscanApiRopsten); - if (env_etherscanApiRinkeby != null) properties.put("etherscanApiRinkeby", env_etherscanApiRinkeby); - if (env_etherscanApiKovan != null) properties.put("etherscanApiKovan", env_etherscanApiKovan); - } catch (Exception ex) { - - throw new IllegalArgumentException(ex.getMessage(), ex); - } - - return properties; - } - - private void configureFromProperties() { - - if (log.isDebugEnabled()) log.debug("Configuring from properties: " + this.getProperties()); - - try { - - String prop_ethereumConnection = (String) this.getProperties().get("ethereumConnection"); - - if ("jsonrpc".equals(prop_ethereumConnection)) { - - this.setEthereumConnection(new JsonRPCEthereumConnection()); - - String prop_rpcUrlMainnet = (String) this.getProperties().get("rpcUrlMainnet"); - String prop_rpcUrlRopsten = (String) this.getProperties().get("rpcUrlRopsten"); - String prop_rpcUrlRinkeby = (String) this.getProperties().get("rpcUrlRinkeby"); - String prop_rpcUrlKovan = (String) this.getProperties().get("rpcUrlKovan"); - - if (prop_rpcUrlMainnet != null) ((JsonRPCEthereumConnection) this.getEthereumConnection()).setRpcUrlMainnet(prop_rpcUrlMainnet); - if (prop_rpcUrlRopsten != null) ((JsonRPCEthereumConnection) this.getEthereumConnection()).setRpcUrlRopsten(prop_rpcUrlRopsten); - if (prop_rpcUrlRinkeby != null) ((JsonRPCEthereumConnection) this.getEthereumConnection()).setRpcUrlRinkeby(prop_rpcUrlRinkeby); - if (prop_rpcUrlKovan != null) ((JsonRPCEthereumConnection) this.getEthereumConnection()).setRpcUrlKovan(prop_rpcUrlKovan); - } else if ("hybrid".equals(prop_ethereumConnection)) { - - this.setEthereumConnection(new HybridEthereumConnection()); - - String prop_rpcUrlMainnet = (String) this.getProperties().get("rpcUrlMainnet"); - String prop_rpcUrlRopsten = (String) this.getProperties().get("rpcUrlRopsten"); - String prop_rpcUrlRinkeby = (String) this.getProperties().get("rpcUrlRinkeby"); - String prop_rpcUrlKovan = (String) this.getProperties().get("rpcUrlKovan"); - String prop_etherscanApiMainnet = (String) this.getProperties().get("etherscanApiMainnet"); - String prop_etherscanApiRopsten = (String) this.getProperties().get("etherscanApiRopsten"); - String prop_etherscanApiRinkeby = (String) this.getProperties().get("etherscanApiRinkeby"); - String prop_etherscanApiKovan = (String) this.getProperties().get("etherscanApiKovan"); - - if (prop_rpcUrlMainnet != null) ((HybridEthereumConnection) this.getEthereumConnection()).setRpcUrlMainnet(prop_rpcUrlMainnet); - if (prop_rpcUrlRopsten != null) ((HybridEthereumConnection) this.getEthereumConnection()).setRpcUrlRopsten(prop_rpcUrlRopsten); - if (prop_rpcUrlRinkeby != null) ((HybridEthereumConnection) this.getEthereumConnection()).setRpcUrlRinkeby(prop_rpcUrlRinkeby); - if (prop_rpcUrlKovan != null) ((HybridEthereumConnection) this.getEthereumConnection()).setRpcUrlKovan(prop_rpcUrlKovan); - if (prop_etherscanApiMainnet != null) ((HybridEthereumConnection) this.getEthereumConnection()).setEtherscanApiMainnet(prop_etherscanApiMainnet); - if (prop_etherscanApiRopsten != null) ((HybridEthereumConnection) this.getEthereumConnection()).setEtherscanApiRopsten(prop_etherscanApiRopsten); - if (prop_etherscanApiRinkeby != null) ((HybridEthereumConnection) this.getEthereumConnection()).setEtherscanApiRinkeby(prop_etherscanApiRinkeby); - if (prop_etherscanApiKovan != null) ((HybridEthereumConnection) this.getEthereumConnection()).setEtherscanApiKovan(prop_etherscanApiKovan); - } - } catch (Exception ex) { - - throw new IllegalArgumentException(ex.getMessage(), ex); - } - } - - @Override - public ResolveResult resolve(String identifier) throws ResolutionException { - - // parse identifier - - Matcher matcher = DID_ERC725_PATTERN.matcher(identifier); - if (! matcher.matches()) return null; - - String network = matcher.groupCount() == 2 ? matcher.group(1) : null; - String address = matcher.groupCount() == 2 ? matcher.group(2) : matcher.group(1); - - // retrieve keys - - ERC725Keys keys; - - try { - - keys = this.getEthereumConnection().getKeys(network, address); - } catch (IOException ex) { - - throw new ResolutionException("Cannot retrieve keys for address " + address + " on network " + network + ": "+ ex.getMessage(), ex); - } - - if (log.isDebugEnabled()) log.debug("Retrieved keys for address " + address + " on network " + network + ": " + keys); - - // DID DOCUMENT id - - String id = identifier; - - // DID DOCUMENT publicKeys - - int keyNum = 0; - List publicKeys = new ArrayList (); - List authentications = new ArrayList (); - List encryptions = new ArrayList (); - - if (keys != null) { - - for (byte[] managementKey : keys.getManagementKeys()) { - - String keyId = id + "#key-" + (++keyNum); - - PublicKey publicKey = PublicKey.build(keyId, DIDDOCUMENT_PUBLICKEY_TYPES, null, null, Hex.encodeHexString(managementKey), null); - publicKeys.add(publicKey); - } - - for (byte[] actionKey : keys.getActionKeys()) { - - String keyId = id + "#key-" + (++keyNum); - - PublicKey publicKey = PublicKey.build(keyId, DIDDOCUMENT_PUBLICKEY_TYPES, null, null, Hex.encodeHexString(actionKey), null); - publicKeys.add(publicKey); - - Authentication authentication = Authentication.build(null, DIDDOCUMENT_AUTHENTICATION_TYPES, keyId); - authentications.add(authentication); - } - - for (byte[] claimKey : keys.getClaimKeys()) { - - String keyId = id + "#key-" + (++keyNum); - - PublicKey publicKey = PublicKey.build(keyId, DIDDOCUMENT_PUBLICKEY_TYPES, null, null, Hex.encodeHexString(claimKey), null); - publicKeys.add(publicKey); - - Authentication authentication = Authentication.build(null, DIDDOCUMENT_AUTHENTICATION_TYPES, keyId); - authentications.add(authentication); - } - - for (byte[] actionKey : keys.getActionKeys()) { - - String keyId = id + "#key-" + (++keyNum); - - PublicKey publicKey = PublicKey.build(keyId, DIDDOCUMENT_PUBLICKEY_TYPES, null, null, Hex.encodeHexString(actionKey), null); - publicKeys.add(publicKey); - - Encryption encryption = Encryption.build(null, DIDDOCUMENT_ENCRYPTION_TYPES, keyId); - encryptions.add(encryption); - } - } else { - - publicKeys = Collections.emptyList(); - authentications = Collections.emptyList(); - encryptions = Collections.emptyList(); - } - - // DID DOCUMENT services - - List services = Collections.emptyList(); - - // create DID DOCUMENT - - DIDDocument didDocument = DIDDocument.build(id, publicKeys, authentications, encryptions, services); - - // create METHOD METADATA - - Map methodMetadata = new LinkedHashMap (); - if (keys != null) methodMetadata.put("keys", keys.toJsonMap()); - - // create RESOLVE RESULT - - ResolveResult resolveResult = ResolveResult.build(didDocument, null, methodMetadata); - - // done - - return resolveResult; - } - - @Override - public Map properties() { - - return this.getProperties(); - } - - /* - * Getters and setters - */ - - public Map getProperties() { - - return this.properties; - } - - public void setProperties(Map properties) { - - this.properties = properties; - this.configureFromProperties(); - } - - public EthereumConnection getEthereumConnection() { - - return this.ethereumConnection; - } - - public void setEthereumConnection(EthereumConnection ethereumConnection) { - - this.ethereumConnection = ethereumConnection; - } -} diff --git a/drivers/erc725/src/main/java/uniresolver/driver/did/erc725/ERC725Contract.java b/drivers/erc725/src/main/java/uniresolver/driver/did/erc725/ERC725Contract.java deleted file mode 100644 index f3a6bd317..000000000 --- a/drivers/erc725/src/main/java/uniresolver/driver/did/erc725/ERC725Contract.java +++ /dev/null @@ -1,707 +0,0 @@ -package uniresolver.driver.did.erc725; - -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.Callable; -import org.web3j.abi.EventEncoder; -import org.web3j.abi.EventValues; -import org.web3j.abi.TypeReference; -import org.web3j.abi.datatypes.Address; -import org.web3j.abi.datatypes.Bool; -import org.web3j.abi.datatypes.DynamicArray; -import org.web3j.abi.datatypes.DynamicBytes; -import org.web3j.abi.datatypes.Event; -import org.web3j.abi.datatypes.Function; -import org.web3j.abi.datatypes.Type; -import org.web3j.abi.datatypes.Utf8String; -import org.web3j.abi.datatypes.generated.Bytes32; -import org.web3j.abi.datatypes.generated.Uint256; -import org.web3j.crypto.Credentials; -import org.web3j.protocol.Web3j; -import org.web3j.protocol.core.DefaultBlockParameter; -import org.web3j.protocol.core.RemoteCall; -import org.web3j.protocol.core.methods.request.EthFilter; -import org.web3j.protocol.core.methods.response.Log; -import org.web3j.protocol.core.methods.response.TransactionReceipt; -import org.web3j.tuples.generated.Tuple6; -import org.web3j.tx.Contract; -import org.web3j.tx.TransactionManager; -import rx.Observable; -import rx.functions.Func1; - -/** - *

Auto generated code. - *

Do not modify! - *

Please use the web3j command line tools, - * or the org.web3j.codegen.SolidityFunctionWrapperGenerator in the - * codegen module to update. - * - *

Generated with web3j version none. - */ -public class ERC725Contract extends Contract { - private static final String BINARY = "6060604052600060065534156200001557600080fd5b62000030336001640100000000620014046200003682021704565b620001a3565b600160a060020a038216600090815260208190526040902054156200005a57600080fd5b8082600160a060020a03167f7d958a859734aa5212d2568f8700fe77619bc93d5b08abf1445585bac8bff60660405160405180910390a3600160a060020a038216600090815260208181526040808320849055838352600290915280822054916004918590859051600160a060020a03929092166c010000000000000000000000000282526014820152603401604051908190039020815260208082019290925260409081016000908120939093558383526002909152902080546001810162000125838262000153565b5060009182526020909120018054600160a060020a031916600160a060020a03939093169290921790915550565b8154818355818115116200017a576000838152602090206200017a9181019083016200017f565b505050565b620001a091905b808211156200019c576000815560010162000186565b5090565b90565b6116c580620001b36000396000f3006060604052600436106100ae5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630607f93781146100b357806341cbfc7b146101b15780634b24fd0d1461021a5780634ec79937146102395780634eee424a1461026857806369e784991461027e5780636fa282491461029d578063a2d39bdb146102b3578063b53ea1b6146102d5578063b61d27f6146102fa578063c9100bcb1461035f575b600080fd5b34156100be57600080fd5b61019f600480359060248035600160a060020a0316916044359160849060643590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f0160208091040260200160405190810160405281815292919060208401838380828437509496506104e695505050505050565b60405190815260200160405180910390f35b34156101bc57600080fd5b6101c76004356106b0565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156102065780820151838201526020016101ee565b505050509050019250505060405180910390f35b341561022557600080fd5b61019f600160a060020a036004351661072c565b341561024457600080fd5b6102546004356024351515610747565b604051901515815260200160405180910390f35b341561027357600080fd5b610254600435610848565b341561028957600080fd5b610254600160a060020a0360043516610bf7565b34156102a857600080fd5b6101c7600435610c43565b34156102be57600080fd5b610254600160a060020a0360043516602435610cb4565b34156102e057600080fd5b610254600160a060020a0360043581169060243516610d01565b341561030557600080fd5b61019f60048035600160a060020a03169060248035919060649060443590810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650610d6895505050505050565b341561036a57600080fd5b610375600435610f83565b6040518087815260200186600160a060020a0316600160a060020a03168152602001858152602001806020018060200180602001848103845287818151815260200191508051906020019080838360005b838110156103de5780820151838201526020016103c6565b50505050905090810190601f16801561040b5780820380516001836020036101000a031916815260200191505b50848103835286818151815260200191508051906020019080838360005b83811015610441578082015183820152602001610429565b50505050905090810190601f16801561046e5780820380516001836020036101000a031916815260200191505b50848103825285818151815260200191508051906020019080838360005b838110156104a457808201518382015260200161048c565b50505050905090810190601f1680156104d15780820380516001836020036101000a031916815260200191505b50995050505050505050505060405180910390f35b600160a060020a03331660009081526020819052604081205460031461050b57600080fd5b8587604051600160a060020a03929092166c0100000000000000000000000002825260148201526034016040518091039020905060c06040519081016040908152888252600160a060020a038816602080840191909152818301889052606083018790526080830186905260a08301859052600084815260019091522081518155602082015160018201805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055604082015181600201556060820151816003019080516105e492916020019061152b565b506080820151816004019080516105ff92916020019061152b565b5060a08201518160050190805161061a92916020019061152b565b505050600087815260036020526040808220549160049189908b9051600160a060020a03929092166c010000000000000000000000000282526014820152603401604051908190039020815260208082019290925260409081016000908120939093558983526003909152902080546001810161069783826115a9565b5060009182526020909120018190559695505050505050565b6106b86115d2565b6002600083815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561071f57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610701575b505050505090505b919050565b600160a060020a031660009081526020819052604090205490565b600160a060020a03331660009081526020819052604081205460011461076c57600080fd5b6006546000848152600560205260409020600301541461078b57600080fd5b6006805460010190558115610842576000838152600560205260409081902080546001820154600160a060020a03909116929091600201905180828054600181600116156101000203166002900480156108265780601f106107fb57610100808354040283529160200191610826565b820191906000526020600020905b81548152906001019060200180831161080957829003601f168201915b505091505060006040518083038185876187965a03f193505050505b92915050565b60006108526115e4565b600083815260016020526040808220829182919060c090519081016040529081600082015481526020016001820160009054906101000a9004600160a060020a0316600160a060020a0316600160a060020a0316815260200160028201548152602001600382018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561094d5780601f106109225761010080835404028352916020019161094d565b820191906000526020600020905b81548152906001019060200180831161093057829003601f168201915b50505050508152602001600482018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156109ef5780601f106109c4576101008083540402835291602001916109ef565b820191906000526020600020905b8154815290600101906020018083116109d257829003601f168201915b50505050508152602001600582018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a915780601f10610a6657610100808354040283529160200191610a91565b820191906000526020600020905b815481529060010190602001808311610a7457829003601f168201915b50505050508152505093508360200151600160a060020a031633600160a060020a03161480610ad85750600160a060020a0333166000908152602081905260409020546001145b80610af4575030600160a060020a031633600160a060020a0316145b1515610aff57600080fd5b60008681526004602052604081208054908290559350600390855181526020810191909152604001600020805490925082906000198101908110610b3f57fe5b9060005260206000209001549050808284815481101515610b5c57fe5b60009182526020808320909101929092558281526004825260408082208690558882526001928390528120818155918201805473ffffffffffffffffffffffffffffffffffffffff1916905560028201819055610bbc6003830182611635565b610bca600483016000611635565b610bd8600583016000611635565b50508154610bea8360001983016115a9565b5060019695505050505050565b600160a060020a03331660009081526020819052604081205460011480610c2f575030600160a060020a031633600160a060020a0316145b1515610c3a57600080fd5b61072782611222565b610c4b6115d2565b6003600083815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561071f57602002820191906000526020600020905b81548152600190910190602001808311610c945750505050509050919050565b600160a060020a03331660009081526020819052604081205460011480610cec575030600160a060020a031633600160a060020a0316145b1515610cf757600080fd5b6108428383611404565b600160a060020a03331660009081526020819052604081205460011480610d39575030600160a060020a031633600160a060020a0316145b1515610d4457600080fd5b610d5682610d518561072c565b611404565b610d5f83611222565b50600192915050565b600160a060020a0333166000908152602081905260408120546001811480610d905750600281145b1515610d9b57600080fd5b8484846006546040516c01000000000000000000000000600160a060020a038616028152601481018490526034810183805190602001908083835b60208310610df55780518252601f199092019160209182019101610dd6565b6001836020036101000a03801982511681845116179092525050509190910192835250506020019250604091505051908190039020915083600160a060020a038616837fce0206f766cbb69a1ad1b8485f947bf53c2c0a2f3cf1078b31bb424833d3b0fb8660405160208082528190810183818151815260200191508051906020019080838360005b83811015610e96578082015183820152602001610e7e565b50505050905090810190601f168015610ec35780820380516001836020036101000a031916815260200191505b509250505060405180910390a460806040519081016040908152600160a060020a03871682526020808301879052818301869052600654606084015260008581526005909152208151815473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039190911617815560208201518160010155604082015181600201908051610f5892916020019061152b565b506060820151600390910155506001811415610f7b57610f79826001610747565b505b509392505050565b6000806000610f906115d2565b610f986115d2565b610fa06115d2565b610fa86115e4565b600088815260016020526040908190209060c090519081016040529081600082015481526020016001820160009054906101000a9004600160a060020a0316600160a060020a0316600160a060020a0316815260200160028201548152602001600382018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110a05780601f10611075576101008083540402835291602001916110a0565b820191906000526020600020905b81548152906001019060200180831161108357829003601f168201915b50505050508152602001600482018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111425780601f1061111757610100808354040283529160200191611142565b820191906000526020600020905b81548152906001019060200180831161112557829003601f168201915b50505050508152602001600582018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111e45780601f106111b9576101008083540402835291602001916111e4565b820191906000526020600020905b8154815290600101906020018083116111c757829003601f168201915b5050505050815250509050806000015181602001518260400151836060015184608001518560a00151949d939c50919a509850965090945092505050565b600160a060020a03811660008181526020819052604080822054928291829182918691907fe96ba5805e91ce4b5225d90ad1aac15c207472188f51f24025974341360f0f8a905160405180910390a360026000868152602001908152602001600020935030600160a060020a031633600160a060020a0316141580156112a85750600185145b80156112b5575083546001145b156112bf57600080fd5b8585604051600160a060020a03929092166c01000000000000000000000000028252601482015260340160405190819003902060008181526004602052604081208054919055855491945092508490600019810190811061131c57fe5b6000918252602090912001548454600160a060020a039091169150819085908490811061134557fe5b6000918252602080832091909101805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0394851617905591831681529081905260408082205484926004929091859151600160a060020a03929092166c010000000000000000000000000282526014820152603401604051908190039020815260208101919091526040016000205583546113e28560001983016115a9565b505050600160a060020a03909316600090815260208190526040812055505050565b600160a060020a0382166000908152602081905260409020541561142757600080fd5b8082600160a060020a03167f7d958a859734aa5212d2568f8700fe77619bc93d5b08abf1445585bac8bff60660405160405180910390a3600160a060020a038216600090815260208181526040808320849055838352600290915280822054916004918590859051600160a060020a03929092166c01000000000000000000000000028252601482015260340160405190819003902081526020808201929092526040908101600090812093909355838352600290915290208054600181016114f083826115a9565b506000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03939093169290921790915550565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061156c57805160ff1916838001178555611599565b82800160010185558215611599579182015b8281111561159957825182559160200191906001019061157e565b506115a592915061167c565b5090565b8154818355818115116115cd576000838152602090206115cd91810190830161167c565b505050565b60206040519081016040526000815290565b60c060405190810160405280600081526020016000600160a060020a03168152602001600081526020016116166115d2565b81526020016116236115d2565b81526020016116306115d2565b905290565b50805460018160011615610100020316600290046000825580601f1061165b5750611679565b601f016020900490600052602060002090810190611679919061167c565b50565b61169691905b808211156115a55760008155600101611682565b905600a165627a7a723058208420b42cb3a4a59b7027c6d7c7546800e743bc57519a685119169f83fc5976810029"; - - protected ERC725Contract(String contractAddress, Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) { - super(BINARY, contractAddress, web3j, credentials, gasPrice, gasLimit); - } - - protected ERC725Contract(String contractAddress, Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) { - super(BINARY, contractAddress, web3j, transactionManager, gasPrice, gasLimit); - } - - public List getClaimRequestedEvents(TransactionReceipt transactionReceipt) { - final Event event = new Event("ClaimRequested", - Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference

() {}), - Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); - List valueList = extractEventParameters(event, transactionReceipt); - ArrayList responses = new ArrayList(valueList.size()); - for (EventValues eventValues : valueList) { - ClaimRequestedEventResponse typedResponse = new ClaimRequestedEventResponse(); - typedResponse.log = transactionReceipt.getLogs().get(valueList.indexOf(eventValues)); - typedResponse.claimId = (byte[]) eventValues.getIndexedValues().get(0).getValue(); - typedResponse.claimType = (BigInteger) eventValues.getIndexedValues().get(1).getValue(); - typedResponse.issuer = (String) eventValues.getIndexedValues().get(2).getValue(); - typedResponse.signatureType = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue(); - typedResponse.signature = (byte[]) eventValues.getNonIndexedValues().get(1).getValue(); - typedResponse.claim = (byte[]) eventValues.getNonIndexedValues().get(2).getValue(); - typedResponse.uri = (String) eventValues.getNonIndexedValues().get(3).getValue(); - responses.add(typedResponse); - } - return responses; - } - - public Observable claimRequestedEventObservable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) { - final Event event = new Event("ClaimRequested", - Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference
() {}), - Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); - EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress()); - filter.addSingleTopic(EventEncoder.encode(event)); - return web3j.ethLogObservable(filter).map(new Func1() { - @Override - public ClaimRequestedEventResponse call(Log log) { - EventValues eventValues = extractEventParameters(event, log); - ClaimRequestedEventResponse typedResponse = new ClaimRequestedEventResponse(); - typedResponse.log = log; - typedResponse.claimId = (byte[]) eventValues.getIndexedValues().get(0).getValue(); - typedResponse.claimType = (BigInteger) eventValues.getIndexedValues().get(1).getValue(); - typedResponse.issuer = (String) eventValues.getIndexedValues().get(2).getValue(); - typedResponse.signatureType = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue(); - typedResponse.signature = (byte[]) eventValues.getNonIndexedValues().get(1).getValue(); - typedResponse.claim = (byte[]) eventValues.getNonIndexedValues().get(2).getValue(); - typedResponse.uri = (String) eventValues.getNonIndexedValues().get(3).getValue(); - return typedResponse; - } - }); - } - - public List getClaimAddedEvents(TransactionReceipt transactionReceipt) { - final Event event = new Event("ClaimAdded", - Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference
() {}), - Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); - List valueList = extractEventParameters(event, transactionReceipt); - ArrayList responses = new ArrayList(valueList.size()); - for (EventValues eventValues : valueList) { - ClaimAddedEventResponse typedResponse = new ClaimAddedEventResponse(); - typedResponse.log = transactionReceipt.getLogs().get(valueList.indexOf(eventValues)); - typedResponse.claimId = (byte[]) eventValues.getIndexedValues().get(0).getValue(); - typedResponse.claimType = (BigInteger) eventValues.getIndexedValues().get(1).getValue(); - typedResponse.issuer = (String) eventValues.getIndexedValues().get(2).getValue(); - typedResponse.signatureType = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue(); - typedResponse.signature = (byte[]) eventValues.getNonIndexedValues().get(1).getValue(); - typedResponse.claim = (byte[]) eventValues.getNonIndexedValues().get(2).getValue(); - typedResponse.uri = (String) eventValues.getNonIndexedValues().get(3).getValue(); - responses.add(typedResponse); - } - return responses; - } - - public Observable claimAddedEventObservable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) { - final Event event = new Event("ClaimAdded", - Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference
() {}), - Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); - EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress()); - filter.addSingleTopic(EventEncoder.encode(event)); - return web3j.ethLogObservable(filter).map(new Func1() { - @Override - public ClaimAddedEventResponse call(Log log) { - EventValues eventValues = extractEventParameters(event, log); - ClaimAddedEventResponse typedResponse = new ClaimAddedEventResponse(); - typedResponse.log = log; - typedResponse.claimId = (byte[]) eventValues.getIndexedValues().get(0).getValue(); - typedResponse.claimType = (BigInteger) eventValues.getIndexedValues().get(1).getValue(); - typedResponse.issuer = (String) eventValues.getIndexedValues().get(2).getValue(); - typedResponse.signatureType = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue(); - typedResponse.signature = (byte[]) eventValues.getNonIndexedValues().get(1).getValue(); - typedResponse.claim = (byte[]) eventValues.getNonIndexedValues().get(2).getValue(); - typedResponse.uri = (String) eventValues.getNonIndexedValues().get(3).getValue(); - return typedResponse; - } - }); - } - - public List getClaimRemovedEvents(TransactionReceipt transactionReceipt) { - final Event event = new Event("ClaimRemoved", - Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference
() {}), - Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); - List valueList = extractEventParameters(event, transactionReceipt); - ArrayList responses = new ArrayList(valueList.size()); - for (EventValues eventValues : valueList) { - ClaimRemovedEventResponse typedResponse = new ClaimRemovedEventResponse(); - typedResponse.log = transactionReceipt.getLogs().get(valueList.indexOf(eventValues)); - typedResponse.claimId = (byte[]) eventValues.getIndexedValues().get(0).getValue(); - typedResponse.claimType = (BigInteger) eventValues.getIndexedValues().get(1).getValue(); - typedResponse.issuer = (String) eventValues.getIndexedValues().get(2).getValue(); - typedResponse.signatureType = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue(); - typedResponse.signature = (byte[]) eventValues.getNonIndexedValues().get(1).getValue(); - typedResponse.claim = (byte[]) eventValues.getNonIndexedValues().get(2).getValue(); - typedResponse.uri = (String) eventValues.getNonIndexedValues().get(3).getValue(); - responses.add(typedResponse); - } - return responses; - } - - public Observable claimRemovedEventObservable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) { - final Event event = new Event("ClaimRemoved", - Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference
() {}), - Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); - EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress()); - filter.addSingleTopic(EventEncoder.encode(event)); - return web3j.ethLogObservable(filter).map(new Func1() { - @Override - public ClaimRemovedEventResponse call(Log log) { - EventValues eventValues = extractEventParameters(event, log); - ClaimRemovedEventResponse typedResponse = new ClaimRemovedEventResponse(); - typedResponse.log = log; - typedResponse.claimId = (byte[]) eventValues.getIndexedValues().get(0).getValue(); - typedResponse.claimType = (BigInteger) eventValues.getIndexedValues().get(1).getValue(); - typedResponse.issuer = (String) eventValues.getIndexedValues().get(2).getValue(); - typedResponse.signatureType = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue(); - typedResponse.signature = (byte[]) eventValues.getNonIndexedValues().get(1).getValue(); - typedResponse.claim = (byte[]) eventValues.getNonIndexedValues().get(2).getValue(); - typedResponse.uri = (String) eventValues.getNonIndexedValues().get(3).getValue(); - return typedResponse; - } - }); - } - - public List getClaimChangedEvents(TransactionReceipt transactionReceipt) { - final Event event = new Event("ClaimChanged", - Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference
() {}), - Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); - List valueList = extractEventParameters(event, transactionReceipt); - ArrayList responses = new ArrayList(valueList.size()); - for (EventValues eventValues : valueList) { - ClaimChangedEventResponse typedResponse = new ClaimChangedEventResponse(); - typedResponse.log = transactionReceipt.getLogs().get(valueList.indexOf(eventValues)); - typedResponse.claimId = (byte[]) eventValues.getIndexedValues().get(0).getValue(); - typedResponse.claimType = (BigInteger) eventValues.getIndexedValues().get(1).getValue(); - typedResponse.issuer = (String) eventValues.getIndexedValues().get(2).getValue(); - typedResponse.signatureType = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue(); - typedResponse.signature = (byte[]) eventValues.getNonIndexedValues().get(1).getValue(); - typedResponse.claim = (byte[]) eventValues.getNonIndexedValues().get(2).getValue(); - typedResponse.uri = (String) eventValues.getNonIndexedValues().get(3).getValue(); - responses.add(typedResponse); - } - return responses; - } - - public Observable claimChangedEventObservable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) { - final Event event = new Event("ClaimChanged", - Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference
() {}), - Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); - EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress()); - filter.addSingleTopic(EventEncoder.encode(event)); - return web3j.ethLogObservable(filter).map(new Func1() { - @Override - public ClaimChangedEventResponse call(Log log) { - EventValues eventValues = extractEventParameters(event, log); - ClaimChangedEventResponse typedResponse = new ClaimChangedEventResponse(); - typedResponse.log = log; - typedResponse.claimId = (byte[]) eventValues.getIndexedValues().get(0).getValue(); - typedResponse.claimType = (BigInteger) eventValues.getIndexedValues().get(1).getValue(); - typedResponse.issuer = (String) eventValues.getIndexedValues().get(2).getValue(); - typedResponse.signatureType = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue(); - typedResponse.signature = (byte[]) eventValues.getNonIndexedValues().get(1).getValue(); - typedResponse.claim = (byte[]) eventValues.getNonIndexedValues().get(2).getValue(); - typedResponse.uri = (String) eventValues.getNonIndexedValues().get(3).getValue(); - return typedResponse; - } - }); - } - - public List getKeyAddedEvents(TransactionReceipt transactionReceipt) { - final Event event = new Event("KeyAdded", - Arrays.>asList(new TypeReference
() {}, new TypeReference() {}), - Arrays.>asList()); - List valueList = extractEventParameters(event, transactionReceipt); - ArrayList responses = new ArrayList(valueList.size()); - for (EventValues eventValues : valueList) { - KeyAddedEventResponse typedResponse = new KeyAddedEventResponse(); - typedResponse.log = transactionReceipt.getLogs().get(valueList.indexOf(eventValues)); - typedResponse.key = (String) eventValues.getIndexedValues().get(0).getValue(); - typedResponse.keyType = (BigInteger) eventValues.getIndexedValues().get(1).getValue(); - responses.add(typedResponse); - } - return responses; - } - - public Observable keyAddedEventObservable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) { - final Event event = new Event("KeyAdded", - Arrays.>asList(new TypeReference
() {}, new TypeReference() {}), - Arrays.>asList()); - EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress()); - filter.addSingleTopic(EventEncoder.encode(event)); - return web3j.ethLogObservable(filter).map(new Func1() { - @Override - public KeyAddedEventResponse call(Log log) { - EventValues eventValues = extractEventParameters(event, log); - KeyAddedEventResponse typedResponse = new KeyAddedEventResponse(); - typedResponse.log = log; - typedResponse.key = (String) eventValues.getIndexedValues().get(0).getValue(); - typedResponse.keyType = (BigInteger) eventValues.getIndexedValues().get(1).getValue(); - return typedResponse; - } - }); - } - - public List getKeyRemovedEvents(TransactionReceipt transactionReceipt) { - final Event event = new Event("KeyRemoved", - Arrays.>asList(new TypeReference
() {}, new TypeReference() {}), - Arrays.>asList()); - List valueList = extractEventParameters(event, transactionReceipt); - ArrayList responses = new ArrayList(valueList.size()); - for (EventValues eventValues : valueList) { - KeyRemovedEventResponse typedResponse = new KeyRemovedEventResponse(); - typedResponse.log = transactionReceipt.getLogs().get(valueList.indexOf(eventValues)); - typedResponse.key = (String) eventValues.getIndexedValues().get(0).getValue(); - typedResponse.keyType = (BigInteger) eventValues.getIndexedValues().get(1).getValue(); - responses.add(typedResponse); - } - return responses; - } - - public Observable keyRemovedEventObservable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) { - final Event event = new Event("KeyRemoved", - Arrays.>asList(new TypeReference
() {}, new TypeReference() {}), - Arrays.>asList()); - EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress()); - filter.addSingleTopic(EventEncoder.encode(event)); - return web3j.ethLogObservable(filter).map(new Func1() { - @Override - public KeyRemovedEventResponse call(Log log) { - EventValues eventValues = extractEventParameters(event, log); - KeyRemovedEventResponse typedResponse = new KeyRemovedEventResponse(); - typedResponse.log = log; - typedResponse.key = (String) eventValues.getIndexedValues().get(0).getValue(); - typedResponse.keyType = (BigInteger) eventValues.getIndexedValues().get(1).getValue(); - return typedResponse; - } - }); - } - - public List getKeyReplacedEvents(TransactionReceipt transactionReceipt) { - final Event event = new Event("KeyReplaced", - Arrays.>asList(new TypeReference
() {}, new TypeReference
() {}, new TypeReference() {}), - Arrays.>asList()); - List valueList = extractEventParameters(event, transactionReceipt); - ArrayList responses = new ArrayList(valueList.size()); - for (EventValues eventValues : valueList) { - KeyReplacedEventResponse typedResponse = new KeyReplacedEventResponse(); - typedResponse.log = transactionReceipt.getLogs().get(valueList.indexOf(eventValues)); - typedResponse.oldKey = (String) eventValues.getIndexedValues().get(0).getValue(); - typedResponse.newKey = (String) eventValues.getIndexedValues().get(1).getValue(); - typedResponse.keyType = (BigInteger) eventValues.getIndexedValues().get(2).getValue(); - responses.add(typedResponse); - } - return responses; - } - - public Observable keyReplacedEventObservable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) { - final Event event = new Event("KeyReplaced", - Arrays.>asList(new TypeReference
() {}, new TypeReference
() {}, new TypeReference() {}), - Arrays.>asList()); - EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress()); - filter.addSingleTopic(EventEncoder.encode(event)); - return web3j.ethLogObservable(filter).map(new Func1() { - @Override - public KeyReplacedEventResponse call(Log log) { - EventValues eventValues = extractEventParameters(event, log); - KeyReplacedEventResponse typedResponse = new KeyReplacedEventResponse(); - typedResponse.log = log; - typedResponse.oldKey = (String) eventValues.getIndexedValues().get(0).getValue(); - typedResponse.newKey = (String) eventValues.getIndexedValues().get(1).getValue(); - typedResponse.keyType = (BigInteger) eventValues.getIndexedValues().get(2).getValue(); - return typedResponse; - } - }); - } - - public List getExecutionRequestedEvents(TransactionReceipt transactionReceipt) { - final Event event = new Event("ExecutionRequested", - Arrays.>asList(new TypeReference() {}, new TypeReference
() {}, new TypeReference() {}), - Arrays.>asList(new TypeReference() {})); - List valueList = extractEventParameters(event, transactionReceipt); - ArrayList responses = new ArrayList(valueList.size()); - for (EventValues eventValues : valueList) { - ExecutionRequestedEventResponse typedResponse = new ExecutionRequestedEventResponse(); - typedResponse.log = transactionReceipt.getLogs().get(valueList.indexOf(eventValues)); - typedResponse.executionId = (byte[]) eventValues.getIndexedValues().get(0).getValue(); - typedResponse.to = (String) eventValues.getIndexedValues().get(1).getValue(); - typedResponse.value = (BigInteger) eventValues.getIndexedValues().get(2).getValue(); - typedResponse.data = (byte[]) eventValues.getNonIndexedValues().get(0).getValue(); - responses.add(typedResponse); - } - return responses; - } - - public Observable executionRequestedEventObservable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) { - final Event event = new Event("ExecutionRequested", - Arrays.>asList(new TypeReference() {}, new TypeReference
() {}, new TypeReference() {}), - Arrays.>asList(new TypeReference() {})); - EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress()); - filter.addSingleTopic(EventEncoder.encode(event)); - return web3j.ethLogObservable(filter).map(new Func1() { - @Override - public ExecutionRequestedEventResponse call(Log log) { - EventValues eventValues = extractEventParameters(event, log); - ExecutionRequestedEventResponse typedResponse = new ExecutionRequestedEventResponse(); - typedResponse.log = log; - typedResponse.executionId = (byte[]) eventValues.getIndexedValues().get(0).getValue(); - typedResponse.to = (String) eventValues.getIndexedValues().get(1).getValue(); - typedResponse.value = (BigInteger) eventValues.getIndexedValues().get(2).getValue(); - typedResponse.data = (byte[]) eventValues.getNonIndexedValues().get(0).getValue(); - return typedResponse; - } - }); - } - - public List getExecutedEvents(TransactionReceipt transactionReceipt) { - final Event event = new Event("Executed", - Arrays.>asList(new TypeReference() {}, new TypeReference
() {}, new TypeReference() {}), - Arrays.>asList(new TypeReference() {})); - List valueList = extractEventParameters(event, transactionReceipt); - ArrayList responses = new ArrayList(valueList.size()); - for (EventValues eventValues : valueList) { - ExecutedEventResponse typedResponse = new ExecutedEventResponse(); - typedResponse.log = transactionReceipt.getLogs().get(valueList.indexOf(eventValues)); - typedResponse.executionId = (byte[]) eventValues.getIndexedValues().get(0).getValue(); - typedResponse.to = (String) eventValues.getIndexedValues().get(1).getValue(); - typedResponse.value = (BigInteger) eventValues.getIndexedValues().get(2).getValue(); - typedResponse.data = (byte[]) eventValues.getNonIndexedValues().get(0).getValue(); - responses.add(typedResponse); - } - return responses; - } - - public Observable executedEventObservable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) { - final Event event = new Event("Executed", - Arrays.>asList(new TypeReference() {}, new TypeReference
() {}, new TypeReference() {}), - Arrays.>asList(new TypeReference() {})); - EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress()); - filter.addSingleTopic(EventEncoder.encode(event)); - return web3j.ethLogObservable(filter).map(new Func1() { - @Override - public ExecutedEventResponse call(Log log) { - EventValues eventValues = extractEventParameters(event, log); - ExecutedEventResponse typedResponse = new ExecutedEventResponse(); - typedResponse.log = log; - typedResponse.executionId = (byte[]) eventValues.getIndexedValues().get(0).getValue(); - typedResponse.to = (String) eventValues.getIndexedValues().get(1).getValue(); - typedResponse.value = (BigInteger) eventValues.getIndexedValues().get(2).getValue(); - typedResponse.data = (byte[]) eventValues.getNonIndexedValues().get(0).getValue(); - return typedResponse; - } - }); - } - - public List getApprovedEvents(TransactionReceipt transactionReceipt) { - final Event event = new Event("Approved", - Arrays.>asList(new TypeReference() {}), - Arrays.>asList(new TypeReference() {})); - List valueList = extractEventParameters(event, transactionReceipt); - ArrayList responses = new ArrayList(valueList.size()); - for (EventValues eventValues : valueList) { - ApprovedEventResponse typedResponse = new ApprovedEventResponse(); - typedResponse.log = transactionReceipt.getLogs().get(valueList.indexOf(eventValues)); - typedResponse.executionId = (byte[]) eventValues.getIndexedValues().get(0).getValue(); - typedResponse.approved = (Boolean) eventValues.getNonIndexedValues().get(0).getValue(); - responses.add(typedResponse); - } - return responses; - } - - public Observable approvedEventObservable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) { - final Event event = new Event("Approved", - Arrays.>asList(new TypeReference() {}), - Arrays.>asList(new TypeReference() {})); - EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress()); - filter.addSingleTopic(EventEncoder.encode(event)); - return web3j.ethLogObservable(filter).map(new Func1() { - @Override - public ApprovedEventResponse call(Log log) { - EventValues eventValues = extractEventParameters(event, log); - ApprovedEventResponse typedResponse = new ApprovedEventResponse(); - typedResponse.log = log; - typedResponse.executionId = (byte[]) eventValues.getIndexedValues().get(0).getValue(); - typedResponse.approved = (Boolean) eventValues.getNonIndexedValues().get(0).getValue(); - return typedResponse; - } - }); - } - - public RemoteCall addClaim(BigInteger _claimType, String _issuer, BigInteger _signatureType, byte[] _signature, byte[] _claim, String _uri) { - Function function = new Function( - "addClaim", - Arrays.asList(new org.web3j.abi.datatypes.generated.Uint256(_claimType), - new org.web3j.abi.datatypes.Address(_issuer), - new org.web3j.abi.datatypes.generated.Uint256(_signatureType), - new org.web3j.abi.datatypes.DynamicBytes(_signature), - new org.web3j.abi.datatypes.DynamicBytes(_claim), - new org.web3j.abi.datatypes.Utf8String(_uri)), - Collections.>emptyList()); - return executeRemoteCallTransaction(function); - } - - public RemoteCall getKeysByType(BigInteger _type) { - Function function = new Function("getKeysByType", - Arrays.asList(new org.web3j.abi.datatypes.generated.Uint256(_type)), - Arrays.>asList(new TypeReference>() {})); - return executeRemoteCallSingleValueReturn(function, List.class); - } - - public RemoteCall getKeyType(String _key) { - Function function = new Function("getKeyType", - Arrays.asList(new org.web3j.abi.datatypes.Address(_key)), - Arrays.>asList(new TypeReference() {})); - return executeRemoteCallSingleValueReturn(function, BigInteger.class); - } - - public RemoteCall approve(byte[] _id, Boolean _approve) { - Function function = new Function( - "approve", - Arrays.asList(new org.web3j.abi.datatypes.generated.Bytes32(_id), - new org.web3j.abi.datatypes.Bool(_approve)), - Collections.>emptyList()); - return executeRemoteCallTransaction(function); - } - - public RemoteCall removeClaim(byte[] _claimId) { - Function function = new Function( - "removeClaim", - Arrays.asList(new org.web3j.abi.datatypes.generated.Bytes32(_claimId)), - Collections.>emptyList()); - return executeRemoteCallTransaction(function); - } - - public RemoteCall removeKey(String _key) { - Function function = new Function( - "removeKey", - Arrays.asList(new org.web3j.abi.datatypes.Address(_key)), - Collections.>emptyList()); - return executeRemoteCallTransaction(function); - } - - public RemoteCall getClaimsIdByType(BigInteger _claimType) { - Function function = new Function("getClaimsIdByType", - Arrays.asList(new org.web3j.abi.datatypes.generated.Uint256(_claimType)), - Arrays.>asList(new TypeReference>() {})); - return executeRemoteCallSingleValueReturn(function, List.class); - } - - public RemoteCall addKey(String _key, BigInteger _type) { - Function function = new Function( - "addKey", - Arrays.asList(new org.web3j.abi.datatypes.Address(_key), - new org.web3j.abi.datatypes.generated.Uint256(_type)), - Collections.>emptyList()); - return executeRemoteCallTransaction(function); - } - - public RemoteCall replaceKey(String _oldKey, String _newKey) { - Function function = new Function( - "replaceKey", - Arrays.asList(new org.web3j.abi.datatypes.Address(_oldKey), - new org.web3j.abi.datatypes.Address(_newKey)), - Collections.>emptyList()); - return executeRemoteCallTransaction(function); - } - - public RemoteCall execute(String _to, BigInteger _value, byte[] _data) { - Function function = new Function( - "execute", - Arrays.asList(new org.web3j.abi.datatypes.Address(_to), - new org.web3j.abi.datatypes.generated.Uint256(_value), - new org.web3j.abi.datatypes.DynamicBytes(_data)), - Collections.>emptyList()); - return executeRemoteCallTransaction(function); - } - - public RemoteCall> getClaim(byte[] _claimId) { - final Function function = new Function("getClaim", - Arrays.asList(new org.web3j.abi.datatypes.generated.Bytes32(_claimId)), - Arrays.>asList(new TypeReference() {}, new TypeReference
() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); - return new RemoteCall>( - new Callable>() { - @Override - public Tuple6 call() throws Exception { - List results = executeCallMultipleValueReturn(function);; - return new Tuple6( - (BigInteger) results.get(0).getValue(), - (String) results.get(1).getValue(), - (BigInteger) results.get(2).getValue(), - (byte[]) results.get(3).getValue(), - (byte[]) results.get(4).getValue(), - (String) results.get(5).getValue()); - } - }); - } - - public static RemoteCall deploy(Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) { - return deployRemoteCall(ERC725Contract.class, web3j, credentials, gasPrice, gasLimit, BINARY, ""); - } - - public static RemoteCall deploy(Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) { - return deployRemoteCall(ERC725Contract.class, web3j, transactionManager, gasPrice, gasLimit, BINARY, ""); - } - - public static ERC725Contract load(String contractAddress, Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) { - return new ERC725Contract(contractAddress, web3j, credentials, gasPrice, gasLimit); - } - - public static ERC725Contract load(String contractAddress, Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) { - return new ERC725Contract(contractAddress, web3j, transactionManager, gasPrice, gasLimit); - } - - public static class ClaimRequestedEventResponse { - public Log log; - - public byte[] claimId; - - public BigInteger claimType; - - public String issuer; - - public BigInteger signatureType; - - public byte[] signature; - - public byte[] claim; - - public String uri; - } - - public static class ClaimAddedEventResponse { - public Log log; - - public byte[] claimId; - - public BigInteger claimType; - - public String issuer; - - public BigInteger signatureType; - - public byte[] signature; - - public byte[] claim; - - public String uri; - } - - public static class ClaimRemovedEventResponse { - public Log log; - - public byte[] claimId; - - public BigInteger claimType; - - public String issuer; - - public BigInteger signatureType; - - public byte[] signature; - - public byte[] claim; - - public String uri; - } - - public static class ClaimChangedEventResponse { - public Log log; - - public byte[] claimId; - - public BigInteger claimType; - - public String issuer; - - public BigInteger signatureType; - - public byte[] signature; - - public byte[] claim; - - public String uri; - } - - public static class KeyAddedEventResponse { - public Log log; - - public String key; - - public BigInteger keyType; - } - - public static class KeyRemovedEventResponse { - public Log log; - - public String key; - - public BigInteger keyType; - } - - public static class KeyReplacedEventResponse { - public Log log; - - public String oldKey; - - public String newKey; - - public BigInteger keyType; - } - - public static class ExecutionRequestedEventResponse { - public Log log; - - public byte[] executionId; - - public String to; - - public BigInteger value; - - public byte[] data; - } - - public static class ExecutedEventResponse { - public Log log; - - public byte[] executionId; - - public String to; - - public BigInteger value; - - public byte[] data; - } - - public static class ApprovedEventResponse { - public Log log; - - public byte[] executionId; - - public Boolean approved; - } -} diff --git a/drivers/erc725/src/main/java/uniresolver/driver/did/erc725/ethereumconnection/AbstractEthereumConnection.java b/drivers/erc725/src/main/java/uniresolver/driver/did/erc725/ethereumconnection/AbstractEthereumConnection.java deleted file mode 100644 index 66f5d9659..000000000 --- a/drivers/erc725/src/main/java/uniresolver/driver/did/erc725/ethereumconnection/AbstractEthereumConnection.java +++ /dev/null @@ -1,39 +0,0 @@ -package uniresolver.driver.did.erc725.ethereumconnection; - -import java.io.IOException; -import java.math.BigInteger; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -public abstract class AbstractEthereumConnection implements EthereumConnection { - - @Override - public final ERC725Keys getKeys(String network, String address) throws IOException { - - Map> keysByType = this.getKeysByType(network, address); - - Map managementPublicKeys = keysByType.get(KEY_TYPE_MANAGEMENT); - Map actionPublicKeys = keysByType.get(KEY_TYPE_ACTION); - Map claimPublicKeys = keysByType.get(KEY_TYPE_CLAIM); - Map encryptionPublicKeys = keysByType.get(KEY_TYPE_ENCRYPTION); - - return new ERC725Keys(managementPublicKeys.keySet(), actionPublicKeys.keySet(), claimPublicKeys.keySet(), encryptionPublicKeys.keySet(), managementPublicKeys.values(), actionPublicKeys.values(), claimPublicKeys.values(), encryptionPublicKeys.values()); - } - - public abstract Map> getKeysByType(String network, String address) throws IOException; - - @Override - public final Map getPublicKeysByAddresses(String network, List addresses) throws Exception { - - if (addresses == null || addresses.size() < 1) return Collections.emptyMap(); - - Map transactionHashesByAddresses = this.getTransactionHashesByAddresses(network, addresses); - Map publicKeysByAddresses = this.getPublicKeysByAddresses(network, transactionHashesByAddresses); - - return publicKeysByAddresses; - } - - public abstract Map getTransactionHashesByAddresses(String network, List addresses) throws Exception; - public abstract Map getPublicKeysByAddresses(String network, Map transactionHashesByAddress) throws Exception; -} diff --git a/drivers/erc725/src/main/java/uniresolver/driver/did/erc725/ethereumconnection/EthereumConnection.java b/drivers/erc725/src/main/java/uniresolver/driver/did/erc725/ethereumconnection/EthereumConnection.java deleted file mode 100644 index c7662a49c..000000000 --- a/drivers/erc725/src/main/java/uniresolver/driver/did/erc725/ethereumconnection/EthereumConnection.java +++ /dev/null @@ -1,117 +0,0 @@ -package uniresolver.driver.did.erc725.ethereumconnection; - -import java.io.IOException; -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.commons.codec.binary.Hex; - -public interface EthereumConnection { - - public static final String NETWORK_MAINNET = "mainnet"; - public static final String NETWORK_ROPSTEN = "ropsten"; - public static final String NETWORK_RINKEBY = "rinkeby"; - public static final String NETWORK_KOVAN = "kovan"; - - public static final BigInteger KEY_TYPE_MANAGEMENT = BigInteger.valueOf(1); - public static final BigInteger KEY_TYPE_ACTION = BigInteger.valueOf(2); - public static final BigInteger KEY_TYPE_CLAIM = BigInteger.valueOf(3); - public static final BigInteger KEY_TYPE_ENCRYPTION = BigInteger.valueOf(4); - - public ERC725Keys getKeys(String network, String address) throws IOException; - public Map getPublicKeysByAddresses(String network, List addresses) throws Exception; - - public static class ERC725Keys { - - public ERC725Keys(Collection managementAddresses, Collection actionAddresses, Collection claimAddresses, Collection encryptionAddresses, Collection managementKeys, Collection actionKeys, Collection claimKeys, Collection encryptionKeys) { - - this.managementAddresses = managementAddresses; - this.actionAddresses = actionAddresses; - this.claimAddresses = claimAddresses; - this.encryptionAddresses = encryptionAddresses; - this.managementKeys = managementKeys; - this.actionKeys = actionKeys; - this.claimKeys = claimKeys; - this.encryptionKeys = encryptionKeys; - } - - private Collection managementAddresses; - private Collection actionAddresses; - private Collection claimAddresses; - private Collection encryptionAddresses; - private Collection managementKeys; - private Collection actionKeys; - private Collection claimKeys; - private Collection encryptionKeys; - - public Collection getManagementAddresses() { - - return this.managementAddresses; - } - - public Collection getActionAddresses() { - - return this.actionAddresses; - } - - public Collection getClaimAddresses() { - - return this.claimAddresses; - } - - public Collection getEncryptionAddresses() { - - return this.encryptionAddresses; - } - - public Collection getManagementKeys() { - - return this.managementKeys; - } - - public Collection getActionKeys() { - - return this.actionKeys; - } - - public Collection getClaimKeys() { - - return this.claimKeys; - } - - public Collection getEncryptionKeys() { - - return this.encryptionKeys; - } - - public Map toJsonMap() { - - List managementKeys = new ArrayList (); - List actionKeys = new ArrayList (); - List claimKeys = new ArrayList (); - List encryptionKeys = new ArrayList (); - - for (byte[] managementKey : this.managementKeys) managementKeys.add("0x" + Hex.encodeHexString(managementKey).toUpperCase()); - for (byte[] actionKey : this.actionKeys) actionKeys.add("0x" + Hex.encodeHexString(actionKey).toUpperCase()); - for (byte[] claimKey : this.claimKeys) claimKeys.add("0x" + Hex.encodeHexString(claimKey).toUpperCase()); - for (byte[] encryptionKey : this.encryptionKeys) encryptionKeys.add("0x" + Hex.encodeHexString(encryptionKey).toUpperCase()); - - Map jsonMap = new HashMap (); - jsonMap.put("managementKeys", managementKeys); - jsonMap.put("actionKeys", actionKeys); - jsonMap.put("claimKeys", claimKeys); - jsonMap.put("encryptionKeys", encryptionKeys); - - jsonMap.put("managementAddresses", this.managementAddresses); - jsonMap.put("actionAddresses", this.actionAddresses); - jsonMap.put("claimAddresses", this.claimAddresses); - jsonMap.put("encryptionAddresses", this.encryptionAddresses); - - return jsonMap; - } - } -} diff --git a/drivers/erc725/src/main/java/uniresolver/driver/did/erc725/ethereumconnection/HybridEthereumConnection.java b/drivers/erc725/src/main/java/uniresolver/driver/did/erc725/ethereumconnection/HybridEthereumConnection.java deleted file mode 100644 index f99a76cd7..000000000 --- a/drivers/erc725/src/main/java/uniresolver/driver/did/erc725/ethereumconnection/HybridEthereumConnection.java +++ /dev/null @@ -1,207 +0,0 @@ -package uniresolver.driver.did.erc725.ethereumconnection; - -import java.io.IOException; -import java.net.URI; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.http.HttpEntity; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.util.EntityUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.web3j.protocol.Web3j; - -import com.fasterxml.jackson.databind.ObjectMapper; - -public class HybridEthereumConnection extends JsonRPCEthereumConnection implements EthereumConnection { - - private static Logger log = LoggerFactory.getLogger(HybridEthereumConnection.class); - - private static final ObjectMapper objectMapper = new ObjectMapper(); - - private static final HybridEthereumConnection instance = new HybridEthereumConnection(); - - private String etherscanApiMainnet; - private String etherscanApiRopsten; - private String etherscanApiRinkeby; - private String etherscanApiKovan; - private HttpClient httpClient; - - public HybridEthereumConnection(Web3j ethereumWeb3jMainnet, Web3j ethereumWeb3jRopsten, Web3j ethereumWeb3jRinkeby, Web3j ethereumWeb3jKovan, String etherscanApiMainnet, String etherscanApiRopsten, String etherscanApiRinkeby, String etherscanApiKovan) { - - super(ethereumWeb3jMainnet, ethereumWeb3jRopsten, ethereumWeb3jRinkeby, ethereumWeb3jKovan); - - this.etherscanApiMainnet = etherscanApiMainnet; - this.etherscanApiRopsten = etherscanApiRopsten; - this.etherscanApiRinkeby = etherscanApiRinkeby; - this.etherscanApiKovan = etherscanApiKovan; - this.httpClient = HttpClients.createDefault(); - } - - public HybridEthereumConnection(Web3j ethereumWeb3jMainnet, Web3j ethereumWeb3jRopsten, Web3j ethereumWeb3jRinkeby, Web3j ethereumWeb3jKovan) { - - this(ethereumWeb3jMainnet, ethereumWeb3jRopsten, ethereumWeb3jRinkeby, ethereumWeb3jKovan, null, null, null, null); - } - - public HybridEthereumConnection() { - - this(null, null, null, null, null, null, null, null); - } - - public static HybridEthereumConnection get() { - - return instance; - } - - @Override - public Map getTransactionHashesByAddresses(String network, List addresses) throws IOException { - - // determine network - - String api = this.getApi(network); - if (api == null) throw new IOException("No API for network '" + network + "'"); - - // find transaction hashes - - Map transactionHashesByAddresses = new HashMap (); - - for (String address : addresses) { - - // prepare HTTP request - - String uriString = api; - uriString += "?module=account&action=txlist&address="; - uriString += address; - - HttpGet httpGet = new HttpGet(URI.create(uriString)); - - // execute HTTP request - - Map transactions; - - if (log.isDebugEnabled()) log.debug("Request for address " + address + " to: " + uriString); - - try (CloseableHttpResponse httpResponse = (CloseableHttpResponse) this.getHttpClient().execute(httpGet)) { - - int statusCode = httpResponse.getStatusLine().getStatusCode(); - String statusMessage = httpResponse.getStatusLine().getReasonPhrase(); - - if (log.isDebugEnabled()) log.debug("Response status from " + uriString + ": " + statusCode + " " + statusMessage); - - if (statusCode == 404) return null; - - HttpEntity httpEntity = httpResponse.getEntity(); - String httpBody = EntityUtils.toString(httpEntity); - EntityUtils.consume(httpEntity); - - if (log.isDebugEnabled()) log.debug("Response body from " + uriString + ": " + httpBody); - - if (httpResponse.getStatusLine().getStatusCode() > 200) { - - if (log.isWarnEnabled()) log.warn("Cannot retrieve transactions for " + address + " from " + uriString + ": " + httpBody); - throw new IOException(httpBody); - } - - transactions = (Map) objectMapper.readValue(httpBody, Map.class); - } catch (IOException ex) { - - throw new IOException("Cannot retrieve transactions for " + address + " from " + uriString + ": " + ex.getMessage(), ex); - } - - if (log.isDebugEnabled()) log.debug("Retrieved transactions for " + address + " (" + uriString + "): " + transactions); - - // find transaction hashes - - List> result = transactions != null ? (List>) transactions.get("result") : null; - - for (Map transaction : result) { - - String from = (String) transaction.get("from"); - String transactionHash = (String) transaction.get("hash"); - - if (! address.equalsIgnoreCase(from)) { - - if (log.isDebugEnabled()) log.debug("Ignoring transaction " + transactionHash + " from " + from); - continue; - } - - if (log.isDebugEnabled()) log.debug("Found transaction " + transactionHash + " for address " + address); - if (! transactionHashesByAddresses.containsKey(address)) transactionHashesByAddresses.put(address, transactionHash); - } - } - - return transactionHashesByAddresses; - } - - private String getApi(String network) { - - String api = null; - - if (network == null || NETWORK_MAINNET.equals(network)) api = this.etherscanApiMainnet; - else if (NETWORK_ROPSTEN.equals(network)) api = this.etherscanApiRopsten; - else if (NETWORK_RINKEBY.equals(network)) api = this.etherscanApiRinkeby; - else if (NETWORK_KOVAN.equals(network)) api = this.etherscanApiKovan; - - return api; - } - - /* - * Getters and setters - */ - - public String getEtherscanApiMainnet() { - - return this.etherscanApiMainnet; - } - - public void setEtherscanApiMainnet(String etherscanApiMainnet) { - - this.etherscanApiMainnet = etherscanApiMainnet; - } - - public String getEtherscanApiRopsten() { - - return this.etherscanApiRopsten; - } - - public void setEtherscanApiRopsten(String etherscanApiRopsten) { - - this.etherscanApiRopsten = etherscanApiRopsten; - } - - public String getEtherscanApiRinkeby() { - - return this.etherscanApiRinkeby; - } - - public void setEtherscanApiRinkeby(String etherscanApiRinkeby) { - - this.etherscanApiRinkeby = etherscanApiRinkeby; - } - - public String getEtherscanApiKovan() { - - return this.etherscanApiKovan; - } - - public void setEtherscanApiKovan(String etherscanApiKovan) { - - this.etherscanApiKovan = etherscanApiKovan; - } - - public HttpClient getHttpClient() { - - return this.httpClient; - } - - public void setHttpClient(HttpClient httpClient) { - - this.httpClient = httpClient; - } -} - diff --git a/drivers/erc725/src/main/java/uniresolver/driver/did/erc725/ethereumconnection/JsonRPCEthereumConnection.java b/drivers/erc725/src/main/java/uniresolver/driver/did/erc725/ethereumconnection/JsonRPCEthereumConnection.java deleted file mode 100644 index bd824d489..000000000 --- a/drivers/erc725/src/main/java/uniresolver/driver/did/erc725/ethereumconnection/JsonRPCEthereumConnection.java +++ /dev/null @@ -1,311 +0,0 @@ -package uniresolver.driver.did.erc725.ethereumconnection; - -import java.io.IOException; -import java.math.BigInteger; -import java.security.InvalidAlgorithmParameterException; -import java.security.NoSuchAlgorithmException; -import java.security.NoSuchProviderException; -import java.security.SignatureException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -import org.apache.commons.codec.DecoderException; -import org.apache.commons.codec.binary.Hex; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.web3j.abi.datatypes.Address; -import org.web3j.crypto.Credentials; -import org.web3j.crypto.Keys; -import org.web3j.crypto.RawTransaction; -import org.web3j.crypto.Sign; -import org.web3j.crypto.Sign.SignatureData; -import org.web3j.crypto.TransactionEncoder; -import org.web3j.protocol.Web3j; -import org.web3j.protocol.core.DefaultBlockParameterName; -import org.web3j.protocol.core.methods.request.EthFilter; -import org.web3j.protocol.core.methods.response.EthLog; -import org.web3j.protocol.core.methods.response.EthLog.LogResult; -import org.web3j.protocol.core.methods.response.Transaction; -import org.web3j.protocol.http.HttpService; - -import uniresolver.driver.did.erc725.ERC725Contract; - -public class JsonRPCEthereumConnection extends AbstractEthereumConnection implements EthereumConnection { - - private static Logger log = LoggerFactory.getLogger(JsonRPCEthereumConnection.class); - - private static final JsonRPCEthereumConnection instance = new JsonRPCEthereumConnection(); - - private Web3j ethereumWeb3jMainnet; - private Web3j ethereumWeb3jRopsten; - private Web3j ethereumWeb3jRinkeby; - private Web3j ethereumWeb3jKovan; - private Credentials credentials; - - public JsonRPCEthereumConnection(Web3j ethereumWeb3jMainnet, Web3j ethereumWeb3jRopsten, Web3j ethereumWeb3jRinkeby, Web3j ethereumWeb3jKovan) { - - this.ethereumWeb3jMainnet = ethereumWeb3jMainnet; - this.ethereumWeb3jRopsten = ethereumWeb3jRopsten; - this.ethereumWeb3jRinkeby = ethereumWeb3jRinkeby; - this.ethereumWeb3jKovan = ethereumWeb3jKovan; - this.credentials = createCredentials(); - } - - public JsonRPCEthereumConnection(String ethereumRpcUrlMainnet, String ethereumRpcUrlRopsten, String ethereumRpcUrlRinkeby, String ethereumRpcUrlKovan) { - - this(Web3j.build(new HttpService(ethereumRpcUrlMainnet)), Web3j.build(new HttpService(ethereumRpcUrlRopsten)), Web3j.build(new HttpService(ethereumRpcUrlRinkeby)), Web3j.build(new HttpService(ethereumRpcUrlKovan))); - } - - public JsonRPCEthereumConnection() { - - this((Web3j) null, (Web3j) null, (Web3j) null, (Web3j) null); - } - - public static JsonRPCEthereumConnection get() { - - return instance; - } - - private static Credentials createCredentials() { - - try { - - return Credentials.create(Keys.createEcKeyPair()); - } catch (InvalidAlgorithmParameterException | NoSuchAlgorithmException | NoSuchProviderException ex) { - - throw new RuntimeException(ex.getMessage(), ex); - } - } - - public Map> getKeysByType(String network, String address) throws IOException { - - // determine network - - Web3j web3j = this.getWeb3j(network); - if (web3j == null) throw new IOException("No connection for network '" + network + "'"); - - // load ERC725 contract - - ERC725Contract erc725Contract = ERC725Contract.load("0x" + address, web3j, this.getCredentials(), null, null); - - // get keys - - Map managementPublicKeys; - Map actionPublicKeys; - Map claimPublicKeys; - Map encryptionPublicKeys; - - try { - - List managementAddresses = addressesToStrings((List
) erc725Contract.getKeysByType(EthereumConnection.KEY_TYPE_MANAGEMENT).send()); - List actionAddresses = addressesToStrings((List
) erc725Contract.getKeysByType(EthereumConnection.KEY_TYPE_ACTION).send()); - List claimAddresses = addressesToStrings((List
) erc725Contract.getKeysByType(EthereumConnection.KEY_TYPE_CLAIM).send()); - List encryptionAddresses = addressesToStrings((List
) erc725Contract.getKeysByType(EthereumConnection.KEY_TYPE_ENCRYPTION).send()); - - managementPublicKeys = this.getPublicKeysByAddresses(network, managementAddresses); - actionPublicKeys = this.getPublicKeysByAddresses(network, actionAddresses); - claimPublicKeys = this.getPublicKeysByAddresses(network, claimAddresses); - encryptionPublicKeys = this.getPublicKeysByAddresses(network, encryptionAddresses); - } catch (Exception ex) { - - throw new IOException("Cannot look up keys: " + ex.getMessage(), ex); - } - - Map> keysByType = new HashMap> (); - - keysByType.put(KEY_TYPE_MANAGEMENT, managementPublicKeys); - keysByType.put(KEY_TYPE_ACTION, actionPublicKeys); - keysByType.put(KEY_TYPE_CLAIM, claimPublicKeys); - keysByType.put(KEY_TYPE_ENCRYPTION, encryptionPublicKeys); - - // done - - return keysByType; - } - - @Override - public Map getTransactionHashesByAddresses(String network, List addresses) throws IOException { - - // determine network - - Web3j web3j = this.getWeb3j(network); - if (web3j == null) throw new IOException("No connection for network '" + network + "'"); - - // find transaction hashes - - EthFilter filter = new EthFilter(DefaultBlockParameterName.EARLIEST, DefaultBlockParameterName.LATEST, addresses); - List logResults = web3j.ethGetLogs(filter).send().getLogs(); - - Map transactionHashesByAddresses = new HashMap (); - - for (LogResult logResult : logResults) { - - String address = ((EthLog.LogObject) logResult).getAddress(); - String transactionHash = ((EthLog.LogObject) logResult).getTransactionHash(); - - if (log.isDebugEnabled()) log.debug("Found transaction " + transactionHash + " for address " + address); - if (! transactionHashesByAddresses.containsKey(address)) transactionHashesByAddresses.put(address, transactionHash); - } - - // done - - return transactionHashesByAddresses; - } - - @Override - public Map getPublicKeysByAddresses(String network, Map transactionHashesByAddress) throws IOException, DecoderException, SignatureException { - - // determine network - - Web3j web3j = this.getWeb3j(network); - if (web3j == null) throw new IOException("No connection for network '" + network + "'"); - - // find keys - - Map keysByAddress = new HashMap (); - - for (Entry transactionHashByAddress : transactionHashesByAddress.entrySet()) { - - String address = transactionHashByAddress.getKey(); - String transactionHash = transactionHashByAddress.getValue(); - - Transaction transaction = web3j.ethGetTransactionByHash(transactionHash).send().getTransaction().get(); - - if (transaction == null) { - - if (log.isWarnEnabled()) log.warn("Found no transaction " + transactionHash); - continue; - } - - SignatureData signatureData = signatureDataFromTransaction(transaction); - RawTransaction rawTransaction = rawTransactionFromTransaction(transaction); - String encodedRawTransaction = Hex.encodeHexString(TransactionEncoder.encode(rawTransaction)); - - byte[] key = Sign.signedMessageToKey(Hex.decodeHex(encodedRawTransaction.toCharArray()), signatureData).toByteArray(); - if (log.isDebugEnabled()) log.debug("Found key " + Hex.encodeHexString(key) + " for transaction " + transactionHash); - - keysByAddress.put(address, key); - } - - // done - - return keysByAddress; - } - - private Web3j getWeb3j(String network) { - - Web3j web3j = null; - - if (network == null || NETWORK_MAINNET.equals(network)) web3j = this.ethereumWeb3jMainnet; - else if (NETWORK_ROPSTEN.equals(network)) web3j = this.ethereumWeb3jRopsten; - else if (NETWORK_RINKEBY.equals(network)) web3j = this.ethereumWeb3jRinkeby; - else if (NETWORK_KOVAN.equals(network)) web3j = this.ethereumWeb3jKovan; - - return web3j; - } - - private static List addressesToStrings(List
addresses) { - - if (addresses == null) return null; - - List strings = new ArrayList (); - for (Address address : addresses) strings.add(address.getValue()); - - return strings; - } - - private static SignatureData signatureDataFromTransaction(Transaction transaction) throws DecoderException { - - return new SignatureData((byte) transaction.getV(), decodeHex(transaction.getR()), decodeHex(transaction.getS())); - } - - private static RawTransaction rawTransactionFromTransaction(Transaction transaction) { - - return RawTransaction.createTransaction(transaction.getNonce(), transaction.getGasPrice(), transaction.getGas(), transaction.getTo(), transaction.getValue(), transaction.getInput()); - } - - private static byte[] decodeHex(String hexString) throws DecoderException { - - hexString = hexString.substring(2); - if (hexString.length() % 2 != 0) hexString = '0' + hexString; - return Hex.decodeHex(hexString.toCharArray()); - } - - /* - * Getters and setters - */ - - public Web3j getEthereumWeb3jMainnet() { - - return this.ethereumWeb3jMainnet; - } - - public void setEthereumWeb3jMainnet(Web3j ethereumWeb3jMainnet) { - - this.ethereumWeb3jMainnet = ethereumWeb3jMainnet; - } - - public void setRpcUrlMainnet(String rpcUrlMainnet) { - - this.setEthereumWeb3jMainnet(Web3j.build(new HttpService(rpcUrlMainnet))); - } - - public Web3j getEthereumWeb3jRopsten() { - - return this.ethereumWeb3jRopsten; - } - - public void setEthereumWeb3jRopsten(Web3j ethereumWeb3jRopsten) { - - this.ethereumWeb3jRopsten = ethereumWeb3jRopsten; - } - - public void setRpcUrlRopsten(String rpcUrlRopsten) { - - this.setEthereumWeb3jRopsten(Web3j.build(new HttpService(rpcUrlRopsten))); - } - - public Web3j getEthereumWeb3jRinkeby() { - - return this.ethereumWeb3jRinkeby; - } - - public void setEthereumWeb3jRinkeby(Web3j ethereumWeb3jRinkeby) { - - this.ethereumWeb3jRinkeby = ethereumWeb3jRinkeby; - } - - public void setRpcUrlRinkeby(String rpcUrlRinkeby) { - - this.setEthereumWeb3jRinkeby(Web3j.build(new HttpService(rpcUrlRinkeby))); - } - - public Web3j getEthereumWeb3jKovan() { - - return this.ethereumWeb3jKovan; - } - - public void setEthereumWeb3jKovan(Web3j ethereumWeb3jKovan) { - - this.ethereumWeb3jKovan = ethereumWeb3jKovan; - } - - public void setRpcUrlKovan(String ethereumRpcUrlKovan) { - - this.setEthereumWeb3jKovan(Web3j.build(new HttpService(ethereumRpcUrlKovan))); - } - - public Credentials getCredentials() { - - return this.credentials; - } - - public void setCredentials(Credentials credentials) { - - this.credentials = credentials; - } -} - diff --git a/drivers/erc725/src/main/webapp/WEB-INF/web.xml b/drivers/erc725/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index dbf05e33b..000000000 --- a/drivers/erc725/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - uni-resolver-driver-did-erc725 - - - - - InitServlet - InitServlet - uniresolver.driver.servlet.InitServlet - - Driver - uniresolver.driver.did.erc725.DidErc725Driver - - 1 - - - - ResolveServlet - ResolveServlet - uniresolver.driver.servlet.ResolveServlet - - - PropertiesServlet - PropertiesServlet - uniresolver.driver.servlet.PropertiesServlet - - - ResolveServlet - /1.0/identifiers/* - - - PropertiesServlet - /1.0/properties - /1.0/properties/* - - - diff --git a/drivers/erc725/src/test/resources/jetty-env.xml b/drivers/erc725/src/test/resources/jetty-env.xml deleted file mode 100644 index 70a2c10ce..000000000 --- a/drivers/erc725/src/test/resources/jetty-env.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern - ^$ - - - org.eclipse.jetty.server.webapp.WebInfIncludeJarPattern - ^$ - - diff --git a/drivers/erc725/src/test/resources/jetty.xml b/drivers/erc725/src/test/resources/jetty.xml deleted file mode 100644 index c24808c45..000000000 --- a/drivers/erc725/src/test/resources/jetty.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/drivers/erc725/src/test/resources/log4j.properties b/drivers/erc725/src/test/resources/log4j.properties deleted file mode 100644 index 5f95c67ea..000000000 --- a/drivers/erc725/src/test/resources/log4j.properties +++ /dev/null @@ -1,11 +0,0 @@ -log4j.rootLogger=DEBUG, STDOUT - -log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender -log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout -log4j.appender.STDOUT.layout.ConversionPattern=%d{HH:mm:ss,SSS} - %5p [%c] - %m%n - -log4j.logger.org.apache=INFO, STDOUT -log4j.logger.org.eclipse=INFO, STDOUT -log4j.logger.org.mortbay=INFO, STDOUT -log4j.logger.org.springframework=INFO, STDOUT -log4j.logger.uniresolver=DEBUG, STDOUT diff --git a/drivers/sov/.gitignore b/drivers/sov/.gitignore deleted file mode 100644 index 697e1e157..000000000 --- a/drivers/sov/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -.project -.classpath -/.settings/ -/target -/bin/ diff --git a/drivers/sov/README.md b/drivers/sov/README.md deleted file mode 100644 index 168e4656f..000000000 --- a/drivers/sov/README.md +++ /dev/null @@ -1,61 +0,0 @@ -![DIF Logo](https://raw.githubusercontent.com/decentralized-identity/decentralized-identity.github.io/master/images/logo-small.png) - -# Universal Resolver Driver: did:sov - -This is a [Universal Resolver](https://github.com/decentralized-identity/universal-resolver/) driver for **did:sov** identifiers. - -## Specifications - -* [Decentralized Identifiers](https://w3c-ccg.github.io/did-spec/) -* [Sovrin DID Method Specification](https://sovrin-foundation.github.io/sovrin/spec/did-method-spec-template.html) - -## Example DIDs - -``` -did:sov:WRfXPg8dantKVubE3HX8pw -did:sov:stn:WRfXPg8dantKVubE3HX8pw -``` - -## Build and Run (Docker) - -``` -docker build -f ./docker/Dockerfile . -t universalresolver/driver-did-sov -docker run -p 8080:8080 universalresolver/driver-did-sov -curl -X GET http://localhost:8080/1.0/identifiers/did:sov:WRfXPg8dantKVubE3HX8pw -``` - -## Build (native Java) - - 1. First, build https://github.com/decentralized-identity/universal-resolver/tree/master/resolver/java - 1. Then, `mvn clean install` - -## Driver Environment Variables - -The driver recognizes the following environment variables: - -### `uniresolver_driver_did_sov_libIndyPath` - - * Specifies the path to the Indy SDK library. - * Default value: `./sovrin/lib/` - -### `uniresolver_driver_did_sov_poolConfigs` - - * Specifies a semi-colon-separated list of Indy network names and pool configuration files. The default network is `_`. - * Default value: `_;./sovrin/live.txn;stn;./sovrin/stn.txn;danube;./sovrin/11347-05.txn` - -### `uniresolver_driver_did_sov_poolVersions` - - * Specifies a semi-colon-separated list of Indy network names and pool protocol versions. The default network is `_`. - * Default value: `_;2;stn;2;danube;2` - -### `uniresolver_driver_did_sov_walletName` - - * Specifies the name of the Indy wallet. - * Default value: `default` - -## Driver Metadata - -The driver returns the following metadata in addition to a DID document: - -* `nymResponse`: Response to the Indy `GET_NYM` operation, including `txnTime`, `state_proof`, and other information. -* `attrResponse`: Response to the Indy `GET_ATTR` operation, including `txnTime`, `state_proof`, and other information. diff --git a/drivers/sov/docker/Dockerfile b/drivers/sov/docker/Dockerfile deleted file mode 100644 index a41f76116..000000000 --- a/drivers/sov/docker/Dockerfile +++ /dev/null @@ -1,38 +0,0 @@ -# Dockerfile for universalresolver/driver-did-btcr - -FROM universalresolver/driver -MAINTAINER Markus Sabadello - -# build dependencies - -RUN apt-get install -y --no-install-recommends curl build-essential pkg-config cmake libssl-dev libsqlite3-dev libsodium-dev libzmq3-dev - -RUN curl https://sh.rustup.rs -sSf | sh -s -- -y -RUN cd /opt/ && git clone https://github.com/hyperledger/indy-sdk.git && cd indy-sdk && git checkout v1.6.2 -RUN cd /opt/indy-sdk/libindy/ && ~/.cargo/bin/cargo clean && ~/.cargo/bin/cargo build -RUN cd /opt/indy-sdk/wrappers/java/ && mvn clean install -DskipTests - -# build driver-did-sov - -ADD . /opt/driver-did-sov -RUN cd /opt/driver-did-sov && mvn install package -N -DskipTests - -RUN cp /opt/indy-sdk/libindy/target/debug/libindy.so /opt/driver-did-sov/sovrin/lib/ - -# clean up - -RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* - -# variables - -ENV uniresolver_driver_did_sov_libIndyPath=./sovrin/lib/ -ENV uniresolver_driver_did_sov_poolConfigs=_;./sovrin/live.txn;stn;./sovrin/stn.txn;danube;./sovrin/11347-05.txn;myidsafe;./sovrin/myidsafe.txn -ENV uniresolver_driver_did_sov_poolVersions=_;2;stn;2;danube;2;myidsafe;1 -ENV uniresolver_driver_did_sov_walletName=default - -# done - -EXPOSE 8080 - -RUN chmod a+rx /opt/driver-did-sov/docker/run-driver-did-sov.sh -CMD "/opt/driver-did-sov/docker/run-driver-did-sov.sh" diff --git a/drivers/sov/docker/run-driver-did-sov.sh b/drivers/sov/docker/run-driver-did-sov.sh deleted file mode 100644 index 3888e29ab..000000000 --- a/drivers/sov/docker/run-driver-did-sov.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -cd /opt/driver-did-sov/ -mvn jetty:run -P war diff --git a/drivers/sov/pom.xml b/drivers/sov/pom.xml deleted file mode 100644 index 31ce7fcda..000000000 --- a/drivers/sov/pom.xml +++ /dev/null @@ -1,113 +0,0 @@ - - - 4.0.0 - uni-resolver-driver-did-sov - ${packaging.type} - uni-resolver-driver-did-sov - - - decentralized-identity - uni-resolver - 0.1-SNAPSHOT - - - - - - - default - true - jar - - - - - - war - war - - - - org.apache.maven.plugins - maven-war-plugin - 2.4 - - - org.eclipse.jetty - jetty-maven-plugin - 9.4.0.M1 - - - ${basedir}/src/test/resources/jetty.xml - - - ${basedir}/src/test/resources/jetty-env.xml - - / - true - - - jetty.port - 8080 - - - slf4j - true - - - log4j.configuration - file:${basedir}/src/test/resources/log4j.properties - - - - - - org.slf4j - slf4j-api - 1.7.5 - compile - - - org.slf4j - jcl-over-slf4j - 1.7.5 - compile - - - org.slf4j - slf4j-log4j12 - 1.7.5 - compile - - - - - - - - - - - - - decentralized-identity - uni-resolver-driver - 0.1-SNAPSHOT - compile - - - org.hyperledger - indy - 1.6.2 - compile - - - com.google.code.gson - gson - 2.2.4 - compile - - - - diff --git a/drivers/sov/sovrin/11347-04.txn b/drivers/sov/sovrin/11347-04.txn deleted file mode 100644 index 693590010..000000000 --- a/drivers/sov/sovrin/11347-04.txn +++ /dev/null @@ -1,4 +0,0 @@ -{"reqSignature":{},"txn":{"data":{"data":{"alias":"Node1","blskey":"4N8aUNHSgjQVgkpm8nhNEfDf6txHznoYREg9kirmJrkivgL4oSEimFF6nsQ6M41QvhM2Z33nves5vfSn9n1UwNFJBYtWVnHYMATn76vLuL3zU88KyeAYcHfsih3He6UHcXDxcaecHVz6jhCYz1P2UZn2bDVruL5wXpehgBfBaLKm3Ba","client_ip":"212.232.28.103","client_port":9702,"node_ip":"212.232.28.103","node_port":9701,"services":["VALIDATOR"]},"dest":"Gw6pDLhcBcoQesN72qfotTgFa7cbuqZpkX3Xo6pLhPhv"},"metadata":{"from":"Th7MpTaRZVRYnPiabds81Y"},"type":"0"},"txnMetadata":{"seqNo":1,"txnId":"fea82e10e894419fe2bea7d96296a6d46f50f93f9eeda954ec461b2ed2950b62"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"Node2","blskey":"37rAPpXVoxzKhz7d9gkUe52XuXryuLXoM6P6LbWDB7LSbG62Lsb33sfG7zqS8TK1MXwuCHj1FKNzVpsnafmqLG1vXN88rt38mNFs9TENzm4QHdBzsvCuoBnPH7rpYYDo9DZNJePaDvRvqJKByCabubJz3XXKbEeshzpz4Ma5QYpJqjk","client_ip":"212.232.28.103","client_port":9704,"node_ip":"212.232.28.103","node_port":9703,"services":["VALIDATOR"]},"dest":"8ECVSk179mjsjKRLWiQtssMLgp6EPhWXtaYyStWPSGAb"},"metadata":{"from":"EbP4aYNeTHL6q385GuVpRV"},"type":"0"},"txnMetadata":{"seqNo":2,"txnId":"1ac8aece2a18ced660fef8694b61aac3af08ba875ce3026a160acbc3a3af35fc"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"Node3","blskey":"3WFpdbg7C5cnLYZwFZevJqhubkFALBfCBBok15GdrKMUhUjGsk3jV6QKj6MZgEubF7oqCafxNdkm7eswgA4sdKTRc82tLGzZBd6vNqU8dupzup6uYUf32KTHTPQbuUM8Yk4QFXjEf2Usu2TJcNkdgpyeUSX42u5LqdDDpNSWUK5deC5","client_ip":"212.232.28.103","client_port":9706,"node_ip":"212.232.28.103","node_port":9705,"services":["VALIDATOR"]},"dest":"DKVxG2fXXTU8yT5N7hGEbXB3dfdAnYv1JczDUHpmDxya"},"metadata":{"from":"4cU41vWW82ArfxJxHkzXPG"},"type":"0"},"txnMetadata":{"seqNo":3,"txnId":"7e9f355dffa78ed24668f0e0e369fd8c224076571c51e2ea8be5f26479edebe4"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"Node4","blskey":"2zN3bHM1m4rLz54MJHYSwvqzPchYp8jkHswveCLAEJVcX6Mm1wHQD1SkPYMzUDTZvWvhuE6VNAkK3KxVeEmsanSmvjVkReDeBEMxeDaayjcZjFGPydyey1qxBHmTvAnBKoPydvuTAqx5f7YNNRAdeLmUi99gERUU7TD8KfAa6MpQ9bw","client_ip":"212.232.28.103","client_port":9708,"node_ip":"212.232.28.103","node_port":9707,"services":["VALIDATOR"]},"dest":"4PS3EDQ3dW1tci1Bp6543CfuuebjFrg36kLAUcskGfaA"},"metadata":{"from":"TWwCRQRZ2ZHMJFn9TzLp7W"},"type":"0"},"txnMetadata":{"seqNo":4,"txnId":"aa5e817d7cc626170eca175822029339a444eb0ee8f0bd20d3b0b76e566fb008"},"ver":"1"} diff --git a/drivers/sov/sovrin/11347-04.txn.v1 b/drivers/sov/sovrin/11347-04.txn.v1 deleted file mode 100644 index f29a6d099..000000000 --- a/drivers/sov/sovrin/11347-04.txn.v1 +++ /dev/null @@ -1,4 +0,0 @@ -{"data":{"alias":"Node1","blskey":"4N8aUNHSgjQVgkpm8nhNEfDf6txHznoYREg9kirmJrkivgL4oSEimFF6nsQ6M41QvhM2Z33nves5vfSn9n1UwNFJBYtWVnHYMATn76vLuL3zU88KyeAYcHfsih3He6UHcXDxcaecHVz6jhCYz1P2UZn2bDVruL5wXpehgBfBaLKm3Ba","client_ip":"212.232.28.103","client_port":9702,"node_ip":"212.232.28.103","node_port":9701,"services":["VALIDATOR"]},"dest":"Gw6pDLhcBcoQesN72qfotTgFa7cbuqZpkX3Xo6pLhPhv","identifier":"Th7MpTaRZVRYnPiabds81Y","txnId":"fea82e10e894419fe2bea7d96296a6d46f50f93f9eeda954ec461b2ed2950b62","type":"0"} -{"data":{"alias":"Node2","blskey":"37rAPpXVoxzKhz7d9gkUe52XuXryuLXoM6P6LbWDB7LSbG62Lsb33sfG7zqS8TK1MXwuCHj1FKNzVpsnafmqLG1vXN88rt38mNFs9TENzm4QHdBzsvCuoBnPH7rpYYDo9DZNJePaDvRvqJKByCabubJz3XXKbEeshzpz4Ma5QYpJqjk","client_ip":"212.232.28.103","client_port":9704,"node_ip":"212.232.28.103","node_port":9703,"services":["VALIDATOR"]},"dest":"8ECVSk179mjsjKRLWiQtssMLgp6EPhWXtaYyStWPSGAb","identifier":"EbP4aYNeTHL6q385GuVpRV","txnId":"1ac8aece2a18ced660fef8694b61aac3af08ba875ce3026a160acbc3a3af35fc","type":"0"} -{"data":{"alias":"Node3","blskey":"3WFpdbg7C5cnLYZwFZevJqhubkFALBfCBBok15GdrKMUhUjGsk3jV6QKj6MZgEubF7oqCafxNdkm7eswgA4sdKTRc82tLGzZBd6vNqU8dupzup6uYUf32KTHTPQbuUM8Yk4QFXjEf2Usu2TJcNkdgpyeUSX42u5LqdDDpNSWUK5deC5","client_ip":"212.232.28.103","client_port":9706,"node_ip":"212.232.28.103","node_port":9705,"services":["VALIDATOR"]},"dest":"DKVxG2fXXTU8yT5N7hGEbXB3dfdAnYv1JczDUHpmDxya","identifier":"4cU41vWW82ArfxJxHkzXPG","txnId":"7e9f355dffa78ed24668f0e0e369fd8c224076571c51e2ea8be5f26479edebe4","type":"0"} -{"data":{"alias":"Node4","blskey":"2zN3bHM1m4rLz54MJHYSwvqzPchYp8jkHswveCLAEJVcX6Mm1wHQD1SkPYMzUDTZvWvhuE6VNAkK3KxVeEmsanSmvjVkReDeBEMxeDaayjcZjFGPydyey1qxBHmTvAnBKoPydvuTAqx5f7YNNRAdeLmUi99gERUU7TD8KfAa6MpQ9bw","client_ip":"212.232.28.103","client_port":9708,"node_ip":"212.232.28.103","node_port":9707,"services":["VALIDATOR"]},"dest":"4PS3EDQ3dW1tci1Bp6543CfuuebjFrg36kLAUcskGfaA","identifier":"TWwCRQRZ2ZHMJFn9TzLp7W","txnId":"aa5e817d7cc626170eca175822029339a444eb0ee8f0bd20d3b0b76e566fb008","type":"0"} diff --git a/drivers/sov/sovrin/11347-04.txn.v2 b/drivers/sov/sovrin/11347-04.txn.v2 deleted file mode 100644 index 693590010..000000000 --- a/drivers/sov/sovrin/11347-04.txn.v2 +++ /dev/null @@ -1,4 +0,0 @@ -{"reqSignature":{},"txn":{"data":{"data":{"alias":"Node1","blskey":"4N8aUNHSgjQVgkpm8nhNEfDf6txHznoYREg9kirmJrkivgL4oSEimFF6nsQ6M41QvhM2Z33nves5vfSn9n1UwNFJBYtWVnHYMATn76vLuL3zU88KyeAYcHfsih3He6UHcXDxcaecHVz6jhCYz1P2UZn2bDVruL5wXpehgBfBaLKm3Ba","client_ip":"212.232.28.103","client_port":9702,"node_ip":"212.232.28.103","node_port":9701,"services":["VALIDATOR"]},"dest":"Gw6pDLhcBcoQesN72qfotTgFa7cbuqZpkX3Xo6pLhPhv"},"metadata":{"from":"Th7MpTaRZVRYnPiabds81Y"},"type":"0"},"txnMetadata":{"seqNo":1,"txnId":"fea82e10e894419fe2bea7d96296a6d46f50f93f9eeda954ec461b2ed2950b62"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"Node2","blskey":"37rAPpXVoxzKhz7d9gkUe52XuXryuLXoM6P6LbWDB7LSbG62Lsb33sfG7zqS8TK1MXwuCHj1FKNzVpsnafmqLG1vXN88rt38mNFs9TENzm4QHdBzsvCuoBnPH7rpYYDo9DZNJePaDvRvqJKByCabubJz3XXKbEeshzpz4Ma5QYpJqjk","client_ip":"212.232.28.103","client_port":9704,"node_ip":"212.232.28.103","node_port":9703,"services":["VALIDATOR"]},"dest":"8ECVSk179mjsjKRLWiQtssMLgp6EPhWXtaYyStWPSGAb"},"metadata":{"from":"EbP4aYNeTHL6q385GuVpRV"},"type":"0"},"txnMetadata":{"seqNo":2,"txnId":"1ac8aece2a18ced660fef8694b61aac3af08ba875ce3026a160acbc3a3af35fc"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"Node3","blskey":"3WFpdbg7C5cnLYZwFZevJqhubkFALBfCBBok15GdrKMUhUjGsk3jV6QKj6MZgEubF7oqCafxNdkm7eswgA4sdKTRc82tLGzZBd6vNqU8dupzup6uYUf32KTHTPQbuUM8Yk4QFXjEf2Usu2TJcNkdgpyeUSX42u5LqdDDpNSWUK5deC5","client_ip":"212.232.28.103","client_port":9706,"node_ip":"212.232.28.103","node_port":9705,"services":["VALIDATOR"]},"dest":"DKVxG2fXXTU8yT5N7hGEbXB3dfdAnYv1JczDUHpmDxya"},"metadata":{"from":"4cU41vWW82ArfxJxHkzXPG"},"type":"0"},"txnMetadata":{"seqNo":3,"txnId":"7e9f355dffa78ed24668f0e0e369fd8c224076571c51e2ea8be5f26479edebe4"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"Node4","blskey":"2zN3bHM1m4rLz54MJHYSwvqzPchYp8jkHswveCLAEJVcX6Mm1wHQD1SkPYMzUDTZvWvhuE6VNAkK3KxVeEmsanSmvjVkReDeBEMxeDaayjcZjFGPydyey1qxBHmTvAnBKoPydvuTAqx5f7YNNRAdeLmUi99gERUU7TD8KfAa6MpQ9bw","client_ip":"212.232.28.103","client_port":9708,"node_ip":"212.232.28.103","node_port":9707,"services":["VALIDATOR"]},"dest":"4PS3EDQ3dW1tci1Bp6543CfuuebjFrg36kLAUcskGfaA"},"metadata":{"from":"TWwCRQRZ2ZHMJFn9TzLp7W"},"type":"0"},"txnMetadata":{"seqNo":4,"txnId":"aa5e817d7cc626170eca175822029339a444eb0ee8f0bd20d3b0b76e566fb008"},"ver":"1"} diff --git a/drivers/sov/sovrin/11347-05.txn b/drivers/sov/sovrin/11347-05.txn deleted file mode 100644 index 7de7ff49f..000000000 --- a/drivers/sov/sovrin/11347-05.txn +++ /dev/null @@ -1,4 +0,0 @@ -{"reqSignature":{},"txn":{"data":{"data":{"alias":"Node1","blskey":"4N8aUNHSgjQVgkpm8nhNEfDf6txHznoYREg9kirmJrkivgL4oSEimFF6nsQ6M41QvhM2Z33nves5vfSn9n1UwNFJBYtWVnHYMATn76vLuL3zU88KyeAYcHfsih3He6UHcXDxcaecHVz6jhCYz1P2UZn2bDVruL5wXpehgBfBaLKm3Ba","client_ip":"92.42.139.24","client_port":9702,"node_ip":"92.42.139.24","node_port":9701,"services":["VALIDATOR"]},"dest":"Gw6pDLhcBcoQesN72qfotTgFa7cbuqZpkX3Xo6pLhPhv"},"metadata":{"from":"Th7MpTaRZVRYnPiabds81Y"},"type":"0"},"txnMetadata":{"seqNo":1,"txnId":"fea82e10e894419fe2bea7d96296a6d46f50f93f9eeda954ec461b2ed2950b62"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"Node2","blskey":"37rAPpXVoxzKhz7d9gkUe52XuXryuLXoM6P6LbWDB7LSbG62Lsb33sfG7zqS8TK1MXwuCHj1FKNzVpsnafmqLG1vXN88rt38mNFs9TENzm4QHdBzsvCuoBnPH7rpYYDo9DZNJePaDvRvqJKByCabubJz3XXKbEeshzpz4Ma5QYpJqjk","client_ip":"92.42.139.24","client_port":9704,"node_ip":"92.42.139.24","node_port":9703,"services":["VALIDATOR"]},"dest":"8ECVSk179mjsjKRLWiQtssMLgp6EPhWXtaYyStWPSGAb"},"metadata":{"from":"EbP4aYNeTHL6q385GuVpRV"},"type":"0"},"txnMetadata":{"seqNo":2,"txnId":"1ac8aece2a18ced660fef8694b61aac3af08ba875ce3026a160acbc3a3af35fc"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"Node3","blskey":"3WFpdbg7C5cnLYZwFZevJqhubkFALBfCBBok15GdrKMUhUjGsk3jV6QKj6MZgEubF7oqCafxNdkm7eswgA4sdKTRc82tLGzZBd6vNqU8dupzup6uYUf32KTHTPQbuUM8Yk4QFXjEf2Usu2TJcNkdgpyeUSX42u5LqdDDpNSWUK5deC5","client_ip":"92.42.139.24","client_port":9706,"node_ip":"92.42.139.24","node_port":9705,"services":["VALIDATOR"]},"dest":"DKVxG2fXXTU8yT5N7hGEbXB3dfdAnYv1JczDUHpmDxya"},"metadata":{"from":"4cU41vWW82ArfxJxHkzXPG"},"type":"0"},"txnMetadata":{"seqNo":3,"txnId":"7e9f355dffa78ed24668f0e0e369fd8c224076571c51e2ea8be5f26479edebe4"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"Node4","blskey":"2zN3bHM1m4rLz54MJHYSwvqzPchYp8jkHswveCLAEJVcX6Mm1wHQD1SkPYMzUDTZvWvhuE6VNAkK3KxVeEmsanSmvjVkReDeBEMxeDaayjcZjFGPydyey1qxBHmTvAnBKoPydvuTAqx5f7YNNRAdeLmUi99gERUU7TD8KfAa6MpQ9bw","client_ip":"92.42.139.24","client_port":9708,"node_ip":"92.42.139.24","node_port":9707,"services":["VALIDATOR"]},"dest":"4PS3EDQ3dW1tci1Bp6543CfuuebjFrg36kLAUcskGfaA"},"metadata":{"from":"TWwCRQRZ2ZHMJFn9TzLp7W"},"type":"0"},"txnMetadata":{"seqNo":4,"txnId":"aa5e817d7cc626170eca175822029339a444eb0ee8f0bd20d3b0b76e566fb008"},"ver":"1"} diff --git a/drivers/sov/sovrin/lib/.gitignore b/drivers/sov/sovrin/lib/.gitignore deleted file mode 100644 index c12103d43..000000000 --- a/drivers/sov/sovrin/lib/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -libindy.so - diff --git a/drivers/sov/sovrin/live.txn b/drivers/sov/sovrin/live.txn deleted file mode 100644 index 312124c30..000000000 --- a/drivers/sov/sovrin/live.txn +++ /dev/null @@ -1,10 +0,0 @@ -{"reqSignature":{},"txn":{"data":{"data":{"alias":"ev1","client_ip":"54.207.36.81","client_port":"9702","node_ip":"18.231.96.215","node_port":"9701","services":["VALIDATOR"]},"dest":"GWgp6huggos5HrzHVDy5xeBkYHxPvrRZzjPNAyJAqpjA"},"metadata":{"from":"J4N1K1SEB8uY2muwmecY5q"},"type":"0"},"txnMetadata":{"seqNo":1,"txnId":"b0c82a3ade3497964cb8034be915da179459287823d92b5717e6d642784c50e6"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"zaValidator","client_ip":"154.0.164.39","client_port":"9702","node_ip":"154.0.164.39","node_port":"9701","services":["VALIDATOR"]},"dest":"BnubzSjE3dDVakR77yuJAuDdNajBdsh71ZtWePKhZTWe"},"metadata":{"from":"UoFyxT8BAqotbkhiehxHCn"},"type":"0"},"txnMetadata":{"seqNo":2,"txnId":"d5f775f65e44af60ff69cfbcf4f081cd31a218bf16a941d949339dadd55024d0"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"danube","client_ip":"128.130.204.35","client_port":"9722","node_ip":"128.130.204.35","node_port":"9721","services":["VALIDATOR"]},"dest":"476kwEjDj5rxH5ZcmTtgnWqDbAnYJAGGMgX7Sq183VED"},"metadata":{"from":"BrYDA5NubejDVHkCYBbpY5"},"type":"0"},"txnMetadata":{"seqNo":3,"txnId":"ebf340b317c044d970fcd0ca018d8903726fa70c8d8854752cd65e29d443686c"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"royal_sovrin","client_ip":"35.167.133.255","client_port":"9702","node_ip":"35.167.133.255","node_port":"9701","services":["VALIDATOR"]},"dest":"Et6M1U7zXQksf7QM6Y61TtmXF1JU23nsHCwcp1M9S8Ly"},"metadata":{"from":"4ohadAwtb2kfqvXynfmfbq"},"type":"0"},"txnMetadata":{"seqNo":4,"txnId":"24d391604c62e0e142ea51c6527481ae114722102e27f7878144d405d40df88d"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"digitalbazaar","client_ip":"34.226.105.29","client_port":"9701","node_ip":"34.226.105.29","node_port":"9700","services":["VALIDATOR"]},"dest":"D9oXgXC3b6ms3bXxrUu6KqR65TGhmC1eu7SUUanPoF71"},"metadata":{"from":"rckdVhnC5R5WvdtC83NQp"},"type":"0"},"txnMetadata":{"seqNo":5,"txnId":"56e1af48ef806615659304b1e5cf3ebf87050ad48e6310c5e8a8d9332ac5c0d8"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"OASFCU","client_ip":"38.70.17.248","client_port":"9702","node_ip":"38.70.17.248","node_port":"9701","services":["VALIDATOR"]},"dest":"8gM8NHpq2cE13rJYF33iDroEGiyU6wWLiU1jd2J4jSBz"},"metadata":{"from":"BFAeui85mkcuNeQQhZfqQY"},"type":"0"},"txnMetadata":{"seqNo":6,"txnId":"825aeaa33bc238449ec9bd58374b2b747a0b4859c5418da0ad201e928c3049ad"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"BIGAWSUSEAST1-001","client_ip":"34.224.255.108","client_port":"9796","node_ip":"34.224.255.108","node_port":"9769","services":["VALIDATOR"]},"dest":"HMJedzRbFkkuijvijASW2HZvQ93ooEVprxvNhqhCJUti"},"metadata":{"from":"L851TgZcjr6xqh4w6vYa34"},"type":"0"},"txnMetadata":{"seqNo":7,"txnId":"40fceb5fea4dbcadbd270be6d5752980e89692151baf77a6bb64c8ade42ac148"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"DustStorm","client_ip":"207.224.246.57","client_port":"9712","node_ip":"207.224.246.57","node_port":"9711","services":["VALIDATOR"]},"dest":"8gGDjbrn6wdq6CEjwoVStjQCEj3r7FCxKrA5d3qqXxjm"},"metadata":{"from":"FjuHvTjq76Pr9kdZiDadqq"},"type":"0"},"txnMetadata":{"seqNo":8,"txnId":"6d1ee3eb2057b8435333b23f271ab5c255a598193090452e9767f1edf1b4c72b"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"prosovitor","client_ip":"138.68.240.143","client_port":"9711","node_ip":"138.68.240.143","node_port":"9710","services":["VALIDATOR"]},"dest":"C8W35r9D2eubcrnAjyb4F3PC3vWQS1BHDg7UvDkvdV6Q"},"metadata":{"from":"Y1ENo59jsXYvTeP378hKWG"},"type":"0"},"txnMetadata":{"seqNo":9,"txnId":"15f22de8c95ef194f6448cfc03e93aeef199b9b1b7075c5ea13cfef71985bd83"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"iRespond","client_ip":"52.187.10.28","client_port":"9702","node_ip":"52.187.10.28","node_port":"9701","services":["VALIDATOR"]},"dest":"3SD8yyJsK7iKYdesQjwuYbBGCPSs1Y9kYJizdwp2Q1zp"},"metadata":{"from":"JdJi97RRDH7Bx7khr1znAq"},"type":"0"},"txnMetadata":{"seqNo":10,"txnId":"b65ce086b631ed75722a4e1f28fc9cf6119b8bc695bbb77b7bdff53cfe0fc2e2"},"ver":"1"} diff --git a/drivers/sov/sovrin/live.txn.v1 b/drivers/sov/sovrin/live.txn.v1 deleted file mode 100644 index 3357cfb9f..000000000 --- a/drivers/sov/sovrin/live.txn.v1 +++ /dev/null @@ -1,10 +0,0 @@ -{"data":{"alias":"ev1","client_ip":"54.207.36.81","client_port":"9702","node_ip":"18.231.96.215","node_port":"9701","services":["VALIDATOR"]},"dest":"GWgp6huggos5HrzHVDy5xeBkYHxPvrRZzjPNAyJAqpjA","identifier":"J4N1K1SEB8uY2muwmecY5q","txnId":"b0c82a3ade3497964cb8034be915da179459287823d92b5717e6d642784c50e6","type":"0"} -{"data":{"alias":"zaValidator","client_ip":"154.0.164.39","client_port":"9702","node_ip":"154.0.164.39","node_port":"9701","services":["VALIDATOR"]},"dest":"BnubzSjE3dDVakR77yuJAuDdNajBdsh71ZtWePKhZTWe","identifier":"UoFyxT8BAqotbkhiehxHCn","txnId":"d5f775f65e44af60ff69cfbcf4f081cd31a218bf16a941d949339dadd55024d0","type":"0"} -{"data":{"alias":"danube","client_ip":"128.130.204.35","client_port":"9722","node_ip":"128.130.204.35","node_port":"9721","services":["VALIDATOR"]},"dest":"476kwEjDj5rxH5ZcmTtgnWqDbAnYJAGGMgX7Sq183VED","identifier":"BrYDA5NubejDVHkCYBbpY5","txnId":"ebf340b317c044d970fcd0ca018d8903726fa70c8d8854752cd65e29d443686c","type":"0"} -{"data":{"alias":"royal_sovrin","client_ip":"35.167.133.255","client_port":"9702","node_ip":"35.167.133.255","node_port":"9701","services":["VALIDATOR"]},"dest":"Et6M1U7zXQksf7QM6Y61TtmXF1JU23nsHCwcp1M9S8Ly","identifier":"4ohadAwtb2kfqvXynfmfbq","txnId":"24d391604c62e0e142ea51c6527481ae114722102e27f7878144d405d40df88d","type":"0"} -{"data":{"alias":"digitalbazaar","client_ip":"34.226.105.29","client_port":"9701","node_ip":"34.226.105.29","node_port":"9700","services":["VALIDATOR"]},"dest":"D9oXgXC3b6ms3bXxrUu6KqR65TGhmC1eu7SUUanPoF71","identifier":"rckdVhnC5R5WvdtC83NQp","txnId":"56e1af48ef806615659304b1e5cf3ebf87050ad48e6310c5e8a8d9332ac5c0d8","type":"0"} -{"data":{"alias":"OASFCU","client_ip":"38.70.17.248","client_port":"9702","node_ip":"38.70.17.248","node_port":"9701","services":["VALIDATOR"]},"dest":"8gM8NHpq2cE13rJYF33iDroEGiyU6wWLiU1jd2J4jSBz","identifier":"BFAeui85mkcuNeQQhZfqQY","txnId":"825aeaa33bc238449ec9bd58374b2b747a0b4859c5418da0ad201e928c3049ad","type":"0"} -{"data":{"alias":"BIGAWSUSEAST1-001","client_ip":"34.224.255.108","client_port":"9796","node_ip":"34.224.255.108","node_port":"9769","services":["VALIDATOR"]},"dest":"HMJedzRbFkkuijvijASW2HZvQ93ooEVprxvNhqhCJUti","identifier":"L851TgZcjr6xqh4w6vYa34","txnId":"40fceb5fea4dbcadbd270be6d5752980e89692151baf77a6bb64c8ade42ac148","type":"0"} -{"data":{"alias":"DustStorm","client_ip":"207.224.246.57","client_port":"9712","node_ip":"207.224.246.57","node_port":"9711","services":["VALIDATOR"]},"dest":"8gGDjbrn6wdq6CEjwoVStjQCEj3r7FCxKrA5d3qqXxjm","identifier":"FjuHvTjq76Pr9kdZiDadqq","txnId":"6d1ee3eb2057b8435333b23f271ab5c255a598193090452e9767f1edf1b4c72b","type":"0"} -{"data":{"alias":"prosovitor","client_ip":"138.68.240.143","client_port":"9711","node_ip":"138.68.240.143","node_port":"9710","services":["VALIDATOR"]},"dest":"C8W35r9D2eubcrnAjyb4F3PC3vWQS1BHDg7UvDkvdV6Q","identifier":"Y1ENo59jsXYvTeP378hKWG","txnId":"15f22de8c95ef194f6448cfc03e93aeef199b9b1b7075c5ea13cfef71985bd83","type":"0"} -{"data":{"alias":"iRespond","client_ip":"52.187.10.28","client_port":"9702","node_ip":"52.187.10.28","node_port":"9701","services":["VALIDATOR"]},"dest":"3SD8yyJsK7iKYdesQjwuYbBGCPSs1Y9kYJizdwp2Q1zp","identifier":"JdJi97RRDH7Bx7khr1znAq","txnId":"b65ce086b631ed75722a4e1f28fc9cf6119b8bc695bbb77b7bdff53cfe0fc2e2","type":"0"} diff --git a/drivers/sov/sovrin/live.txn.v2 b/drivers/sov/sovrin/live.txn.v2 deleted file mode 100644 index 312124c30..000000000 --- a/drivers/sov/sovrin/live.txn.v2 +++ /dev/null @@ -1,10 +0,0 @@ -{"reqSignature":{},"txn":{"data":{"data":{"alias":"ev1","client_ip":"54.207.36.81","client_port":"9702","node_ip":"18.231.96.215","node_port":"9701","services":["VALIDATOR"]},"dest":"GWgp6huggos5HrzHVDy5xeBkYHxPvrRZzjPNAyJAqpjA"},"metadata":{"from":"J4N1K1SEB8uY2muwmecY5q"},"type":"0"},"txnMetadata":{"seqNo":1,"txnId":"b0c82a3ade3497964cb8034be915da179459287823d92b5717e6d642784c50e6"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"zaValidator","client_ip":"154.0.164.39","client_port":"9702","node_ip":"154.0.164.39","node_port":"9701","services":["VALIDATOR"]},"dest":"BnubzSjE3dDVakR77yuJAuDdNajBdsh71ZtWePKhZTWe"},"metadata":{"from":"UoFyxT8BAqotbkhiehxHCn"},"type":"0"},"txnMetadata":{"seqNo":2,"txnId":"d5f775f65e44af60ff69cfbcf4f081cd31a218bf16a941d949339dadd55024d0"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"danube","client_ip":"128.130.204.35","client_port":"9722","node_ip":"128.130.204.35","node_port":"9721","services":["VALIDATOR"]},"dest":"476kwEjDj5rxH5ZcmTtgnWqDbAnYJAGGMgX7Sq183VED"},"metadata":{"from":"BrYDA5NubejDVHkCYBbpY5"},"type":"0"},"txnMetadata":{"seqNo":3,"txnId":"ebf340b317c044d970fcd0ca018d8903726fa70c8d8854752cd65e29d443686c"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"royal_sovrin","client_ip":"35.167.133.255","client_port":"9702","node_ip":"35.167.133.255","node_port":"9701","services":["VALIDATOR"]},"dest":"Et6M1U7zXQksf7QM6Y61TtmXF1JU23nsHCwcp1M9S8Ly"},"metadata":{"from":"4ohadAwtb2kfqvXynfmfbq"},"type":"0"},"txnMetadata":{"seqNo":4,"txnId":"24d391604c62e0e142ea51c6527481ae114722102e27f7878144d405d40df88d"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"digitalbazaar","client_ip":"34.226.105.29","client_port":"9701","node_ip":"34.226.105.29","node_port":"9700","services":["VALIDATOR"]},"dest":"D9oXgXC3b6ms3bXxrUu6KqR65TGhmC1eu7SUUanPoF71"},"metadata":{"from":"rckdVhnC5R5WvdtC83NQp"},"type":"0"},"txnMetadata":{"seqNo":5,"txnId":"56e1af48ef806615659304b1e5cf3ebf87050ad48e6310c5e8a8d9332ac5c0d8"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"OASFCU","client_ip":"38.70.17.248","client_port":"9702","node_ip":"38.70.17.248","node_port":"9701","services":["VALIDATOR"]},"dest":"8gM8NHpq2cE13rJYF33iDroEGiyU6wWLiU1jd2J4jSBz"},"metadata":{"from":"BFAeui85mkcuNeQQhZfqQY"},"type":"0"},"txnMetadata":{"seqNo":6,"txnId":"825aeaa33bc238449ec9bd58374b2b747a0b4859c5418da0ad201e928c3049ad"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"BIGAWSUSEAST1-001","client_ip":"34.224.255.108","client_port":"9796","node_ip":"34.224.255.108","node_port":"9769","services":["VALIDATOR"]},"dest":"HMJedzRbFkkuijvijASW2HZvQ93ooEVprxvNhqhCJUti"},"metadata":{"from":"L851TgZcjr6xqh4w6vYa34"},"type":"0"},"txnMetadata":{"seqNo":7,"txnId":"40fceb5fea4dbcadbd270be6d5752980e89692151baf77a6bb64c8ade42ac148"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"DustStorm","client_ip":"207.224.246.57","client_port":"9712","node_ip":"207.224.246.57","node_port":"9711","services":["VALIDATOR"]},"dest":"8gGDjbrn6wdq6CEjwoVStjQCEj3r7FCxKrA5d3qqXxjm"},"metadata":{"from":"FjuHvTjq76Pr9kdZiDadqq"},"type":"0"},"txnMetadata":{"seqNo":8,"txnId":"6d1ee3eb2057b8435333b23f271ab5c255a598193090452e9767f1edf1b4c72b"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"prosovitor","client_ip":"138.68.240.143","client_port":"9711","node_ip":"138.68.240.143","node_port":"9710","services":["VALIDATOR"]},"dest":"C8W35r9D2eubcrnAjyb4F3PC3vWQS1BHDg7UvDkvdV6Q"},"metadata":{"from":"Y1ENo59jsXYvTeP378hKWG"},"type":"0"},"txnMetadata":{"seqNo":9,"txnId":"15f22de8c95ef194f6448cfc03e93aeef199b9b1b7075c5ea13cfef71985bd83"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"iRespond","client_ip":"52.187.10.28","client_port":"9702","node_ip":"52.187.10.28","node_port":"9701","services":["VALIDATOR"]},"dest":"3SD8yyJsK7iKYdesQjwuYbBGCPSs1Y9kYJizdwp2Q1zp"},"metadata":{"from":"JdJi97RRDH7Bx7khr1znAq"},"type":"0"},"txnMetadata":{"seqNo":10,"txnId":"b65ce086b631ed75722a4e1f28fc9cf6119b8bc695bbb77b7bdff53cfe0fc2e2"},"ver":"1"} diff --git a/drivers/sov/sovrin/localhost.txn b/drivers/sov/sovrin/localhost.txn deleted file mode 100644 index de359921e..000000000 --- a/drivers/sov/sovrin/localhost.txn +++ /dev/null @@ -1,4 +0,0 @@ -{"data":{"alias":"Node1","client_ip":"10.0.0.2","client_port":9702,"node_ip":"10.0.0.2","node_port":9701,"services":["VALIDATOR"]},"dest":"Gw6pDLhcBcoQesN72qfotTgFa7cbuqZpkX3Xo6pLhPhv","identifier":"FYmoFw55GeQH7SRFa37dkx1d2dZ3zUF8ckg7wmL7ofN4","txnId":"fea82e10e894419fe2bea7d96296a6d46f50f93f9eeda954ec461b2ed2950b62","type":"0"} -{"data":{"alias":"Node2","client_ip":"10.0.0.2","client_port":9704,"node_ip":"10.0.0.2","node_port":9703,"services":["VALIDATOR"]},"dest":"8ECVSk179mjsjKRLWiQtssMLgp6EPhWXtaYyStWPSGAb","identifier":"8QhFxKxyaFsJy4CyxeYX34dFH8oWqyBv1P4HLQCsoeLy","txnId":"1ac8aece2a18ced660fef8694b61aac3af08ba875ce3026a160acbc3a3af35fc","type":"0"} -{"data":{"alias":"Node3","client_ip":"10.0.0.2","client_port":9706,"node_ip":"10.0.0.2","node_port":9705,"services":["VALIDATOR"]},"dest":"DKVxG2fXXTU8yT5N7hGEbXB3dfdAnYv1JczDUHpmDxya","identifier":"2yAeV5ftuasWNgQwVYzeHeTuM7LwwNtPR3Zg9N4JiDgF","txnId":"7e9f355dffa78ed24668f0e0e369fd8c224076571c51e2ea8be5f26479edebe4","type":"0"} -{"data":{"alias":"Node4","client_ip":"10.0.0.2","client_port":9708,"node_ip":"10.0.0.2","node_port":9707,"services":["VALIDATOR"]},"dest":"4PS3EDQ3dW1tci1Bp6543CfuuebjFrg36kLAUcskGfaA","identifier":"FTE95CVthRtrBnK2PYCBbC9LghTcGwi9Zfi1Gz2dnyNx","txnId":"aa5e817d7cc626170eca175822029339a444eb0ee8f0bd20d3b0b76e566fb008","type":"0"} diff --git a/drivers/sov/sovrin/myidsafe.txn b/drivers/sov/sovrin/myidsafe.txn deleted file mode 100644 index 71469899a..000000000 --- a/drivers/sov/sovrin/myidsafe.txn +++ /dev/null @@ -1,4 +0,0 @@ -{"data":{"alias":"danube1","blskey":"7Rfu7NUJv79SCNWjG3NXeJjyiDeNxwmn851mut98ZNui2rgiPp617siHoA25i3bdBjJXfvn2FSSWPxr5TEm8N4wC9Hcu36JiGTtFpp3SwGey6MKSo1pC7QbPNRbyjye4234ECAwsDeeVEWcUhwWwiL2eMdDCULYjcZwR61bi1Jh1zX","client_ip":"188.166.71.219","client_port":9702,"node_ip":"188.166.71.219","node_port":9701,"services":["VALIDATOR"]},"dest":"FN9dy5K117Vj1tTd9GifkjUZgjuYW4yNECGmLHp3epnB","identifier":"5qFYK398bhzpndHcnzL9Wt","txnId":"fea82e10e894419fe2bea7d96296a6d46f50f93f9eeda954ec461b2ed2950b62","type":"0"} -{"data":{"alias":"danube2","blskey":"Taro88Gus1jnAe4vV8goNyLkKSBG7FhC28fQA5F6N4Z8BCQHhkmg7ChWreeWx7jtEeZiTVXEsR6NyZWuLuafuQNa2XjQnLyynCzqPTE37QNTbRy9eHcCDZkzXoZhV7aqcc2DHk31pxuAJqPA6MgtPGV3rKb6C3UE63pDj7LuRxAqXL","client_ip":"159.65.118.95","client_port":9702,"node_ip":"159.65.118.95","node_port":9701,"services":["VALIDATOR"]},"dest":"G5H6qgHQC7FYNa97iGXTJmbzaorH3At7kqppDiDFJfDg","identifier":"2vrHqFrKMFukPeYtxrTiUj","txnId":"1ac8aece2a18ced660fef8694b61aac3af08ba875ce3026a160acbc3a3af35fc","type":"0"} -{"data":{"alias":"uniqa","blskey":"3NVrChWio9JYuggUQ58ijkNeys5HxFrPWMdTxMRGtvPg9xspq6dKj9NP5i6AXWU9DD1sNH8qA8tTrrFJ1hfTBJVM1obUAa6XbfZ5ZfCKnXNi7pUZzSPw3pdtyEb5KiLJQV1z6yf9vdo6GSHZ3TxRJSE6PFVqmtTWuA18m8t2Yfy7c11","client_ip":"40.114.145.65","client_port":9702,"node_ip":"40.114.145.65","node_port":9701,"services":["VALIDATOR"]},"dest":"2Az3bVgkWZYVBm91CQdj2guKME1Q3TeX7nDsZPUp1Adz","identifier":"Q4LVAkoaCy6iNKPdLqcDLX","txnId":"1ac8aece2a18ced660fef8694b61aac3af08ba875ce3026a160acbc3a3af35fd","type":"0"} -{"data":{"alias":"raiffeisen","blskey":"2mQ9KNn6YywvyQFbcNnCErV8g7nV1qQhMcgq9QoGrzQ5jsKNfFRUMXFTvaut6DsdycT4XBSSVPmQLcapCo66oXxnDSrxUDDezpohb86FdmZb3vY5zQNXVBXvMUG1SkxD6cTGNR1DfwJdJv4e27eTTVGFfxPDgnpCAz5mUJCbwLYavxe","client_ip":"185.178.194.43","client_port":9702,"node_ip":"185.178.194.43","node_port":9701,"services":["VALIDATOR"]},"dest":"4ccGQu6PQHMQQvSQhJEHCbzYDhoiGMoXHZMZ5bBRVdXb","identifier":"G4fJhc22htTE6EPKsykTWu","txnId":"1ac8aece2a18ced660fef8694b61aac3af08ba875ce3026a160acbc3a3af35fe","type":"0"} diff --git a/drivers/sov/sovrin/stn.txn b/drivers/sov/sovrin/stn.txn deleted file mode 100644 index 9860b231a..000000000 --- a/drivers/sov/sovrin/stn.txn +++ /dev/null @@ -1,7 +0,0 @@ -{"reqSignature":{},"txn":{"data":{"data":{"alias":"australia","client_ip":"52.64.96.160","client_port":"9702","node_ip":"52.64.96.160","node_port":"9701","services":["VALIDATOR"]},"dest":"UZH61eLH3JokEwjMWQoCMwB3PMD6zRBvG6NCv5yVwXz"},"metadata":{"from":"3U8HUen8WcgpbnEz1etnai"},"type":"0"},"txnMetadata":{"seqNo":1,"txnId":"c585f1decb986f7ff19b8d03deba346ab8a0494cc1e4d69ad9b8acb0dfbeab6f"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"brazil","client_ip":"54.233.203.241","client_port":"9702","node_ip":"54.233.203.241","node_port":"9701","services":["VALIDATOR"]},"dest":"2MHGDD2XpRJohQzsXu4FAANcmdypfNdpcqRbqnhkQsCq"},"metadata":{"from":"G3knUCmDrWd1FJrRryuKTw"},"type":"0"},"txnMetadata":{"seqNo":2,"txnId":"5c8f52ca28966103ff0aad98160bc8e978c9ca0285a2043a521481d11ed17506"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"canada","client_ip":"52.60.207.225","client_port":"9702","node_ip":"52.60.207.225","node_port":"9701","services":["VALIDATOR"]},"dest":"8NZ6tbcPN2NVvf2fVhZWqU11XModNudhbe15JSctCXab"},"metadata":{"from":"22QmMyTEAbaF4VfL7LameE"},"type":"0"},"txnMetadata":{"seqNo":3,"txnId":"408c7c5887a0f3905767754f424989b0089c14ac502d7f851d11b31ea2d1baa6"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"england","client_ip":"52.56.191.9","client_port":"9702","node_ip":"52.56.191.9","node_port":"9701","services":["VALIDATOR"]},"dest":"DNuLANU7f1QvW1esN3Sv9Eap9j14QuLiPeYzf28Nub4W"},"metadata":{"from":"NYh3bcUeSsJJcxBE6TTmEr"},"type":"0"},"txnMetadata":{"seqNo":4,"txnId":"d56d0ff69b62792a00a361fbf6e02e2a634a7a8da1c3e49d59e71e0f19c27875"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"korea","client_ip":"52.79.115.223","client_port":"9702","node_ip":"52.79.115.223","node_port":"9701","services":["VALIDATOR"]},"dest":"HCNuqUoXuK9GXGd2EULPaiMso2pJnxR6fCZpmRYbc7vM"},"metadata":{"from":"U38UHML5A1BQ1mYh7tYXeu"},"type":"0"},"txnMetadata":{"seqNo":5,"txnId":"76201e78aca720dbaf516d86d9342ad5b5d46f5badecf828eb9edfee8ab48a50"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"singapore","client_ip":"13.228.62.7","client_port":"9702","node_ip":"13.228.62.7","node_port":"9701","services":["VALIDATOR"]},"dest":"Dh99uW8jSNRBiRQ4JEMpGmJYvzmF35E6ibnmAAf7tbk8"},"metadata":{"from":"HfXThVwhJB4o1Q1Fjr4yrC"},"type":"0"},"txnMetadata":{"seqNo":6,"txnId":"51e2a46721d104d9148d85b617833e7745fdbd6795cb0b502a5b6ea31d33378e"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"virginia","client_ip":"34.225.215.131","client_port":"9702","node_ip":"34.225.215.131","node_port":"9701","services":["VALIDATOR"]},"dest":"EoGRm7eRADtHJRThMCrBXMUM2FpPRML19tNxDAG8YTP8"},"metadata":{"from":"SPdfHq6rGcySFVjDX4iyCo"},"type":"0"},"txnMetadata":{"seqNo":7,"txnId":"0a4992ea442b53e3dca861deac09a8d4987004a8483079b12861080ea4aa1b52"},"ver":"1"} diff --git a/drivers/sov/sovrin/stn.txn.v1 b/drivers/sov/sovrin/stn.txn.v1 deleted file mode 100644 index 90664bb72..000000000 --- a/drivers/sov/sovrin/stn.txn.v1 +++ /dev/null @@ -1,7 +0,0 @@ -{"data":{"alias":"australia","client_ip":"52.64.96.160","client_port":"9702","node_ip":"52.64.96.160","node_port":"9701","services":["VALIDATOR"]},"dest":"UZH61eLH3JokEwjMWQoCMwB3PMD6zRBvG6NCv5yVwXz","identifier":"3U8HUen8WcgpbnEz1etnai","txnId":"c585f1decb986f7ff19b8d03deba346ab8a0494cc1e4d69ad9b8acb0dfbeab6f","type":"0"} -{"data":{"alias":"brazil","client_ip":"54.233.203.241","client_port":"9702","node_ip":"54.233.203.241","node_port":"9701","services":["VALIDATOR"]},"dest":"2MHGDD2XpRJohQzsXu4FAANcmdypfNdpcqRbqnhkQsCq","identifier":"G3knUCmDrWd1FJrRryuKTw","txnId":"5c8f52ca28966103ff0aad98160bc8e978c9ca0285a2043a521481d11ed17506","type":"0"} -{"data":{"alias":"canada","client_ip":"52.60.207.225","client_port":"9702","node_ip":"52.60.207.225","node_port":"9701","services":["VALIDATOR"]},"dest":"8NZ6tbcPN2NVvf2fVhZWqU11XModNudhbe15JSctCXab","identifier":"22QmMyTEAbaF4VfL7LameE","txnId":"408c7c5887a0f3905767754f424989b0089c14ac502d7f851d11b31ea2d1baa6","type":"0"} -{"data":{"alias":"england","client_ip":"52.56.191.9","client_port":"9702","node_ip":"52.56.191.9","node_port":"9701","services":["VALIDATOR"]},"dest":"DNuLANU7f1QvW1esN3Sv9Eap9j14QuLiPeYzf28Nub4W","identifier":"NYh3bcUeSsJJcxBE6TTmEr","txnId":"d56d0ff69b62792a00a361fbf6e02e2a634a7a8da1c3e49d59e71e0f19c27875","type":"0"} -{"data":{"alias":"korea","client_ip":"52.79.115.223","client_port":"9702","node_ip":"52.79.115.223","node_port":"9701","services":["VALIDATOR"]},"dest":"HCNuqUoXuK9GXGd2EULPaiMso2pJnxR6fCZpmRYbc7vM","identifier":"U38UHML5A1BQ1mYh7tYXeu","txnId":"76201e78aca720dbaf516d86d9342ad5b5d46f5badecf828eb9edfee8ab48a50","type":"0"} -{"data":{"alias":"singapore","client_ip":"13.228.62.7","client_port":"9702","node_ip":"13.228.62.7","node_port":"9701","services":["VALIDATOR"]},"dest":"Dh99uW8jSNRBiRQ4JEMpGmJYvzmF35E6ibnmAAf7tbk8","identifier":"HfXThVwhJB4o1Q1Fjr4yrC","txnId":"51e2a46721d104d9148d85b617833e7745fdbd6795cb0b502a5b6ea31d33378e","type":"0"} -{"data":{"alias":"virginia","client_ip":"34.225.215.131","client_port":"9702","node_ip":"34.225.215.131","node_port":"9701","services":["VALIDATOR"]},"dest":"EoGRm7eRADtHJRThMCrBXMUM2FpPRML19tNxDAG8YTP8","identifier":"SPdfHq6rGcySFVjDX4iyCo","txnId":"0a4992ea442b53e3dca861deac09a8d4987004a8483079b12861080ea4aa1b52","type":"0"} diff --git a/drivers/sov/sovrin/stn.txn.v2 b/drivers/sov/sovrin/stn.txn.v2 deleted file mode 100644 index 9860b231a..000000000 --- a/drivers/sov/sovrin/stn.txn.v2 +++ /dev/null @@ -1,7 +0,0 @@ -{"reqSignature":{},"txn":{"data":{"data":{"alias":"australia","client_ip":"52.64.96.160","client_port":"9702","node_ip":"52.64.96.160","node_port":"9701","services":["VALIDATOR"]},"dest":"UZH61eLH3JokEwjMWQoCMwB3PMD6zRBvG6NCv5yVwXz"},"metadata":{"from":"3U8HUen8WcgpbnEz1etnai"},"type":"0"},"txnMetadata":{"seqNo":1,"txnId":"c585f1decb986f7ff19b8d03deba346ab8a0494cc1e4d69ad9b8acb0dfbeab6f"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"brazil","client_ip":"54.233.203.241","client_port":"9702","node_ip":"54.233.203.241","node_port":"9701","services":["VALIDATOR"]},"dest":"2MHGDD2XpRJohQzsXu4FAANcmdypfNdpcqRbqnhkQsCq"},"metadata":{"from":"G3knUCmDrWd1FJrRryuKTw"},"type":"0"},"txnMetadata":{"seqNo":2,"txnId":"5c8f52ca28966103ff0aad98160bc8e978c9ca0285a2043a521481d11ed17506"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"canada","client_ip":"52.60.207.225","client_port":"9702","node_ip":"52.60.207.225","node_port":"9701","services":["VALIDATOR"]},"dest":"8NZ6tbcPN2NVvf2fVhZWqU11XModNudhbe15JSctCXab"},"metadata":{"from":"22QmMyTEAbaF4VfL7LameE"},"type":"0"},"txnMetadata":{"seqNo":3,"txnId":"408c7c5887a0f3905767754f424989b0089c14ac502d7f851d11b31ea2d1baa6"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"england","client_ip":"52.56.191.9","client_port":"9702","node_ip":"52.56.191.9","node_port":"9701","services":["VALIDATOR"]},"dest":"DNuLANU7f1QvW1esN3Sv9Eap9j14QuLiPeYzf28Nub4W"},"metadata":{"from":"NYh3bcUeSsJJcxBE6TTmEr"},"type":"0"},"txnMetadata":{"seqNo":4,"txnId":"d56d0ff69b62792a00a361fbf6e02e2a634a7a8da1c3e49d59e71e0f19c27875"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"korea","client_ip":"52.79.115.223","client_port":"9702","node_ip":"52.79.115.223","node_port":"9701","services":["VALIDATOR"]},"dest":"HCNuqUoXuK9GXGd2EULPaiMso2pJnxR6fCZpmRYbc7vM"},"metadata":{"from":"U38UHML5A1BQ1mYh7tYXeu"},"type":"0"},"txnMetadata":{"seqNo":5,"txnId":"76201e78aca720dbaf516d86d9342ad5b5d46f5badecf828eb9edfee8ab48a50"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"singapore","client_ip":"13.228.62.7","client_port":"9702","node_ip":"13.228.62.7","node_port":"9701","services":["VALIDATOR"]},"dest":"Dh99uW8jSNRBiRQ4JEMpGmJYvzmF35E6ibnmAAf7tbk8"},"metadata":{"from":"HfXThVwhJB4o1Q1Fjr4yrC"},"type":"0"},"txnMetadata":{"seqNo":6,"txnId":"51e2a46721d104d9148d85b617833e7745fdbd6795cb0b502a5b6ea31d33378e"},"ver":"1"} -{"reqSignature":{},"txn":{"data":{"data":{"alias":"virginia","client_ip":"34.225.215.131","client_port":"9702","node_ip":"34.225.215.131","node_port":"9701","services":["VALIDATOR"]},"dest":"EoGRm7eRADtHJRThMCrBXMUM2FpPRML19tNxDAG8YTP8"},"metadata":{"from":"SPdfHq6rGcySFVjDX4iyCo"},"type":"0"},"txnMetadata":{"seqNo":7,"txnId":"0a4992ea442b53e3dca861deac09a8d4987004a8483079b12861080ea4aa1b52"},"ver":"1"} diff --git a/drivers/sov/src/main/java/uniresolver/driver/did/sov/Base58.java b/drivers/sov/src/main/java/uniresolver/driver/did/sov/Base58.java deleted file mode 100644 index c4136998f..000000000 --- a/drivers/sov/src/main/java/uniresolver/driver/did/sov/Base58.java +++ /dev/null @@ -1,77 +0,0 @@ -package uniresolver.driver.did.sov; - -import java.util.Arrays; - -public class Base58 { - - public static final char[] ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz".toCharArray(); - private static final int[] INDEXES = new int[128]; - - static { - - Arrays.fill(INDEXES, -1); - for (int i = 0; i < ALPHABET.length; i++) INDEXES[ALPHABET[i]] = i; - } - - public static byte[] decode(String input) throws AddressFormatException { - - if (input.length() == 0) return new byte[0]; - - byte[] input58 = new byte[input.length()]; - for (int i = 0; i < input.length(); ++i) { - - char c = input.charAt(i); - int digit = c < 128 ? INDEXES[c] : -1; - if (digit < 0) throw new AddressFormatException("Illegal character " + c + " at position " + i); - - input58[i] = (byte) digit; - } - - int zeros = 0; - while (zeros < input58.length && input58[zeros] == 0) ++zeros; - - byte[] decoded = new byte[input.length()]; - int outputStart = decoded.length; - - for (int inputStart = zeros; inputStart < input58.length; ) { - - decoded[--outputStart] = divmod(input58, inputStart, 58, 256); - if (input58[inputStart] == 0) ++inputStart; - } - - while (outputStart < decoded.length && decoded[outputStart] == 0) ++outputStart; - - - return Arrays.copyOfRange(decoded, outputStart - zeros, decoded.length); - } - - private static byte divmod(byte[] number, int firstDigit, int base, int divisor) { - - int remainder = 0; - - for (int i = firstDigit; i < number.length; i++) { - - int digit = (int) number[i] & 0xFF; - int temp = remainder * base + digit; - number[i] = (byte) (temp / divisor); - remainder = temp % divisor; - } - - return (byte) remainder; - } - - public static class AddressFormatException extends IllegalArgumentException { - - private static final long serialVersionUID = 187454854796294238L; - - public AddressFormatException() { - - super(); - } - - public AddressFormatException(String message) { - - super(message); - } - } -} diff --git a/drivers/sov/src/main/java/uniresolver/driver/did/sov/DidSovDriver.java b/drivers/sov/src/main/java/uniresolver/driver/did/sov/DidSovDriver.java deleted file mode 100644 index 0cc8530d7..000000000 --- a/drivers/sov/src/main/java/uniresolver/driver/did/sov/DidSovDriver.java +++ /dev/null @@ -1,506 +0,0 @@ -package uniresolver.driver.did.sov; - -import java.io.File; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ExecutionException; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.hyperledger.indy.sdk.IndyException; -import org.hyperledger.indy.sdk.LibIndy; -import org.hyperledger.indy.sdk.did.Did; -import org.hyperledger.indy.sdk.did.DidJSONParameters.CreateAndStoreMyDidJSONParameter; -import org.hyperledger.indy.sdk.did.DidResults.CreateAndStoreMyDidResult; -import org.hyperledger.indy.sdk.ledger.Ledger; -import org.hyperledger.indy.sdk.pool.Pool; -import org.hyperledger.indy.sdk.pool.PoolJSONParameters.CreatePoolLedgerConfigJSONParameter; -import org.hyperledger.indy.sdk.pool.PoolJSONParameters.OpenPoolLedgerJSONParameter; -import org.hyperledger.indy.sdk.pool.PoolLedgerConfigExistsException; -import org.hyperledger.indy.sdk.wallet.Wallet; -import org.hyperledger.indy.sdk.wallet.WalletExistsException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.gson.Gson; -import com.google.gson.JsonElement; -import com.google.gson.JsonNull; -import com.google.gson.JsonObject; -import com.google.gson.JsonPrimitive; - -import did.Authentication; -import did.DIDDocument; -import did.Encryption; -import did.PublicKey; -import did.Service; -import uniresolver.ResolutionException; -import uniresolver.driver.Driver; -import uniresolver.result.ResolveResult; - -public class DidSovDriver implements Driver { - - private static Logger log = LoggerFactory.getLogger(DidSovDriver.class); - - public static final Pattern DID_SOV_PATTERN = Pattern.compile("^did:sov:(?:(\\w[-\\w]*(?::\\w[-\\w]*)*):)?([1-9A-HJ-NP-Za-km-z]{21,22})$"); - - public static final String[] DIDDOCUMENT_PUBLICKEY_TYPES = new String[] { "Ed25519VerificationKey2018" }; - public static final String[] DIDDOCUMENT_AUTHENTICATION_TYPES = new String[] { "Ed25519SignatureAuthentication2018" }; - - private Map properties; - - private static final Gson gson = new Gson(); - - private String libIndyPath; - private String poolConfigs; - private String poolVersions; - private String walletName; - - private Map poolMap = null; - private Map poolVersionMap = null; - private Wallet wallet = null; - private String submitterDid = null; - - public DidSovDriver(Map properties) { - - this.setProperties(properties); - } - - public DidSovDriver() { - - this.setProperties(getPropertiesFromEnvironment()); - } - - private static Map getPropertiesFromEnvironment() { - - if (log.isDebugEnabled()) log.debug("Loading from environment: " + System.getenv()); - - Map properties = new HashMap (); - - try { - - String env_libIndyPath = System.getenv("uniresolver_driver_did_sov_libIndyPath"); - String env_poolConfigs = System.getenv("uniresolver_driver_did_sov_poolConfigs"); - String env_poolVersions = System.getenv("uniresolver_driver_did_sov_poolVersions"); - String env_walletName = System.getenv("uniresolver_driver_did_sov_walletName"); - - if (env_libIndyPath != null) properties.put("libIndyPath", env_libIndyPath); - if (env_poolConfigs != null) properties.put("poolConfigs", env_poolConfigs); - if (env_poolVersions != null) properties.put("poolVersions", env_poolVersions); - if (env_walletName != null) properties.put("walletName", env_walletName); - } catch (Exception ex) { - - throw new IllegalArgumentException(ex.getMessage(), ex); - } - - return properties; - } - - private void configureFromProperties() { - - if (log.isDebugEnabled()) log.debug("Configuring from properties: " + this.getProperties()); - - try { - - String prop_libIndyPath = (String) this.getProperties().get("libIndyPath"); - String prop_poolConfigs = (String) this.getProperties().get("poolConfigs"); - String prop_poolVersions = (String) this.getProperties().get("poolVersions"); - String prop_walletName = (String) this.getProperties().get("walletName"); - - if (prop_libIndyPath != null) this.setLibIndyPath(prop_libIndyPath); - if (prop_poolConfigs != null) this.setPoolConfigs(prop_poolConfigs); - if (prop_poolVersions != null) this.setPoolVersions(prop_poolVersions); - if (prop_walletName != null) this.setWalletName(prop_walletName); - } catch (Exception ex) { - - throw new IllegalArgumentException(ex.getMessage(), ex); - } - } - - @Override - public ResolveResult resolve(String identifier) throws ResolutionException { - - // open pool - - if (this.getPoolMap() == null || this.getWallet() == null || this.getSubmitterDid() == null) this.openIndy(); - - // parse identifier - - Matcher matcher = DID_SOV_PATTERN.matcher(identifier); - if (! matcher.matches()) return null; - - String network = matcher.group(1); - String targetDid = matcher.group(2); - if (network == null || network.trim().isEmpty()) network = "_"; - - Integer poolVersion = this.getPoolVersionMap().get(network); - - // find pool - - Pool pool = this.getPoolMap().get(network); - if (pool == null) throw new ResolutionException("Unknown network: " + network); - - // send GET_NYM request - - String getNymResponse; - - try { - - synchronized (this) { - - Pool.setProtocolVersion(poolVersion); - - String getNymRequest = Ledger.buildGetNymRequest(this.getSubmitterDid(), targetDid).get(); - getNymResponse = Ledger.signAndSubmitRequest(pool, this.getWallet(), this.getSubmitterDid(), getNymRequest).get(); - } - } catch (IndyException | InterruptedException | ExecutionException ex) { - - throw new ResolutionException("Cannot send GET_NYM request: " + ex.getMessage(), ex); - } - - if (log.isInfoEnabled()) log.info("GET_NYM for " + targetDid + ": " + getNymResponse); - - // GET_NYM response data - - JsonObject jsonGetNymResponse = gson.fromJson(getNymResponse, JsonObject.class); - JsonObject jsonGetNymResult = jsonGetNymResponse == null ? null : jsonGetNymResponse.getAsJsonObject("result"); - JsonElement jsonGetNymData = jsonGetNymResult == null ? null : jsonGetNymResult.get("data"); - JsonObject jsonGetNymDataContent = (jsonGetNymData == null || jsonGetNymData instanceof JsonNull) ? null : gson.fromJson(jsonGetNymData.getAsString(), JsonObject.class); - - if (jsonGetNymDataContent == null) return null; - - // send GET_ATTR request - - String getAttrResponse; - - try { - - synchronized (this) { - - Pool.setProtocolVersion(poolVersion); - - String getAttrRequest = Ledger.buildGetAttribRequest(this.getSubmitterDid(), targetDid, "endpoint", null, null).get(); - getAttrResponse = Ledger.signAndSubmitRequest(pool, this.getWallet(), this.getSubmitterDid(), getAttrRequest).get(); - } - } catch (IndyException | InterruptedException | ExecutionException ex) { - - throw new ResolutionException("Cannot send GET_NYM request: " + ex.getMessage(), ex); - } - - if (log.isInfoEnabled()) log.info("GET_ATTR for " + targetDid + ": " + getAttrResponse); - - // GET_ATTR response data - - JsonObject jsonGetAttrResponse = gson.fromJson(getAttrResponse, JsonObject.class); - JsonObject jsonGetAttrResult = jsonGetAttrResponse == null ? null : jsonGetAttrResponse.getAsJsonObject("result"); - JsonElement jsonGetAttrData = jsonGetAttrResult == null ? null : jsonGetAttrResult.get("data"); - JsonObject jsonGetAttrDataContent = (jsonGetAttrData == null || jsonGetAttrData instanceof JsonNull) ? null : gson.fromJson(jsonGetAttrData.getAsString(), JsonObject.class); - - // DID DOCUMENT id - - String id = identifier; - - // DID DOCUMENT publicKeys - - JsonPrimitive jsonGetNymVerkey = jsonGetNymDataContent == null ? null : jsonGetNymDataContent.getAsJsonPrimitive("verkey"); - - String verkey = jsonGetNymVerkey == null ? null : jsonGetNymVerkey.getAsString(); - - int keyNum = 0; - List publicKeys; - List authentications; - List encryptions; - - String keyId = id + "#key-" + (++keyNum); - - PublicKey publicKey = PublicKey.build(keyId, DIDDOCUMENT_PUBLICKEY_TYPES, null, verkey, null, null); - publicKeys = Collections.singletonList(publicKey); - - Authentication authentication = Authentication.build(null, DIDDOCUMENT_AUTHENTICATION_TYPES, keyId); - authentications = Collections.singletonList(authentication); - - encryptions = Collections.emptyList(); - - // DID DOCUMENT services - - JsonObject jsonGetAttrEndpoint = jsonGetAttrDataContent == null ? null : jsonGetAttrDataContent.getAsJsonObject("endpoint"); - - List services = new ArrayList (); - - if (jsonGetAttrEndpoint != null) { - - for (Map.Entry jsonService : jsonGetAttrEndpoint.entrySet()) { - - JsonPrimitive jsonGetAttrEndpointValue = jsonGetAttrEndpoint == null ? null : jsonGetAttrEndpoint.getAsJsonPrimitive(jsonService.getKey()); - String value = jsonGetAttrEndpointValue == null ? null : jsonGetAttrEndpointValue.getAsString(); - - Service service = Service.build(jsonService.getKey(), null, value); - - services.add(service); - } - } - - // create DID DOCUMENT - - DIDDocument didDocument = DIDDocument.build(id, publicKeys, authentications, encryptions, services); - - // create DRIVER METADATA - - Map methodMetadata = new LinkedHashMap (); - methodMetadata.put("network", network); - methodMetadata.put("poolVersion", poolVersion); - methodMetadata.put("nymResponse", gson.fromJson(jsonGetNymResponse, Map.class)); - methodMetadata.put("nymResponse", gson.fromJson(jsonGetNymResponse, Map.class)); - methodMetadata.put("attrResponse", gson.fromJson(jsonGetAttrResponse, Map.class)); - - // create RESOLVE RESULT - - ResolveResult resolveResult = ResolveResult.build(didDocument, null, methodMetadata); - - // done - - return resolveResult; - } - - @Override - public Map properties() { - - return this.getProperties(); - } - - private void openIndy() throws ResolutionException { - - // initialize libindy - - if ((! LibIndy.isInitialized()) && this.getLibIndyPath() != null) { - - if (log.isInfoEnabled()) log.info("Initializing libindy: " + this.getLibIndyPath() + " (" + new File(this.getLibIndyPath()).getAbsolutePath() + ")"); - LibIndy.init(this.getLibIndyPath()); - } - - // parse pool configs - - String[] poolConfigs = this.getPoolConfigs().split(";"); - Map poolConfigMap = new HashMap (); - - for (int i=0; i (); - - for (int i=0; i poolConfig : poolConfigMap.entrySet()) { - - String poolConfigName = poolConfig.getKey(); - String poolConfigFile = poolConfig.getValue(); - - try { - - CreatePoolLedgerConfigJSONParameter createPoolLedgerConfigJSONParameter = new CreatePoolLedgerConfigJSONParameter(poolConfigFile); - Pool.createPoolLedgerConfig(poolConfigName, createPoolLedgerConfigJSONParameter.toJson()).get(); - if (log.isInfoEnabled()) log.info("Pool config \"" + poolConfigName + "\" successfully created."); - } catch (IndyException | InterruptedException | ExecutionException ex) { - - IndyException iex = null; - if (ex instanceof IndyException) iex = (IndyException) ex; - if (ex instanceof ExecutionException && ex.getCause() instanceof IndyException) iex = (IndyException) ex.getCause(); - if (iex instanceof PoolLedgerConfigExistsException) { - - if (log.isInfoEnabled()) log.info("Pool config \"" + poolConfigName + "\" has already been created."); - } else { - - throw new ResolutionException("Cannot create pool config \"" + poolConfigName + "\": " + ex.getMessage(), ex); - } - } - } - - // create wallet - - try { - - String walletConfig = "{ \"id\":\"" + this.getWalletName() + "\", \"storage_type\":\"" + "default" + "\"}"; - String walletCredentials = "{ \"key\":\"key\" }"; - Wallet.createWallet(walletConfig, walletCredentials).get(); - if (log.isInfoEnabled()) log.info("Wallet \"" + this.getWalletName() + "\" successfully created."); - } catch (IndyException | InterruptedException | ExecutionException ex) { - - IndyException iex = null; - if (ex instanceof IndyException) iex = (IndyException) ex; - if (ex instanceof ExecutionException && ex.getCause() instanceof IndyException) iex = (IndyException) ex.getCause(); - if (iex instanceof WalletExistsException) { - - if (log.isInfoEnabled()) log.info("Wallet \"" + this.getWalletName() + "\" has already been created."); - } else { - - throw new ResolutionException("Cannot create wallet \"" + this.getWalletName() + "\": " + ex.getMessage(), ex); - } - } - - // open pools - - this.poolMap = new HashMap (); - - for (String poolConfigName : poolConfigMap.keySet()) { - - try { - - Pool.setProtocolVersion(this.getPoolVersionMap().get(poolConfigName)); - - OpenPoolLedgerJSONParameter openPoolLedgerJSONParameter = new OpenPoolLedgerJSONParameter(null, null); - Pool pool = Pool.openPoolLedger(poolConfigName, openPoolLedgerJSONParameter.toJson()).get(); - - this.poolMap.put(poolConfigName, pool); - } catch (IndyException | InterruptedException | ExecutionException ex) { - - throw new ResolutionException("Cannot open pool \"" + poolConfigName + "\": " + ex.getMessage(), ex); - } - } - - if (log.isInfoEnabled()) log.info("Opened " + this.poolMap.size() + " pools: " + this.poolMap.keySet()); - - // open wallet - - try { - - String walletConfig = "{ \"id\":\"" + this.getWalletName() + "\", \"storage_type\":\"" + "default" + "\"}"; - String walletCredentials = "{ \"key\":\"key\" }"; - this.wallet = Wallet.openWallet(walletConfig, walletCredentials).get(); - } catch (IndyException | InterruptedException | ExecutionException ex) { - - throw new ResolutionException("Cannot open wallet \"" + this.getWalletName() + "\": " + ex.getMessage(), ex); - } - - // create submitter DID - - try { - - CreateAndStoreMyDidJSONParameter createAndStoreMyDidJSONParameterTrustee = new CreateAndStoreMyDidJSONParameter(null, null, null, null); - CreateAndStoreMyDidResult createAndStoreMyDidResultTrustee = Did.createAndStoreMyDid(this.getWallet(), createAndStoreMyDidJSONParameterTrustee.toJson()).get(); - this.submitterDid = createAndStoreMyDidResultTrustee.getDid(); - } catch (IndyException | InterruptedException | ExecutionException ex) { - - throw new ResolutionException("Cannot create submitter DID: " + ex.getMessage(), ex); - } - - if (log.isInfoEnabled()) log.info("Created submitter DID: " + this.submitterDid); - } - - /* - * Getters and setters - */ - - public Map getProperties() { - - return this.properties; - } - - public void setProperties(Map properties) { - - this.properties = properties; - this.configureFromProperties(); - } - - public String getLibIndyPath() { - - return this.libIndyPath; - } - - public void setLibIndyPath(String libIndyPath) { - - this.libIndyPath = libIndyPath; - } - - public String getPoolConfigs() { - - return this.poolConfigs; - } - - public void setPoolConfigs(String poolConfigs) { - - this.poolConfigs = poolConfigs; - } - - public String getPoolVersions() { - - return this.poolVersions; - } - - public void setPoolVersions(String poolVersions) { - - this.poolVersions = poolVersions; - } - - public String getWalletName() { - - return this.walletName; - } - - public void setWalletName(String walletName) { - - this.walletName = walletName; - } - - public Map getPoolMap() { - - return this.poolMap; - } - - public void setPoolMap(Map poolMap) { - - this.poolMap = poolMap; - } - - public Map getPoolVersionMap() { - - return this.poolVersionMap; - } - - public void setPoolVersionMap(Map poolVersionMap) { - - this.poolVersionMap = poolVersionMap; - } - - public Wallet getWallet() { - - return this.wallet; - } - - public void setWallet(Wallet wallet) { - - this.wallet = wallet; - } - - public String getSubmitterDid() { - - return this.submitterDid; - } - - public void setSubmitterDid(String submitterDid) { - - this.submitterDid = submitterDid; - } -} diff --git a/drivers/sov/src/main/webapp/WEB-INF/web.xml b/drivers/sov/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index 97147ba58..000000000 --- a/drivers/sov/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - uni-resolver-driver-did-sov - - - - - InitServlet - InitServlet - uniresolver.driver.servlet.InitServlet - - Driver - uniresolver.driver.did.sov.DidSovDriver - - 1 - - - - ResolveServlet - ResolveServlet - uniresolver.driver.servlet.ResolveServlet - - - PropertiesServlet - PropertiesServlet - uniresolver.driver.servlet.PropertiesServlet - - - ResolveServlet - /1.0/identifiers/* - - - PropertiesServlet - /1.0/properties - /1.0/properties/* - - - diff --git a/drivers/sov/src/test/resources/jetty-env.xml b/drivers/sov/src/test/resources/jetty-env.xml deleted file mode 100644 index 2746628e2..000000000 --- a/drivers/sov/src/test/resources/jetty-env.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - org.eclipse.jetty.server.webapp.WebInfIncludeJarPattern - ^$ - - diff --git a/drivers/sov/src/test/resources/jetty.xml b/drivers/sov/src/test/resources/jetty.xml deleted file mode 100644 index c24808c45..000000000 --- a/drivers/sov/src/test/resources/jetty.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/drivers/sov/src/test/resources/log4j.properties b/drivers/sov/src/test/resources/log4j.properties deleted file mode 100644 index 5f95c67ea..000000000 --- a/drivers/sov/src/test/resources/log4j.properties +++ /dev/null @@ -1,11 +0,0 @@ -log4j.rootLogger=DEBUG, STDOUT - -log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender -log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout -log4j.appender.STDOUT.layout.ConversionPattern=%d{HH:mm:ss,SSS} - %5p [%c] - %m%n - -log4j.logger.org.apache=INFO, STDOUT -log4j.logger.org.eclipse=INFO, STDOUT -log4j.logger.org.mortbay=INFO, STDOUT -log4j.logger.org.springframework=INFO, STDOUT -log4j.logger.uniresolver=DEBUG, STDOUT diff --git a/drivers/stack/.gitignore b/drivers/stack/.gitignore deleted file mode 100644 index 697e1e157..000000000 --- a/drivers/stack/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -.project -.classpath -/.settings/ -/target -/bin/ diff --git a/drivers/stack/README.md b/drivers/stack/README.md deleted file mode 100644 index 127e118d5..000000000 --- a/drivers/stack/README.md +++ /dev/null @@ -1,41 +0,0 @@ -![DIF Logo](https://raw.githubusercontent.com/decentralized-identity/decentralized-identity.github.io/master/images/logo-small.png) - -# Universal Resolver Driver: did:stack - -This is a [Universal Resolver](https://github.com/decentralized-identity/universal-resolver/) driver for **did:stack** identifiers. - -## Specifications - -* [Decentralized Identifiers](https://w3c-ccg.github.io/did-spec/) -* Blockstack DID Method Specification (missing) - -## Example DIDs - -``` -did:stack:v0:16EMaNw3pkn3v6f2BgnSSs53zAKH4Q8YJg-0 -``` - -## Build and Run (Docker) - -``` -docker build -f ./docker/Dockerfile . -t universalresolver/driver-did-stack -docker run -p 8080:8080 universalresolver/driver-did-stack -curl -X GET http://localhost:8080/1.0/identifiers/did:stack:v0:16EMaNw3pkn3v6f2BgnSSs53zAKH4Q8YJg-0 -``` - -## Build (native Java) - - 1. First, build https://github.com/decentralized-identity/universal-resolver/tree/master/resolver/java - 1. Then, `mvn clean install` - -## Driver Environment Variables - -The driver recognizes the following environment variables: - -(none) - -## Driver Metadata - -The driver returns the following metadata in addition to a DID document: - -(none) diff --git a/drivers/stack/docker/Dockerfile b/drivers/stack/docker/Dockerfile deleted file mode 100644 index 331538d97..000000000 --- a/drivers/stack/docker/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -# Dockerfile for universalresolver/driver-did-stack - -FROM universalresolver/driver -MAINTAINER Markus Sabadello - -# build driver-did-stack - -ADD . /opt/driver-did-stack -RUN cd /opt/driver-did-stack && mvn install package -N -DskipTests - -# done - -RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* - -EXPOSE 8084 - -RUN chmod a+rx /opt/driver-did-stack/docker/run-driver-did-stack.sh -CMD "/opt/driver-did-stack/docker/run-driver-did-stack.sh" diff --git a/drivers/stack/docker/run-driver-did-stack.sh b/drivers/stack/docker/run-driver-did-stack.sh deleted file mode 100644 index efb616266..000000000 --- a/drivers/stack/docker/run-driver-did-stack.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -cd /opt/driver-did-stack/ -mvn jetty:run -P war diff --git a/drivers/stack/pom.xml b/drivers/stack/pom.xml deleted file mode 100644 index a23d81a48..000000000 --- a/drivers/stack/pom.xml +++ /dev/null @@ -1,113 +0,0 @@ - - - 4.0.0 - uni-resolver-driver-did-stack - ${packaging.type} - uni-resolver-driver-did-stack - - - decentralized-identity - uni-resolver - 0.1-SNAPSHOT - - - - - - - default - true - jar - - - - - - war - war - - - - org.apache.maven.plugins - maven-war-plugin - 2.4 - - - org.eclipse.jetty - jetty-maven-plugin - 9.4.0.M1 - - - ${basedir}/src/test/resources/jetty.xml - - - ${basedir}/src/test/resources/jetty-env.xml - - / - true - - - jetty.port - 8080 - - - slf4j - true - - - log4j.configuration - file:${basedir}/src/test/resources/log4j.properties - - - - - - org.slf4j - slf4j-api - 1.7.5 - compile - - - org.slf4j - jcl-over-slf4j - 1.7.5 - compile - - - org.slf4j - slf4j-log4j12 - 1.7.5 - compile - - - - - - - - - - - - - decentralized-identity - uni-resolver-driver - 0.1-SNAPSHOT - compile - - - org.json - json - 20171018 - compile - - - org.bitcoinj - bitcoinj-core - 0.14.7 - compile - - - - diff --git a/drivers/stack/src/main/java/uniresolver/driver/did/stack/DidStackDriver.java b/drivers/stack/src/main/java/uniresolver/driver/did/stack/DidStackDriver.java deleted file mode 100644 index ed8255fe4..000000000 --- a/drivers/stack/src/main/java/uniresolver/driver/did/stack/DidStackDriver.java +++ /dev/null @@ -1,255 +0,0 @@ -package uniresolver.driver.did.stack; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.http.HttpEntity; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.impl.client.LaxRedirectStrategy; -import org.apache.http.util.EntityUtils; -import org.bitcoinj.core.Base58; -import org.bitcoinj.core.Sha256Hash; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import did.DIDDocument; -import did.PublicKey; -import did.Service; -import uniresolver.ResolutionException; -import uniresolver.driver.Driver; -import uniresolver.result.ResolveResult; - -public class DidStackDriver implements Driver { - - private static Logger log = LoggerFactory.getLogger(DidStackDriver.class); - - public static final Pattern DID_STACK_PATTERN = Pattern.compile("^did:stack:v0:([123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{25,34})-([0-9]+)$"); - - public static final String[] DIDDOCUMENT_PUBLICKEY_TYPES = new String[] { "Secp256k1VerificationKey2018" }; - - public static final String DEFAULT_BLOCKSTACK_CORE_URL = "https://core.blockstack.org"; - public static final HttpClient DEFAULT_HTTP_CLIENT = HttpClientBuilder.create().setRedirectStrategy(new LaxRedirectStrategy()).build(); - - private String blockstackCoreUrl = DEFAULT_BLOCKSTACK_CORE_URL; - private HttpClient httpClient = DEFAULT_HTTP_CLIENT; - - public DidStackDriver() { - - } - - private static boolean isSubdomain(String candidate) { - return candidate.split("\\.").length == 3; - } - - private static boolean isDomain(String candidate) { - return candidate.split("\\.").length == 2; - } - - private String getNameFromDID(String address, int index, boolean useSubdomains) throws ResolutionException { - - // find names owned by address - String addressUri = this.getBlockstackCoreUrl() + "/v1/addresses/bitcoin/" + address; - HttpGet httpGet = new HttpGet(addressUri); - - try (CloseableHttpResponse httpResponse = (CloseableHttpResponse) this.getHttpClient().execute(httpGet)) { - - if(httpResponse.getStatusLine().getStatusCode() != 200) { - throw new ResolutionException("Cannot retrieve names owned by address `" + address + "`: " + httpResponse.getStatusLine()); - } - - // extract payload - HttpEntity httpEntity = httpResponse.getEntity(); - String entityString = EntityUtils.toString(httpEntity); - EntityUtils.consume(httpEntity); - - // it had better be JSON - JSONObject jo = new JSONObject(entityString); - - // expect "names" list - if(!jo.has("names")) { - throw new ResolutionException("Did not get a list of `names` from " + addressUri); - } - - JSONArray namesList = jo.getJSONArray("names"); - ArrayList filteredList = new ArrayList(); - - for (int i = 0; i < namesList.length(); i++) { - String currentName = namesList.getString(i); - if (useSubdomains) { - if (DidStackDriver.isSubdomain(currentName)) - filteredList.add(currentName); - } else { - if (DidStackDriver.isDomain(currentName)) - filteredList.add(currentName); - } - } - - if(filteredList.size() <= index) { - String type = useSubdomains ? "subdomain" : "domain"; - throw new ResolutionException( - "DID " + type + " index `" + index + "` is out-of-bounds for owner `" + - address + "`"); - } - - return filteredList.get(index); - } catch (IOException ex) { - throw new ResolutionException("Cannot lookup address-to-name list for `" + address + "-" + index + "` from " + addressUri); - } catch (JSONException jex) { - throw new ResolutionException("Cannot parse JSON response from `" + addressUri + "`: " + jex.getMessage(), jex); - } - } - - public static String encodeChecked(int version, byte[] payload) { - if (version < 0 || version > 255) - throw new IllegalArgumentException("Version not in range."); - - // A stringified buffer is: - // 1 byte version + data bytes + 4 bytes check code (a truncated hash) - byte[] addressBytes = new byte[1 + payload.length + 4]; - addressBytes[0] = (byte) version; - System.arraycopy(payload, 0, addressBytes, 1, payload.length); - byte[] checksum = Sha256Hash.hashTwice(addressBytes, 0, payload.length + 1); - System.arraycopy(checksum, 0, addressBytes, payload.length + 1, 4); - return Base58.encode(addressBytes); - } - - @Override - public ResolveResult resolve(String identifier) throws ResolutionException { - // match - Matcher matcher = DID_STACK_PATTERN.matcher(identifier); - if(!matcher.matches()) { - return null; - } - - String didAddress = matcher.group(1); - String indexStr = matcher.group(2); - int nameIndex = Integer.parseInt(indexStr); - - byte[] decodedVersionHash = Base58.decodeChecked(didAddress); - byte version = decodedVersionHash[0]; - byte[] decodedHash = Arrays.copyOfRange(decodedVersionHash, 1, decodedVersionHash.length); - byte reencodeVersion; - if (version == 50 || version == 5) { - reencodeVersion = 5; - } else if (version == 63 || version == 0) { - reencodeVersion = 0; - } else { - throw new ResolutionException("Invalid address version in " + - didAddress + ". Must be one of [0, 5, 50, 63]"); - } - boolean useSubdomains = (version == 63 || version == 50); - - String reencodedAddress = DidStackDriver.encodeChecked(reencodeVersion, decodedHash); - - log.debug("Re-encoding " + didAddress + " to " + reencodedAddress); - - String name = this.getNameFromDID(reencodedAddress, nameIndex, useSubdomains); - - // fetch data from Core node - String nameUri = this.getBlockstackCoreUrl() + "/v1/users/" + name; - HttpGet httpGet = new HttpGet(nameUri); - - // find the public key! - String publicKeyHex = null; - - try (CloseableHttpResponse httpResponse = (CloseableHttpResponse) this.getHttpClient().execute(httpGet)) { - - if(httpResponse.getStatusLine().getStatusCode() != 200) { - throw new ResolutionException("Cannot retrieve DDO for `" + name + "` from `" + nameUri + ": " + httpResponse.getStatusLine()); - } - - // extract payload - HttpEntity httpEntity = httpResponse.getEntity(); - String entityString = EntityUtils.toString(httpEntity); - EntityUtils.consume(httpEntity); - - // it had better be JSON - JSONObject jo = new JSONObject(entityString); - - // it had better start with the name - if(jo.isNull(name)) { - // malformed - throw new ResolutionException("Invalid profile returned: name `" + name + "` not mapped to profile info"); - } - - JSONObject nameInfo = jo.getJSONObject(name); - - if(nameInfo.isNull("public_key")) { - // no public key defined in the profile - // (usually means the user has a legacy profile) - throw new ResolutionException("Cannot retrieve public key for `" + name + "`: profile is in legacy format"); - } - else { - // extract public_key - publicKeyHex = nameInfo.getString("public_key"); - } - - } catch (IOException ex) { - throw new ResolutionException("Cannot retrieve DDO info for `" + name + "` from `" + nameUri + "`: " + ex.getMessage(), ex); - } catch (JSONException jex) { - throw new ResolutionException("Cannot parse JSON response from `" + nameUri + "`: " + jex.getMessage(), jex); - } - - // DDO id - String id = identifier; - - // DDO publicKeys - PublicKey publicKey = PublicKey.build(identifier, DIDDOCUMENT_PUBLICKEY_TYPES, null, null, publicKeyHex, null); - - List publicKeys = Collections.singletonList(publicKey); - - // DDO services - List services = new ArrayList(); - services.add(Service.build("blockstack", null, DEFAULT_BLOCKSTACK_CORE_URL)); - - // create DDO - DIDDocument didDocument = DIDDocument.build(id, publicKeys, null, null, services); - - // done - return ResolveResult.build(didDocument); - } - - public Map properties() { - - Map properties = new HashMap (); - properties.put("blockstackCoreUrl", this.getBlockstackCoreUrl()); - - return properties; - } - - /* - * Getters and setters - */ - - public HttpClient getHttpClient() { - - return this.httpClient; - } - - public void setHttpClient(HttpClient httpClient) { - - this.httpClient = httpClient; - } - - public String getBlockstackCoreUrl() { - - return this.blockstackCoreUrl; - } - - public void setBlockstackCoreUrl(String stackUrl) { - this.blockstackCoreUrl = stackUrl; - } -} diff --git a/drivers/stack/src/main/webapp/WEB-INF/web.xml b/drivers/stack/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index e7cc1132c..000000000 --- a/drivers/stack/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - uni-resolver-driver-did-stack - - - - - InitServlet - InitServlet - uniresolver.driver.servlet.InitServlet - - Driver - uniresolver.driver.did.stack.DidStackDriver - - 1 - - - - ResolveServlet - ResolveServlet - uniresolver.driver.servlet.ResolveServlet - - - PropertiesServlet - PropertiesServlet - uniresolver.driver.servlet.PropertiesServlet - - - ResolveServlet - /1.0/identifiers/* - - - PropertiesServlet - /1.0/properties - /1.0/properties/* - - - diff --git a/drivers/stack/src/test/resources/jetty-env.xml b/drivers/stack/src/test/resources/jetty-env.xml deleted file mode 100644 index 2746628e2..000000000 --- a/drivers/stack/src/test/resources/jetty-env.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - org.eclipse.jetty.server.webapp.WebInfIncludeJarPattern - ^$ - - diff --git a/drivers/stack/src/test/resources/jetty.xml b/drivers/stack/src/test/resources/jetty.xml deleted file mode 100644 index c24808c45..000000000 --- a/drivers/stack/src/test/resources/jetty.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/drivers/stack/src/test/resources/log4j.properties b/drivers/stack/src/test/resources/log4j.properties deleted file mode 100644 index 5f95c67ea..000000000 --- a/drivers/stack/src/test/resources/log4j.properties +++ /dev/null @@ -1,11 +0,0 @@ -log4j.rootLogger=DEBUG, STDOUT - -log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender -log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout -log4j.appender.STDOUT.layout.ConversionPattern=%d{HH:mm:ss,SSS} - %5p [%c] - %m%n - -log4j.logger.org.apache=INFO, STDOUT -log4j.logger.org.eclipse=INFO, STDOUT -log4j.logger.org.mortbay=INFO, STDOUT -log4j.logger.org.springframework=INFO, STDOUT -log4j.logger.uniresolver=DEBUG, STDOUT diff --git a/resolver/java/.gitignore b/resolver/java/.gitignore index afe7f9e98..2de2a70fc 100644 --- a/resolver/java/.gitignore +++ b/resolver/java/.gitignore @@ -3,3 +3,5 @@ /.settings/ /target/ /bin/ +/.idea/ +*.iml diff --git a/resolver/java/README.md b/resolver/java/README.md index c7a82f3d3..1c6173fc5 100644 --- a/resolver/java/README.md +++ b/resolver/java/README.md @@ -1,22 +1,18 @@ -![DIF Logo](https://raw.githubusercontent.com/decentralized-identity/decentralized-identity.github.io/master/images/logo-small.png) - -# Universal Resolver - Java Implementation +# Universal Resolver — Java Components This is a Java implementation of a Universal Resolver. See [universal-resolver](https://github.com/decentralized-identity/universal-resolver/) for a general introduction to Universal Resolvers and drivers. -See this [blog post](https://medium.com/decentralized-identity/a-universal-resolver-for-self-sovereign-identifiers-48e6b4a5cc3c) for an introduction. - -See https://uniresolver.io/ for a publicly hosted instance of a Universal Resolver. - ## Build (native Java) -Run: +First, build https://github.com/decentralized-identity/did-common-java + +Then run: - mvn clean install + mvn clean install -pl '!examples' ## Local Resolver -You can use a [Local Resolver](https://github.com/decentralized-identity/universal-resolver-java/tree/master/uni-resolver-client) in your Java project that invokes drivers locally (either directly via their JAVA API or via a Docker REST API). +You can use a [Local Resolver](https://github.com/decentralized-identity/universal-resolver/tree/master/resolver/java/uni-resolver-client) in your Java project that invokes drivers locally (either directly via their JAVA API or via a Docker REST API). Dependency: @@ -26,7 +22,7 @@ Dependency: 0.1-SNAPSHOT -[Example Use](https://github.com/decentralized-identity/universal-resolver-java/blob/master/examples/src/main/java/uniresolver/examples/TestLocalUniResolver.java): +[Example Use](https://github.com/decentralized-identity/universal-resolver/blob/master/resolver/java/examples/src/main/java/uniresolver/examples/TestLocalUniResolver.java): LocalUniResolver uniResolver = LocalUniResolver.getDefault(); uniResolver.getDriver(DidSovDriver.class).setLibIndyPath("./sovrin/lib/"); @@ -45,9 +41,9 @@ Dependency: ## Web Resolver -You can deploy a [Web Resolver](https://github.com/decentralized-identity/universal-resolver-java/tree/master/uni-resolver-web) that can be called by clients and invokes drivers locally (either directly via their JAVA API or via a Docker REST API). +You can deploy a [Web Resolver](https://github.com/decentralized-identity/universal-resolver/tree/master/resolver/java/uni-resolver-web) that can be called by clients and invokes drivers locally (either directly via their JAVA API or via a Docker REST API). -See the [Example Configuration](https://github.com/decentralized-identity/universal-resolver-java/blob/master/uni-resolver-web/src/main/webapp/WEB-INF/applicationContext.xml). +See the [Example Configuration](https://github.com/decentralized-identity/universal-resolver/blob/master/resolver/java/uni-resolver-web/src/main/webapp/WEB-INF/applicationContext.xml). How to run: @@ -55,7 +51,7 @@ How to run: ## Client Resolver -You can use a [Client Resolver](https://github.com/decentralized-identity/universal-resolver-java/tree/master/uni-resolver-client) in your Java project that calls a remote Web Resolver. +You can use a [Client Resolver](https://github.com/decentralized-identity/universal-resolver/tree/master/resolver/java/uni-resolver-client) in your Java project that calls a remote Web Resolver. Dependency: @@ -65,7 +61,7 @@ Dependency: 0.1-SNAPSHOT -[Example Use](https://github.com/decentralized-identity/universal-resolver-java/blob/master/examples/src/main/java/uniresolver/examples/TestClientUniResolver.java): +[Example Use](https://github.com/decentralized-identity/universal-resolver/blob/master/resolver/java/examples/src/main/java/uniresolver/examples/TestClientUniResolver.java): ClientUniResolver uniResolver = new ClientUniResolver(); uniResolver.setResolveUri("https://uniresolver.danubetech.com/1.0/identifiers/"); diff --git a/resolver/java/docker/Dockerfile b/resolver/java/docker/Dockerfile deleted file mode 100644 index 1861bf8e7..000000000 --- a/resolver/java/docker/Dockerfile +++ /dev/null @@ -1,20 +0,0 @@ -# Dockerfile for universalresolver/base - -FROM debian:stretch -MAINTAINER Markus Sabadello - -USER root - -RUN apt-get -y update - -RUN apt-get install -y --no-install-recommends openjdk-8-jdk maven - -ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/ -ENV PATH $JAVA_HOME/bin:$PATH - -# build dependencies - -RUN apt-get install -y --no-install-recommends git - -RUN cd /opt/ && git clone https://github.com/decentralized-identity/did-common-java.git -RUN cd /opt/did-common-java/ && mvn clean install -DskipTests diff --git a/resolver/java/driver-http/.gitignore b/resolver/java/driver-http/.gitignore index 697e1e157..791fd266e 100644 --- a/resolver/java/driver-http/.gitignore +++ b/resolver/java/driver-http/.gitignore @@ -3,3 +3,5 @@ /.settings/ /target /bin/ +/.idea/ +*.iml diff --git a/resolver/java/driver-http/src/main/java/uniresolver/driver/http/HttpDriver.java b/resolver/java/driver-http/src/main/java/uniresolver/driver/http/HttpDriver.java index c084ea35b..9a749a368 100644 --- a/resolver/java/driver-http/src/main/java/uniresolver/driver/http/HttpDriver.java +++ b/resolver/java/driver-http/src/main/java/uniresolver/driver/http/HttpDriver.java @@ -27,6 +27,8 @@ public class HttpDriver implements Driver { + public static final String MIME_TYPES = ResolveResult.MIME_TYPE + "," + DIDDocument.MIME_TYPE + "," + "application/ld+json"; + private static Logger log = LoggerFactory.getLogger(HttpDriver.class); private static final ObjectMapper objectMapper = new ObjectMapper(); @@ -143,6 +145,7 @@ public ResolveResult resolve(String identifier) throws ResolutionException { resolveResult = ResolveResult.fromJson(httpBody); } catch (Exception ex) { + if (log.isWarnEnabled()) log.warn("No RESOLVE RESULT. Maybe DID DOCUMENT: " + httpBody + " (" + ex.getMessage()); resolveResult = ResolveResult.build(DIDDocument.fromJson(httpBody)); } } catch (IOException ex) { @@ -174,8 +177,15 @@ public Map properties() throws ResolutionException { // remote properties - Map remoteProperties = this.remoteProperties(); - if (remoteProperties != null) properties.putAll(remoteProperties); + try { + + Map remoteProperties = this.remoteProperties(); + if (remoteProperties != null) properties.putAll(remoteProperties); + } catch (Exception ex) { + + if (log.isWarnEnabled()) log.warn("Cannot retrieve remote properties: " + ex.getMessage(), ex); + properties.put("remotePropertiesException", ex.getMessage()); + } // done diff --git a/resolver/java/driver/.gitignore b/resolver/java/driver/.gitignore index 697e1e157..791fd266e 100644 --- a/resolver/java/driver/.gitignore +++ b/resolver/java/driver/.gitignore @@ -3,3 +3,5 @@ /.settings/ /target /bin/ +/.idea/ +*.iml diff --git a/resolver/java/driver/docker/Dockerfile b/resolver/java/driver/docker/Dockerfile deleted file mode 100644 index 7f72ff8ca..000000000 --- a/resolver/java/driver/docker/Dockerfile +++ /dev/null @@ -1,12 +0,0 @@ -# Dockerfile for universalresolver/driver - -FROM universalresolver/base -MAINTAINER Markus Sabadello - -# build driver - -ADD . /opt/uni-resolver-java - -RUN cd /opt/uni-resolver-java && mvn clean install -N -DskipTests -RUN cd /opt/uni-resolver-java/uni-resolver-core && mvn install -N -DskipTests -RUN cd /opt/uni-resolver-java/driver && mvn install -N -DskipTests diff --git a/resolver/java/driver/src/main/java/uniresolver/driver/servlet/PropertiesServlet.java b/resolver/java/driver/src/main/java/uniresolver/driver/servlet/PropertiesServlet.java index 729e5df35..7fa9bfe42 100644 --- a/resolver/java/driver/src/main/java/uniresolver/driver/servlet/PropertiesServlet.java +++ b/resolver/java/driver/src/main/java/uniresolver/driver/servlet/PropertiesServlet.java @@ -45,7 +45,7 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) t try { - properties = InitServlet.getDriver().properties(); + properties = InitServlet.getDriver() == null ? null : InitServlet.getDriver().properties(); propertiesString = properties == null ? null : objectMapper.writeValueAsString(properties); } catch (Exception ex) { diff --git a/resolver/java/driver/src/main/java/uniresolver/driver/servlet/ResolveServlet.java b/resolver/java/driver/src/main/java/uniresolver/driver/servlet/ResolveServlet.java index 049f9c958..fd038fd59 100644 --- a/resolver/java/driver/src/main/java/uniresolver/driver/servlet/ResolveServlet.java +++ b/resolver/java/driver/src/main/java/uniresolver/driver/servlet/ResolveServlet.java @@ -37,8 +37,13 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) t String servletPath = request.getServletPath(); String requestPath = request.getRequestURI(); + if (log.isDebugEnabled()) log.debug("contextPath: " + contextPath + ", servletPath: " + servletPath + ", requestPath: " + requestPath); + String identifier = requestPath.substring(contextPath.length() + servletPath.length()); + if (log.isDebugEnabled()) log.debug("processing identifier (1): " + identifier); + if (identifier.startsWith("/")) identifier = identifier.substring(1); + if (log.isDebugEnabled()) log.debug("processing identifier (2): " + identifier); try { diff --git a/resolver/java/examples/.gitignore b/resolver/java/examples/.gitignore index 697e1e157..791fd266e 100644 --- a/resolver/java/examples/.gitignore +++ b/resolver/java/examples/.gitignore @@ -3,3 +3,5 @@ /.settings/ /target /bin/ +/.idea/ +*.iml diff --git a/resolver/java/examples/pom.xml b/resolver/java/examples/pom.xml index b3b943a5f..e8892346f 100644 --- a/resolver/java/examples/pom.xml +++ b/resolver/java/examples/pom.xml @@ -43,6 +43,12 @@ 0.1-SNAPSHOT compile + + decentralized-identity + uni-resolver-driver-did-work + 0.1-SNAPSHOT + compile + diff --git a/resolver/java/examples/sovrin/lib/.gitignore b/resolver/java/examples/sovrin/lib/.gitignore index c12103d43..933576c72 100644 --- a/resolver/java/examples/sovrin/lib/.gitignore +++ b/resolver/java/examples/sovrin/lib/.gitignore @@ -1,2 +1,4 @@ libindy.so +/.idea/ +*.iml diff --git a/resolver/java/examples/src/main/java/uniresolver/examples/TestClientUniResolver.java b/resolver/java/examples/src/main/java/uniresolver/examples/TestClientUniResolver.java index fe8015344..bc2710ca4 100644 --- a/resolver/java/examples/src/main/java/uniresolver/examples/TestClientUniResolver.java +++ b/resolver/java/examples/src/main/java/uniresolver/examples/TestClientUniResolver.java @@ -1,14 +1,13 @@ package uniresolver.examples; import did.DIDDocument; import uniresolver.client.ClientUniResolver; -import uniresolver.result.ResolveResult; public class TestClientUniResolver { public static void main(String[] args) throws Exception { ClientUniResolver uniResolver = new ClientUniResolver(); - uniResolver.setResolveUri("https://uniresolver.danubetech.com/1.0/identifiers/"); + uniResolver.setResolveUri("https://uniresolver.io/1.0/identifiers/"); DIDDocument didDocument1 = uniResolver.resolve("did:sov:WRfXPg8dantKVubE3HX8pw").getDidDocument(); System.out.println(didDocument1.toJson()); diff --git a/resolver/java/examples/src/main/java/uniresolver/examples/TestDriverDidBtcr.java b/resolver/java/examples/src/main/java/uniresolver/examples/TestDriverDidBtcr.java index 65461f06e..3575b3eb9 100644 --- a/resolver/java/examples/src/main/java/uniresolver/examples/TestDriverDidBtcr.java +++ b/resolver/java/examples/src/main/java/uniresolver/examples/TestDriverDidBtcr.java @@ -1,6 +1,6 @@ package uniresolver.examples; +import info.weboftrust.btctxlookup.bitcoinconnection.BlockcypherAPIBitcoinConnection; import uniresolver.driver.did.btcr.DidBtcrDriver; -import uniresolver.driver.did.btcr.bitcoinconnection.BlockcypherAPIBitcoinConnection; import uniresolver.result.ResolveResult; public class TestDriverDidBtcr { @@ -10,7 +10,7 @@ public static void main(String[] args) throws Exception { DidBtcrDriver driver = new DidBtcrDriver(); driver.setBitcoinConnection(BlockcypherAPIBitcoinConnection.get()); - ResolveResult ResolveResult = driver.resolve("did:btcr:xkrn-xzcr-qqlv-j6sl"); + ResolveResult ResolveResult = driver.resolve("did:btcr:xz35-jznz-q6mr-7q6"); System.out.println(ResolveResult.toJson()); } } diff --git a/resolver/java/examples/src/main/java/uniresolver/examples/TestDriverDidWork.java b/resolver/java/examples/src/main/java/uniresolver/examples/TestDriverDidWork.java new file mode 100644 index 000000000..e2fe78f7f --- /dev/null +++ b/resolver/java/examples/src/main/java/uniresolver/examples/TestDriverDidWork.java @@ -0,0 +1,16 @@ +package uniresolver.examples; +import uniresolver.driver.did.work.DIDWorkDriver; +import uniresolver.result.ResolveResult; + +public class TestDriverDidWork { + + public static void main(String[] args) throws Exception { + + DIDWorkDriver driver = new DIDWorkDriver(); + driver.setWorkDomain("https://credentials.id.workday.com"); + driver.setApiKey("sxVQUoDE015VhAs5ep4b57DFA5vT3zqvf1Dm1sGe"); + + ResolveResult ResolveResult = driver.resolve("did:work:2UUHQCd4psvkPLZGnWY33L"); + System.out.println(ResolveResult.toJson()); + } +} diff --git a/resolver/java/examples/src/main/java/uniresolver/examples/TestLocalUniResolver.java b/resolver/java/examples/src/main/java/uniresolver/examples/TestLocalUniResolver.java index 74df3f302..e96c7a4e1 100644 --- a/resolver/java/examples/src/main/java/uniresolver/examples/TestLocalUniResolver.java +++ b/resolver/java/examples/src/main/java/uniresolver/examples/TestLocalUniResolver.java @@ -1,6 +1,6 @@ package uniresolver.examples; +import info.weboftrust.btctxlookup.bitcoinconnection.BlockcypherAPIBitcoinConnection; import uniresolver.driver.did.btcr.DidBtcrDriver; -import uniresolver.driver.did.btcr.bitcoinconnection.BlockcypherAPIBitcoinConnection; import uniresolver.driver.did.sov.DidSovDriver; import uniresolver.local.LocalUniResolver; import uniresolver.result.ResolveResult; @@ -9,18 +9,18 @@ public class TestLocalUniResolver { public static void main(String[] args) throws Exception { - LocalUniResolver uniResolver = LocalUniResolver.getDefault(); + LocalUniResolver uniResolver = new LocalUniResolver(); uniResolver.getDrivers().put("btcr", new DidBtcrDriver()); uniResolver.getDrivers().put("sov", new DidSovDriver()); uniResolver.getDriver(DidSovDriver.class).setLibIndyPath("./sovrin/lib/"); - uniResolver.getDriver(DidSovDriver.class).setPoolConfigs("_;./sovrin/live.txn;stn;./sovrin/stn.txn;danube;./sovrin/11347-05.txn"); - uniResolver.getDriver(DidSovDriver.class).setPoolVersions("_;1;stn;1;danube;2"); + uniResolver.getDriver(DidSovDriver.class).setPoolConfigs("_;./sovrin/mainnet.txn;staging;./sovrin/stagingnet.txn;builder;./sovrin/buildernet.txn;danube;./sovrin/danube.txn"); + uniResolver.getDriver(DidSovDriver.class).setPoolVersions("_;2;staging;2;builder;2;danube;2"); uniResolver.getDriver(DidBtcrDriver.class).setBitcoinConnection(BlockcypherAPIBitcoinConnection.get()); ResolveResult ResolveResult1 = uniResolver.resolve("did:sov:WRfXPg8dantKVubE3HX8pw"); System.out.println(ResolveResult1.toJson()); - ResolveResult ResolveResult2 = uniResolver.resolve("did:btcr:xkrn-xzcr-qqlv-j6sl"); + ResolveResult ResolveResult2 = uniResolver.resolve("did:btcr:xz35-jznz-q6mr-7q6"); System.out.println(ResolveResult2.toJson()); ResolveResult ResolveResult3 = uniResolver.resolve("did:stack:v0:16EMaNw3pkn3v6f2BgnSSs53zAKH4Q8YJg-0"); diff --git a/resolver/java/logo-dif.png b/resolver/java/logo-dif.png deleted file mode 100644 index 3a12d501a..000000000 Binary files a/resolver/java/logo-dif.png and /dev/null differ diff --git a/resolver/java/pom.xml b/resolver/java/pom.xml index 9383e5f46..b32336672 100644 --- a/resolver/java/pom.xml +++ b/resolver/java/pom.xml @@ -80,7 +80,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.3 + 3.8.1 1.8 1.8 @@ -89,7 +89,7 @@ org.apache.maven.plugins maven-source-plugin - 2.4 + 3.1.0 @@ -101,7 +101,7 @@ org.apache.maven.plugins maven-surefire-plugin - 2.18.1 + 2.22.2 ${basedir}/../tmp @@ -109,7 +109,7 @@ org.apache.maven.plugins maven-dependency-plugin - 2.10 + 3.1.1 execution @@ -193,19 +193,19 @@ org.slf4j slf4j-api - 1.7.12 + 1.7.25 compile org.slf4j jcl-over-slf4j - 1.7.12 + 1.7.25 compile org.slf4j slf4j-log4j12 - 1.7.12 + 1.7.25 compile diff --git a/resolver/java/uni-resolver-client/.gitignore b/resolver/java/uni-resolver-client/.gitignore index 697e1e157..791fd266e 100644 --- a/resolver/java/uni-resolver-client/.gitignore +++ b/resolver/java/uni-resolver-client/.gitignore @@ -3,3 +3,5 @@ /.settings/ /target /bin/ +/.idea/ +*.iml diff --git a/resolver/java/uni-resolver-client/docker/Dockerfile b/resolver/java/uni-resolver-client/docker/Dockerfile new file mode 100644 index 000000000..1cd517daa --- /dev/null +++ b/resolver/java/uni-resolver-client/docker/Dockerfile @@ -0,0 +1,19 @@ +# Dockerfile for universalresolver/uni-resolver-client + +FROM maven:3-jdk-8 +MAINTAINER Markus Sabadello + +USER root + +# build dependencies + +RUN cd /opt/ && git clone https://github.com/decentralized-identity/did-common-java.git +RUN cd /opt/did-common-java/ && mvn clean install -DskipTests + +# build uni-resolver-client + +ADD ./resolver/java/ /opt/uni-resolver-java + +RUN cd /opt/uni-resolver-java && mvn clean install -N -DskipTests && mvn clean && \ + cd /opt/uni-resolver-java/uni-resolver-core && mvn clean install -N -DskipTests && mvn clean && \ + cd /opt/uni-resolver-java/uni-resolver-client && mvn clean install -N -DskipTests && mvn clean diff --git a/resolver/java/uni-resolver-client/src/main/java/uniresolver/client/ClientUniResolver.java b/resolver/java/uni-resolver-client/src/main/java/uniresolver/client/ClientUniResolver.java index dbfde3746..376a0d3a9 100644 --- a/resolver/java/uni-resolver-client/src/main/java/uniresolver/client/ClientUniResolver.java +++ b/resolver/java/uni-resolver-client/src/main/java/uniresolver/client/ClientUniResolver.java @@ -46,7 +46,7 @@ public ResolveResult resolve(String identifier) throws ResolutionException { } @Override - public ResolveResult resolve(String identifier, String selectServiceType) throws ResolutionException { + public ResolveResult resolve(String identifier, Map options) throws ResolutionException { if (identifier == null) throw new NullPointerException(); diff --git a/resolver/java/uni-resolver-core/.gitignore b/resolver/java/uni-resolver-core/.gitignore index 697e1e157..791fd266e 100644 --- a/resolver/java/uni-resolver-core/.gitignore +++ b/resolver/java/uni-resolver-core/.gitignore @@ -3,3 +3,5 @@ /.settings/ /target /bin/ +/.idea/ +*.iml diff --git a/resolver/java/uni-resolver-core/pom.xml b/resolver/java/uni-resolver-core/pom.xml index 2cce3b474..5e0347f89 100644 --- a/resolver/java/uni-resolver-core/pom.xml +++ b/resolver/java/uni-resolver-core/pom.xml @@ -19,6 +19,18 @@ 0.1-SNAPSHOT compile + + com.fasterxml.jackson.core + jackson-core + 2.10.1 + compile + + + com.fasterxml.jackson.core + jackson-databind + 2.10.1 + compile + diff --git a/resolver/java/uni-resolver-core/src/main/java/uniresolver/UniResolver.java b/resolver/java/uni-resolver-core/src/main/java/uniresolver/UniResolver.java index 1ef4b82b9..57540734f 100644 --- a/resolver/java/uni-resolver-core/src/main/java/uniresolver/UniResolver.java +++ b/resolver/java/uni-resolver-core/src/main/java/uniresolver/UniResolver.java @@ -9,6 +9,6 @@ public interface UniResolver { public static final String PROPERTIES_MIME_TYPE = "application/json"; public ResolveResult resolve(String identifier) throws ResolutionException; - public ResolveResult resolve(String identifier, String selectServiceType) throws ResolutionException; + public ResolveResult resolve(String identifier, Map options) throws ResolutionException; public Map> properties() throws ResolutionException; } diff --git a/resolver/java/uni-resolver-core/src/main/java/uniresolver/result/ResolveResult.java b/resolver/java/uni-resolver-core/src/main/java/uniresolver/result/ResolveResult.java index 827457c4e..948ccbfbc 100644 --- a/resolver/java/uni-resolver-core/src/main/java/uniresolver/result/ResolveResult.java +++ b/resolver/java/uni-resolver-core/src/main/java/uniresolver/result/ResolveResult.java @@ -5,7 +5,9 @@ import java.util.HashMap; import java.util.Map; +import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonGetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.annotation.JsonRawValue; @@ -17,18 +19,22 @@ import did.DIDDocument; -@JsonPropertyOrder({ "redirect", "didDocument", "resolverMetadata", "methodMetadata" }) +@JsonPropertyOrder({ "didDocument", "resolverMetadata", "methodMetadata" }) +@JsonIgnoreProperties(ignoreUnknown=true) public class ResolveResult { - public static final String MIME_TYPE = "application/json"; + public static final String MIME_TYPE = "application/ld+json;profile=\"https://w3c-ccg.github.io/did-resolution/\""; private static final ObjectMapper objectMapper = new ObjectMapper(); @JsonProperty - private String redirect; + private DIDDocument didDocument; @JsonProperty - private DIDDocument didDocument; + private Object content; + + @JsonProperty + private String contentType; @JsonProperty private Map resolverMetadata; @@ -36,14 +42,11 @@ public class ResolveResult { @JsonProperty private Map methodMetadata; - private ResolveResult() { - - } + private ResolveResult(DIDDocument didDocument, Object content, String contentType, Map resolverMetadata, Map methodMetadata) { - private ResolveResult(String redirect, DIDDocument didDocument, Map resolverMetadata, Map methodMetadata) { - - this.redirect = redirect; this.didDocument = didDocument; + this.content = content; + this.contentType = contentType; this.resolverMetadata = resolverMetadata; this.methodMetadata = methodMetadata; } @@ -52,24 +55,44 @@ private ResolveResult(String redirect, DIDDocument didDocument, Map resolverMetadata, Map methodMetadata) { + @JsonCreator + public static ResolveResult build(@JsonProperty(value="didDocument", required=true) DIDDocument didDocument, @JsonProperty(value="content", required=false) Object content, @JsonProperty(value="contentType", required=false) String contentType, @JsonProperty(value="resolverMetadata", required=true) Map resolverMetadata, @JsonProperty(value="methodMetadata", required=true) Map methodMetadata) { - return new ResolveResult(redirect, didDocument, resolverMetadata, methodMetadata); + return new ResolveResult(didDocument, content, contentType, resolverMetadata, methodMetadata); } public static ResolveResult build(DIDDocument didDocument, Map resolverMetadata, Map methodMetadata) { - return new ResolveResult(null, didDocument, resolverMetadata, methodMetadata); + return new ResolveResult(didDocument, null, DIDDocument.MIME_TYPE, resolverMetadata, methodMetadata); } public static ResolveResult build(DIDDocument didDocument) { - return new ResolveResult(null, didDocument, new HashMap (), new HashMap ()); + return new ResolveResult(didDocument, null, DIDDocument.MIME_TYPE, new HashMap (), new HashMap ()); + } + + public static ResolveResult build(Map didDocument) { + + return new ResolveResult(DIDDocument.build(didDocument), null, DIDDocument.MIME_TYPE, new HashMap (), new HashMap ()); } public static ResolveResult build() { - return new ResolveResult(null, DIDDocument.build(new HashMap ()), new HashMap (), new HashMap ()); + return new ResolveResult(null, null, null, new HashMap (), new HashMap ()); + } + + public ResolveResult copy() { + + return new ResolveResult(this.getDidDocument(), this.getContent(), this.getContentType(), this.getResolverMetadata(), this.getMethodMetadata()); + } + + public void reset() { + + this.setDidDocument(null); + this.setContent(null); + this.setContentType(null); + this.setResolverMetadata(new HashMap ()); + this.setMethodMetadata(new HashMap ()); } /* @@ -95,33 +118,40 @@ public String toJson() throws JsonProcessingException { * Getters and setters */ - @JsonGetter - public final String getRedirect() { + @JsonRawValue + public final DIDDocument getDidDocument() { - return this.redirect; + return this.didDocument; } @JsonSetter - public final void setRedirect(String redirect) { + public final void setDidDocument(DIDDocument didDocument) { - this.redirect = redirect; + this.didDocument = didDocument; } - @JsonRawValue - public final DIDDocument getDidDocument() { + @JsonGetter + public Object getContent() { - return this.didDocument; + return this.content; } - public final void setDidDocument(DIDDocument didDocument) { + @JsonSetter + public void setContent(Object content) { - this.didDocument = didDocument; + this.content = content; + } + + @JsonGetter + public String getContentType() { + + return this.contentType; } @JsonSetter - public final void setDidDocument(Map jsonLdObject) { + public void setContentType(String contentType) { - this.didDocument = DIDDocument.build(jsonLdObject); + this.contentType = contentType; } @JsonGetter @@ -147,4 +177,20 @@ public final void setMethodMetadata(Map methodMetadata) { this.methodMetadata = methodMetadata; } + + /* + * Object methods + */ + + @Override + public String toString() { + + try { + + return this.toJson(); + } catch (JsonProcessingException ex) { + + return ex.getMessage(); + } + } } diff --git a/resolver/java/uni-resolver-local/.gitignore b/resolver/java/uni-resolver-local/.gitignore index 697e1e157..791fd266e 100644 --- a/resolver/java/uni-resolver-local/.gitignore +++ b/resolver/java/uni-resolver-local/.gitignore @@ -3,3 +3,5 @@ /.settings/ /target /bin/ +/.idea/ +*.iml diff --git a/resolver/java/uni-resolver-local/pom.xml b/resolver/java/uni-resolver-local/pom.xml index 11d418ddf..afd9614b5 100644 --- a/resolver/java/uni-resolver-local/pom.xml +++ b/resolver/java/uni-resolver-local/pom.xml @@ -1,4 +1,5 @@ - 4.0.0 @@ -31,6 +32,12 @@ 0.1-SNAPSHOT compile + + com.google.code.gson + gson + 2.8.5 + compile + diff --git a/resolver/java/uni-resolver-local/src/main/java/uniresolver/local/LocalUniResolver.java b/resolver/java/uni-resolver-local/src/main/java/uniresolver/local/LocalUniResolver.java index 605318c23..8cd31d3ce 100644 --- a/resolver/java/uni-resolver-local/src/main/java/uniresolver/local/LocalUniResolver.java +++ b/resolver/java/uni-resolver-local/src/main/java/uniresolver/local/LocalUniResolver.java @@ -1,9 +1,14 @@ package uniresolver.local; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.io.Reader; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; -import java.util.LinkedHashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -11,166 +16,185 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import did.DID; +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; + +import did.DIDDocument; +import did.DIDURL; import did.parser.ParserException; import uniresolver.ResolutionException; import uniresolver.UniResolver; import uniresolver.driver.Driver; +import uniresolver.driver.http.HttpDriver; +import uniresolver.local.extensions.Extension; +import uniresolver.local.extensions.ExtensionStatus; import uniresolver.result.ResolveResult; public class LocalUniResolver implements UniResolver { private static Logger log = LoggerFactory.getLogger(LocalUniResolver.class); - private static final LocalUniResolver DEFAULT_RESOLVER; - private Map drivers = new HashMap (); + private List extensions = new ArrayList (); - static { + public LocalUniResolver() { - DEFAULT_RESOLVER = new LocalUniResolver(); } - public LocalUniResolver() { + public static LocalUniResolver fromConfigFile(String filePath) throws FileNotFoundException, IOException { - } + final Gson gson = new Gson(); - public static LocalUniResolver getDefault() { + Map drivers = new HashMap (); - return DEFAULT_RESOLVER; - } + try (Reader reader = new FileReader(new File(filePath))) { - @Override - public ResolveResult resolve(String identifier) throws ResolutionException { + JsonObject jsonObjectRoot = gson.fromJson(reader, JsonObject.class); + JsonArray jsonArrayDrivers = jsonObjectRoot.getAsJsonArray("drivers"); - return this.resolve(identifier, null); - } + int i = 0; - @Override - public ResolveResult resolve(String identifier, String selectServiceType) throws ResolutionException { + for (Iterator jsonElementsDrivers = jsonArrayDrivers.iterator(); jsonElementsDrivers.hasNext(); ) { - if (identifier == null) throw new NullPointerException(); + i++; - if (this.getDrivers() == null) throw new ResolutionException("No drivers configured."); + JsonObject jsonObjectDriver = (JsonObject) jsonElementsDrivers.next(); - // start time + String id = jsonObjectDriver.has("id") ? jsonObjectDriver.get("id").getAsString() : null; + String pattern = jsonObjectDriver.has("pattern") ? jsonObjectDriver.get("pattern").getAsString() : null; + String image = jsonObjectDriver.has("image") ? jsonObjectDriver.get("image").getAsString() : null; + String imagePort = jsonObjectDriver.has("imagePort") ? jsonObjectDriver.get("imagePort").getAsString() : null; + String imageProperties = jsonObjectDriver.has("imageProperties") ? jsonObjectDriver.get("imageProperties").getAsString() : null; + String url = jsonObjectDriver.has("url") ? jsonObjectDriver.get("url").getAsString() : null; - long start = System.currentTimeMillis(); + if (pattern == null) throw new IllegalArgumentException("Missing 'pattern' entry in driver configuration."); + if (image == null && url == null) throw new IllegalArgumentException("Missing 'image' and 'url' entry in driver configuration (need either one)."); - // try all drivers + HttpDriver driver = new HttpDriver(); + driver.setPattern(pattern); - ResolveResult ResolveResult = null; - String usedDriverId = null; - Driver usedDriver = null; + if (url != null) { - for (Entry driver : this.getDrivers().entrySet()) { + driver.setResolveUri(url); + } else { - if (log.isDebugEnabled()) log.debug("Attemping to resolve " + identifier + " with driver " + driver.getValue().getClass()); - ResolveResult = driver.getValue().resolve(identifier); + String httpDriverUri = image.substring(image.indexOf("/") + 1); + if (httpDriverUri.contains(":")) httpDriverUri = httpDriverUri.substring(0, httpDriverUri.indexOf(":")); + httpDriverUri = "http://" + httpDriverUri + ":" + (imagePort != null ? imagePort : "8080" ) + "/"; - if (ResolveResult != null) { + driver.setResolveUri(httpDriverUri + "1.0/identifiers/$1"); - usedDriverId = driver.getKey(); - usedDriver = driver.getValue(); - break; + if ("true".equals(imageProperties)) { + + driver.setPropertiesUri(httpDriverUri + "1.0/properties"); + } + } + + if (id == null) { + + id = "driver"; + if (image != null) id += "-" + image; + if (image == null || drivers.containsKey(id)) id += "-" + Integer.toString(i); + } + + drivers.put(id, driver); + + if (log.isInfoEnabled()) log.info("Added driver '" + id + "' at " + driver.getResolveUri() + " (" + driver.getPropertiesUri() + ")"); } } - if (log.isDebugEnabled()) log.debug("Resolved " + identifier + " with driver " + usedDriverId); + LocalUniResolver localUniResolver = new LocalUniResolver(); + localUniResolver.setDrivers(drivers); - // result contains a new did? + return localUniResolver; + } - List initialIdentifiers = new ArrayList (); - List initialResolveResults = new ArrayList (); + @Override + public ResolveResult resolve(String identifier) throws ResolutionException { - while (ResolveResult != null && ResolveResult.getMethodMetadata().containsKey("did")) { + return this.resolve(identifier, null); + } - initialIdentifiers.add(identifier); - initialResolveResults.add(ResolveResult); + @Override + public ResolveResult resolve(String identifier, Map options) throws ResolutionException { - identifier = (String) ResolveResult.getMethodMetadata().get("did"); + if (identifier == null) throw new NullPointerException(); - for (Entry driver : this.getDrivers().entrySet()) { + if (this.getDrivers() == null) throw new ResolutionException("No drivers configured."); - if (log.isDebugEnabled()) log.debug("Attemping to resolve " + identifier + " with driver " + driver.getValue().getClass()); - ResolveResult = driver.getValue().resolve(identifier); + // start time - if (ResolveResult != null) { + long start = System.currentTimeMillis(); - usedDriverId = driver.getKey(); - usedDriver = driver.getValue(); - break; - } - } + // prepare resolve result - if (log.isDebugEnabled()) log.debug("Resolved " + identifier + " with driver " + usedDriverId); - } + ResolveResult resolveResult = ResolveResult.build(); + ExtensionStatus extensionStatus = new ExtensionStatus(); - if (initialIdentifiers.isEmpty()) initialIdentifiers = null; - if (initialResolveResults.isEmpty()) initialResolveResults = null; + // parse DID URL - // stop time + DIDURL didUrl = null; - long stop = System.currentTimeMillis(); + try { - // no driver was able to fulfill a request? + didUrl = DIDURL.fromString(identifier); + resolveResult.getResolverMetadata().put("didUrl", didUrl.toJsonObject()); - if (ResolveResult == null && initialResolveResults != null && initialIdentifiers != null) { + log.debug("Identifier " + identifier + " is a valid DID URL: " + didUrl.getDid()); + } catch (IllegalArgumentException | ParserException ex) { - identifier = initialIdentifiers.get(0); - ResolveResult = initialResolveResults.get(0); - if (log.isDebugEnabled()) log.debug("Falling back to initial identifier and resolve result: " + identifier); + log.debug("Identifier " + identifier + " is not a valid DID URL: " + ex.getMessage()); } - if (ResolveResult == null) { + // execute extensions (before) + + if (! extensionStatus.skipExtensionsBefore()) { + + for (Extension extension : this.getExtensions()) { - if (log.isDebugEnabled()) log.debug("No resolve result."); - return null; + extensionStatus.or(extension.beforeResolve(identifier, didUrl, options, resolveResult, this)); + if (extensionStatus.skipExtensionsBefore()) break; + } } - // parse DID + // try all drivers - DID didReference = null; + if (! extensionStatus.skipDriver()) { - try { + String resolveIdentifier = didUrl != null ? didUrl.getDid().getDidString() : identifier; + if (log.isDebugEnabled()) log.debug("Resolving identifier: " + resolveIdentifier); - didReference = DID.fromString(identifier); - log.debug("identifier " + identifier + " is a valid DID reference: " + didReference.getDid()); + ResolveResult driverResolveResult = ResolveResult.build(); + this.resolveWithDrivers(resolveIdentifier, driverResolveResult); - identifier = didReference.getDid(); - } catch (IllegalArgumentException | ParserException ex) { + resolveResult.setDidDocument(driverResolveResult.getDidDocument()); + resolveResult.setMethodMetadata(driverResolveResult.getMethodMetadata()); - log.debug("Identifier " + identifier + " is not a valid DID reference: " + ex.getMessage()); + resolveResult.getResolverMetadata().putAll(driverResolveResult.getResolverMetadata()); } - // service selection - - String selectServiceName = didReference != null ? didReference.getService() : null; - Integer[] selectedServices; + // execute extensions (after) - if (selectServiceName == null && selectServiceType == null) { + if (! extensionStatus.skipExtensionsAfter()) { - selectedServices = null; - } else { + for (Extension extension : this.getExtensions()) { - selectedServices = ResolveResult.getDidDocument().selectServices(selectServiceName, selectServiceType); + extensionStatus.or(extension.afterResolve(identifier, didUrl, options, resolveResult, this)); + if (extensionStatus.skipExtensionsAfter()) break; + } } - // add RESOLVER METADATA + // stop time - Map resolverMetadata = new LinkedHashMap (); - resolverMetadata.put("driverId", usedDriverId); - resolverMetadata.put("driver", usedDriver.getClass().getSimpleName()); - resolverMetadata.put("duration", Long.valueOf(stop - start)); - if (initialIdentifiers != null) resolverMetadata.put("initialIdentifiers", initialIdentifiers); - if (didReference != null) resolverMetadata.put("didReference", didReference); - if (selectedServices != null) resolverMetadata.put("selectedServices", selectedServices); + long stop = System.currentTimeMillis(); - ResolveResult.setResolverMetadata(resolverMetadata); + resolveResult.getResolverMetadata().put("duration", Long.valueOf(stop - start)); // done - return ResolveResult; + return resolveResult; } @Override @@ -195,6 +219,44 @@ public Map> properties() throws ResolutionException return properties; } + public void resolveWithDrivers(String resolveIdentifier, ResolveResult resolveResult) throws ResolutionException { + + ResolveResult driverResolveResult = null; + String usedDriverId = null; + + for (Entry driver : this.getDrivers().entrySet()) { + + if (log.isDebugEnabled()) log.debug("Attemping to resolve " + resolveIdentifier + " with driver " + driver.getValue().getClass()); + driverResolveResult = driver.getValue().resolve(resolveIdentifier); + + if (driverResolveResult != null && driverResolveResult.getDidDocument() != null && driverResolveResult.getDidDocument().getJsonLdObject().isEmpty()) { + + driverResolveResult.setDidDocument((DIDDocument) null); + } + + if (driverResolveResult != null) { + + usedDriverId = driver.getKey(); + + resolveResult.setDidDocument(driverResolveResult.getDidDocument()); + resolveResult.setMethodMetadata(driverResolveResult.getMethodMetadata()); + + break; + } + } + + if (usedDriverId != null) { + + resolveResult.getResolverMetadata().put("driverId", usedDriverId); + if (log.isDebugEnabled()) log.debug("Resolved " + resolveIdentifier + " with driver " + usedDriverId); + } else { + + if (log.isDebugEnabled()) log.debug("No result with " + this.getDrivers().size() + " drivers."); + } + + resolveResult.getResolverMetadata().put("identifier", resolveIdentifier); + } + /* * Getters and setters */ @@ -219,4 +281,14 @@ public void setDrivers(Map drivers) { this.drivers = drivers; } + + public List getExtensions() { + + return this.extensions; + } + + public void setExtensions(List extensions) { + + this.extensions = extensions; + } } diff --git a/resolver/java/uni-resolver-local/src/main/java/uniresolver/local/extensions/Extension.java b/resolver/java/uni-resolver-local/src/main/java/uniresolver/local/extensions/Extension.java new file mode 100644 index 000000000..a97f15cc6 --- /dev/null +++ b/resolver/java/uni-resolver-local/src/main/java/uniresolver/local/extensions/Extension.java @@ -0,0 +1,29 @@ +package uniresolver.local.extensions; + +import java.util.Map; + +import did.DIDURL; +import uniresolver.ResolutionException; +import uniresolver.local.LocalUniResolver; +import uniresolver.result.ResolveResult; + +public interface Extension { + + public ExtensionStatus beforeResolve(String identifier, DIDURL didUrl, Map options, ResolveResult resolveResult, LocalUniResolver localUniResolver) throws ResolutionException; + public ExtensionStatus afterResolve(String identifier, DIDURL didUrl, Map options, ResolveResult resolveResult, LocalUniResolver localUniResolver) throws ResolutionException; + + public abstract static class AbstractExtension implements Extension { + + @Override + public ExtensionStatus beforeResolve(String identifier, DIDURL didUrl, Map options, ResolveResult resolveResult, LocalUniResolver localUniResolver) throws ResolutionException { + + return null; + } + + @Override + public ExtensionStatus afterResolve(String identifier, DIDURL didUrl, Map options, ResolveResult resolveResult, LocalUniResolver localUniResolver) throws ResolutionException { + + return null; + } + } +} diff --git a/resolver/java/uni-resolver-local/src/main/java/uniresolver/local/extensions/ExtensionStatus.java b/resolver/java/uni-resolver-local/src/main/java/uniresolver/local/extensions/ExtensionStatus.java new file mode 100644 index 000000000..a381888a8 --- /dev/null +++ b/resolver/java/uni-resolver-local/src/main/java/uniresolver/local/extensions/ExtensionStatus.java @@ -0,0 +1,50 @@ +package uniresolver.local.extensions; + +public class ExtensionStatus { + + public static final ExtensionStatus DEFAULT = new ExtensionStatus(false, false, false); + + public static final ExtensionStatus SKIP_EXTENSION_BEFORE = new ExtensionStatus(true, false, false); + public static final ExtensionStatus SKIP_DRIVER = new ExtensionStatus(false, true, false); + public static final ExtensionStatus SKIP_EXTENSIONS_AFTER = new ExtensionStatus(false, false, true); + + private boolean skipExtensionsBefore; + private boolean skipDriver; + private boolean skipExtensionsAfter; + + public ExtensionStatus(boolean skipExtensionsBefore, boolean skipDriver, boolean skipExtensionsAfter) { + + this.skipExtensionsBefore = skipExtensionsBefore; + this.skipDriver = skipDriver; + this.skipExtensionsAfter = skipExtensionsAfter; + } + + public ExtensionStatus() { + + this(false, false, false); + } + + public void or(ExtensionStatus extensionStatus) { + + if (extensionStatus == null) return; + + this.skipExtensionsBefore |= extensionStatus.skipExtensionsBefore; + this.skipDriver |= extensionStatus.skipDriver; + this.skipExtensionsAfter |= extensionStatus.skipExtensionsAfter; + } + + public boolean skipExtensionsBefore() { + + return this.skipExtensionsBefore; + } + + public boolean skipDriver() { + + return this.skipDriver; + } + + public boolean skipExtensionsAfter() { + + return this.skipExtensionsAfter; + } +} diff --git a/resolver/java/uni-resolver-local/src/main/java/uniresolver/local/extensions/ParameterExtension.java b/resolver/java/uni-resolver-local/src/main/java/uniresolver/local/extensions/ParameterExtension.java new file mode 100644 index 000000000..e656d29c0 --- /dev/null +++ b/resolver/java/uni-resolver-local/src/main/java/uniresolver/local/extensions/ParameterExtension.java @@ -0,0 +1,15 @@ +package uniresolver.local.extensions; + +public interface ParameterExtension extends Extension { + + public String[] handlesParameters(); + + public abstract static class AbstractParameterExtension extends AbstractExtension implements ParameterExtension { + + @Override + public String[] handlesParameters() { + + return new String[0]; + } + } +} diff --git a/resolver/java/uni-resolver-local/src/main/java/uniresolver/local/extensions/impl/RedirectExtension.java b/resolver/java/uni-resolver-local/src/main/java/uniresolver/local/extensions/impl/RedirectExtension.java new file mode 100644 index 000000000..332383933 --- /dev/null +++ b/resolver/java/uni-resolver-local/src/main/java/uniresolver/local/extensions/impl/RedirectExtension.java @@ -0,0 +1,45 @@ +package uniresolver.local.extensions.impl; + +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import did.DIDURL; +import uniresolver.ResolutionException; +import uniresolver.local.LocalUniResolver; +import uniresolver.local.extensions.Extension; +import uniresolver.local.extensions.ExtensionStatus; +import uniresolver.local.extensions.Extension.AbstractExtension; +import uniresolver.result.ResolveResult; + +public class RedirectExtension extends AbstractExtension implements Extension { + + private static Logger log = LoggerFactory.getLogger(RedirectExtension.class); + + @Override + public ExtensionStatus afterResolve(String identifier, DIDURL didUrl, Map options, ResolveResult resolveResult, LocalUniResolver localUniResolver) throws ResolutionException { + + if (! resolveResult.getMethodMetadata().containsKey("redirect")) return ExtensionStatus.DEFAULT; + + while (resolveResult.getMethodMetadata().containsKey("redirect")) { + + String resolveIdentifier = (String) resolveResult.getMethodMetadata().get("redirect"); + if (log.isDebugEnabled()) log.debug("Resolving identifier: " + resolveIdentifier); + + ResolveResult previousResolveResult = resolveResult.copy(); + resolveResult.reset(); + resolveResult.getResolverMetadata().put("previous", previousResolveResult); + + ResolveResult driverResolveResult = ResolveResult.build(); + localUniResolver.resolveWithDrivers(resolveIdentifier, driverResolveResult); + + resolveResult.setDidDocument(driverResolveResult.getDidDocument()); + resolveResult.setMethodMetadata(driverResolveResult.getMethodMetadata()); + + resolveResult.getResolverMetadata().putAll(driverResolveResult.getResolverMetadata()); + } + + return ExtensionStatus.DEFAULT; + } +} diff --git a/resolver/java/uni-resolver-local/src/main/java/uniresolver/local/extensions/impl/ServiceParameterExtension.java b/resolver/java/uni-resolver-local/src/main/java/uniresolver/local/extensions/impl/ServiceParameterExtension.java new file mode 100644 index 000000000..b110ea4d3 --- /dev/null +++ b/resolver/java/uni-resolver-local/src/main/java/uniresolver/local/extensions/impl/ServiceParameterExtension.java @@ -0,0 +1,136 @@ +package uniresolver.local.extensions.impl; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import did.DIDDocument; +import did.DIDURL; +import did.PublicKey; +import did.Service; +import did.parser.ParserException; +import uniresolver.ResolutionException; +import uniresolver.local.LocalUniResolver; +import uniresolver.local.extensions.ExtensionStatus; +import uniresolver.local.extensions.ParameterExtension; +import uniresolver.local.extensions.ParameterExtension.AbstractParameterExtension; +import uniresolver.result.ResolveResult; + +public class ServiceParameterExtension extends AbstractParameterExtension implements ParameterExtension { + + private static Logger log = LoggerFactory.getLogger(ServiceParameterExtension.class); + + private static final String[] HANDLES_PARAMETERS = new String[] { "service", "service-type", "key", "key-type" }; + + @Override + public String[] handlesParameters() { + + return HANDLES_PARAMETERS; + } + + @Override + public ExtensionStatus afterResolve(String identifier, DIDURL didUrl, Map options, ResolveResult resolveResult, LocalUniResolver localUniResolver) throws ResolutionException { + + if (didUrl == null) return ExtensionStatus.DEFAULT; + if (didUrl .getParametersMap() == null) return ExtensionStatus.DEFAULT; + if (! (didUrl.getParametersMap().containsKey("service") || didUrl.getParametersMap().containsKey("service-type") || didUrl.getParametersMap().containsKey("key") || didUrl.getParametersMap().containsKey("key-type"))) return ExtensionStatus.DEFAULT; + + Integer[] selectedServices = null; + + String selectServiceName = didUrl.getParametersMap().get("service"); + String selectServiceType = didUrl.getParametersMap().get("service-type"); + + if (selectServiceName != null || selectServiceType != null) { + + selectedServices = selectServices(resolveResult.getDidDocument(), selectServiceName, selectServiceType).keySet().toArray(new Integer[0]); + + if (log.isDebugEnabled()) log.debug("Selected services: " + Arrays.asList(selectedServices)); + } + + Integer[] selectedKeys = null; + + String selectKeyName = didUrl.getParametersMap().get("key"); + String selectKeyType = didUrl.getParametersMap().get("key-type"); + + if (selectKeyName != null || selectKeyType != null) { + + selectedKeys = selectKeys(resolveResult.getDidDocument(), selectKeyName, selectKeyType).keySet().toArray(new Integer[0]); + + if (log.isDebugEnabled()) log.debug("Selected keys: " + Arrays.asList(selectedKeys)); + } + + if (selectedServices != null) resolveResult.getResolverMetadata().put("selectedServices", selectedServices); + if (selectedKeys != null) resolveResult.getResolverMetadata().put("selectedKeys", selectedKeys); + + return ExtensionStatus.DEFAULT; + } + + /* + * Helper methods + */ + + public static Map selectServices(DIDDocument didDocument, String selectServiceName, String selectServiceType) { + + int i = -1; + Map selectedServices = new HashMap (); + if (didDocument.getServices() == null) return selectedServices; + + for (Service service : didDocument.getServices()) { + + i++; + + if (selectServiceName != null && service.getId() != null) { + + DIDURL serviceDidUrl; + try { serviceDidUrl = DIDURL.fromString(service.getId()); } catch (ParserException ex) { serviceDidUrl = null; } + String serviceName = serviceDidUrl == null ? null : serviceDidUrl.getFragment(); + + if (serviceName == null) continue; + if (! serviceName.equals(selectServiceName)) continue; + } + + if (selectServiceType != null & service.getTypes() != null) { + + if (! Arrays.asList(service.getTypes()).contains(selectServiceType)) continue; + } + + selectedServices.put(Integer.valueOf(i), service); + } + + return selectedServices; + } + + public static Map selectKeys(DIDDocument didDocument, String selectKeyName, String selectKeyType) { + + int i = -1; + Map selectedKeys = new HashMap (); + if (didDocument.getPublicKeys() == null) return selectedKeys; + + for (PublicKey publicKey : didDocument.getPublicKeys()) { + + i++; + + if (selectKeyName != null && publicKey.getId() != null) { + + DIDURL publicKeyDidUrl; + try { publicKeyDidUrl = DIDURL.fromString(publicKey.getId()); } catch (ParserException ex) { publicKeyDidUrl = null; } + String publicKeyName = publicKeyDidUrl == null ? null : publicKeyDidUrl.getFragment(); + + if (publicKeyName == null) continue; + if (! publicKeyName.equals(selectKeyName)) continue; + } + + if (selectKeyType != null && publicKey.getTypes() != null) { + + if (! Arrays.asList(publicKey.getTypes()).contains(selectKeyType)) continue; + } + + selectedKeys.put(Integer.valueOf(i), publicKey); + } + + return selectedKeys; + } +} diff --git a/resolver/java/uni-resolver-web/.gitignore b/resolver/java/uni-resolver-web/.gitignore index 697e1e157..791fd266e 100644 --- a/resolver/java/uni-resolver-web/.gitignore +++ b/resolver/java/uni-resolver-web/.gitignore @@ -3,3 +3,5 @@ /.settings/ /target /bin/ +/.idea/ +*.iml diff --git a/resolver/java/uni-resolver-web/docker/Dockerfile b/resolver/java/uni-resolver-web/docker/Dockerfile index 36ec3308c..1429e41cc 100644 --- a/resolver/java/uni-resolver-web/docker/Dockerfile +++ b/resolver/java/uni-resolver-web/docker/Dockerfile @@ -1,24 +1,32 @@ # Dockerfile for universalresolver/uni-resolver-web -FROM universalresolver/base +FROM maven:3-jdk-8 MAINTAINER Markus Sabadello +USER root + +# build dependencies + +RUN cd /opt/ && git clone https://github.com/decentralized-identity/did-common-java.git +RUN cd /opt/did-common-java/ && mvn clean install -DskipTests + +RUN mvn org.apache.maven.plugins:maven-dependency-plugin:3.1.1:get -DrepoUrl=https://repo.maven.apache.org/maven2 -Dartifact=org.eclipse.jetty:jetty-maven-plugin:9.4.18.v20190429 +RUN mvn org.apache.maven.plugins:maven-dependency-plugin:3.1.1:get -DrepoUrl=https://repo.maven.apache.org/maven2 -Dartifact=org.apache.maven.plugins:maven-war-plugin:3.2.2 + # build uni-resolver-web -ADD . /opt/uni-resolver-java +ADD ./resolver/java/ /opt/uni-resolver-java +ADD ./config.json /opt/uni-resolver-java/uni-resolver-web/ -RUN cd /opt/uni-resolver-java && mvn clean -RUN cd /opt/uni-resolver-java && mvn install -N -DskipTests -RUN cd /opt/uni-resolver-java/uni-resolver-core && mvn install -N -DskipTests -RUN cd /opt/uni-resolver-java/driver && mvn install -N -DskipTests -RUN cd /opt/uni-resolver-java/driver-http && mvn install -N -DskipTests -RUN cd /opt/uni-resolver-java/uni-resolver-local && mvn install -N -DskipTests -RUN cd /opt/uni-resolver-java/uni-resolver-web && mvn install -N -DskipTests +RUN cd /opt/uni-resolver-java && mvn clean install -N -DskipTests && mvn clean && \ + cd /opt/uni-resolver-java/uni-resolver-core && mvn clean install -N -DskipTests && mvn clean && \ + cd /opt/uni-resolver-java/driver && mvn clean install -N -DskipTests && mvn clean && \ + cd /opt/uni-resolver-java/driver-http && mvn clean install -N -DskipTests && mvn clean && \ + cd /opt/uni-resolver-java/uni-resolver-local && mvn clean install -N -DskipTests && mvn clean && \ + cd /opt/uni-resolver-java/uni-resolver-web && mvn clean install package -N -DskipTests # done -RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* - EXPOSE 8080 RUN chmod a+rx /opt/uni-resolver-java/uni-resolver-web/docker/run-uni-resolver-web.sh diff --git a/resolver/java/uni-resolver-web/docker/run-uni-resolver-web.sh b/resolver/java/uni-resolver-web/docker/run-uni-resolver-web.sh index 0bb860621..5f84962c4 100644 --- a/resolver/java/uni-resolver-web/docker/run-uni-resolver-web.sh +++ b/resolver/java/uni-resolver-web/docker/run-uni-resolver-web.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh cd /opt/uni-resolver-java/uni-resolver-web/ mvn jetty:run diff --git a/resolver/java/uni-resolver-web/pom.xml b/resolver/java/uni-resolver-web/pom.xml index e8af6821a..2d0c46eb0 100644 --- a/resolver/java/uni-resolver-web/pom.xml +++ b/resolver/java/uni-resolver-web/pom.xml @@ -16,10 +16,15 @@ + + org.apache.maven.plugins + maven-war-plugin + 3.2.2 + org.eclipse.jetty jetty-maven-plugin - 9.4.0.M1 + 9.4.18.v20190429 ${basedir}/src/test/resources/jetty.xml @@ -43,24 +48,28 @@ file:${basedir}/src/test/resources/log4j.properties + + ^$ + ^$ + org.slf4j slf4j-api - 1.7.5 + 1.7.25 compile org.slf4j jcl-over-slf4j - 1.7.5 + 1.7.25 compile org.slf4j slf4j-log4j12 - 1.7.5 + 1.7.25 compile @@ -91,30 +100,4 @@ - - - with-drivers - - - decentralized-identity - uni-resolver-driver-did-btcr - 0.1-SNAPSHOT - compile - - - decentralized-identity - uni-resolver-driver-did-sov - 0.1-SNAPSHOT - compile - - - decentralized-identity - uni-resolver-driver-did-stack - 0.1-SNAPSHOT - compile - - - - - diff --git a/resolver/java/uni-resolver-web/sovrin/lib/.gitignore b/resolver/java/uni-resolver-web/sovrin/lib/.gitignore index c12103d43..933576c72 100644 --- a/resolver/java/uni-resolver-web/sovrin/lib/.gitignore +++ b/resolver/java/uni-resolver-web/sovrin/lib/.gitignore @@ -1,2 +1,4 @@ libindy.so +/.idea/ +*.iml diff --git a/resolver/java/uni-resolver-web/src/main/java/uniresolver/web/WebUniResolver.java b/resolver/java/uni-resolver-web/src/main/java/uniresolver/web/WebUniResolver.java index df9d43288..9235e516f 100644 --- a/resolver/java/uni-resolver-web/src/main/java/uniresolver/web/WebUniResolver.java +++ b/resolver/java/uni-resolver-web/src/main/java/uniresolver/web/WebUniResolver.java @@ -1,6 +1,7 @@ package uniresolver.web; import java.io.IOException; +import java.io.OutputStream; import java.io.PrintWriter; import java.util.Map; @@ -51,9 +52,9 @@ public ResolveResult resolve(String identifier) throws ResolutionException { } @Override - public ResolveResult resolve(String identifier, String selectServiceType) throws ResolutionException { + public ResolveResult resolve(String identifier, Map options) throws ResolutionException { - return this.getUniResolver() == null ? null : this.getUniResolver().resolve(identifier, selectServiceType); + return this.getUniResolver() == null ? null : this.getUniResolver().resolve(identifier, options); } @Override @@ -66,7 +67,7 @@ public Map> properties() throws ResolutionException * Helper methods */ - protected static void sendResponse(HttpServletResponse response, int status, String contentType, String body) throws IOException { + protected static void sendResponse(HttpServletResponse response, int status, String contentType, Object body) throws IOException { response.setStatus(status); @@ -74,12 +75,24 @@ protected static void sendResponse(HttpServletResponse response, int status, Str response.setHeader("Access-Control-Allow-Origin", "*"); - if (body != null) { + if (body instanceof String) { - PrintWriter writer = response.getWriter(); - writer.write(body); - writer.flush(); - writer.close(); + PrintWriter printWriter = response.getWriter(); + printWriter.write((String) body); + printWriter.flush(); + printWriter.close(); + } else if (body instanceof byte[]) { + + OutputStream outputStream = response.getOutputStream(); + outputStream.write((byte[]) body); + outputStream.flush(); + outputStream.close(); + } else { + + PrintWriter printWriter = response.getWriter(); + printWriter.write(body.toString()); + printWriter.flush(); + printWriter.close(); } } diff --git a/resolver/java/uni-resolver-web/src/main/java/uniresolver/web/servlet/PropertiesServlet.java b/resolver/java/uni-resolver-web/src/main/java/uniresolver/web/servlet/PropertiesServlet.java index 8d8227187..92d8cfb70 100644 --- a/resolver/java/uni-resolver-web/src/main/java/uniresolver/web/servlet/PropertiesServlet.java +++ b/resolver/java/uni-resolver-web/src/main/java/uniresolver/web/servlet/PropertiesServlet.java @@ -12,7 +12,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; -import uniresolver.ResolutionException; import uniresolver.UniResolver; import uniresolver.web.WebUniResolver; @@ -43,7 +42,7 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) t properties = this.properties(); propertiesString = properties == null ? null : objectMapper.writeValueAsString(properties); - } catch (ResolutionException ex) { + } catch (Exception ex) { if (log.isWarnEnabled()) log.warn("Driver reported: " + ex.getMessage(), ex); WebUniResolver.sendResponse(response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, null, "Driver reported: " + ex.getMessage()); diff --git a/resolver/java/uni-resolver-web/src/main/java/uniresolver/web/servlet/ResolveServlet.java b/resolver/java/uni-resolver-web/src/main/java/uniresolver/web/servlet/ResolveServlet.java index 97bc7ca21..752fb8beb 100644 --- a/resolver/java/uni-resolver-web/src/main/java/uniresolver/web/servlet/ResolveServlet.java +++ b/resolver/java/uni-resolver-web/src/main/java/uniresolver/web/servlet/ResolveServlet.java @@ -1,7 +1,6 @@ package uniresolver.web.servlet; import java.io.IOException; -import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import javax.servlet.ServletException; @@ -11,7 +10,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import uniresolver.ResolutionException; +import did.DIDDocument; import uniresolver.result.ResolveResult; import uniresolver.web.WebUniResolver; @@ -41,9 +40,11 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) t try { identifier = URLDecoder.decode(identifier, "UTF-8"); - } catch (UnsupportedEncodingException ex) { + } catch (Exception ex) { - throw new IOException(ex.getMessage(), ex); + if (log.isWarnEnabled()) log.warn("Request problem: " + ex.getMessage(), ex); + WebUniResolver.sendResponse(response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, null, "Request problem: " + ex.getMessage()); + return; } if (log.isInfoEnabled()) log.info("Incoming resolve request for identifier: " + identifier); @@ -57,31 +58,41 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) t // execute the request ResolveResult resolveResult; - String resolveResultString; try { resolveResult = this.resolve(identifier); - resolveResultString = resolveResult == null ? null : resolveResult.toJson(); - } catch (ResolutionException ex) { + } catch (Exception ex) { if (log.isWarnEnabled()) log.warn("Resolve problem for " + identifier + ": " + ex.getMessage(), ex); WebUniResolver.sendResponse(response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, null, "Resolve problem for " + identifier + ": " + ex.getMessage()); return; } - if (log.isInfoEnabled()) log.info("Resolve result for " + identifier + ": " + resolveResultString); + if (log.isInfoEnabled()) log.info("Resolve result for " + identifier + ": " + resolveResult.toJson()); // no resolve result? - if (resolveResultString == null) { + if (resolveResult == null || (resolveResult.getDidDocument() == null && resolveResult.getContent() == null)) { - WebUniResolver.sendResponse(response, HttpServletResponse.SC_NOT_FOUND, null, "No resolve result for " + identifier + "."); + WebUniResolver.sendResponse(response, HttpServletResponse.SC_NOT_FOUND, null, resolveResult.toJson()); return; } // write resolve result - WebUniResolver.sendResponse(response, HttpServletResponse.SC_OK, MIME_TYPE, resolveResultString); + if (request.getHeader("Accept").contains(DIDDocument.MIME_TYPE) && resolveResult.getDidDocument() != null) { + + WebUniResolver.sendResponse(response, HttpServletResponse.SC_OK, DIDDocument.MIME_TYPE, resolveResult.getDidDocument().toJson()); + return; + } else if (resolveResult.getContent() != null) { + + WebUniResolver.sendResponse(response, HttpServletResponse.SC_OK, resolveResult.getContentType(), resolveResult.getContent()); + return; + } else { + + WebUniResolver.sendResponse(response, HttpServletResponse.SC_OK, ResolveResult.MIME_TYPE, resolveResult.toJson()); + return; + } } } \ No newline at end of file diff --git a/resolver/java/uni-resolver-web/src/main/webapp/WEB-INF/applicationContext.xml b/resolver/java/uni-resolver-web/src/main/webapp/WEB-INF/applicationContext.xml index 41620b87e..1090bf551 100644 --- a/resolver/java/uni-resolver-web/src/main/webapp/WEB-INF/applicationContext.xml +++ b/resolver/java/uni-resolver-web/src/main/webapp/WEB-INF/applicationContext.xml @@ -5,21 +5,13 @@ - - - - - - - - - - - - - - - + + + + + + + @@ -31,67 +23,4 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/resolver/java/uni-resolver-web/src/main/webapp/WEB-INF/applicationContext.xml.docker b/resolver/java/uni-resolver-web/src/main/webapp/WEB-INF/applicationContext.xml.docker index 792b58cc3..34fb30c02 100644 --- a/resolver/java/uni-resolver-web/src/main/webapp/WEB-INF/applicationContext.xml.docker +++ b/resolver/java/uni-resolver-web/src/main/webapp/WEB-INF/applicationContext.xml.docker @@ -8,17 +8,9 @@ - - - - - - - - - - - + + + @@ -34,64 +26,20 @@ - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/resolver/java/uni-resolver-web/src/main/webapp/WEB-INF/applicationContext.xml.java b/resolver/java/uni-resolver-web/src/main/webapp/WEB-INF/applicationContext.xml.java index 33d8046a7..b6108eeeb 100644 --- a/resolver/java/uni-resolver-web/src/main/webapp/WEB-INF/applicationContext.xml.java +++ b/resolver/java/uni-resolver-web/src/main/webapp/WEB-INF/applicationContext.xml.java @@ -8,9 +8,9 @@ - - - + + + @@ -32,9 +32,9 @@ - - - + + + diff --git a/resolver/java/uni-resolver-web/src/main/webapp/WEB-INF/web.xml b/resolver/java/uni-resolver-web/src/main/webapp/WEB-INF/web.xml index 05acd384b..53f5ef643 100644 --- a/resolver/java/uni-resolver-web/src/main/webapp/WEB-INF/web.xml +++ b/resolver/java/uni-resolver-web/src/main/webapp/WEB-INF/web.xml @@ -2,7 +2,7 @@ + id="WebApp_ID" version="2.5" metadata-complete="true"> uni-resolver-web diff --git a/resolver/python/API/README.md b/resolver/python/API/README.md deleted file mode 100644 index bbd54583b..000000000 --- a/resolver/python/API/README.md +++ /dev/null @@ -1,40 +0,0 @@ -This is a simple API Library implementaation built for Python3 with backwards compatibility for python2.x. It is intended to make a simple http request to a web service. The web service will handle the resolving of the DID and will return a DDO (DID Document) through the HTTP response. - -implementation: assign a config file with a list of URLs pointing to a resolver web service. This is done, by creating a UniversalUriResolver object and assign it a string with the name of the file. - -```python -uri = ClientUriResolver("Config.txt") -``` - -Now you can resolve DIDs by passing them as a string argument into the resolver method - -```python -ddo = uri.resolver("did:sov:WRfXPg8dantKVubE3HX8pw") -``` - -This returns back the DDO in the form of a JSON object. If it fails to resolve using all of the provided web services, it will return a None object. - -example to print a DDO: - -```python -webResolver = ClientWebResolver("config.txt") -response = webResolver.resolve("did:sov:WRfXPg8dantKVubE3HX8pw") -print(response) -``` - -response will look like this: -```JSON -{u'control': [], - u'owner': { - u'curve': u'ed25519', - u'publicKeyBase64': u'H3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV', - u'type': [u'CryptographicKey', u'EdDsaSAPublicKey'], - u'id': u'did:sov:WRfXPg8dantKVubE3HX8pw' - }, - u'id': u'did:sov:WRfXPg8dantKVubE3HX8pw', - u'service': { - u'xdi': u'http://127.0.0.1:8080/xdi' - }, - u'@context': u'https://example.org/did/v1' -} -``` diff --git a/resolver/python/API/UniversalResolver.py b/resolver/python/API/UniversalResolver.py deleted file mode 100644 index acd26d16b..000000000 --- a/resolver/python/API/UniversalResolver.py +++ /dev/null @@ -1,25 +0,0 @@ -import requests - -class ClientWebResolver: - - def __init__(self, config): - self.CONFIG = config - - def resolve(self, did): - configFile = open(self.CONFIG, 'r') - lines = configFile.readlines() - - try: - for line in lines: - if not line.endswith('/'): - line += '/' - url = line + did - httpResponse = requests.get(url) - if httpResponse.status_code is 200: - return httpResponse.json() - raise TypeError - except TypeError: - print("All web services tested. Please add a working web resolver to the config file and try again.") - - def modifier(self, did): - pass \ No newline at end of file diff --git a/resolver/python/API/config.txt b/resolver/python/API/config.txt deleted file mode 100644 index 860837a4a..000000000 --- a/resolver/python/API/config.txt +++ /dev/null @@ -1 +0,0 @@ -https://uniresolver.danubetech.com/1.0/identifiers \ No newline at end of file diff --git a/resolver/python/LICENSE b/resolver/python/LICENSE deleted file mode 100644 index 261eeb9e9..000000000 --- a/resolver/python/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/swagger/api.yml b/swagger/api.yml new file mode 100644 index 000000000..cae604927 --- /dev/null +++ b/swagger/api.yml @@ -0,0 +1,42 @@ +openapi: 3.0.0 +servers: +# Added by API Auto Mocking Plugin + - description: SwaggerHub API Auto Mocking + url: https://virtserver.swaggerhub.com/universal-resolver/universal-resolver/1.0.0 + - url: /1.0/ +info: + description: Universal Resolver + version: "1.0.0" + title: Universal Resolver + contact: + email: markus@danubetech.com +paths: + /identifiers/{identifier}: + get: + summary: Resolve a DID or other identifier. + operationId: resolve + parameters: + - in: path + required: true + name: identifier + schema: + type: string + description: A DID or other identifier to be resolved. + - in: header + required: false + name: Accept + schema: + type: string + example: application/did+ld+json + responses: + '200': + description: successfully resolved! + content: + application/json: + schema: + type: object + description: The Resolution Result or DID document. + '400': + description: invalid input! + '500': + description: error!