diff --git a/lib/index.js b/lib/index.js index b046d24..4b93020 100644 --- a/lib/index.js +++ b/lib/index.js @@ -10,12 +10,17 @@ const base58 = require('bs58') const Obz = require('obz') const Keypair = require('ppppp-keypair') const MsgV3 = require('./msg-v3') -const { SIGNATURE_TAG_IDENTITY_ADD, IDENTITY_SELF } = require('./msg-v3/constants') +const { + SIGNATURE_TAG_IDENTITY_ADD, + IDENTITY_SELF, +} = require('./msg-v3/constants') const { ReadyGate } = require('./utils') const { decrypt } = require('./encryption') /** * @typedef {import('ppppp-keypair').Keypair} Keypair + * @typedef {import('ppppp-keypair').KeypairPublicSlice} KeypairPublicSlice + * @typedef {import('ppppp-keypair').KeypairPrivateSlice} KeypairPrivateSlice * @typedef {import('./msg-v3').Msg} Msg * @typedef {import('./encryption').EncryptionFormat} EncryptionFormat * @@ -300,7 +305,7 @@ function initDB(peer, config) { } /** - * @param {{ keypair?: any; identity: string; domain: string; }} opts + * @param {{ keypair?: Keypair; identity: string; domain: string; }} opts * @param {CB} cb */ function initializeFeed(opts, cb) { @@ -339,7 +344,7 @@ function initDB(peer, config) { /** * @param {{ - * keypair?: Keypair; + * keypair?: KeypairPublicSlice; * domain: string; * }} opts * @param {CB} cb @@ -428,7 +433,7 @@ function initDB(peer, config) { /** * @param {{ - * keypair?: Keypair; + * keypair?: KeypairPrivateSlice; * identity: string; * }} opts * @returns {string} @@ -447,27 +452,39 @@ function initDB(peer, config) { /** * @param {{ - * keypair: Keypair; * identity: string; - * consent: string - * }} opts + * } & ({ + * keypair: KeypairPublicSlice & {private?: never}; + * consent: string; + * } | { + * keypair: Keypair; + * consent?: never; + * })} opts * @param {CB} cb */ function addToIdentity(opts, cb) { - // prettier-ignore - if (!opts?.keypair) return cb(new Error('identity.add() requires a `keypair`')) // prettier-ignore if (!opts?.identity) return cb(new Error('identity.add() requires a `identity`')) // prettier-ignore - if (!opts?.consent) return cb(new Error('identity.add() requires a `consent`')) + if (!opts?.keypair) return cb(new Error('identity.add() requires a `keypair`')) + // prettier-ignore + if (!opts?.keypair.public) return cb(new Error('identity.add() requires a `keypair` with `public`')) + let consent = /** @type {string} */ (opts.consent) + if (typeof opts.consent === 'undefined') { + if (opts.keypair.private) { + consent = consentToIdentity(opts) + } else { + return cb(new Error('identity.add() requires a `consent`')) + } + } const addedKeypair = opts.keypair const signingKeypair = config.keypair // Verify consent: const signableBuf = b4a.from( - SIGNATURE_TAG_IDENTITY_ADD + base58.decode(opts.identity), + SIGNATURE_TAG_IDENTITY_ADD + base58.decode(opts.identity) ) - if (!Keypair.verify(addedKeypair, signableBuf, opts.consent)) { + if (!Keypair.verify(addedKeypair, signableBuf, consent)) { // prettier-ignore return cb(new Error('identity.add() failed because the consent is invalid')) } @@ -558,7 +575,6 @@ function initDB(peer, config) { ciphertextBuf = encryptionFormat.encrypt(plaintext, encryptOpts) } catch (err) { // prettier-ignore - console.log(err); return cb( new Error('feed.publish() failed to encrypt data', { cause: err }) ) diff --git a/test/identity-add.test.js b/test/identity-add.test.js index 0d3aa5f..74f9cba 100644 --- a/test/identity-add.test.js +++ b/test/identity-add.test.js @@ -68,11 +68,10 @@ test('publish with a key in the identity', async (t) => { }) const identityMsg0 = peer.db.get(identity) - const consent = peer.db.identity.consent({ identity, keypair: keypair2 }) + // Consent is implicitly created because keypair2 has .private const identityRec1 = await p(peer.db.identity.add)({ identity, keypair: keypair2, - consent, }) const postRec = await p(peer.db.feed.publish)({