QString EmailMessageListModel::bodyPlainText(const QMailMessage &mailMsg) const { QMailMessagePartContainer *container = (QMailMessagePartContainer *)&mailMsg; QMailMessageContentType contentType = container->contentType(); if (container->hasBody() && contentType.type().toLower() == "text" && contentType.subType().toLower() == "plain") { return container->body().data(); } QString text(""); for ( uint i = 0; i < container->partCount(); i++ ) { QMailMessagePart messagePart = container->partAt(i); contentType = messagePart.contentType(); if (messagePart.hasBody() && contentType.type().toLower() == "text" && contentType.subType().toLower() == "plain") { text += messagePart.body().data() + "\n"; } QMailMessagePart subPart; for (uint j = 0; j < messagePart.partCount(); j++) { subPart = messagePart.partAt(j); contentType = subPart.contentType(); if (subPart.hasBody() && contentType.type().toLower() == "text" && contentType.subType().toLower() == "plain") text += subPart.body().data() + "\n"; } } return text; }
QMailCryptoFwd::SignatureResult QMailCryptoSMIME::sign(QMailMessagePartContainer &part, const QStringList &keys) const { QByteArray signedData, micalg; QMailCryptoFwd::SignatureResult result; result = computeSignature(part, keys, signedData, micalg); if (result != QMailCryptoFwd::SignatureValid) return result; // Set it to multipart/signed content-type. QList<QMailMessageHeaderField::ParameterType> parameters; parameters << QMailMessageHeaderField::ParameterType("micalg", micalg); parameters << QMailMessageHeaderField::ParameterType("protocol", "application/pkcs7-signature"); part.setMultipartType(QMailMessagePartContainerFwd::MultipartSigned, parameters); // Write the signature data in the second part. QMailMessagePart &signature = part.partAt(1); QMailMessageContentDisposition disposition; disposition.setType(QMailMessageContentDispositionFwd::Attachment); disposition.setFilename("smime.p7s"); signature.setContentDisposition(disposition); signature.setBody(QMailMessageBody::fromData(signedData, QMailMessageContentType("application/pkcs7-signature"), QMailMessageBodyFwd::Base64)); return QMailCryptoFwd::SignatureValid; }
QMailCryptoFwd::VerificationResult QMailCryptoSMIME::verifySignature(const QMailMessagePartContainer &part) const { if (!partHasSignature(part)) return QMailCryptoFwd::VerificationResult(QMailCryptoFwd::MissingSignature); QMailMessagePart body = part.partAt(0); QMailMessagePart signature = part.partAt(1); if (!body.contentAvailable() || !signature.contentAvailable()) return QMailCryptoFwd::VerificationResult(); QMailCryptoFwd::VerificationResult result; result.engine = QStringLiteral("libsmime.so"); result.summary = verify(signature.body().data(QMailMessageBodyFwd::Decoded), body.undecodedData(), result.keyResults); return result; }
bool QMailCryptoSMIME::partHasSignature(const QMailMessagePartContainer &part) const { if (part.multipartType() != QMailMessagePartContainerFwd::MultipartSigned || part.partCount() != 2) return false; const QMailMessagePart signature = part.partAt(1); if (!signature.contentType().matches("application", "pkcs7-signature") && !signature.contentType().matches("application", "x-pkcs7-signature")) return false; return true; }