const EncryptionService = require('lib/services/EncryptionService'); const { _ } = require('lib/locale.js'); const BaseItem = require('lib/models/BaseItem.js'); const Setting = require('lib/models/Setting.js'); const shared = {}; shared.constructor = function(comp) { comp.state = { masterKeys: [], passwords: {}, passwordChecks: {}, stats: { encrypted: null, total: null, }, }; comp.isMounted_ = false; comp.refreshStatsIID_ = null; } shared.initState = function(comp, props) { comp.setState({ masterKeys: props.masterKeys, passwords: props.passwords ? props.passwords : {}, }, () => { comp.checkPasswords(); }); comp.refreshStats(); if (comp.refreshStatsIID_) { clearInterval(comp.refreshStatsIID_); comp.refreshStatsIID_ = null; } comp.refreshStatsIID_ = setInterval(() => { if (!comp.isMounted_) { clearInterval(comp.refreshStatsIID_); comp.refreshStatsIID_ = null; return; } comp.refreshStats(); }, 3000); } shared.refreshStats = async function(comp) { const stats = await BaseItem.encryptedItemsStats(); comp.setState({ stats: stats }); } shared.checkPasswords = async function(comp) { const passwordChecks = Object.assign({}, comp.state.passwordChecks); for (let i = 0; i < comp.state.masterKeys.length; i++) { const mk = comp.state.masterKeys[i]; const password = comp.state.passwords[mk.id]; const ok = password ? await EncryptionService.instance().checkMasterKeyPassword(mk, password) : false; passwordChecks[mk.id] = ok; } comp.setState({ passwordChecks: passwordChecks }); } shared.decryptedStatText = function(comp) { const stats = comp.state.stats; const doneCount = stats.encrypted !== null ? (stats.total - stats.encrypted) : '-'; const totalCount = stats.total !== null ? stats.total : '-'; return _('Decrypted items: %s / %s', doneCount, totalCount); } shared.onSavePasswordClick = function(comp, mk) { const password = comp.state.passwords[mk.id]; if (!password) { Setting.deleteObjectKey('encryption.passwordCache', mk.id); } else { Setting.setObjectKey('encryption.passwordCache', mk.id, password); } comp.checkPasswords(); } shared.onPasswordChange = function(comp, mk, password) { const passwords = comp.state.passwords; passwords[mk.id] = password; comp.setState({ passwords: passwords }); } module.exports = shared;