QSslConfiguration::setCiphers - introduce the overload taking QString

We had such an overloaded version in QSslSocket, it was deprecated without
providing any alternative. Now this function has some use and may be
introduced in Qt6, as QSslConfiguration::setCiphers(const QString &).
Last but not the least - a useless and strange auto-test was removed
(it was creating a list of 5 QSslCiphers each with isNull() == true).
That's becasue '!MD5' or 'ALL' (for example) is not a cipher to be found
in supportedCiphers.

Change-Id: I47eb4c0faa9b52885e883751dd992cd9cb3d26fe
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
This commit is contained in:
Timur Pocheptsov 2020-06-12 11:11:08 +02:00
parent 4fbb040f75
commit 37d9e44cd0
4 changed files with 58 additions and 3 deletions

View File

@ -53,3 +53,10 @@ QSslConfiguration config = sslSocket.sslConfiguration();
config.setProtocol(QSsl::TlsV1_0);
sslSocket.setSslConfiguration(config);
//! [0]
//! [1]
QSslConfiguration tlsConfig = QSslConfiguration::defaultConfiguration();
tlsConfig.setCiphers(QStringLiteral("DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:AES256-SHA"));
//! [1]

View File

@ -610,6 +610,33 @@ void QSslConfiguration::setCiphers(const QList<QSslCipher> &ciphers)
d->ciphers = ciphers;
}
/*!
\since 6.0
Sets the cryptographic cipher suite for this configuration to \a ciphers,
which is a colon-separated list of cipher suite names. The ciphers are listed
in order of preference, starting with the most preferred cipher. For example:
\snippet code/src_network_ssl_qsslconfiguration.cpp 1
Each cipher name in \a ciphers must be the name of a cipher in the
list returned by supportedCiphers(). Restricting the cipher suite
must be done before the handshake phase, where the session cipher
is chosen.
\sa ciphers()
*/
void QSslConfiguration::setCiphers(const QString &ciphers)
{
d->ciphers.clear();
const auto cipherNames = ciphers.split(QLatin1Char(':'), Qt::SkipEmptyParts);
for (const QString &cipherName : cipherNames) {
QSslCipher cipher(cipherName);
if (!cipher.isNull())
d->ciphers << cipher;
}
}
/*!
\since 5.5

View File

@ -125,6 +125,7 @@ public:
// Cipher settings
QList<QSslCipher> ciphers() const;
void setCiphers(const QList<QSslCipher> &ciphers);
void setCiphers(const QString &ciphers);
static QList<QSslCipher> supportedCiphers();
// Certificate Authority (CA) settings

View File

@ -804,10 +804,30 @@ void tst_QSslSocket::ciphers()
socket.setSslConfiguration(sslConfig);
QCOMPARE(socket.sslConfiguration().ciphers(), QSslConfiguration::defaultConfiguration().ciphers());
// Task 164356
sslConfig.setCiphers({QSslCipher("ALL"), QSslCipher("!ADH"), QSslCipher("!LOW"),
QSslCipher("!EXP"), QSslCipher("!MD5"), QSslCipher("@STRENGTH")});
sslConfig = QSslConfiguration::defaultConfiguration();
QList<QSslCipher> ciphers;
QString ciphersAsString;
const auto &supported = sslConfig.supportedCiphers();
for (const auto &cipher : supported) {
if (cipher.isNull() || !cipher.name().length())
continue;
if (ciphers.size() > 0)
ciphersAsString += QStringLiteral(":");
ciphersAsString += cipher.name();
ciphers.append(cipher);
if (ciphers.size() == 3) // 3 should be enough.
break;
}
if (!ciphers.size())
QSKIP("No proper ciphersuite was found to test 'setCiphers'");
sslConfig.setCiphers(ciphersAsString);
socket.setSslConfiguration(sslConfig);
QCOMPARE(ciphers, socket.sslConfiguration().ciphers());
sslConfig.setCiphers(ciphers);
socket.setSslConfiguration(sslConfig);
QCOMPARE(ciphers, socket.sslConfiguration().ciphers());
}
void tst_QSslSocket::connectToHostEncrypted()