--- /dev/null
+/***************************************************************************
+ * Copyright (C) 2005-08 by the Quassel Project *
+ * devel@quassel-irc.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) version 3. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#include "sslserver.h"
+
+#include <QSslSocket>
+#include <QFile>
+#include <QDebug>
+
+#include "util.h"
+
+SslServer::SslServer(QObject *parent)
+ : QTcpServer(parent)
+{
+ QFile certFile(quasselDir().absolutePath() + "/quasselCert.pem");
+ certFile.open(QIODevice::ReadOnly);
+ _cert = QSslCertificate(&certFile);
+ certFile.close();
+
+ certFile.open(QIODevice::ReadOnly);
+ _key = QSslKey(&certFile, QSsl::Rsa);
+ certFile.close();
+
+ _certIsValid = !_cert.isNull() && _cert.isValid() && !_key.isNull();
+ if(!_certIsValid) {
+ qWarning() << "SslServer: SSL Certificate is either missing or has wrong format!";
+ qWarning() << " make sure that ~/.quassel/quasselCert.pem is pem format and contains the cert and an rsa key!";
+ qWarning() << "SslServer: this Quassel Core cannot provide SSL!";
+ }
+}
+
+QTcpSocket *SslServer::nextPendingConnection() {
+ if(_pendingConnections.isEmpty())
+ return 0;
+ else
+ return _pendingConnections.takeFirst();
+}
+
+void SslServer::incomingConnection(int socketDescriptor) {
+ QSslSocket *serverSocket = new QSslSocket(this);
+ if(serverSocket->setSocketDescriptor(socketDescriptor)) {
+ if(certIsValid()) {
+ serverSocket->setLocalCertificate(_cert);
+ serverSocket->setPrivateKey(_key);
+ }
+ _pendingConnections << serverSocket;
+ emit newConnection();
+ } else {
+ delete serverSocket;
+ }
+}
--- /dev/null
+/***************************************************************************
+ * Copyright (C) 2005-08 by the Quassel Project *
+ * devel@quassel-irc.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) version 3. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#ifndef SSLSERVER_H
+#define SSLSERVER_H
+
+#include <QTcpServer>
+#include <QLinkedList>
+#include <QSslCertificate>
+#include <QSslKey>
+
+class SslServer : public QTcpServer {
+ Q_OBJECT
+
+public:
+ SslServer(QObject *parent = 0);
+
+ virtual inline bool hasPendingConnections() const { return !_pendingConnections.isEmpty(); }
+ virtual QTcpSocket *nextPendingConnection();
+
+ virtual inline const QSslCertificate &certificate() const { return _cert; }
+ virtual inline const QSslKey &key() const { return _key; }
+ virtual inline bool certIsValid() const { return _certIsValid; }
+
+protected:
+ virtual void incomingConnection(int socketDescriptor);
+
+private:
+ QLinkedList<QTcpSocket *> _pendingConnections;
+ QSslCertificate _cert;
+ QSslKey _key;
+ bool _certIsValid;
+};
+
+#endif //SSLSERVER_H