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"