KIdentityManagement

identity.cpp
1/*
2 SPDX-FileCopyrightText: 2002-2004 Marc Mutz <mutz@kde.org>
3 SPDX-FileCopyrightText: 2007 Tom Albers <tomalbers@kde.nl>
4
5 SPDX-License-Identifier: LGPL-2.0-or-later
6*/
7
8#include "identity.h"
9
10#include "kidentitymanagementcore_debug.h"
11#include <KConfigGroup>
12#include <KEmailAddress>
13
14#include <QByteArray>
15#include <QHostInfo>
16#include <QMimeData>
17
18using namespace Qt::Literals::StringLiterals;
19using namespace KIdentityManagementCore;
20
21static Identity *identityNull = nullptr;
22
23Q_DECLARE_METATYPE(KIdentityManagementCore::Signature)
24
25Identity::Identity(const QString &id, const QString &fullName, const QString &emailAddr, const QString &organization, const QString &replyToAddr)
26{
27 qRegisterMetaType<Signature>();
29 setProperty(QLatin1StringView(s_identity), id);
30 setProperty(QLatin1StringView(s_name), fullName);
31 setProperty(QLatin1StringView(s_primaryEmail), emailAddr);
32 setProperty(QLatin1StringView(s_organization), organization);
33 setProperty(QLatin1StringView(s_replyto), replyToAddr);
34 // FIXME KF6: Sonnet::defaultLanguageName is gone
35 // setDictionary( Sonnet::defaultLanguageName() );
36 setProperty(QLatin1StringView(s_disabledFcc), false);
38 setProperty(QLatin1StringView(s_disabledSpam), false);
39}
40
41const Identity &Identity::null()
42{
43 if (!identityNull) {
44 identityNull = new Identity;
45 }
46 return *identityNull;
47}
48
49bool Identity::isNull() const
50{
51 QHash<QString, QVariant>::const_iterator i = mPropertiesMap.constBegin();
52
53 while (i != mPropertiesMap.constEnd()) {
54 const QString &key = i.key();
55 // Take into account that the defaultDomainName for a null identity is not empty
56 if (key == QLatin1StringView(s_defaultDomainName)) {
57 ++i;
58 continue;
59 }
60 // Take into account that the dictionary for a null identity is not empty
61 if (key == QLatin1StringView(s_dict)) {
62 ++i;
63 continue;
64 }
65 // Take into account that disableFcc == false for a null identity
66 if (key == QLatin1StringView(s_disabledFcc) && i.value().toBool() == false) {
67 ++i;
68 continue;
69 }
70 // Take into account that disableFcc == false for a null identity
71 if (key == QLatin1StringView(s_disabledSpam) && i.value().toBool() == false) {
72 ++i;
73 continue;
74 }
75 // The uoid is 0 by default, so ignore this
76 if (!(key == QLatin1StringView(s_uoid) && i.value().toUInt() == 0)) {
77 if (!i.value().isNull() || (i.value().metaType().id() == QMetaType::QString && !i.value().toString().isEmpty())) {
78 return false;
79 }
80 }
81 ++i;
82 }
83
84 return true;
85}
86
88{
89 // get all keys and convert them to our QHash.
90 QMap<QString, QString> entries = config.entryMap();
93 while (i != end) {
94 const QString &key = i.key();
95 if (key == QLatin1StringView(s_emailAliases) || key == QLatin1StringView(s_activities)) {
96 // HACK: Read s_emailAliases as a stringlist
97 mPropertiesMap.insert(key, config.readEntry(key, QStringList()));
98 } else {
99 mPropertiesMap.insert(key, config.readEntry(key));
100 }
101 ++i;
102 }
103 // needs to update to v5.21.41
104 // Check if we update to to encryption override mode
105 // before we had only auto_encrypt and auto_sign and no global setting
106 if (!mPropertiesMap.contains(QLatin1StringView(s_encryptionOverride)) && !mPropertiesMap.contains(QLatin1StringView(s_warnnotencrypt))
107 && !mPropertiesMap.contains(QLatin1StringView(s_warnnotsign))) {
108 setEncryptionOverride(true);
109 }
110 mSignature.readConfig(config);
111}
112
114{
115 QHash<QString, QVariant>::const_iterator i = mPropertiesMap.constBegin();
116 QHash<QString, QVariant>::const_iterator end = mPropertiesMap.constEnd();
117 while (i != end) {
118 config.writeEntry(i.key(), i.value());
119 qCDebug(KIDENTITYMANAGEMENT_LOG) << "Store:" << i.key() << ":" << i.value();
120 ++i;
121 }
122 if (!mPropertiesMap.contains(QLatin1StringView(s_encryptionOverride))) {
123 config.writeEntry(QLatin1StringView(s_encryptionOverride), false);
124 qCDebug(KIDENTITYMANAGEMENT_LOG) << "Add" << s_encryptionOverride << ":" << false;
125 }
126 mSignature.writeConfig(config);
127}
128
129bool Identity::mailingAllowed() const
130{
131 return !property(QLatin1StringView(s_primaryEmail)).toString().isEmpty();
132}
133
134QString Identity::mimeDataType()
135{
136 return QStringLiteral("application/x-kmail-identity-drag");
137}
138
139bool Identity::canDecode(const QMimeData *md)
140{
141 if (md) {
142 return md->hasFormat(mimeDataType());
143 } else {
144 return false;
145 }
146}
147
148void Identity::populateMimeData(QMimeData *md) const
149{
150 QByteArray a;
151 {
152 QDataStream s(&a, QIODevice::WriteOnly);
153 s << *this;
154 }
155 md->setData(mimeDataType(), a);
156}
157
158Identity Identity::fromMimeData(const QMimeData *md)
159{
160 Identity i;
161 if (canDecode(md)) {
162 QByteArray ba = md->data(mimeDataType());
163 QDataStream s(&ba, QIODevice::ReadOnly);
164 s >> i;
165 }
166 return i;
167}
168
169// ------------------ Operators --------------------------//
170
171QDataStream &KIdentityManagementCore::operator<<(QDataStream &stream, const KIdentityManagementCore::Identity &i)
172{
173 return stream << static_cast<quint32>(i.uoid()) << i.mPropertiesMap[QLatin1StringView(s_identity)] << i.mPropertiesMap[QLatin1StringView(s_name)]
174 << i.mPropertiesMap[QLatin1StringView(s_organization)] << i.mPropertiesMap[QLatin1StringView(s_pgps)]
175 << i.mPropertiesMap[QLatin1StringView(s_pgpe)] << i.mPropertiesMap[QLatin1StringView(s_smimes)]
176 << i.mPropertiesMap[QLatin1StringView(s_smimee)] << i.mPropertiesMap[QLatin1StringView(s_primaryEmail)]
177 << i.mPropertiesMap[QLatin1StringView(s_emailAliases)] << i.mPropertiesMap[QLatin1StringView(s_replyto)]
178 << i.mPropertiesMap[QLatin1StringView(s_bcc)] << i.mPropertiesMap[QLatin1StringView(s_vcard)]
179 << i.mPropertiesMap[QLatin1StringView(s_transport)] << i.mPropertiesMap[QLatin1StringView(s_fcc)]
180 << i.mPropertiesMap[QLatin1StringView(s_drafts)] << i.mPropertiesMap[QLatin1StringView(s_templates)] << i.mSignature
181 << i.mPropertiesMap[QLatin1StringView(s_dict)] << i.mPropertiesMap[QLatin1StringView(s_xface)]
182 << i.mPropertiesMap[QLatin1StringView(s_xfaceenabled)] << i.mPropertiesMap[QLatin1StringView(s_face)]
183 << i.mPropertiesMap[QLatin1StringView(s_faceenabled)] << i.mPropertiesMap[QLatin1StringView(s_prefcrypt)]
184 << i.mPropertiesMap[QLatin1StringView(s_cc)] << i.mPropertiesMap[QLatin1StringView(s_attachVcard)]
185 << i.mPropertiesMap[QLatin1StringView(s_autocorrectionLanguage)] << i.mPropertiesMap[QLatin1StringView(s_disabledFcc)]
186 << i.mPropertiesMap[QLatin1StringView(s_defaultDomainName)] << i.mPropertiesMap[QLatin1StringView(s_autocryptEnabled)]
187 << i.mPropertiesMap[QLatin1StringView(s_autocryptPrefer)] << i.mPropertiesMap[QLatin1StringView(s_encryptionOverride)]
188 << i.mPropertiesMap[QLatin1StringView(s_pgpautosign)] << i.mPropertiesMap[QLatin1StringView(s_pgpautoencrypt)]
189 << i.mPropertiesMap[QLatin1StringView(s_warnnotencrypt)] << i.mPropertiesMap[QLatin1StringView(s_warnnotsign)]
190 << i.mPropertiesMap[QLatin1StringView(s_activities)] << i.mPropertiesMap[QLatin1StringView(s_enabledActivities)]
191 << i.mPropertiesMap[QLatin1StringView(s_spam)] << i.mPropertiesMap[QLatin1StringView(s_disabledSpam)];
192}
193
194QDataStream &KIdentityManagementCore::operator>>(QDataStream &stream, KIdentityManagementCore::Identity &i)
195{
196 quint32 uoid;
197 stream >> uoid >> i.mPropertiesMap[QLatin1StringView(s_identity)] >> i.mPropertiesMap[QLatin1StringView(s_name)]
198 >> i.mPropertiesMap[QLatin1StringView(s_organization)] >> i.mPropertiesMap[QLatin1StringView(s_pgps)] >> i.mPropertiesMap[QLatin1StringView(s_pgpe)]
199 >> i.mPropertiesMap[QLatin1StringView(s_smimes)] >> i.mPropertiesMap[QLatin1StringView(s_smimee)] >> i.mPropertiesMap[QLatin1StringView(s_primaryEmail)]
200 >> i.mPropertiesMap[QLatin1StringView(s_emailAliases)] >> i.mPropertiesMap[QLatin1StringView(s_replyto)] >> i.mPropertiesMap[QLatin1StringView(s_bcc)]
201 >> i.mPropertiesMap[QLatin1StringView(s_vcard)] >> i.mPropertiesMap[QLatin1StringView(s_transport)] >> i.mPropertiesMap[QLatin1StringView(s_fcc)]
202 >> i.mPropertiesMap[QLatin1StringView(s_drafts)] >> i.mPropertiesMap[QLatin1StringView(s_templates)] >> i.mSignature
203 >> i.mPropertiesMap[QLatin1StringView(s_dict)] >> i.mPropertiesMap[QLatin1StringView(s_xface)] >> i.mPropertiesMap[QLatin1StringView(s_xfaceenabled)]
204 >> i.mPropertiesMap[QLatin1StringView(s_face)] >> i.mPropertiesMap[QLatin1StringView(s_faceenabled)] >> i.mPropertiesMap[QLatin1StringView(s_prefcrypt)]
205 >> i.mPropertiesMap[QLatin1StringView(s_cc)] >> i.mPropertiesMap[QLatin1StringView(s_attachVcard)]
206 >> i.mPropertiesMap[QLatin1StringView(s_autocorrectionLanguage)] >> i.mPropertiesMap[QLatin1StringView(s_disabledFcc)]
207 >> i.mPropertiesMap[QLatin1StringView(s_defaultDomainName)] >> i.mPropertiesMap[QLatin1StringView(s_autocryptEnabled)]
208 >> i.mPropertiesMap[QLatin1StringView(s_autocryptPrefer)] >> i.mPropertiesMap[QLatin1StringView(s_encryptionOverride)]
209 >> i.mPropertiesMap[QLatin1StringView(s_pgpautosign)] >> i.mPropertiesMap[QLatin1StringView(s_pgpautoencrypt)]
210 >> i.mPropertiesMap[QLatin1StringView(s_warnnotencrypt)] >> i.mPropertiesMap[QLatin1StringView(s_warnnotsign)]
211 >> i.mPropertiesMap[QLatin1StringView(s_activities)] >> i.mPropertiesMap[QLatin1StringView(s_enabledActivities)]
212 >> i.mPropertiesMap[QLatin1StringView(s_spam)] >> i.mPropertiesMap[QLatin1StringView(s_disabledSpam)];
213
214 i.setProperty(QLatin1StringView(s_uoid), uoid);
215 return stream;
216}
217
218bool Identity::operator<(const Identity &other) const
219{
220 if (isDefault()) {
221 return true;
222 }
223 if (other.isDefault()) {
224 return false;
225 }
226 return identityName() < other.identityName();
227}
228
229bool Identity::operator>(const Identity &other) const
230{
231 if (isDefault()) {
232 return false;
233 }
234 if (other.isDefault()) {
235 return true;
236 }
237 return identityName() > other.identityName();
238}
239
240bool Identity::operator<=(const Identity &other) const
241{
242 return !operator>(other);
243}
244
245bool Identity::operator>=(const Identity &other) const
246{
247 return !operator<(other);
248}
249
250bool Identity::operator==(const Identity &other) const
251{
252 // The deserializer fills in the QHash will lots of invalid variants, which
253 // is OK, but the CTOR doesn't fill the hash with the missing fields, so
254 // regular mPropertiesMap == other.mPropertiesMap comparison will fail.
255 // This algo considers both maps equal even if one map does not contain the
256 // key and the other one contains the key but with an invalid value
257 for (const auto &pair : {qMakePair(mPropertiesMap, other.mPropertiesMap), qMakePair(other.mPropertiesMap, mPropertiesMap)}) {
258 const auto lhs = pair.first;
259 const auto rhs = pair.second;
260 for (auto lhsIt = lhs.constBegin(), lhsEnd = lhs.constEnd(); lhsIt != lhsEnd; ++lhsIt) {
261 const auto rhsIt = rhs.constFind(lhsIt.key());
262 // Does the other map contain the key?
263 if (rhsIt == rhs.constEnd()) {
264 // It does not, so check if our value is invalid, if yes, consider it
265 // equal to not present and continue
266 if (lhsIt->isValid()) {
267 return false;
268 }
269 } else if (lhsIt.value() != rhsIt.value()) {
270 // Both maps have the key, but different value -> different maps
271 return false;
272 }
273 }
274 }
275
276 return mSignature == other.mSignature;
277}
278
279bool Identity::operator!=(const Identity &other) const
280{
281 return !operator==(other);
282}
283
284// --------------------- Getters -----------------------------//
285
287{
288 if (key == QLatin1StringView(s_signature)) {
289 return QVariant::fromValue(mSignature);
290 } else {
291 return mPropertiesMap.value(key);
292 }
293}
294
295QString Identity::fullEmailAddr() const
296{
297 const QString name = mPropertiesMap.value(QLatin1StringView(s_name)).toString();
298 const QString mail = mPropertiesMap.value(QLatin1StringView(s_primaryEmail)).toString();
299
300 if (name.isEmpty()) {
301 return mail;
302 }
303
304 const QString specials(QStringLiteral("()<>@,.;:[]"));
305
306 QString result;
307
308 // add DQUOTE's if necessary:
309 bool needsQuotes = false;
310 const int nameLength(name.length());
311 for (int i = 0; i < nameLength; i++) {
312 if (specials.contains(name[i])) {
313 needsQuotes = true;
314 } else if (name[i] == QLatin1Char('\\') || name[i] == QLatin1Char('"')) {
315 needsQuotes = true;
316 result += QLatin1Char('\\');
317 }
318 result += name[i];
319 }
320
321 if (needsQuotes) {
322 result.insert(0, QLatin1Char('"'));
323 result += QLatin1Char('"');
324 }
325
326 result += " <"_L1 + mail + QLatin1Char('>');
327
328 return result;
329}
330
331QString Identity::identityName() const
332{
333 return property(QLatin1StringView(s_identity)).toString();
334}
335
336QString Identity::signatureText(bool *ok) const
337{
338 return mSignature.withSeparator(ok);
339}
340
341bool Identity::signatureIsInlinedHtml() const
342{
343 return mSignature.isInlinedHtml();
344}
345
347{
348 return mIsDefault;
349}
350
351uint Identity::uoid() const
352{
353 return property(QLatin1StringView(s_uoid)).toInt();
354}
355
356QString Identity::fullName() const
357{
358 return property(QLatin1StringView(s_name)).toString();
359}
360
361QString Identity::organization() const
362{
363 return property(QLatin1StringView(s_organization)).toString();
364}
365
366QByteArray Identity::pgpEncryptionKey() const
367{
368 return property(QLatin1StringView(s_pgpe)).toByteArray();
369}
370
371QByteArray Identity::pgpSigningKey() const
372{
373 return property(QLatin1StringView(s_pgps)).toByteArray();
374}
375
376QByteArray Identity::smimeEncryptionKey() const
377{
378 return property(QLatin1StringView(s_smimee)).toByteArray();
379}
380
381QByteArray Identity::smimeSigningKey() const
382{
383 return property(QLatin1StringView(s_smimes)).toByteArray();
384}
385
386QString Identity::preferredCryptoMessageFormat() const
387{
388 return property(QLatin1StringView(s_prefcrypt)).toString();
389}
390
391QString Identity::primaryEmailAddress() const
392{
393 return property(QLatin1StringView(s_primaryEmail)).toString();
394}
395
396const QStringList Identity::emailAliases() const
397{
398 return property(QLatin1StringView(s_emailAliases)).toStringList();
399}
400
401QString Identity::vCardFile() const
402{
403 return property(QLatin1StringView(s_vcard)).toString();
404}
405
406bool Identity::attachVcard() const
407{
408 return property(QLatin1StringView(s_attachVcard)).toBool();
409}
410
411QString Identity::replyToAddr() const
412{
413 return property(QLatin1StringView(s_replyto)).toString();
414}
415
416QString Identity::bcc() const
417{
418 return property(QLatin1StringView(s_bcc)).toString();
419}
420
421QString Identity::cc() const
422{
423 return property(QLatin1StringView(s_cc)).toString();
424}
425
426Signature &Identity::signature()
427{
428 return mSignature;
429}
430
431bool Identity::isXFaceEnabled() const
432{
433 return property(QLatin1StringView(s_xfaceenabled)).toBool();
434}
435
436QString Identity::xface() const
437{
438 return property(QLatin1StringView(s_xface)).toString();
439}
440
441bool Identity::isFaceEnabled() const
442{
443 return property(QLatin1StringView(s_faceenabled)).toBool();
444}
445
446QString Identity::face() const
447{
448 return property(QLatin1StringView(s_face)).toString();
449}
450
451QString Identity::dictionary() const
452{
453 return property(QLatin1StringView(s_dict)).toString();
454}
455
456QString Identity::templates() const
457{
458 const QString str = property(QLatin1StringView(s_templates)).toString();
459 return verifyAkonadiId(str);
460}
461
462QString Identity::drafts() const
463{
464 const QString str = property(QLatin1StringView(s_drafts)).toString();
465 return verifyAkonadiId(str);
466}
467
468QString Identity::fcc() const
469{
470 const QString str = property(QLatin1StringView(s_fcc)).toString();
471 return verifyAkonadiId(str);
472}
473
474QString Identity::spam() const
475{
476 const QString str = property(QLatin1StringView(s_spam)).toString();
477 return verifyAkonadiId(str);
478}
479
480QString Identity::transport() const
481{
482 return property(QLatin1StringView(s_transport)).toString();
483}
484
486{
487 return mSignature.type() == Signature::FromCommand;
488}
489
491{
492 return mSignature.type() == Signature::FromFile;
493}
494
496{
497 return mSignature.type() == Signature::Inlined;
498}
499
504
506{
507 return mSignature.text();
508}
509
511{
512 return mSignature.path();
513}
514
515QString Identity::autocorrectionLanguage() const
516{
517 return property(QLatin1StringView(s_autocorrectionLanguage)).toString();
518}
519
520// --------------------- Setters -----------------------------//
521
522void Identity::setProperty(const QString &key, const QVariant &value)
523{
524 if (key == QLatin1StringView(s_signature)) {
525 mSignature = value.value<Signature>();
526 } else {
527 if (value.isNull() || (value.metaType().id() == QMetaType::QString && value.toString().isEmpty())) {
528 mPropertiesMap.remove(key);
529 } else {
530 mPropertiesMap.insert(key, value);
531 }
532 }
533}
534
535void Identity::setUoid(uint aUoid)
536{
537 setProperty(QLatin1StringView(s_uoid), aUoid);
538}
539
541{
542 setProperty(QLatin1StringView(s_identity), name);
543}
544
545void Identity::setFullName(const QString &str)
546{
547 setProperty(QLatin1StringView(s_name), str);
548}
549
550void Identity::setOrganization(const QString &str)
551{
552 setProperty(QLatin1StringView(s_organization), str);
553}
554
555void Identity::setPGPSigningKey(const QByteArray &str)
556{
557 setProperty(QLatin1StringView(s_pgps), QLatin1StringView(str));
558}
559
560void Identity::setPGPEncryptionKey(const QByteArray &str)
561{
562 setProperty(QLatin1StringView(s_pgpe), QLatin1StringView(str));
563}
564
565void Identity::setSMIMESigningKey(const QByteArray &str)
566{
567 setProperty(QLatin1StringView(s_smimes), QLatin1StringView(str));
568}
569
570void Identity::setSMIMEEncryptionKey(const QByteArray &str)
571{
572 setProperty(QLatin1StringView(s_smimee), QLatin1StringView(str));
573}
574
575void Identity::setPrimaryEmailAddress(const QString &email)
576{
577 setProperty(QLatin1StringView(s_primaryEmail), email);
578}
579
580void Identity::setEmailAliases(const QStringList &aliases)
581{
582 setProperty(QLatin1StringView(s_emailAliases), aliases);
583}
584
585const QStringList Identity::activities() const
586{
587 return property(QLatin1StringView(s_activities)).toStringList();
588}
589
590void Identity::setActivities(const QStringList &a)
591{
592 setProperty(QLatin1StringView(s_activities), a);
593}
594
595bool Identity::enabledActivities() const
596{
597 return property(QLatin1StringView(s_enabledActivities)).toBool();
598}
599
600void Identity::setEnabledActivities(bool a)
601{
602 setProperty(QLatin1StringView(s_enabledActivities), a);
603}
604
605void Identity::setVCardFile(const QString &str)
606{
607 setProperty(QLatin1StringView(s_vcard), str);
608}
609
610void Identity::setAttachVcard(bool attachment)
611{
612 setProperty(QLatin1StringView(s_attachVcard), attachment);
613}
614
615void Identity::setReplyToAddr(const QString &str)
616{
617 setProperty(QLatin1StringView(s_replyto), str);
618}
619
620void Identity::setSignatureFile(const QString &str)
621{
622 mSignature.setPath(str, signatureIsCommand());
623}
624
625void Identity::setSignatureInlineText(const QString &str)
626{
627 mSignature.setText(str);
628}
629
630void Identity::setTransport(const QString &str)
631{
632 setProperty(QLatin1StringView(s_transport), str);
633}
634
635void Identity::setFcc(const QString &str)
636{
637 setProperty(QLatin1StringView(s_fcc), str);
638}
639
640void Identity::setSpam(const QString &str)
641{
642 setProperty(QLatin1StringView(s_spam), str);
643}
644
645void Identity::setDrafts(const QString &str)
646{
647 setProperty(QLatin1StringView(s_drafts), str);
648}
649
650void Identity::setTemplates(const QString &str)
651{
652 setProperty(QLatin1StringView(s_templates), str);
653}
654
655void Identity::setDictionary(const QString &str)
656{
657 setProperty(QLatin1StringView(s_dict), str);
658}
659
660void Identity::setBcc(const QString &str)
661{
662 setProperty(QLatin1StringView(s_bcc), str);
663}
664
665void Identity::setCc(const QString &str)
666{
667 setProperty(QLatin1StringView(s_cc), str);
668}
669
671{
672 mIsDefault = flag;
673}
674
675void Identity::setPreferredCryptoMessageFormat(const QString &str)
676{
677 setProperty(QLatin1StringView(s_prefcrypt), str);
678}
679
680void Identity::setXFace(const QString &str)
681{
682 QString strNew = str;
683 strNew.remove(QLatin1Char(' '));
684 strNew.remove(QLatin1Char('\n'));
685 strNew.remove(QLatin1Char('\r'));
686 setProperty(QLatin1StringView(s_xface), strNew);
687}
688
689void Identity::setXFaceEnabled(bool on)
690{
691 setProperty(QLatin1StringView(s_xfaceenabled), on);
692}
693
694void Identity::setFace(const QString &str)
695{
696 QString strNew = str;
697 strNew.remove(QLatin1Char(' '));
698 strNew.remove(QLatin1Char('\n'));
699 strNew.remove(QLatin1Char('\r'));
700 setProperty(QLatin1StringView(s_face), strNew);
701}
702
703void Identity::setFaceEnabled(bool on)
704{
705 setProperty(QLatin1StringView(s_faceenabled), on);
706}
707
708void Identity::setSignature(const Signature &sig)
709{
710 mSignature = sig;
711}
712
714{
715 const QString addrSpec = KEmailAddress::extractEmailAddress(addr).toLower();
716 if (addrSpec == primaryEmailAddress().toLower()) {
717 return true;
718 }
719
720 const QStringList lst = emailAliases();
721 for (const QString &alias : lst) {
722 if (alias.toLower() == addrSpec) {
723 return true;
724 }
725 }
726
727 return false;
728}
729
730void Identity::setAutocorrectionLanguage(const QString &language)
731{
732 setProperty(QLatin1StringView(s_autocorrectionLanguage), language);
733}
734
735bool Identity::disabledFcc() const
736{
737 const QVariant var = property(QLatin1StringView(s_disabledFcc));
738 if (var.isNull()) {
739 return false;
740 } else {
741 return var.toBool();
742 }
743}
744
745void Identity::setDisabledFcc(bool disable)
746{
747 setProperty(QLatin1StringView(s_disabledFcc), disable);
748}
749
750bool Identity::disabledSpam() const
751{
752 const QVariant var = property(QLatin1StringView(s_disabledSpam));
753 if (var.isNull()) {
754 return false;
755 } else {
756 return var.toBool();
757 }
758}
759
760void Identity::setDisabledSpam(bool disable)
761{
762 setProperty(QLatin1StringView(s_disabledSpam), disable);
763}
764
765bool Identity::pgpAutoSign() const
766{
767 const QVariant var = property(QLatin1StringView(s_pgpautosign));
768 if (var.isNull()) {
769 return false;
770 } else {
771 return var.toBool();
772 }
773}
774
775void Identity::setPgpAutoSign(bool autoSign)
776{
777 setProperty(QLatin1StringView(s_pgpautosign), autoSign);
778}
779
780bool Identity::pgpAutoEncrypt() const
781{
782 const QVariant var = property(QLatin1StringView(s_pgpautoencrypt));
783 if (var.isNull()) {
784 return false;
785 } else {
786 return var.toBool();
787 }
788}
789
790void Identity::setPgpAutoEncrypt(bool autoEncrypt)
791{
792 setProperty(QLatin1StringView(s_pgpautoencrypt), autoEncrypt);
793}
794
795bool Identity::autocryptEnabled() const
796{
797 const auto var = property(QLatin1StringView(s_autocryptEnabled));
798 if (var.isNull()) {
799 return false;
800 } else {
801 return var.toBool();
802 }
803}
804
805void Identity::setAutocryptEnabled(const bool on)
806{
807 setProperty(QLatin1StringView(s_autocryptEnabled), on);
808}
809
810bool Identity::autocryptPrefer() const
811{
812 const auto var = property(QLatin1StringView(s_autocryptPrefer));
813 if (var.isNull()) {
814 return false;
815 } else {
816 return var.toBool();
817 }
818}
819
820void Identity::setAutocryptPrefer(const bool on)
821{
822 setProperty(QLatin1StringView(s_autocryptPrefer), on);
823}
824
825bool Identity::encryptionOverride() const
826{
827 const auto var = property(QLatin1StringView(s_encryptionOverride));
828 if (var.isNull()) {
829 return false;
830 } else {
831 return var.toBool();
832 }
833}
834
835void Identity::setEncryptionOverride(const bool on)
836{
837 setProperty(QLatin1StringView(s_encryptionOverride), on);
838}
839
840bool Identity::warnNotEncrypt() const
841{
842 const auto var = property(QLatin1StringView(s_warnnotencrypt));
843 if (var.isNull()) {
844 return false;
845 } else {
846 return var.toBool();
847 }
848}
849
850void Identity::setWarnNotEncrypt(const bool on)
851{
852 setProperty(QLatin1StringView(s_warnnotencrypt), on);
853}
854
855bool Identity::warnNotSign() const
856{
857 const auto var = property(QLatin1StringView(s_warnnotsign));
858 if (var.isNull()) {
859 return false;
860 } else {
861 return var.toBool();
862 }
863}
864
865void Identity::setWarnNotSign(const bool on)
866{
867 setProperty(QLatin1StringView(s_warnnotsign), on);
868}
869
870QString Identity::defaultDomainName() const
871{
872 return property(QLatin1StringView(s_defaultDomainName)).toString();
873}
874
875void Identity::setDefaultDomainName(const QString &domainName)
876{
877 setProperty(QLatin1StringView(s_defaultDomainName), domainName);
878}
879
881{
882 if (str.isEmpty()) {
883 return str;
884 }
885 bool ok = false;
886 const qlonglong val = str.toLongLong(&ok);
887 Q_UNUSED(val)
888 if (ok) {
889 return str;
890 } else {
891 return {};
892 }
893}
894
895#include "moc_identity.cpp"
void writeEntry(const char *key, const char *value, WriteConfigFlags pFlags=Normal)
QString readEntry(const char *key, const char *aDefault=nullptr) const
QMap< QString, QString > entryMap() const
User identity information.
Definition identity.h:76
bool operator!=(const Identity &other) const
used for comparison
Definition identity.cpp:279
bool matchesEmailAddress(const QString &addr) const
Definition identity.cpp:713
bool operator==(const Identity &other) const
used for comparison
Definition identity.cpp:250
void setUoid(uint aUoid)
Set the uiod.
Definition identity.cpp:535
QString signatureFile() const
name of the signature file (with path)
Definition identity.cpp:510
bool operator<=(const Identity &other) const
used for sorting
Definition identity.cpp:240
void setIsDefault(bool flag)
Set whether this identity is the default identity.
Definition identity.cpp:670
QVariant property(const QString &key) const
Get random properties.
Definition identity.cpp:286
QString signatureInlineText() const
inline signature
Definition identity.cpp:505
bool operator>=(const Identity &other) const
used for sorting
Definition identity.cpp:245
void writeConfig(KConfigGroup &) const
Write configuration to config.
Definition identity.cpp:113
void setProperty(const QString &key, const QVariant &value)
Set random properties, when value is empty (for QStrings) or null, the property is deleted.
Definition identity.cpp:522
void readConfig(const KConfigGroup &)
Read configuration from config.
Definition identity.cpp:87
Identity(const QString &id=QString(), const QString &realName=QString(), const QString &emailAddr=QString(), const QString &organization=QString(), const QString &replyToAddress=QString())
Constructor.
Definition identity.cpp:25
bool useSignatureFile() const
Inline or signature from a file.
Definition identity.cpp:500
bool operator<(const Identity &other) const
used for sorting
Definition identity.cpp:218
bool operator>(const Identity &other) const
used for sorting
Definition identity.cpp:229
void setIdentityName(const QString &name)
Identity/nickname for this collection.
Definition identity.cpp:540
QString verifyAkonadiId(const QString &str) const
during migration when it failed it can be a string => not a qlonglong akonadi::id => fix it
Definition identity.cpp:880
Abstraction of a signature (aka "footer").
Definition signature.h:61
KCODECS_EXPORT QByteArray extractEmailAddress(const QByteArray &address)
QByteArray toLower() const const
QString localHostName()
const_iterator constBegin() const const
const_iterator constEnd() const const
int id() const const
QByteArray data(const QString &mimeType) const const
virtual bool hasFormat(const QString &mimeType) const const
void setData(const QString &mimeType, const QByteArray &data)
bool contains(QChar ch, Qt::CaseSensitivity cs) const const
QString & insert(qsizetype position, QChar ch)
bool isEmpty() const const
qsizetype length() const const
QString & remove(QChar ch, Qt::CaseSensitivity cs)
qlonglong toLongLong(bool *ok, int base) const const
QVariant fromValue(T &&value)
bool isNull() const const
QMetaType metaType() const const
bool toBool() const const
QByteArray toByteArray() const const
int toInt(bool *ok) const const
QString toString() const const
QStringList toStringList() const const
T value() const const
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri Mar 28 2025 12:00:17 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.