Skip to content

Commit

Permalink
fix: ignore query string when interpreting identifiers (decentralized…
Browse files Browse the repository at this point in the history
  • Loading branch information
mirceanis committed Apr 22, 2021
1 parent e36a51d commit 5508f8a
Show file tree
Hide file tree
Showing 3 changed files with 134 additions and 12 deletions.
87 changes: 86 additions & 1 deletion src/__tests__/extended-id.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { identifierMatcher } from '../helpers'
import { identifierMatcher, interpretIdentifier } from '../helpers'

describe('pattern matcher', () => {
const matcher = identifierMatcher
Expand Down Expand Up @@ -37,3 +37,88 @@ describe('pattern matcher', () => {
})
})
})

describe('interpretIdentifier', () => {
const pubKey = '0x02b97c30de767f084ce3080168ee293053ba33b235d7116a3263d29f1450936b71'
const checksumAddress = '0xC662e6c5F91B9FcD22D7FcafC80Cf8b640aed247'

it('parses ethereumAddress', () => {
const { address, publicKey, network } = interpretIdentifier(checksumAddress.toLowerCase())
expect(address).toEqual(checksumAddress)
expect(publicKey).toBeUndefined()
expect(network).toBeUndefined()
})
it('parses ethereumAddress with checksum', () => {
const { address, publicKey, network } = interpretIdentifier(checksumAddress)
expect(address).toEqual(checksumAddress)
expect(publicKey).toBeUndefined()
expect(network).toBeUndefined()
})
it('parses did:ethr with address', () => {
const { address, publicKey, network } = interpretIdentifier(`did:ethr:${checksumAddress}`)
expect(address).toEqual(checksumAddress)
expect(publicKey).toBeUndefined()
expect(network).toBeUndefined()
})
it('parses did:ethr with address and version', () => {
const { address, publicKey, network } = interpretIdentifier(`did:ethr:${checksumAddress}?versionId=42`)
expect(address).toEqual(checksumAddress)
expect(publicKey).toBeUndefined()
expect(network).toBeUndefined()
})
it('parses did:ethr with address and network', () => {
const { address, publicKey, network } = interpretIdentifier(`did:ethr:0x1:${checksumAddress}`)
expect(address).toEqual(checksumAddress)
expect(publicKey).toBeUndefined()
expect(network).toEqual('0x1')
})
it('parses did:ethr with address and sub-network', () => {
const { address, publicKey, network } = interpretIdentifier(`did:ethr:rsk:testnet:${checksumAddress}`)
expect(address).toEqual(checksumAddress)
expect(publicKey).toBeUndefined()
expect(network).toEqual('rsk:testnet')
})
it('parses did:ethr with address and sub-network and version', () => {
const { address, publicKey, network } = interpretIdentifier(`did:ethr:rsk:testnet:${checksumAddress}?versionId=42`)
expect(address).toEqual(checksumAddress)
expect(publicKey).toBeUndefined()
expect(network).toEqual('rsk:testnet')
})

it('parses publicKey', () => {
const { address, publicKey, network } = interpretIdentifier(pubKey)
expect(address).toEqual(checksumAddress)
expect(publicKey).toEqual(pubKey)
expect(network).toBeUndefined()
})
it('parses did:ethr with publicKey', () => {
const { address, publicKey, network } = interpretIdentifier(`did:ethr:${pubKey}`)
expect(address).toEqual(checksumAddress)
expect(publicKey).toEqual(pubKey)
expect(network).toBeUndefined()
})
it('parses did:ethr with publicKey and version', () => {
const { address, publicKey, network } = interpretIdentifier(`did:ethr:${pubKey}?versionId=42`)
expect(address).toEqual(checksumAddress)
expect(publicKey).toEqual(pubKey)
expect(network).toBeUndefined()
})
it('parses did:ethr with publicKey and network', () => {
const { address, publicKey, network } = interpretIdentifier(`did:ethr:mainnet:${pubKey}`)
expect(address).toEqual(checksumAddress)
expect(publicKey).toEqual(pubKey)
expect(network).toEqual('mainnet')
})
it('parses did:ethr with publicKey and sub-network', () => {
const { address, publicKey, network } = interpretIdentifier(`did:ethr:not:so:main:net:${pubKey}`)
expect(address).toEqual(checksumAddress)
expect(publicKey).toEqual(pubKey)
expect(network).toEqual('not:so:main:net')
})
it('parses did:ethr with publicKey and sub-network', () => {
const { address, publicKey, network } = interpretIdentifier(`did:ethr:not:so:main:net:${pubKey}?versionId=42`)
expect(address).toEqual(checksumAddress)
expect(publicKey).toEqual(pubKey)
expect(network).toEqual('not:so:main:net')
})
})
58 changes: 47 additions & 11 deletions src/__tests__/networks.integration.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,46 @@ describe('ethrResolver (alt-chains)', () => {
const { address } = interpretIdentifier(addr)
const checksumAddr = address

describe('eth-testnets', () => {
it('resolves on ropsten when configured', () => {
describe('eth-networks', () => {
it('resolves on mainnet with versionId', async () => {
const resolver = new Resolver(getResolver({ infuraProjectId: '6b734e0b04454df8a6ce234023c04f26' }))
const result = await resolver.resolve('did:ethr:0x26bf14321004e770e7a8b080b7a526d8eed8b388?versionId=12090174')
expect(result).toEqual({
didDocumentMetadata: {
nextVersionId: '12090175',
nextUpdate: '2021-03-22T18:14:29.000Z',
},
didResolutionMetadata: {
contentType: 'application/did+ld+json',
},
didDocument: {
'@context': [
'https://www.w3.org/ns/did/v1',
'https://identity.foundation/EcdsaSecp256k1RecoverySignature2020/lds-ecdsa-secp256k1-recovery2020-0.0.jsonld',
],
id: 'did:ethr:0x26bf14321004e770e7a8b080b7a526d8eed8b388',
verificationMethod: [
{
id: 'did:ethr:0x26bf14321004e770e7a8b080b7a526d8eed8b388#controller',
type: 'EcdsaSecp256k1RecoveryMethod2020',
controller: 'did:ethr:0x26bf14321004e770e7a8b080b7a526d8eed8b388',
blockchainAccountId: '0x26bF14321004e770E7A8b080b7a526d8eed8b388@eip155:1',
},
],
authentication: ['did:ethr:0x26bf14321004e770e7a8b080b7a526d8eed8b388#controller'],
assertionMethod: ['did:ethr:0x26bf14321004e770e7a8b080b7a526d8eed8b388#controller'],
},
})
})

it('resolves on ropsten when configured', async () => {
const did = 'did:ethr:ropsten:' + addr
const ethr = getResolver({
networks: [{ name: 'ropsten', rpcUrl: 'https://ropsten.infura.io/v3/6b734e0b04454df8a6ce234023c04f26' }],
})
const resolver = new Resolver(ethr)
return expect(resolver.resolve(did)).resolves.toEqual({
const result = await resolver.resolve(did)
expect(result).toEqual({
didDocumentMetadata: {},
didResolutionMetadata: { contentType: 'application/did+ld+json' },
didDocument: {
Expand All @@ -39,13 +71,14 @@ describe('ethrResolver (alt-chains)', () => {
})
})

it('resolves on rinkeby when configured', () => {
it('resolves on rinkeby when configured', async () => {
const did = 'did:ethr:rinkeby:' + addr
const ethr = getResolver({
networks: [{ name: 'rinkeby', rpcUrl: 'https://rinkeby.infura.io/v3/6b734e0b04454df8a6ce234023c04f26' }],
})
const resolver = new Resolver(ethr)
return expect(resolver.resolve(did)).resolves.toEqual({
const result = await resolver.resolve(did)
expect(result).toEqual({
didDocumentMetadata: {},
didResolutionMetadata: { contentType: 'application/did+ld+json' },
didDocument: {
Expand All @@ -68,13 +101,14 @@ describe('ethrResolver (alt-chains)', () => {
})
})

it('resolves on kovan when configured', () => {
it('resolves on kovan when configured', async () => {
const did = 'did:ethr:kovan:' + addr
const ethr = getResolver({
networks: [{ name: 'kovan', rpcUrl: 'https://kovan.infura.io/v3/6b734e0b04454df8a6ce234023c04f26' }],
})
const resolver = new Resolver(ethr)
return expect(resolver.resolve(did)).resolves.toEqual({
const result = await resolver.resolve(did)
expect(result).toEqual({
didDocumentMetadata: {},
didResolutionMetadata: { contentType: 'application/did+ld+json' },
didDocument: {
Expand All @@ -97,11 +131,12 @@ describe('ethrResolver (alt-chains)', () => {
})
})

it('resolves on rsk when configured', () => {
it('resolves on rsk when configured', async () => {
const did = 'did:ethr:rsk:' + addr
const ethr = getResolver({ networks: [{ name: 'rsk', rpcUrl: 'https://did.rsk.co:4444' }] })
const resolver = new Resolver(ethr)
return expect(resolver.resolve(did)).resolves.toEqual({
const result = await resolver.resolve(did)
expect(result).toEqual({
didDocumentMetadata: {},
didResolutionMetadata: { contentType: 'application/did+ld+json' },
didDocument: {
Expand All @@ -124,11 +159,12 @@ describe('ethrResolver (alt-chains)', () => {
})
})

it('resolves on rsk:testnet when configured', () => {
it('resolves on rsk:testnet when configured', async () => {
const did = 'did:ethr:rsk:testnet:' + addr
const ethr = getResolver({ networks: [{ name: 'rsk:testnet', rpcUrl: 'https://did.testnet.rsk.co:4444' }] })
const resolver = new Resolver(ethr)
return expect(resolver.resolve(did)).resolves.toEqual({
const result = await resolver.resolve(did)
expect(result).toEqual({
didDocumentMetadata: {},
didResolutionMetadata: { contentType: 'application/did+ld+json' },
didDocument: {
Expand Down
1 change: 1 addition & 0 deletions src/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ export function interpretIdentifier(identifier: string): { address: string; publ
let id = identifier
let network = undefined
if (id.startsWith('did:ethr')) {
id = id.split('?')[0]
const components = id.split(':')
id = components[components.length - 1]
if (components.length >= 4) {
Expand Down

0 comments on commit 5508f8a

Please sign in to comment.