def command(self): session, config = self.session, self.session.config handle, lines = self.args[0], self.args[1:] vcard = config.vcards.get_vcard(handle) if not vcard: return self._error('%s not found: %s' % (self.VCARD, handle)) config.vcards.deindex_vcard(vcard) try: for l in lines: if '=' in l[:5]: ln, l = l.split('=', 1) vcard.set_line(int(ln.strip()), VCardLine(l.strip())) else: vcard.add(VCardLine(l)) vcard.save() return self._success(_("Added %d lines") % len(lines), result=self._vcard_list([vcard], simplify=True, info={ 'updated': handle, 'added': len(lines) })) except KeyboardInterrupt: raise except: config.vcards.index_vcard(vcard) self._ignore_exception() return self._error(_('Error adding lines to %s') % handle) finally: config.vcards.index_vcard(vcard)
def _make_new_vcard(self, handle, name): l = [VCardLine(name='fn', value=name), VCardLine(name='kind', value=self.KIND)] if self.KIND == 'individual': return SimpleVCard(VCardLine(name='email', value=handle), *l) else: return SimpleVCard(VCardLine(name='nickname', value=handle), *l)
def command(self): session, config = self.session, self.session.config if self.args: handle, lines = self.args[0], self.args[1:] else: handle = self.data.get('rid', self.data.get('email', [None]))[0] if not handle: raise ValueError('Must set rid or email to choose VCard') name, value, replace, replace_all = (self.data.get(n, [None])[0] for n in ('name', 'value', 'replace', 'replace_all')) if not name or not value or ':' in name or '=' in name: raise ValueError('Must send a line name and line data') value = '%s:%s' % (name, value) if replace: value = '%d=%s:%s' % (replace, value) elif replace_all: value = '=%s:%s' % (replace, value) lines = [value] vcard = config.vcards.get_vcard(handle) if not vcard: return self._error('%s not found: %s' % (self.VCARD, handle)) config.vcards.deindex_vcard(vcard) try: for l in lines: if l[0] == '=': l = l[1:] name = l.split(':', 1)[0] existing = [ex._line_id for ex in vcard.get_all(name)] vcard.add(VCardLine(l.strip())) vcard.remove(*existing) elif '=' in l[:5]: ln, l = l.split('=', 1) vcard.set_line(int(ln.strip()), VCardLine(l.strip())) else: vcard.add(VCardLine(l)) vcard.save() return self._success(_("Added %d lines") % len(lines), result=self._vcard_list([vcard], simplify=True, info={ 'updated': handle, 'added': len(lines) })) except KeyboardInterrupt: raise except: config.vcards.index_vcard(vcard) self._ignore_exception() return self._error(_('Error adding lines to %s') % handle) finally: config.vcards.index_vcard(vcard)
def _make_new_vcard(self, handle, name, kind): l = [ VCardLine(name='fn', value=name), VCardLine(name='kind', value=kind) ] if self.KIND in VCardStore.KINDS_PEOPLE: return MailpileVCard( VCardLine(name='email', value=handle, type='pref'), *l) else: return MailpileVCard(VCardLine(name='nickname', value=handle), *l)
def _get_or_create_vcard(self, address): vcard = self.session.config.vcards.get_vcard(address) if not vcard: vcard = MailpileVCard(VCardLine(name='email', value=address, type='pref'), VCardLine(name='kind', value='individual'), config=self.session.config) self.session.config.vcards.add_vcards(vcard) return vcard
def test_vcard_overrides_mail_history(self): vcard = self._add_vcard('Encrypter', '*****@*****.**') vcard.add(VCardLine(name=VCARD_CRYPTO_POLICY, value='sign')) res = self.mp.crypto_policy('*****@*****.**').as_dict() self.assertEqual('success', res['status']) self.assertEqual('sign', res['result']['crypto-policy'])
def _update_vcard(self, vcard, policy): if 'default' == policy: for line in vcard.get_all(VCARD_CRYPTO_POLICY): vcard.remove(line.line_id) else: if len(vcard.get_all(VCARD_CRYPTO_POLICY)) > 0: vcard.get(VCARD_CRYPTO_POLICY).value = policy else: vcard.add(VCardLine(name=VCARD_CRYPTO_POLICY, value=policy))
def get_vcards(self): if not self.config.active: return [] def _b64(data): return data.encode('base64').replace('\n', '') results = [] for contact in self._want_update(): email = contact.email if not email: continue if mailpile.util.QUITTING: return [] vcard = MailpileVCard(VCardLine(name=self.VCARD_TS, value=int(time.time()))) email, img, gcard, gjson = self.check_libravatar(contact, email) if gcard: # FIXME: Is this boring? # vcard.load(data=gcard) pass if gjson: # FIXME: This is less boring! pass if img: vcard.add(VCardLine( name='photo', value='data:image/jpeg;base64,%s' % _b64(img), mediatype='image/jpeg' )) if gcard or gjson or img: vcard.add(VCardLine(name='email', value=email)) results.append(vcard) return results
def command(self): session, config = self.session, self.session.config handle, var, lines = self.args[0], self.args[1], self.args[2:] vcard = config.vcards.get_vcard(handle) if not vcard: return self._error('%s not found: %s' % (self.VCARD, handle)) config.vcards.deindex_vcard(vcard) try: vcard.add(*[VCardLine(l) for l in lines]) vcard.save() return self._vcard_list([vcard], info={ 'updated': handle, 'added': len(lines) }) except: config.vcards.index_vcard(vcard) self._ignore_exception() return self._error('Error setting %s = %s' % (var, val)) finally: config.vcards.index_vcard(vcard)
def _add_vcard(self, full_name, email): card = MailpileVCard(VCardLine(name='fn', value=full_name), VCardLine(name='email', value=email)) self.config.vcards.add_vcards(card) return card
def test_default_policy_removes_vcard_line(self): vcard = self._add_vcard('Test', '*****@*****.**') vcard.add(VCardLine(name=VCARD_CRYPTO_POLICY, value='sign')) self.mp.crypto_policy_set('*****@*****.**', 'default') self.assertEqual(0, len(vcard.get_all(VCARD_CRYPTO_POLICY)))
def _add_vcard(self, full_name, email): card = SimpleVCard(VCardLine(name='fn', value=full_name), VCardLine(name='email', value=email)) self.config.vcards.index_vcard(card) return card