2021-05-24 07:25:56 +00:00
/*
SPDX - FileCopyrightText : 2018 Chinmoy Ranjan Pradhan < chinmoyrp65 @ gmail . com >
SPDX - License - Identifier : GPL - 2.0 - or - later
*/
2019-01-05 22:30:25 +00:00
# include "pdfsignatureutils.h"
# include <KLocalizedString>
# include <QDebug>
2020-11-26 20:51:46 +00:00
# include <QInputDialog>
2019-01-05 22:30:25 +00:00
PopplerCertificateInfo : : PopplerCertificateInfo ( const Poppler : : CertificateInfo & info )
: m_info ( info )
{
}
PopplerCertificateInfo : : ~ PopplerCertificateInfo ( )
{
}
bool PopplerCertificateInfo : : isNull ( ) const
{
return m_info . isNull ( ) ;
}
int PopplerCertificateInfo : : version ( ) const
{
return m_info . version ( ) ;
}
QByteArray PopplerCertificateInfo : : serialNumber ( ) const
{
return m_info . serialNumber ( ) ;
}
QString PopplerCertificateInfo : : issuerInfo ( PopplerCertificateInfo : : EntityInfoKey key ) const
{
QString str = m_info . issuerInfo ( static_cast < Poppler : : CertificateInfo : : EntityInfoKey > ( key ) ) ;
return ! str . isEmpty ( ) ? str : i18n ( " Not Available " ) ;
}
QString PopplerCertificateInfo : : subjectInfo ( PopplerCertificateInfo : : EntityInfoKey key ) const
{
QString str = m_info . subjectInfo ( static_cast < Poppler : : CertificateInfo : : EntityInfoKey > ( key ) ) ;
return ! str . isEmpty ( ) ? str : i18n ( " Not Available " ) ;
}
2020-01-18 14:54:47 +00:00
QString PopplerCertificateInfo : : nickName ( ) const
{
2022-04-29 21:57:01 +00:00
# if POPPLER_VERSION_MACRO >= QT_VERSION_CHECK(21, 1, 0)
2020-01-18 14:54:47 +00:00
return m_info . nickName ( ) ;
2020-02-01 06:32:35 +00:00
# else
return i18n ( " Not Available " ) ;
# endif
2020-01-18 14:54:47 +00:00
}
2019-01-05 22:30:25 +00:00
QDateTime PopplerCertificateInfo : : validityStart ( ) const
{
return m_info . validityStart ( ) ;
}
QDateTime PopplerCertificateInfo : : validityEnd ( ) const
{
return m_info . validityEnd ( ) ;
}
PopplerCertificateInfo : : KeyUsageExtensions PopplerCertificateInfo : : keyUsageExtensions ( ) const
{
Poppler : : CertificateInfo : : KeyUsageExtensions popplerKu = m_info . keyUsageExtensions ( ) ;
KeyUsageExtensions ku = KuNone ;
if ( popplerKu . testFlag ( Poppler : : CertificateInfo : : KuDigitalSignature ) ) {
ku | = KuDigitalSignature ;
2022-03-08 10:10:43 +00:00
}
2019-01-05 22:30:25 +00:00
if ( popplerKu . testFlag ( Poppler : : CertificateInfo : : KuNonRepudiation ) ) {
ku | = KuNonRepudiation ;
2022-03-08 10:10:43 +00:00
}
2019-01-05 22:30:25 +00:00
if ( popplerKu . testFlag ( Poppler : : CertificateInfo : : KuKeyEncipherment ) ) {
ku | = KuKeyEncipherment ;
2022-03-08 10:10:43 +00:00
}
2019-01-05 22:30:25 +00:00
if ( popplerKu . testFlag ( Poppler : : CertificateInfo : : KuDataEncipherment ) ) {
ku | = KuDataEncipherment ;
2022-03-08 10:10:43 +00:00
}
2019-01-05 22:30:25 +00:00
if ( popplerKu . testFlag ( Poppler : : CertificateInfo : : KuKeyAgreement ) ) {
ku | = KuKeyAgreement ;
2022-03-08 10:10:43 +00:00
}
2019-01-05 22:30:25 +00:00
if ( popplerKu . testFlag ( Poppler : : CertificateInfo : : KuKeyCertSign ) ) {
ku | = KuKeyCertSign ;
2022-03-08 10:10:43 +00:00
}
2019-01-05 22:30:25 +00:00
if ( popplerKu . testFlag ( Poppler : : CertificateInfo : : KuClrSign ) ) {
ku | = KuClrSign ;
2022-03-08 10:10:43 +00:00
}
2019-01-05 22:30:25 +00:00
if ( popplerKu . testFlag ( Poppler : : CertificateInfo : : KuEncipherOnly ) ) {
ku | = KuEncipherOnly ;
2022-03-08 10:10:43 +00:00
}
2019-01-05 22:30:25 +00:00
return ku ;
}
QByteArray PopplerCertificateInfo : : publicKey ( ) const
{
return m_info . publicKey ( ) ;
}
PopplerCertificateInfo : : PublicKeyType PopplerCertificateInfo : : publicKeyType ( ) const
{
switch ( m_info . publicKeyType ( ) ) {
case Poppler : : CertificateInfo : : RsaKey :
return RsaKey ;
case Poppler : : CertificateInfo : : DsaKey :
return DsaKey ;
case Poppler : : CertificateInfo : : EcKey :
return EcKey ;
case Poppler : : CertificateInfo : : OtherKey :
return OtherKey ;
}
return OtherKey ;
}
int PopplerCertificateInfo : : publicKeyStrength ( ) const
{
return m_info . publicKeyStrength ( ) ;
}
bool PopplerCertificateInfo : : isSelfSigned ( ) const
{
return m_info . isSelfSigned ( ) ;
}
QByteArray PopplerCertificateInfo : : certificateData ( ) const
{
return m_info . certificateData ( ) ;
}
2020-11-26 16:45:59 +00:00
bool PopplerCertificateInfo : : checkPassword ( const QString & password ) const
{
2022-04-29 21:57:01 +00:00
# if POPPLER_VERSION_MACRO >= QT_VERSION_CHECK(21, 1, 0)
2020-11-26 16:45:59 +00:00
return m_info . checkPassword ( password ) ;
# else
Q_UNUSED ( password ) ;
return false ;
# endif
}
2019-01-05 22:30:25 +00:00
PopplerSignatureInfo : : PopplerSignatureInfo ( const Poppler : : SignatureValidationInfo & info )
: m_info ( info )
{
m_certfiticateInfo = new PopplerCertificateInfo ( m_info . certificateInfo ( ) ) ;
}
PopplerSignatureInfo : : ~ PopplerSignatureInfo ( )
{
delete m_certfiticateInfo ;
}
PopplerSignatureInfo : : SignatureStatus PopplerSignatureInfo : : signatureStatus ( ) const
{
switch ( m_info . signatureStatus ( ) ) {
case Poppler : : SignatureValidationInfo : : SignatureValid :
return SignatureValid ;
case Poppler : : SignatureValidationInfo : : SignatureInvalid :
return SignatureInvalid ;
case Poppler : : SignatureValidationInfo : : SignatureDigestMismatch :
return SignatureDigestMismatch ;
case Poppler : : SignatureValidationInfo : : SignatureDecodingError :
return SignatureDecodingError ;
case Poppler : : SignatureValidationInfo : : SignatureGenericError :
return SignatureGenericError ;
case Poppler : : SignatureValidationInfo : : SignatureNotFound :
return SignatureNotFound ;
case Poppler : : SignatureValidationInfo : : SignatureNotVerified :
return SignatureNotVerified ;
default :
return SignatureStatusUnknown ;
}
}
PopplerSignatureInfo : : CertificateStatus PopplerSignatureInfo : : certificateStatus ( ) const
{
switch ( m_info . certificateStatus ( ) ) {
case Poppler : : SignatureValidationInfo : : CertificateTrusted :
return CertificateTrusted ;
case Poppler : : SignatureValidationInfo : : CertificateUntrustedIssuer :
return CertificateUntrustedIssuer ;
case Poppler : : SignatureValidationInfo : : CertificateUnknownIssuer :
return CertificateUnknownIssuer ;
case Poppler : : SignatureValidationInfo : : CertificateRevoked :
return CertificateRevoked ;
case Poppler : : SignatureValidationInfo : : CertificateExpired :
return CertificateExpired ;
case Poppler : : SignatureValidationInfo : : CertificateGenericError :
return CertificateGenericError ;
case Poppler : : SignatureValidationInfo : : CertificateNotVerified :
return CertificateNotVerified ;
default :
return CertificateStatusUnknown ;
}
}
PopplerSignatureInfo : : HashAlgorithm PopplerSignatureInfo : : hashAlgorithm ( ) const
{
switch ( m_info . hashAlgorithm ( ) ) {
case Poppler : : SignatureValidationInfo : : HashAlgorithmMd2 :
return HashAlgorithmMd2 ;
case Poppler : : SignatureValidationInfo : : HashAlgorithmMd5 :
return HashAlgorithmMd5 ;
case Poppler : : SignatureValidationInfo : : HashAlgorithmSha1 :
return HashAlgorithmSha1 ;
case Poppler : : SignatureValidationInfo : : HashAlgorithmSha256 :
return HashAlgorithmSha256 ;
case Poppler : : SignatureValidationInfo : : HashAlgorithmSha384 :
return HashAlgorithmSha384 ;
case Poppler : : SignatureValidationInfo : : HashAlgorithmSha512 :
return HashAlgorithmSha512 ;
case Poppler : : SignatureValidationInfo : : HashAlgorithmSha224 :
return HashAlgorithmSha224 ;
default :
return HashAlgorithmUnknown ;
}
}
QString PopplerSignatureInfo : : signerName ( ) const
{
return m_info . signerName ( ) ;
}
QString PopplerSignatureInfo : : signerSubjectDN ( ) const
{
return m_info . signerSubjectDN ( ) ;
}
QString PopplerSignatureInfo : : location ( ) const
{
return m_info . location ( ) ;
}
QString PopplerSignatureInfo : : reason ( ) const
{
return m_info . reason ( ) ;
}
QDateTime PopplerSignatureInfo : : signingTime ( ) const
{
2019-09-18 11:41:19 +00:00
return QDateTime : : fromSecsSinceEpoch ( m_info . signingTime ( ) ) ;
2019-01-05 22:30:25 +00:00
}
QByteArray PopplerSignatureInfo : : signature ( ) const
{
return m_info . signature ( ) ;
}
QList < qint64 > PopplerSignatureInfo : : signedRangeBounds ( ) const
{
return m_info . signedRangeBounds ( ) ;
}
bool PopplerSignatureInfo : : signsTotalDocument ( ) const
{
return m_info . signsTotalDocument ( ) ;
}
const Okular : : CertificateInfo & PopplerSignatureInfo : : certificateInfo ( ) const
{
return * m_certfiticateInfo ;
}
2020-11-26 20:51:46 +00:00
2022-04-29 21:57:01 +00:00
# if POPPLER_VERSION_MACRO >= QT_VERSION_CHECK(21, 1, 0)
2020-11-26 20:51:46 +00:00
PopplerCertificateStore : : ~ PopplerCertificateStore ( ) = default ;
QList < Okular : : CertificateInfo * > PopplerCertificateStore : : signingCertificates ( bool * userCancelled ) const
{
* userCancelled = false ;
auto PDFGeneratorNSSPasswordCallback = [ & userCancelled ] ( const char * element ) - > char * {
bool ok ;
2022-04-02 21:21:33 +00:00
const QString pwd = QInputDialog : : getText ( nullptr , i18n ( " Enter Password " ) , i18n ( " Enter password to open %1: " , QString : : fromUtf8 ( element ) ) , QLineEdit : : Password , QString ( ) , & ok ) ;
2020-11-26 20:51:46 +00:00
* userCancelled = ! ok ;
return ok ? strdup ( pwd . toUtf8 ( ) . constData ( ) ) : nullptr ;
} ;
Poppler : : setNSSPasswordCallback ( PDFGeneratorNSSPasswordCallback ) ;
const QVector < Poppler : : CertificateInfo > certs = Poppler : : getAvailableSigningCertificates ( ) ;
QList < Okular : : CertificateInfo * > vReturnCerts ;
2022-04-29 21:57:01 +00:00
for ( const auto & cert : certs ) {
2020-11-26 20:51:46 +00:00
vReturnCerts . append ( new PopplerCertificateInfo ( cert ) ) ;
2022-03-08 10:10:43 +00:00
}
2020-11-26 20:51:46 +00:00
Poppler : : setNSSPasswordCallback ( nullptr ) ;
return vReturnCerts ;
}
# endif