From fbb7141a57ad7db00e6c1f08122be5c1a0bebf85 Mon Sep 17 00:00:00 2001 From: Skedley <48058984+Dudleyneedham@users.noreply.github.com> Date: Fri, 29 Jan 2021 19:08:40 +0100 Subject: [PATCH] feat: DID fetch on creating an identity (#318) --- src/containers/WalletAdd/WalletAdd.tsx | 14 +++++++- src/services/DidService.ts | 48 +++++++++++++++++++++++++- src/types/Contact.d.ts | 5 ++- 3 files changed, 62 insertions(+), 5 deletions(-) diff --git a/src/containers/WalletAdd/WalletAdd.tsx b/src/containers/WalletAdd/WalletAdd.tsx index 2069475e..1b3be25e 100644 --- a/src/containers/WalletAdd/WalletAdd.tsx +++ b/src/containers/WalletAdd/WalletAdd.tsx @@ -4,6 +4,7 @@ import React from 'react' import { connect } from 'react-redux' import { RouteComponentProps } from 'react-router' import { Link, withRouter } from 'react-router-dom' +import DidService from '../../services/DidService' import Input from '../../components/Input/Input' import { BalanceUtilities } from '../../services/BalanceUtilities' @@ -13,7 +14,7 @@ import { notify, notifySuccess } from '../../services/FeedbackService' import * as Contacts from '../../state/ducks/Contacts' import * as Wallet from '../../state/ducks/Wallet' import { persistentStoreInstance } from '../../state/PersistentStore' -import { IMyIdentity } from '../../types/Contact' +import { IContact, IMyIdentity } from '../../types/Contact' import './WalletAdd.scss' @@ -91,6 +92,17 @@ class WalletAdd extends React.Component { }, phrase, } + + const didDocument = await DidService.fetchDID(identity) + + if (didDocument) { + const did: IContact['did'] = { + identifier: didDocument.id, + document: didDocument, + } + newIdentity.did = did + } + saveIdentity(newIdentity) persistentStoreInstance.store.dispatch( Contacts.Store.addContact( diff --git a/src/services/DidService.ts b/src/services/DidService.ts index c7ae796b..438e9cb5 100644 --- a/src/services/DidService.ts +++ b/src/services/DidService.ts @@ -1,16 +1,21 @@ import { BlockchainUtils, Did, + Identity, IDid, IPublicIdentity, IURLResolver, PublicIdentity, } from '@kiltprotocol/sdk-js' -import { IDidDocumentSigned } from '@kiltprotocol/sdk-js/build/did/Did' +import { + IDidDocument, + IDidDocumentSigned, +} from '@kiltprotocol/sdk-js/build/did/Did' import * as Wallet from '../state/ducks/Wallet' import { persistentStoreInstance } from '../state/PersistentStore' import { IContact, IMyIdentity } from '../types/Contact' import ContactRepository from './ContactRepository' +import { notifyFailure } from './FeedbackService' import MessageRepository from './MessageRepository' const { IS_IN_BLOCK } = BlockchainUtils @@ -18,6 +23,47 @@ const { IS_IN_BLOCK } = BlockchainUtils class DidService { public static readonly URL = `${window._env_.REACT_APP_SERVICE_HOST}/contacts/did` + public static async fetchDID( + identity: Identity + ): Promise { + const didIdentitier = await Did.queryByAddress(identity.address) + if (!didIdentitier) { + return null + } + if (!didIdentitier.documentStore) { + return Did.createDefaultDidDocument( + didIdentitier.identifier, + didIdentitier.publicBoxKey, + didIdentitier.publicSigningKey + ) + } + + try { + const response = await fetch(didIdentitier.documentStore) + if (!response.ok) { + throw Error(identity.address) + } + const contact = await response.json() + const { did } = contact + + const verifyDid = Did.verifyDidDocumentSignature( + did, + didIdentitier.identifier + ) + if (!verifyDid) { + notifyFailure('Signature on DID Document could not be verified.', false) + return null + } + return did + } catch { + notifyFailure( + 'DID Document could not be fetched from the defined service.', + false + ) + return null + } + } + public static async resolveDid( identifier: string ): Promise { diff --git a/src/types/Contact.d.ts b/src/types/Contact.d.ts index de5a9cb6..56e77d92 100644 --- a/src/types/Contact.d.ts +++ b/src/types/Contact.d.ts @@ -1,5 +1,4 @@ -import { Identity, PublicIdentity } from '@kiltprotocol/sdk-js' -import { IDidDocumentSigned } from '@kiltprotocol/sdk-js/build/did/Did' +import { Identity, PublicIdentity, IDidDocument } from '@kiltprotocol/sdk-js' /** * as in prototype/services @@ -13,7 +12,7 @@ export interface IContact { } did?: { identifier?: string - document?: IDidDocumentSigned + document?: IDidDocument } publicIdentity: PublicIdentity