mirror of
https://github.com/orbitdb/orbitdb.git
synced 2025-03-30 15:08:28 +00:00
refactor: Identity provider can be passed as partially instantiated function.
This commit is contained in:
parent
a405ff939a
commit
0a5a6ed1ac
4
package-lock.json
generated
4
package-lock.json
generated
@ -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",
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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 })
|
||||
|
||||
|
4
test/fixtures/providers.js
vendored
4
test/fixtures/providers.js
vendored
@ -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}'` }
|
||||
|
@ -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)
|
||||
})
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user