30 #include <QtCore/QStringList>
31 #include <QtNetwork/QSslKey>
32 #include <QtNetwork/QSslCipher>
33 #include <QtNetwork/QHostAddress>
34 #include <QtNetwork/QNetworkProxy>
45 case QSsl::AnyProtocol:
47 #if QT_VERSION >= 0x040800
48 case QSsl::TlsV1SslV3:
50 case QSsl::SecureProtocols:
63 return QSsl::AnyProtocol;
67 return QSsl::UnknownProtocol;
77 #if QT_VERSION >= 0x040800
79 return QSsl::TlsV1SslV3;
81 return QSsl::SecureProtocols;
86 return QSsl::AnyProtocol;
97 foreach (
const QSslCipher &c, QSslSocket::supportedCiphers()) {
98 allCiphers.insert(c.name(), c);
104 return allCiphers.value(ksc.
name());
108 QHash<QString, QSslCipher> allCiphers;
112 class KSslErrorPrivate
120 case QSslError::UnableToGetLocalIssuerCertificate:
121 case QSslError::InvalidCaCertificate:
123 case QSslError::InvalidNotBeforeField:
124 case QSslError::InvalidNotAfterField:
125 case QSslError::CertificateNotYetValid:
126 case QSslError::CertificateExpired:
128 case QSslError::UnableToDecodeIssuerPublicKey:
129 case QSslError::SubjectIssuerMismatch:
130 case QSslError::AuthorityIssuerSerialNumberMismatch:
132 case QSslError::SelfSignedCertificate:
133 case QSslError::SelfSignedCertificateInChain:
135 case QSslError::CertificateRevoked:
137 case QSslError::InvalidPurpose:
139 case QSslError::CertificateUntrusted:
141 case QSslError::CertificateRejected:
143 case QSslError::NoPeerCertificate:
145 case QSslError::HostNameMismatch:
147 case QSslError::UnableToVerifyFirstCertificate:
148 case QSslError::UnableToDecryptCertificateSignature:
149 case QSslError::UnableToGetIssuerCertificate:
150 case QSslError::CertificateSignatureFailed:
152 case QSslError::PathLengthExceeded:
154 case QSslError::UnspecifiedError:
155 case QSslError::NoSslSupport:
165 return i18nc(
"SSL error",
"No error");
167 return i18nc(
"SSL error",
"The certificate authority's certificate is invalid");
169 return i18nc(
"SSL error",
"The certificate has expired");
171 return i18nc(
"SSL error",
"The certificate is invalid");
173 return i18nc(
"SSL error",
"The certificate is not signed by any trusted certificate authority");
175 return i18nc(
"SSL error",
"The certificate has been revoked");
177 return i18nc(
"SSL error",
"The certificate is unsuitable for this purpose");
179 return i18nc(
"SSL error",
"The root certificate authority's certificate is not trusted for this purpose");
181 return i18nc(
"SSL error",
"The certificate authority's certificate is marked to reject this certificate's purpose");
183 return i18nc(
"SSL error",
"The peer did not present any certificate");
185 return i18nc(
"SSL error",
"The certificate does not apply to the given host");
187 return i18nc(
"SSL error",
"The certificate cannot be verified for internal reasons");
189 return i18nc(
"SSL error",
"The certificate chain is too long");
192 return i18nc(
"SSL error",
"Unknown error");
197 QSslCertificate certificate;
202 : d(new KSslErrorPrivate())
204 d->error = errorCode;
210 : d(new KSslErrorPrivate())
212 d->error = KSslErrorPrivate::errorFromQSslError(other.error());
213 d->certificate = other.certificate();
218 : d(new KSslErrorPrivate())
251 return d->certificate;
255 class KTcpSocketPrivate
260 certificatesLoaded(false),
261 emittedReadyRead(false)
270 case QAbstractSocket::UnconnectedState:
272 case QAbstractSocket::HostLookupState:
274 case QAbstractSocket::ConnectingState:
276 case QAbstractSocket::ConnectedState:
278 case QAbstractSocket::ClosingState:
280 case QAbstractSocket::BoundState:
281 case QAbstractSocket::ListeningState:
291 case QSslSocket::SslClientMode:
293 case QSslSocket::SslServerMode:
303 case QAbstractSocket::ConnectionRefusedError:
305 case QAbstractSocket::RemoteHostClosedError:
307 case QAbstractSocket::HostNotFoundError:
309 case QAbstractSocket::SocketAccessError:
311 case QAbstractSocket::SocketResourceError:
313 case QAbstractSocket::SocketTimeoutError:
315 case QAbstractSocket::NetworkError:
317 case QAbstractSocket::UnsupportedSocketOperationError:
319 case QAbstractSocket::DatagramTooLargeError:
321 case QAbstractSocket::AddressInUseError:
322 case QAbstractSocket::SocketAddressNotAvailableError:
324 case QAbstractSocket::ProxyAuthenticationRequiredError:
326 case QAbstractSocket::UnknownSocketError:
333 void reemitSocketError(QAbstractSocket::SocketError e)
335 emit q->error(errorFromAbsSocket(e));
338 void reemitSslErrors(
const QList<QSslError> &errors)
341 QList<KSslError> kErrors;
342 foreach (
const QSslError &e, errors) {
345 emit q->sslErrors(kErrors);
348 void reemitStateChanged(QAbstractSocket::SocketState s)
350 emit q->stateChanged(state(s));
353 void reemitModeChanged(QSslSocket::SslMode m)
355 emit q->encryptionModeChanged(encryptionMode(m));
361 void reemitReadyRead()
363 if (!emittedReadyRead) {
364 emittedReadyRead =
true;
366 emittedReadyRead =
false;
370 void maybeLoadCertificates()
372 if (!certificatesLoaded) {
374 certificatesLoaded =
true;
379 bool certificatesLoaded;
380 bool emittedReadyRead;
382 QList<KSslCipher> ciphers;
390 d(new KTcpSocketPrivate(this))
392 d->advertisedSslVersion =
SslV3;
394 connect(&d->sock, SIGNAL(aboutToClose()),
this, SIGNAL(aboutToClose()));
395 connect(&d->sock, SIGNAL(bytesWritten(
qint64)),
this, SIGNAL(bytesWritten(
qint64)));
397 connect(&d->sock, SIGNAL(readyRead()),
this, SLOT(reemitReadyRead()));
401 #ifndef QT_NO_NETWORKPROXY
405 connect(&d->sock, SIGNAL(
error(QAbstractSocket::SocketError)),
406 this, SLOT(reemitSocketError(QAbstractSocket::SocketError)));
407 connect(&d->sock, SIGNAL(
sslErrors(QList<QSslError>)),
408 this, SLOT(reemitSslErrors(QList<QSslError>)));
410 connect(&d->sock, SIGNAL(
stateChanged(QAbstractSocket::SocketState)),
411 this, SLOT(reemitStateChanged(QAbstractSocket::SocketState)));
412 connect(&d->sock, SIGNAL(modeChanged(QSslSocket::SslMode)),
413 this, SLOT(reemitModeChanged(QSslSocket::SslMode)));
438 return d->sock.bytesToWrite();
463 bool ret = d->sock.open(open);
464 setOpenMode(d->sock.openMode() | QIODevice::Unbuffered);
471 return d->sock.waitForBytesWritten(msecs);
477 return d->sock.waitForReadyRead(msecs);
483 return d->sock.read(data, maxSize);
489 return d->sock.write(data, maxSize);
505 d->sock.connectToHost(hostName, port);
512 setOpenMode(d->sock.openMode() | QIODevice::Unbuffered);
521 d->sock.connectToHost(hostAddress, port);
522 setOpenMode(d->sock.openMode() | QIODevice::Unbuffered);
531 d->sock.connectToHost(url.host(), url.port());
532 setOpenMode(d->sock.openMode() | QIODevice::Unbuffered);
538 d->sock.disconnectFromHost();
539 setOpenMode(d->sock.openMode() | QIODevice::Unbuffered);
545 return d->errorFromAbsSocket(d->sock.error());
554 QList<KSslError> ret;
555 foreach (
const QSslError &e, d->sock.sslErrors())
563 return d->sock.flush();
569 return d->sock.isValid();
575 return d->sock.localAddress();
581 return d->sock.peerAddress();
587 return d->sock.peerName();
593 return d->sock.peerPort();
597 #ifndef QT_NO_NETWORKPROXY
600 return d->sock.proxy();
606 return d->sock.readBufferSize();
610 #ifndef QT_NO_NETWORKPROXY
613 d->sock.setProxy(proxy);
619 d->sock.setReadBufferSize(size);
625 return d->state(d->sock.state());
631 bool ret = d->sock.waitForConnected(msecs);
633 setErrorString(d->sock.errorString());
634 setOpenMode(d->sock.openMode() | QIODevice::Unbuffered);
641 bool ret = d->sock.waitForDisconnected(msecs);
643 setErrorString(d->sock.errorString());
644 setOpenMode(d->sock.openMode() | QIODevice::Unbuffered);
652 d->maybeLoadCertificates();
653 d->sock.addCaCertificate(certificate);
669 d->maybeLoadCertificates();
670 d->sock.addCaCertificates(certificates);
676 d->maybeLoadCertificates();
677 return d->sock.caCertificates();
689 d->maybeLoadCertificates();
691 d->sock.connectToHostEncrypted(hostName, port, openMode);
692 setOpenMode(d->sock.openMode() | QIODevice::Unbuffered);
698 return d->sock.localCertificate();
704 return d->sock.peerCertificateChain();
710 return KSslKey(d->sock.privateKey());
722 d->sock.setCaCertificates(certificates);
723 d->certificatesLoaded =
true;
730 QList<QSslCipher> cl;
732 cl.append(d->ccc.converted(c));
734 d->sock.setCiphers(cl);
740 d->sock.setLocalCertificate(certificate);
746 d->sock.setLocalCertificate(fileName, format);
752 #if QT_VERSION >= 0x040800
753 d->sock.setPeerVerifyName(hostName);
766 QSslKey _key(key.
toDer(),
771 d->sock.setPrivateKey(_key);
776 QSsl::EncodingFormat format,
const QByteArray &passPhrase)
782 d->sock.setPrivateKey(fileName,
791 return d->sock.waitForEncrypted(msecs);
797 return d->encryptionMode(d->sock.mode());
802 return d->sock.socketOption(options);
807 d->sock.setSocketOption(options, value);
812 return d->sock.sslConfiguration();
817 d->sock.setSslConfiguration(configuration);
823 d->sock.ignoreSslErrors();
830 d->maybeLoadCertificates();
832 d->sock.startClientEncryption();
837 void KTcpSocket::showSslErrors()
839 foreach (
const QSslError &e, d->sock.sslErrors())
840 kDebug(7029) << e.errorString();
846 d->advertisedSslVersion =
version;
852 return d->advertisedSslVersion;
858 if (!d->sock.isEncrypted()) {
867 if (!d->sock.isEncrypted()) {
870 return d->sock.sessionCipher().protocolString();
897 : d(new KSslKeyPrivate)
901 d->isExportable =
true;
906 : d(new KSslKeyPrivate)
913 : d(new KSslKeyPrivate)
915 d->algorithm = d->convertAlgorithm(qsk.algorithm());
917 d->isExportable =
true;
918 d->der = qsk.toDer();
943 return d->isExportable;
961 class KSslCipherPrivate
976 : d(new KSslCipherPrivate)
979 d->supportedBits = 0;
985 : d(new KSslCipherPrivate)
992 : d(new KSslCipherPrivate)
994 d->authenticationMethod = qsc.authenticationMethod();
995 d->encryptionMethod = qsc.encryptionMethod();
998 int parenIdx = d->encryptionMethod.indexOf(QLatin1Char(
'('));
1000 d->encryptionMethod.truncate(parenIdx);
1001 d->keyExchangeMethod = qsc.keyExchangeMethod();
1002 d->name = qsc.name();
1003 d->isNull = qsc.isNull();
1004 d->supportedBits = qsc.supportedBits();
1005 d->usedBits = qsc.usedBits();
1030 return d->authenticationMethod;
1036 return d->encryptionMethod;
1042 return d->keyExchangeMethod;
1050 if (d->name.endsWith(QLatin1String(
"SHA")))
1051 return QString::fromLatin1(
"SHA-1");
1052 else if (d->name.endsWith(QLatin1String(
"MD5")))
1053 return QString::fromLatin1(
"MD5");
1055 return QString::fromLatin1(
"");
1067 return d->supportedBits;
1080 QList<KSslCipher> ret;
1082 foreach(
const QSslCipher &c, candidates) {
1116 foreach (
const QSslError &e, socket->sslErrors())
1119 d->
ip = socket->peerAddress().toString();
1120 d->
host = socket->peerName();
1121 if (socket->isEncrypted()) {
1122 d->
sslProtocol = socket->sessionCipher().protocolString();
1124 d->
cipher = socket->sessionCipher().name();
1125 d->
usedBits = socket->sessionCipher().usedBits();
1126 d->
bits = socket->sessionCipher().supportedBits();
1146 #include "ktcpsocket.moc"