Skip to content

Commit 2dfdff7

Browse files
authored
Merge pull request #1063 from ensdomains/restrict-verifications-to-dentity-url
Add URL validation for Dentity verification credentials
2 parents 5e7a523 + c8ab6bf commit 2dfdff7

File tree

4 files changed

+37
-8
lines changed

4 files changed

+37
-8
lines changed

e2e/specs/stateless/verifications.spec.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,17 @@ import { Hash } from 'viem'
77
import { setRecords } from '@ensdomains/ensjs/wallet'
88

99
import {
10+
DENTITY_BASE_ENDPOINT,
1011
DENTITY_ISS,
11-
DENTITY_VPTOKEN_ENDPOINT,
1212
VERIFICATION_OAUTH_BASE_URL,
1313
VERIFICATION_RECORD_KEY,
1414
} from '@app/constants/verification'
1515

1616
import { createAccounts } from '../../../playwright/fixtures/accounts'
1717
import { testClient } from '../../../playwright/fixtures/contracts/utils/addTestContracts'
1818

19+
const DENTITY_VPTOKEN_ENDPOINT = `${DENTITY_BASE_ENDPOINT}/oidc/vp-token`
20+
1921
type MakeMockVPTokenRecordKey =
2022
| 'com.twitter'
2123
| 'com.github'

src/constants/verification.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
import { match } from 'ts-pattern'
2+
3+
import { getNetworkFromUrl } from '@app/constants/chains'
14
import type { VerificationProtocol } from '@app/transaction-flow/input/VerifyProfile/VerifyProfile-flow'
25

36
/**
@@ -51,12 +54,13 @@ const DENTITY_ENV_CONFIGS = {
5154

5255
type DentityEnvironment = keyof typeof DENTITY_ENV_CONFIGS
5356

54-
const DENTITY_ENV: DentityEnvironment = 'production'
57+
const DENTITY_ENV: DentityEnvironment = match(getNetworkFromUrl())
58+
.with('mainnet', () => 'production' as const)
59+
.with('sepolia', () => 'staging' as const)
60+
.otherwise(() => 'dev' as const)
5561

5662
export const DENTITY_BASE_ENDPOINT = DENTITY_ENV_CONFIGS[DENTITY_ENV].endpoint
5763

58-
export const DENTITY_VPTOKEN_ENDPOINT = `${DENTITY_BASE_ENDPOINT}/oidc/vp-token`
59-
6064
export const DENTITY_CLIENT_ID = DENTITY_ENV_CONFIGS[DENTITY_ENV].clientId
6165

6266
export const DENTITY_ISS = DENTITY_ENV_CONFIGS[DENTITY_ENV].iss

src/hooks/verification/useVerifiedRecords/useVerifiedRecords.test.ts

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,12 @@ import { makeMockVerifiablePresentationData } from '@root/test/mock/makeMockVeri
22
import { match } from 'ts-pattern'
33
import { describe, expect, it, vi } from 'vitest'
44

5+
import { DENTITY_BASE_ENDPOINT } from '@app/constants/verification'
6+
57
import { getVerifiedRecords, parseVerificationRecord } from './useVerifiedRecords'
68

9+
const mockUrl = (path: string) => `${DENTITY_BASE_ENDPOINT}/${path}`
10+
711
describe('parseVerificationRecord', () => {
812
it('should return empty array if undefined', () => {
913
expect(parseVerificationRecord()).toEqual([])
@@ -25,7 +29,7 @@ describe('parseVerificationRecord', () => {
2529
describe('getVerifiedRecords', () => {
2630
const mockFetch = vi.fn().mockImplementation(async (uri) =>
2731
match(uri)
28-
.with('error', () => Promise.reject('error'))
32+
.with(mockUrl('error'), () => Promise.reject('error'))
2933
.otherwise(() =>
3034
Promise.resolve({
3135
json: () => Promise.resolve(makeMockVerifiablePresentationData('openid')),
@@ -36,14 +40,26 @@ describe('getVerifiedRecords', () => {
3640

3741
it('should exclude fetches that error from results ', async () => {
3842
const result = await getVerifiedRecords({
39-
queryKey: [{ verificationsRecord: '["error", "regular", "error"]' }, '0x123'],
43+
queryKey: [
44+
{ verificationsRecord: JSON.stringify([mockUrl('error'), mockUrl('regular'), mockUrl('error')]) },
45+
'0x123',
46+
],
4047
} as any)
4148
expect(result).toHaveLength(7)
4249
})
4350

4451
it('should return a flat array of verified credentials', async () => {
4552
const result = await getVerifiedRecords({
46-
queryKey: [{ verificationsRecord: '["one", "two", "error", "three"]' }],
53+
queryKey: [
54+
{
55+
verificationsRecord: JSON.stringify([
56+
mockUrl('one'),
57+
mockUrl('two'),
58+
mockUrl('error'),
59+
mockUrl('three'),
60+
]),
61+
},
62+
],
4763
} as any)
4864
expect(result).toHaveLength(21)
4965
expect(result.every((item) => !Array.isArray(item))).toBe(true)

src/hooks/verification/useVerifiedRecords/useVerifiedRecords.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { QueryFunctionContext } from '@tanstack/react-query'
22
import { Hash } from 'viem'
33

4+
import { DENTITY_BASE_ENDPOINT } from '@app/constants/verification'
45
import { useQueryOptions } from '@app/hooks/useQueryOptions'
56
import { CreateQueryKey, QueryConfig } from '@app/types'
67
import { getIsCachedData } from '@app/utils/getIsCachedData'
@@ -47,8 +48,14 @@ export const getVerifiedRecords = async <TParams extends UseVerifiedRecordsParam
4748
queryKey: [{ verificationsRecord, ownerAddress, name }],
4849
}: QueryFunctionContext<QueryKey<TParams>>): Promise<UseVerifiedRecordsReturnType> => {
4950
const verifiablePresentationUris = parseVerificationRecord(verificationsRecord)
51+
52+
// Filter to only allow Dentity verification URLs
53+
const validUris = verifiablePresentationUris.filter((uri) =>
54+
uri.startsWith(DENTITY_BASE_ENDPOINT),
55+
)
56+
5057
const responses = await Promise.allSettled(
51-
verifiablePresentationUris.map((uri) => fetch(uri).then((resp) => resp.json())),
58+
validUris.map((uri) => fetch(uri).then((resp) => resp.json())),
5259
)
5360
return Promise.all(
5461
responses

0 commit comments

Comments
 (0)