diff --git a/services/gunDB/rpc.js b/services/gunDB/rpc.js index 66213000..3611789b 100644 --- a/services/gunDB/rpc.js +++ b/services/gunDB/rpc.js @@ -7,11 +7,53 @@ const mapValues = require('lodash/mapValues') const Bluebird = require('bluebird') const { pubToEpub } = require('./contact-api/utils') -const { getGun, getUser, mySEA: SEA, getMySecret } = require('./Mediator') +const { + getGun, + getUser, + mySEA: SEA, + getMySecret, + $$__SHOCKWALLET__ENCRYPTED__ +} = require('./Mediator') /** * @typedef {import('./contact-api/SimpleGUN').ValidDataValue} ValidDataValue */ +/** + * @param {ValidDataValue} value + * @param {string} publicKey + * @returns {Promise} + */ +const deepDecryptIfNeeded = async (value, publicKey) => { + if (Schema.isObj(value)) { + return Bluebird.props( + mapValues(value, o => deepDecryptIfNeeded(o, publicKey)) + ) + } + + if ( + typeof value === 'string' && + value.indexOf($$__SHOCKWALLET__ENCRYPTED__) === 0 + ) { + const user = getUser() + if (!user.is) { + throw new Error(Constants.ErrorCode.NOT_AUTH) + } + + let sec = '' + if (user.is.pub === publicKey) { + sec = getMySecret() + } else { + sec = await SEA.secret(publicKey, user._.sea) + } + + const decrypted = SEA.decrypt(value, sec) + + return decrypted + } + + return value +} + /** * @param {ValidDataValue} value * @returns {Promise} @@ -148,5 +190,7 @@ const set = async (rawPath, value) => { module.exports = { put, - set + set, + deepDecryptIfNeeded, + deepEncryptIfNeeded }