~ubuntu-branches/ubuntu/vivid/quassel/vivid-updates

« back to all changes in this revision

Viewing changes to .pc/0001-Support-intermediate-CA-certificates.patch/src/core/sslserver.cpp

  • Committer: Package Import Robot
  • Author(s): Scott Kitterman
  • Date: 2012-03-20 18:21:56 UTC
  • mfrom: (1.1.48)
  • Revision ID: package-import@ubuntu.com-20120320182156-pv9bi7xbuvj4p162
Tags: 0.8.0-0ubuntu1
* New upstream release
* Add debian/patches/0001-Support-intermediate-CA-certificates.patch and
  0002-Allow-the-core-to-use-expired-certificates.patch from Felix Geyer to
  correct issues with SSL integration

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/***************************************************************************
 
2
 *   Copyright (C) 2005-09 by the Quassel Project                          *
 
3
 *   devel@quassel-irc.org                                                 *
 
4
 *                                                                         *
 
5
 *   This program is free software; you can redistribute it and/or modify  *
 
6
 *   it under the terms of the GNU General Public License as published by  *
 
7
 *   the Free Software Foundation; either version 2 of the License, or     *
 
8
 *   (at your option) version 3.                                           *
 
9
 *                                                                         *
 
10
 *   This program is distributed in the hope that it will be useful,       *
 
11
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 
12
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 
13
 *   GNU General Public License for more details.                          *
 
14
 *                                                                         *
 
15
 *   You should have received a copy of the GNU General Public License     *
 
16
 *   along with this program; if not, write to the                         *
 
17
 *   Free Software Foundation, Inc.,                                       *
 
18
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 
19
 ***************************************************************************/
 
20
 
 
21
#include "sslserver.h"
 
22
 
 
23
#ifdef HAVE_SSL
 
24
#  include <QSslSocket>
 
25
#endif
 
26
 
 
27
#include <QFile>
 
28
 
 
29
#include "logger.h"
 
30
#include "quassel.h"
 
31
 
 
32
#ifdef HAVE_SSL
 
33
 
 
34
SslServer::SslServer(QObject *parent)
 
35
  : QTcpServer(parent),
 
36
  _isCertValid(false)
 
37
{
 
38
  static bool sslWarningShown = false;
 
39
  if(!setCertificate(Quassel::configDirPath() + "quasselCert.pem")) {
 
40
    if(!sslWarningShown) {
 
41
      quWarning()
 
42
        << "SslServer: Unable to set certificate file\n"
 
43
        << "          Quassel Core will still work, but cannot provide SSL for client connections.\n"
 
44
        << "          Please see http://quassel-irc.org/faq/cert to learn how to enable SSL support.";
 
45
      sslWarningShown=true;
 
46
    }
 
47
  }
 
48
}
 
49
 
 
50
QTcpSocket *SslServer::nextPendingConnection() {
 
51
  if(_pendingConnections.isEmpty())
 
52
    return 0;
 
53
  else
 
54
    return _pendingConnections.takeFirst();
 
55
}
 
56
 
 
57
void SslServer::incomingConnection(int socketDescriptor) {
 
58
  QSslSocket *serverSocket = new QSslSocket(this);
 
59
  if(serverSocket->setSocketDescriptor(socketDescriptor)) {
 
60
    if(isCertValid()) {
 
61
      serverSocket->setLocalCertificate(_cert);
 
62
      serverSocket->setPrivateKey(_key);
 
63
    }
 
64
    _pendingConnections << serverSocket;
 
65
    emit newConnection();
 
66
  } else {
 
67
    delete serverSocket;
 
68
  }
 
69
}
 
70
 
 
71
bool SslServer::setCertificate(const QString &path) {
 
72
  _isCertValid = false;
 
73
 
 
74
  if(path.isEmpty())
 
75
    return false;
 
76
 
 
77
  QFile certFile(path);
 
78
  if(!certFile.exists()) {
 
79
    quWarning() << "SslServer: Certificate file" << qPrintable(path) << "does not exist";
 
80
    return false;
 
81
  }
 
82
 
 
83
  if(!certFile.open(QIODevice::ReadOnly)) {
 
84
    quWarning()
 
85
      << "SslServer: Failed to open certificate file" << qPrintable(path)
 
86
      << "error:" << certFile.error();
 
87
    return false;
 
88
  }
 
89
  _cert = QSslCertificate(&certFile);
 
90
 
 
91
  if(!certFile.reset()) {
 
92
    quWarning() << "SslServer: IO error reading certificate file";
 
93
    return false;
 
94
  }
 
95
 
 
96
  _key = QSslKey(&certFile, QSsl::Rsa);
 
97
  certFile.close();
 
98
 
 
99
  if(_cert.isNull()) {
 
100
    quWarning() << "SslServer:" << qPrintable(path) << "contains no certificate data";
 
101
    return false;
 
102
  }
 
103
  if(!_cert.isValid()) {
 
104
    quWarning() << "SslServer: Invalid certificate";
 
105
    return false;
 
106
  }
 
107
  if(_key.isNull()) {
 
108
    quWarning() << "SslServer:" << qPrintable(path) << "contains no key data";
 
109
    return false;
 
110
  }
 
111
 
 
112
  _isCertValid = true;
 
113
 
 
114
  return _isCertValid;
 
115
}
 
116
 
 
117
#endif // HAVE_SSL