File indexing completed on 2024-05-19 05:17:27

0001 /*
0002     SPDX-FileCopyrightText: 2002-2004 Marc Mutz <mutz@kde.org>
0003     SPDX-FileCopyrightText: 2007 Tom Albers <tomalbers@kde.nl>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "identity.h"
0009 
0010 #include "kidentitymanagementcore_debug.h"
0011 #include <KConfigGroup>
0012 #include <KEmailAddress>
0013 
0014 #include <QByteArray>
0015 #include <QHostInfo>
0016 #include <QMimeData>
0017 
0018 using namespace KIdentityManagementCore;
0019 
0020 static Identity *identityNull = nullptr;
0021 
0022 Q_DECLARE_METATYPE(KIdentityManagementCore::Signature)
0023 
0024 Identity::Identity(const QString &id, const QString &fullName, const QString &emailAddr, const QString &organization, const QString &replyToAddr)
0025 {
0026     qRegisterMetaType<Signature>();
0027     setProperty(QLatin1StringView(s_uoid), 0);
0028     setProperty(QLatin1StringView(s_identity), id);
0029     setProperty(QLatin1StringView(s_name), fullName);
0030     setProperty(QLatin1StringView(s_primaryEmail), emailAddr);
0031     setProperty(QLatin1StringView(s_organization), organization);
0032     setProperty(QLatin1StringView(s_replyto), replyToAddr);
0033     // FIXME KF6: Sonnet::defaultLanguageName is gone
0034     // setDictionary( Sonnet::defaultLanguageName() );
0035     setProperty(QLatin1StringView(s_disabledFcc), false);
0036     setProperty(QLatin1StringView(s_defaultDomainName), QHostInfo::localHostName());
0037 }
0038 
0039 const Identity &Identity::null()
0040 {
0041     if (!identityNull) {
0042         identityNull = new Identity;
0043     }
0044     return *identityNull;
0045 }
0046 
0047 bool Identity::isNull() const
0048 {
0049     QHash<QString, QVariant>::const_iterator i = mPropertiesMap.constBegin();
0050 
0051     while (i != mPropertiesMap.constEnd()) {
0052         const QString &key = i.key();
0053         // Take into account that the defaultDomainName for a null identity is not empty
0054         if (key == QLatin1StringView(s_defaultDomainName)) {
0055             ++i;
0056             continue;
0057         }
0058         // Take into account that the dictionary for a null identity is not empty
0059         if (key == QLatin1StringView(s_dict)) {
0060             ++i;
0061             continue;
0062         }
0063         // Take into account that disableFcc == false for a null identity
0064         if (key == QLatin1StringView(s_disabledFcc) && i.value().toBool() == false) {
0065             ++i;
0066             continue;
0067         }
0068         // The uoid is 0 by default, so ignore this
0069         if (!(key == QLatin1StringView(s_uoid) && i.value().toUInt() == 0)) {
0070             if (!i.value().isNull() || (i.value().metaType().id() == QMetaType::QString && !i.value().toString().isEmpty())) {
0071                 return false;
0072             }
0073         }
0074         ++i;
0075     }
0076 
0077     return true;
0078 }
0079 
0080 void Identity::readConfig(const KConfigGroup &config)
0081 {
0082     // get all keys and convert them to our QHash.
0083     QMap<QString, QString> entries = config.entryMap();
0084     QMap<QString, QString>::const_iterator i = entries.constBegin();
0085     QMap<QString, QString>::const_iterator end = entries.constEnd();
0086     while (i != end) {
0087         const QString &key = i.key();
0088         if (key == QLatin1StringView(s_emailAliases)) {
0089             // HACK: Read s_emailAliases as a stringlist
0090             mPropertiesMap.insert(key, config.readEntry(key, QStringList()));
0091         } else {
0092             mPropertiesMap.insert(key, config.readEntry(key));
0093         }
0094         ++i;
0095     }
0096     // needs to update to v5.21.41
0097     // Check if we update to to encryption override mode
0098     // before we had only auto_encrypt and auto_sign and no global setting
0099     if (!mPropertiesMap.contains(QLatin1StringView(s_encryptionOverride)) && !mPropertiesMap.contains(QLatin1StringView(s_warnnotencrypt))
0100         && !mPropertiesMap.contains(QLatin1StringView(s_warnnotsign))) {
0101         setEncryptionOverride(true);
0102     }
0103     mSignature.readConfig(config);
0104 }
0105 
0106 void Identity::writeConfig(KConfigGroup &config) const
0107 {
0108     QHash<QString, QVariant>::const_iterator i = mPropertiesMap.constBegin();
0109     QHash<QString, QVariant>::const_iterator end = mPropertiesMap.constEnd();
0110     while (i != end) {
0111         config.writeEntry(i.key(), i.value());
0112         qCDebug(KIDENTITYMANAGEMENT_LOG) << "Store:" << i.key() << ":" << i.value();
0113         ++i;
0114     }
0115     if (!mPropertiesMap.contains(QLatin1StringView(s_encryptionOverride))) {
0116         config.writeEntry(QLatin1StringView(s_encryptionOverride), false);
0117         qCDebug(KIDENTITYMANAGEMENT_LOG) << "Add" << s_encryptionOverride << ":" << false;
0118     }
0119     mSignature.writeConfig(config);
0120 }
0121 
0122 bool Identity::mailingAllowed() const
0123 {
0124     return !property(QLatin1StringView(s_primaryEmail)).toString().isEmpty();
0125 }
0126 
0127 QString Identity::mimeDataType()
0128 {
0129     return QStringLiteral("application/x-kmail-identity-drag");
0130 }
0131 
0132 bool Identity::canDecode(const QMimeData *md)
0133 {
0134     if (md) {
0135         return md->hasFormat(mimeDataType());
0136     } else {
0137         return false;
0138     }
0139 }
0140 
0141 void Identity::populateMimeData(QMimeData *md) const
0142 {
0143     QByteArray a;
0144     {
0145         QDataStream s(&a, QIODevice::WriteOnly);
0146         s << *this;
0147     }
0148     md->setData(mimeDataType(), a);
0149 }
0150 
0151 Identity Identity::fromMimeData(const QMimeData *md)
0152 {
0153     Identity i;
0154     if (canDecode(md)) {
0155         QByteArray ba = md->data(mimeDataType());
0156         QDataStream s(&ba, QIODevice::ReadOnly);
0157         s >> i;
0158     }
0159     return i;
0160 }
0161 
0162 // ------------------ Operators --------------------------//
0163 
0164 QDataStream &KIdentityManagementCore::operator<<(QDataStream &stream, const KIdentityManagementCore::Identity &i)
0165 {
0166     return stream << static_cast<quint32>(i.uoid()) << i.mPropertiesMap[QLatin1StringView(s_identity)] << i.mPropertiesMap[QLatin1StringView(s_name)]
0167                   << i.mPropertiesMap[QLatin1StringView(s_organization)] << i.mPropertiesMap[QLatin1StringView(s_pgps)]
0168                   << i.mPropertiesMap[QLatin1StringView(s_pgpe)] << i.mPropertiesMap[QLatin1StringView(s_smimes)]
0169                   << i.mPropertiesMap[QLatin1StringView(s_smimee)] << i.mPropertiesMap[QLatin1StringView(s_primaryEmail)]
0170                   << i.mPropertiesMap[QLatin1StringView(s_emailAliases)] << i.mPropertiesMap[QLatin1StringView(s_replyto)]
0171                   << i.mPropertiesMap[QLatin1StringView(s_bcc)] << i.mPropertiesMap[QLatin1StringView(s_vcard)]
0172                   << i.mPropertiesMap[QLatin1StringView(s_transport)] << i.mPropertiesMap[QLatin1StringView(s_fcc)]
0173                   << i.mPropertiesMap[QLatin1StringView(s_drafts)] << i.mPropertiesMap[QLatin1StringView(s_templates)] << i.mSignature
0174                   << i.mPropertiesMap[QLatin1StringView(s_dict)] << i.mPropertiesMap[QLatin1StringView(s_xface)]
0175                   << i.mPropertiesMap[QLatin1StringView(s_xfaceenabled)] << i.mPropertiesMap[QLatin1StringView(s_face)]
0176                   << i.mPropertiesMap[QLatin1StringView(s_faceenabled)] << i.mPropertiesMap[QLatin1StringView(s_prefcrypt)]
0177                   << i.mPropertiesMap[QLatin1StringView(s_cc)] << i.mPropertiesMap[QLatin1StringView(s_attachVcard)]
0178                   << i.mPropertiesMap[QLatin1StringView(s_autocorrectionLanguage)] << i.mPropertiesMap[QLatin1StringView(s_disabledFcc)]
0179                   << i.mPropertiesMap[QLatin1StringView(s_defaultDomainName)] << i.mPropertiesMap[QLatin1StringView(s_autocryptEnabled)]
0180                   << i.mPropertiesMap[QLatin1StringView(s_autocryptPrefer)] << i.mPropertiesMap[QLatin1StringView(s_encryptionOverride)]
0181                   << i.mPropertiesMap[QLatin1StringView(s_pgpautosign)] << i.mPropertiesMap[QLatin1StringView(s_pgpautoencrypt)]
0182                   << i.mPropertiesMap[QLatin1StringView(s_warnnotencrypt)] << i.mPropertiesMap[QLatin1StringView(s_warnnotsign)];
0183 }
0184 
0185 QDataStream &KIdentityManagementCore::operator>>(QDataStream &stream, KIdentityManagementCore::Identity &i)
0186 {
0187     quint32 uoid;
0188     stream >> uoid >> i.mPropertiesMap[QLatin1StringView(s_identity)] >> i.mPropertiesMap[QLatin1StringView(s_name)]
0189         >> i.mPropertiesMap[QLatin1StringView(s_organization)] >> i.mPropertiesMap[QLatin1StringView(s_pgps)] >> i.mPropertiesMap[QLatin1StringView(s_pgpe)]
0190         >> i.mPropertiesMap[QLatin1StringView(s_smimes)] >> i.mPropertiesMap[QLatin1StringView(s_smimee)] >> i.mPropertiesMap[QLatin1StringView(s_primaryEmail)]
0191         >> i.mPropertiesMap[QLatin1StringView(s_emailAliases)] >> i.mPropertiesMap[QLatin1StringView(s_replyto)] >> i.mPropertiesMap[QLatin1StringView(s_bcc)]
0192         >> i.mPropertiesMap[QLatin1StringView(s_vcard)] >> i.mPropertiesMap[QLatin1StringView(s_transport)] >> i.mPropertiesMap[QLatin1StringView(s_fcc)]
0193         >> i.mPropertiesMap[QLatin1StringView(s_drafts)] >> i.mPropertiesMap[QLatin1StringView(s_templates)] >> i.mSignature
0194         >> i.mPropertiesMap[QLatin1StringView(s_dict)] >> i.mPropertiesMap[QLatin1StringView(s_xface)] >> i.mPropertiesMap[QLatin1StringView(s_xfaceenabled)]
0195         >> i.mPropertiesMap[QLatin1StringView(s_face)] >> i.mPropertiesMap[QLatin1StringView(s_faceenabled)] >> i.mPropertiesMap[QLatin1StringView(s_prefcrypt)]
0196         >> i.mPropertiesMap[QLatin1StringView(s_cc)] >> i.mPropertiesMap[QLatin1StringView(s_attachVcard)]
0197         >> i.mPropertiesMap[QLatin1StringView(s_autocorrectionLanguage)] >> i.mPropertiesMap[QLatin1StringView(s_disabledFcc)]
0198         >> i.mPropertiesMap[QLatin1StringView(s_defaultDomainName)] >> i.mPropertiesMap[QLatin1StringView(s_autocryptEnabled)]
0199         >> i.mPropertiesMap[QLatin1StringView(s_autocryptPrefer)] >> i.mPropertiesMap[QLatin1StringView(s_encryptionOverride)]
0200         >> i.mPropertiesMap[QLatin1StringView(s_pgpautosign)] >> i.mPropertiesMap[QLatin1StringView(s_pgpautoencrypt)]
0201         >> i.mPropertiesMap[QLatin1StringView(s_warnnotencrypt)] >> i.mPropertiesMap[QLatin1StringView(s_warnnotsign)];
0202 
0203     i.setProperty(QLatin1StringView(s_uoid), uoid);
0204     return stream;
0205 }
0206 
0207 bool Identity::operator<(const Identity &other) const
0208 {
0209     if (isDefault()) {
0210         return true;
0211     }
0212     if (other.isDefault()) {
0213         return false;
0214     }
0215     return identityName() < other.identityName();
0216 }
0217 
0218 bool Identity::operator>(const Identity &other) const
0219 {
0220     if (isDefault()) {
0221         return false;
0222     }
0223     if (other.isDefault()) {
0224         return true;
0225     }
0226     return identityName() > other.identityName();
0227 }
0228 
0229 bool Identity::operator<=(const Identity &other) const
0230 {
0231     return !operator>(other);
0232 }
0233 
0234 bool Identity::operator>=(const Identity &other) const
0235 {
0236     return !operator<(other);
0237 }
0238 
0239 bool Identity::operator==(const Identity &other) const
0240 {
0241     // The deserializer fills in the QHash will lots of invalid variants, which
0242     // is OK, but the CTOR doesn't fill the hash with the missing fields, so
0243     // regular mPropertiesMap == other.mPropertiesMap comparison will fail.
0244     // This algo considers both maps equal even if one map does not contain the
0245     // key and the other one contains the key but with an invalid value
0246     for (const auto &pair : {qMakePair(mPropertiesMap, other.mPropertiesMap), qMakePair(other.mPropertiesMap, mPropertiesMap)}) {
0247         const auto lhs = pair.first;
0248         const auto rhs = pair.second;
0249         for (auto lhsIt = lhs.constBegin(), lhsEnd = lhs.constEnd(); lhsIt != lhsEnd; ++lhsIt) {
0250             const auto rhsIt = rhs.constFind(lhsIt.key());
0251             // Does the other map contain the key?
0252             if (rhsIt == rhs.constEnd()) {
0253                 // It does not, so check if our value is invalid, if yes, consider it
0254                 // equal to not present and continue
0255                 if (lhsIt->isValid()) {
0256                     return false;
0257                 }
0258             } else if (lhsIt.value() != rhsIt.value()) {
0259                 // Both maps have the key, but different value -> different maps
0260                 return false;
0261             }
0262         }
0263     }
0264 
0265     return mSignature == other.mSignature;
0266 }
0267 
0268 bool Identity::operator!=(const Identity &other) const
0269 {
0270     return !operator==(other);
0271 }
0272 
0273 // --------------------- Getters -----------------------------//
0274 
0275 QVariant Identity::property(const QString &key) const
0276 {
0277     if (key == QLatin1StringView(s_signature)) {
0278         return QVariant::fromValue(mSignature);
0279     } else {
0280         return mPropertiesMap.value(key);
0281     }
0282 }
0283 
0284 QString Identity::fullEmailAddr() const
0285 {
0286     const QString name = mPropertiesMap.value(QLatin1StringView(s_name)).toString();
0287     const QString mail = mPropertiesMap.value(QLatin1StringView(s_primaryEmail)).toString();
0288 
0289     if (name.isEmpty()) {
0290         return mail;
0291     }
0292 
0293     const QString specials(QStringLiteral("()<>@,.;:[]"));
0294 
0295     QString result;
0296 
0297     // add DQUOTE's if necessary:
0298     bool needsQuotes = false;
0299     const int nameLength(name.length());
0300     for (int i = 0; i < nameLength; i++) {
0301         if (specials.contains(name[i])) {
0302             needsQuotes = true;
0303         } else if (name[i] == QLatin1Char('\\') || name[i] == QLatin1Char('"')) {
0304             needsQuotes = true;
0305             result += QLatin1Char('\\');
0306         }
0307         result += name[i];
0308     }
0309 
0310     if (needsQuotes) {
0311         result.insert(0, QLatin1Char('"'));
0312         result += QLatin1Char('"');
0313     }
0314 
0315     result += QLatin1StringView(" <") + mail + QLatin1Char('>');
0316 
0317     return result;
0318 }
0319 
0320 QString Identity::identityName() const
0321 {
0322     return property(QLatin1StringView(s_identity)).toString();
0323 }
0324 
0325 QString Identity::signatureText(bool *ok) const
0326 {
0327     return mSignature.withSeparator(ok);
0328 }
0329 
0330 bool Identity::signatureIsInlinedHtml() const
0331 {
0332     return mSignature.isInlinedHtml();
0333 }
0334 
0335 bool Identity::isDefault() const
0336 {
0337     return mIsDefault;
0338 }
0339 
0340 uint Identity::uoid() const
0341 {
0342     return property(QLatin1StringView(s_uoid)).toInt();
0343 }
0344 
0345 QString Identity::fullName() const
0346 {
0347     return property(QLatin1StringView(s_name)).toString();
0348 }
0349 
0350 QString Identity::organization() const
0351 {
0352     return property(QLatin1StringView(s_organization)).toString();
0353 }
0354 
0355 QByteArray Identity::pgpEncryptionKey() const
0356 {
0357     return property(QLatin1StringView(s_pgpe)).toByteArray();
0358 }
0359 
0360 QByteArray Identity::pgpSigningKey() const
0361 {
0362     return property(QLatin1StringView(s_pgps)).toByteArray();
0363 }
0364 
0365 QByteArray Identity::smimeEncryptionKey() const
0366 {
0367     return property(QLatin1StringView(s_smimee)).toByteArray();
0368 }
0369 
0370 QByteArray Identity::smimeSigningKey() const
0371 {
0372     return property(QLatin1StringView(s_smimes)).toByteArray();
0373 }
0374 
0375 QString Identity::preferredCryptoMessageFormat() const
0376 {
0377     return property(QLatin1StringView(s_prefcrypt)).toString();
0378 }
0379 
0380 QString Identity::primaryEmailAddress() const
0381 {
0382     return property(QLatin1StringView(s_primaryEmail)).toString();
0383 }
0384 
0385 const QStringList Identity::emailAliases() const
0386 {
0387     return property(QLatin1StringView(s_emailAliases)).toStringList();
0388 }
0389 
0390 QString Identity::vCardFile() const
0391 {
0392     return property(QLatin1StringView(s_vcard)).toString();
0393 }
0394 
0395 bool Identity::attachVcard() const
0396 {
0397     return property(QLatin1StringView(s_attachVcard)).toBool();
0398 }
0399 
0400 QString Identity::replyToAddr() const
0401 {
0402     return property(QLatin1StringView(s_replyto)).toString();
0403 }
0404 
0405 QString Identity::bcc() const
0406 {
0407     return property(QLatin1StringView(s_bcc)).toString();
0408 }
0409 
0410 QString Identity::cc() const
0411 {
0412     return property(QLatin1StringView(s_cc)).toString();
0413 }
0414 
0415 Signature &Identity::signature()
0416 {
0417     return mSignature;
0418 }
0419 
0420 bool Identity::isXFaceEnabled() const
0421 {
0422     return property(QLatin1StringView(s_xfaceenabled)).toBool();
0423 }
0424 
0425 QString Identity::xface() const
0426 {
0427     return property(QLatin1StringView(s_xface)).toString();
0428 }
0429 
0430 bool Identity::isFaceEnabled() const
0431 {
0432     return property(QLatin1StringView(s_faceenabled)).toBool();
0433 }
0434 
0435 QString Identity::face() const
0436 {
0437     return property(QLatin1StringView(s_face)).toString();
0438 }
0439 
0440 QString Identity::dictionary() const
0441 {
0442     return property(QLatin1StringView(s_dict)).toString();
0443 }
0444 
0445 QString Identity::templates() const
0446 {
0447     const QString str = property(QLatin1StringView(s_templates)).toString();
0448     return verifyAkonadiId(str);
0449 }
0450 
0451 QString Identity::drafts() const
0452 {
0453     const QString str = property(QLatin1StringView(s_drafts)).toString();
0454     return verifyAkonadiId(str);
0455 }
0456 
0457 QString Identity::fcc() const
0458 {
0459     const QString str = property(QLatin1StringView(s_fcc)).toString();
0460     return verifyAkonadiId(str);
0461 }
0462 
0463 QString Identity::transport() const
0464 {
0465     return property(QLatin1StringView(s_transport)).toString();
0466 }
0467 
0468 bool Identity::signatureIsCommand() const
0469 {
0470     return mSignature.type() == Signature::FromCommand;
0471 }
0472 
0473 bool Identity::signatureIsPlainFile() const
0474 {
0475     return mSignature.type() == Signature::FromFile;
0476 }
0477 
0478 bool Identity::signatureIsInline() const
0479 {
0480     return mSignature.type() == Signature::Inlined;
0481 }
0482 
0483 bool Identity::useSignatureFile() const
0484 {
0485     return signatureIsPlainFile() || signatureIsCommand();
0486 }
0487 
0488 QString Identity::signatureInlineText() const
0489 {
0490     return mSignature.text();
0491 }
0492 
0493 QString Identity::signatureFile() const
0494 {
0495     return mSignature.path();
0496 }
0497 
0498 QString Identity::autocorrectionLanguage() const
0499 {
0500     return property(QLatin1StringView(s_autocorrectionLanguage)).toString();
0501 }
0502 
0503 // --------------------- Setters -----------------------------//
0504 
0505 void Identity::setProperty(const QString &key, const QVariant &value)
0506 {
0507     if (key == QLatin1StringView(s_signature)) {
0508         mSignature = value.value<Signature>();
0509     } else {
0510         if (value.isNull() || (value.metaType().id() == QMetaType::QString && value.toString().isEmpty())) {
0511             mPropertiesMap.remove(key);
0512         } else {
0513             mPropertiesMap.insert(key, value);
0514         }
0515     }
0516 }
0517 
0518 void Identity::setUoid(uint aUoid)
0519 {
0520     setProperty(QLatin1StringView(s_uoid), aUoid);
0521 }
0522 
0523 void Identity::setIdentityName(const QString &name)
0524 {
0525     setProperty(QLatin1StringView(s_identity), name);
0526 }
0527 
0528 void Identity::setFullName(const QString &str)
0529 {
0530     setProperty(QLatin1StringView(s_name), str);
0531 }
0532 
0533 void Identity::setOrganization(const QString &str)
0534 {
0535     setProperty(QLatin1StringView(s_organization), str);
0536 }
0537 
0538 void Identity::setPGPSigningKey(const QByteArray &str)
0539 {
0540     setProperty(QLatin1StringView(s_pgps), QLatin1StringView(str));
0541 }
0542 
0543 void Identity::setPGPEncryptionKey(const QByteArray &str)
0544 {
0545     setProperty(QLatin1StringView(s_pgpe), QLatin1StringView(str));
0546 }
0547 
0548 void Identity::setSMIMESigningKey(const QByteArray &str)
0549 {
0550     setProperty(QLatin1StringView(s_smimes), QLatin1StringView(str));
0551 }
0552 
0553 void Identity::setSMIMEEncryptionKey(const QByteArray &str)
0554 {
0555     setProperty(QLatin1StringView(s_smimee), QLatin1StringView(str));
0556 }
0557 
0558 void Identity::setPrimaryEmailAddress(const QString &email)
0559 {
0560     setProperty(QLatin1StringView(s_primaryEmail), email);
0561 }
0562 
0563 void Identity::setEmailAliases(const QStringList &aliases)
0564 {
0565     setProperty(QLatin1StringView(s_emailAliases), aliases);
0566 }
0567 
0568 void Identity::setVCardFile(const QString &str)
0569 {
0570     setProperty(QLatin1StringView(s_vcard), str);
0571 }
0572 
0573 void Identity::setAttachVcard(bool attachment)
0574 {
0575     setProperty(QLatin1StringView(s_attachVcard), attachment);
0576 }
0577 
0578 void Identity::setReplyToAddr(const QString &str)
0579 {
0580     setProperty(QLatin1StringView(s_replyto), str);
0581 }
0582 
0583 void Identity::setSignatureFile(const QString &str)
0584 {
0585     mSignature.setPath(str, signatureIsCommand());
0586 }
0587 
0588 void Identity::setSignatureInlineText(const QString &str)
0589 {
0590     mSignature.setText(str);
0591 }
0592 
0593 void Identity::setTransport(const QString &str)
0594 {
0595     setProperty(QLatin1StringView(s_transport), str);
0596 }
0597 
0598 void Identity::setFcc(const QString &str)
0599 {
0600     setProperty(QLatin1StringView(s_fcc), str);
0601 }
0602 
0603 void Identity::setDrafts(const QString &str)
0604 {
0605     setProperty(QLatin1StringView(s_drafts), str);
0606 }
0607 
0608 void Identity::setTemplates(const QString &str)
0609 {
0610     setProperty(QLatin1StringView(s_templates), str);
0611 }
0612 
0613 void Identity::setDictionary(const QString &str)
0614 {
0615     setProperty(QLatin1StringView(s_dict), str);
0616 }
0617 
0618 void Identity::setBcc(const QString &str)
0619 {
0620     setProperty(QLatin1StringView(s_bcc), str);
0621 }
0622 
0623 void Identity::setCc(const QString &str)
0624 {
0625     setProperty(QLatin1StringView(s_cc), str);
0626 }
0627 
0628 void Identity::setIsDefault(bool flag)
0629 {
0630     mIsDefault = flag;
0631 }
0632 
0633 void Identity::setPreferredCryptoMessageFormat(const QString &str)
0634 {
0635     setProperty(QLatin1StringView(s_prefcrypt), str);
0636 }
0637 
0638 void Identity::setXFace(const QString &str)
0639 {
0640     QString strNew = str;
0641     strNew.remove(QLatin1Char(' '));
0642     strNew.remove(QLatin1Char('\n'));
0643     strNew.remove(QLatin1Char('\r'));
0644     setProperty(QLatin1StringView(s_xface), strNew);
0645 }
0646 
0647 void Identity::setXFaceEnabled(bool on)
0648 {
0649     setProperty(QLatin1StringView(s_xfaceenabled), on);
0650 }
0651 
0652 void Identity::setFace(const QString &str)
0653 {
0654     QString strNew = str;
0655     strNew.remove(QLatin1Char(' '));
0656     strNew.remove(QLatin1Char('\n'));
0657     strNew.remove(QLatin1Char('\r'));
0658     setProperty(QLatin1StringView(s_face), strNew);
0659 }
0660 
0661 void Identity::setFaceEnabled(bool on)
0662 {
0663     setProperty(QLatin1StringView(s_faceenabled), on);
0664 }
0665 
0666 void Identity::setSignature(const Signature &sig)
0667 {
0668     mSignature = sig;
0669 }
0670 
0671 bool Identity::matchesEmailAddress(const QString &addr) const
0672 {
0673     const QString addrSpec = KEmailAddress::extractEmailAddress(addr).toLower();
0674     if (addrSpec == primaryEmailAddress().toLower()) {
0675         return true;
0676     }
0677 
0678     const QStringList lst = emailAliases();
0679     for (const QString &alias : lst) {
0680         if (alias.toLower() == addrSpec) {
0681             return true;
0682         }
0683     }
0684 
0685     return false;
0686 }
0687 
0688 void Identity::setAutocorrectionLanguage(const QString &language)
0689 {
0690     setProperty(QLatin1StringView(s_autocorrectionLanguage), language);
0691 }
0692 
0693 bool Identity::disabledFcc() const
0694 {
0695     const QVariant var = property(QLatin1StringView(s_disabledFcc));
0696     if (var.isNull()) {
0697         return false;
0698     } else {
0699         return var.toBool();
0700     }
0701 }
0702 
0703 void Identity::setDisabledFcc(bool disable)
0704 {
0705     setProperty(QLatin1StringView(s_disabledFcc), disable);
0706 }
0707 
0708 bool Identity::pgpAutoSign() const
0709 {
0710     const QVariant var = property(QLatin1StringView(s_pgpautosign));
0711     if (var.isNull()) {
0712         return false;
0713     } else {
0714         return var.toBool();
0715     }
0716 }
0717 
0718 void Identity::setPgpAutoSign(bool autoSign)
0719 {
0720     setProperty(QLatin1StringView(s_pgpautosign), autoSign);
0721 }
0722 
0723 bool Identity::pgpAutoEncrypt() const
0724 {
0725     const QVariant var = property(QLatin1StringView(s_pgpautoencrypt));
0726     if (var.isNull()) {
0727         return false;
0728     } else {
0729         return var.toBool();
0730     }
0731 }
0732 
0733 void Identity::setPgpAutoEncrypt(bool autoEncrypt)
0734 {
0735     setProperty(QLatin1StringView(s_pgpautoencrypt), autoEncrypt);
0736 }
0737 
0738 bool Identity::autocryptEnabled() const
0739 {
0740     const auto var = property(QLatin1StringView(s_autocryptEnabled));
0741     if (var.isNull()) {
0742         return false;
0743     } else {
0744         return var.toBool();
0745     }
0746 }
0747 
0748 void Identity::setAutocryptEnabled(const bool on)
0749 {
0750     setProperty(QLatin1StringView(s_autocryptEnabled), on);
0751 }
0752 
0753 bool Identity::autocryptPrefer() const
0754 {
0755     const auto var = property(QLatin1StringView(s_autocryptPrefer));
0756     if (var.isNull()) {
0757         return false;
0758     } else {
0759         return var.toBool();
0760     }
0761 }
0762 
0763 void Identity::setAutocryptPrefer(const bool on)
0764 {
0765     setProperty(QLatin1StringView(s_autocryptPrefer), on);
0766 }
0767 
0768 bool Identity::encryptionOverride() const
0769 {
0770     const auto var = property(QLatin1StringView(s_encryptionOverride));
0771     if (var.isNull()) {
0772         return false;
0773     } else {
0774         return var.toBool();
0775     }
0776 }
0777 
0778 void Identity::setEncryptionOverride(const bool on)
0779 {
0780     setProperty(QLatin1StringView(s_encryptionOverride), on);
0781 }
0782 
0783 bool Identity::warnNotEncrypt() const
0784 {
0785     const auto var = property(QLatin1StringView(s_warnnotencrypt));
0786     if (var.isNull()) {
0787         return false;
0788     } else {
0789         return var.toBool();
0790     }
0791 }
0792 
0793 void Identity::setWarnNotEncrypt(const bool on)
0794 {
0795     setProperty(QLatin1StringView(s_warnnotencrypt), on);
0796 }
0797 
0798 bool Identity::warnNotSign() const
0799 {
0800     const auto var = property(QLatin1StringView(s_warnnotsign));
0801     if (var.isNull()) {
0802         return false;
0803     } else {
0804         return var.toBool();
0805     }
0806 }
0807 
0808 void Identity::setWarnNotSign(const bool on)
0809 {
0810     setProperty(QLatin1StringView(s_warnnotsign), on);
0811 }
0812 
0813 QString Identity::defaultDomainName() const
0814 {
0815     return property(QLatin1StringView(s_defaultDomainName)).toString();
0816 }
0817 
0818 void Identity::setDefaultDomainName(const QString &domainName)
0819 {
0820     setProperty(QLatin1StringView(s_defaultDomainName), domainName);
0821 }
0822 
0823 QString Identity::verifyAkonadiId(const QString &str) const
0824 {
0825     if (str.isEmpty()) {
0826         return str;
0827     }
0828     bool ok = false;
0829     const qlonglong val = str.toLongLong(&ok);
0830     Q_UNUSED(val)
0831     if (ok) {
0832         return str;
0833     } else {
0834         return {};
0835     }
0836 }
0837 
0838 #include "moc_identity.cpp"