diff options
Diffstat (limited to 'src/network/ssl/qsslsocket.cpp')
-rw-r--r-- | src/network/ssl/qsslsocket.cpp | 58 |
1 files changed, 52 insertions, 6 deletions
diff --git a/src/network/ssl/qsslsocket.cpp b/src/network/ssl/qsslsocket.cpp index f0c3f40a28..b1cdef7f29 100644 --- a/src/network/ssl/qsslsocket.cpp +++ b/src/network/ssl/qsslsocket.cpp @@ -895,7 +895,7 @@ QSslConfiguration QSslSocket::sslConfiguration() const void QSslSocket::setSslConfiguration(const QSslConfiguration &configuration) { Q_D(QSslSocket); - d->configuration.localCertificate = configuration.localCertificate(); + d->configuration.localCertificateChain = configuration.localCertificateChain(); d->configuration.privateKey = configuration.privateKey(); d->configuration.ciphers = configuration.ciphers(); d->configuration.caCertificates = configuration.caCertificates(); @@ -912,6 +912,32 @@ void QSslSocket::setSslConfiguration(const QSslConfiguration &configuration) } /*! + Sets the certificate chain to be presented to the peer during the + SSL handshake to be \a localChain. + + \sa QSslConfiguration::setLocalCertificateChain() + \since 5.1 + */ +void QSslSocket::setLocalCertificateChain(const QList<QSslCertificate> &localChain) +{ + Q_D(QSslSocket); + d->configuration.localCertificateChain = localChain; +} + +/*! + Returns the socket's local \l {QSslCertificate} {certificate} chain, + or an empty list if no local certificates have been assigned. + + \sa setLocalCertificateChain() + \since 5.1 +*/ +QList<QSslCertificate> QSslSocket::localCertificateChain() const +{ + Q_D(const QSslSocket); + return d->configuration.localCertificateChain; +} + +/*! Sets the socket's local certificate to \a certificate. The local certificate is necessary if you need to confirm your identity to the peer. It is used together with the private key; if you set the local @@ -926,7 +952,8 @@ void QSslSocket::setSslConfiguration(const QSslConfiguration &configuration) void QSslSocket::setLocalCertificate(const QSslCertificate &certificate) { Q_D(QSslSocket); - d->configuration.localCertificate = certificate; + d->configuration.localCertificateChain = QList<QSslCertificate>(); + d->configuration.localCertificateChain += certificate; } /*! @@ -939,10 +966,10 @@ void QSslSocket::setLocalCertificate(const QSslCertificate &certificate) void QSslSocket::setLocalCertificate(const QString &path, QSsl::EncodingFormat format) { - Q_D(QSslSocket); QFile file(path); if (file.open(QIODevice::ReadOnly | QIODevice::Text)) - d->configuration.localCertificate = QSslCertificate(file.readAll(), format); + setLocalCertificate(QSslCertificate(file.readAll(), format)); + } /*! @@ -954,7 +981,9 @@ void QSslSocket::setLocalCertificate(const QString &path, QSslCertificate QSslSocket::localCertificate() const { Q_D(const QSslSocket); - return d->configuration.localCertificate; + if (d->configuration.localCertificateChain.isEmpty()) + return QSslCertificate(); + return d->configuration.localCertificateChain[0]; } /*! @@ -2057,7 +2086,7 @@ void QSslConfigurationPrivate::deepCopyDefaultConfiguration(QSslConfigurationPri ptr->ref.store(1); ptr->peerCertificate = global->peerCertificate; ptr->peerCertificateChain = global->peerCertificateChain; - ptr->localCertificate = global->localCertificate; + ptr->localCertificateChain = global->localCertificateChain; ptr->privateKey = global->privateKey; ptr->sessionCipher = global->sessionCipher; ptr->ciphers = global->ciphers; @@ -2410,6 +2439,23 @@ QList<QByteArray> QSslSocketPrivate::unixRootCertDirectories() << "/opt/openssl/certs/"; // HP-UX } +/*! + \internal +*/ +void QSslSocketPrivate::checkSettingSslContext(QSslSocket* socket, QSharedPointer<QSslContext> sslContext) +{ + if (socket->d_func()->sslContextPointer.isNull()) + socket->d_func()->sslContextPointer = sslContext; +} + +/*! + \internal +*/ +QSharedPointer<QSslContext> QSslSocketPrivate::sslContext(QSslSocket *socket) +{ + return (socket) ? socket->d_func()->sslContextPointer : QSharedPointer<QSslContext>(); +} + QT_END_NAMESPACE #include "moc_qsslsocket.cpp" |