refactor: Identity provider can be passed as partially instantiated function.

This commit is contained in:
Hayden Young 2023-09-04 00:43:27 +01:00
parent a405ff939a
commit 0a5a6ed1ac
6 changed files with 41 additions and 20 deletions

4
package-lock.json generated
View File

@ -1,12 +1,12 @@
{
"name": "@orbitdb/core",
"version": "0.30.0",
"version": "0.30.1",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@orbitdb/core",
"version": "0.30.0",
"version": "0.30.1",
"license": "MIT",
"dependencies": {
"@ipld/dag-cbor": "^9.0.0",

View File

@ -10,10 +10,9 @@ import { getIdentityProvider } from './providers/index.js'
// import EthIdentityProvider from './identity-providers/ethereum.js'
import KeyStore, { signMessage, verifyMessage } from '../key-store.js'
import { LRUStorage, IPFSBlockStorage, MemoryStorage, ComposedStorage } from '../storage/index.js'
import * as PublicKeyIdentityProvider from './providers/publickey.js'
import pathJoin from '../utils/path-join.js'
const DefaultProviderType = 'publickey'
const DefaultIdentityKeysPath = pathJoin('./orbitdb', 'identities')
/**
@ -66,17 +65,16 @@ const Identities = async ({ keystore, path, storage, ipfs } = {}) => {
/**
* Creates an identity, adding it to storage.
* @param {Object} options Various options for configuring a new identity.
* @param {string} [options.type=publickey] The type of provider to use for generating an identity.
* @param {Function} [options.type=PublicKey()] The type of provider to use for generating an identity.
* @return {module:Identities~Identity} An instance of identity.
* @memberof module:Identities~Identities
* @instance
*/
const createIdentity = async (options = {}) => {
options.keystore = keystore
const type = options.type || DefaultProviderType
const Provider = getIdentityProvider(type).default
const identityProvider = Provider(options)
const DefaultIdentityProviderType = PublicKeyIdentityProvider.default({ keystore })
const IdentityProvider = options.type || DefaultIdentityProviderType
const identityProvider = IdentityProvider()
const id = await identityProvider.getId(options)
const privateKey = await keystore.getKey(id) || await keystore.createKey(id)
const publicKey = keystore.getPublic(privateKey)
@ -87,7 +85,7 @@ const Identities = async ({ keystore, path, storage, ipfs } = {}) => {
publicKey: publicKeyAndIdSignature
}
const identity = await Identity({ id, publicKey, signatures, type, sign, verify })
const identity = await Identity({ id, publicKey, signatures, type: identityProvider.type, sign, verify })
await storage.put(identity.hash, identity.bytes)

View File

@ -27,7 +27,7 @@ const verifyIdentity = identity => {
* identity provider function.
* @private
*/
const PublicKeyIdentityProvider = ({ keystore }) => {
const PublicKeyIdentityProvider = ({ keystore }) => () => {
/**
* @namespace module:IdentityProviders.IdentityProvider-PublicKey
* @memberof module:IdentityProviders
@ -78,6 +78,7 @@ const PublicKeyIdentityProvider = ({ keystore }) => {
}
return {
type,
getId,
signIdentity
}

View File

@ -28,7 +28,7 @@ const DefaultAccessController = IPFSAccessController
* @throws "IPFS instance is required argument" if no IPFS instance is provided.
* @instance
*/
const OrbitDB = async ({ ipfs, id, identities, directory } = {}) => {
const OrbitDB = async ({ ipfs, id, identity, identityProvider, identities, directory } = {}) => {
/**
* @namespace module:OrbitDB~OrbitDB
* @description The instance returned by {@link module:OrbitDB}.
@ -51,7 +51,14 @@ const OrbitDB = async ({ ipfs, id, identities, directory } = {}) => {
identities = await Identities({ ipfs, keystore })
}
const identity = await identities.createIdentity({ id })
// identity takes precedence, then idP, then create from id.
if (!identity) {
if (identityProvider) {
identity = await identities.createIdentity({ type: identityProvider })
} else {
identity = await identities.createIdentity({ id })
}
}
const manifestStore = await ManifestStore({ ipfs })

View File

@ -1,7 +1,7 @@
const customIdentityProvider = () => {
const verifyIdentity = async (data) => { return true }
const CustomIdentityProvider = () => {
const CustomIdentityProvider = () => () => {
const getId = () => { return 'custom' }
const signIdentity = (data) => { return `signature '${data}'` }
@ -23,7 +23,7 @@ const customIdentityProvider = () => {
const fakeIdentityProvider = () => {
const verifyIdentity = async (data) => { return false }
const FakeIdentityProvider = () => {
const FakeIdentityProvider = () => () => {
const getId = () => { return 'pubKey' }
const signIdentity = (data) => { return `false signature '${data}'` }

View File

@ -6,6 +6,7 @@ import KeyStore, { signMessage, verifyMessage } from '../../src/key-store.js'
import { Identities, addIdentityProvider, getIdentityProvider, Identity } from '../../src/identities/index.js'
import testKeysPath from '../fixtures/test-keys-path.js'
import { CustomIdentityProvider, FakeIdentityProvider } from '../fixtures/providers.js'
import * as PublicKeyIdentityProvider from '../../src/identities/providers/publickey.js'
const type = 'publickey'
const keysPath = './testkeys'
@ -64,6 +65,20 @@ describe('Identities', function () {
assert.strictEqual(result.sign, undefined)
assert.strictEqual(result.verify, undefined)
})
it('Passes in an identity provider', async () => {
const keystore = await KeyStore({ path: keysPath })
identities = await Identities({ keystore })
identity = await identities.createIdentity({ id, type: PublicKeyIdentityProvider.default({ keystore }) })
const result = await identities.getIdentity(identity.hash)
assert.strictEqual(result.id, identity.id)
assert.strictEqual(result.hash, identity.hash)
assert.strictEqual(result.publicKey, identity.publicKey)
assert.strictEqual(result.type, identity.type)
assert.deepStrictEqual(result.signatures, identity.signatures)
assert.strictEqual(result.sign, undefined)
assert.strictEqual(result.verify, undefined)
})
})
describe('Passing in custom keystore', async () => {
@ -201,21 +216,21 @@ describe('Identities', function () {
it('identity pkSignature verifies', async () => {
identities = await Identities({ keystore })
identity = await identities.createIdentity({ id, type })
identity = await identities.createIdentity({ id })
const verified = await verifyMessage(identity.signatures.id, identity.publicKey, identity.id)
assert.strictEqual(verified, true)
})
it('identity signature verifies', async () => {
identities = await Identities({ keystore })
identity = await identities.createIdentity({ id, type })
identity = await identities.createIdentity({ id })
const verified = await verifyMessage(identity.signatures.publicKey, identity.id, identity.publicKey + identity.signatures.id)
assert.strictEqual(verified, true)
})
it('false signature doesn\'t verify', async () => {
addIdentityProvider(FakeIdentityProvider)
identity = await identities.createIdentity({ type: FakeIdentityProvider.type })
identity = await identities.createIdentity({ type: FakeIdentityProvider.default() })
const verified = await identities.verifyIdentity(identity)
assert.strictEqual(verified, false)
})
@ -240,7 +255,7 @@ describe('Identities', function () {
})
it('identity verifies', async () => {
identity = await identities.createIdentity({ id, type })
identity = await identities.createIdentity({ id })
const verified = await identities.verifyIdentity(identity)
assert.strictEqual(verified, true)
})
@ -310,7 +325,7 @@ describe('Identities', function () {
beforeEach(async () => {
identities = await Identities({ keystore })
identity = await identities.createIdentity({ id, type })
identity = await identities.createIdentity({ id })
signature = await identities.sign(identity, data, keystore)
})