1 /***************************************************************************
2 * Copyright (C) 2005-2019 by the Quassel Project *
3 * devel@quassel-irc.org *
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. *
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. *
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 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
19 ***************************************************************************/
22 # include <sys/stat.h>
23 # include <sys/types.h>
24 #endif /* HAVE_UMASK */
28 #include "corenetwork.h"
29 #include "oidentdconfiggenerator.h"
31 OidentdConfigGenerator::OidentdConfigGenerator(QObject* parent)
38 OidentdConfigGenerator::~OidentdConfigGenerator()
40 _quasselConfig.clear();
42 _configFile->deleteLater();
45 bool OidentdConfigGenerator::init()
47 _configDir = QDir::homePath();
48 _configFileName = ".oidentd.conf";
50 if (Quassel::isOptionSet("oidentd-conffile"))
51 _configPath = Quassel::optionValue("oidentd-conffile");
53 _configPath = _configDir.absoluteFilePath(_configFileName);
55 _configTag = " stanza created by Quassel";
57 _configFile = new QFile(_configPath);
59 // Rx has to match Template in order for cleanup to work.
60 // Template should be enhanced with the "from" parameter as soon as Quassel gains
61 // the ability to bind to an IP on client sockets.
63 _quasselStanzaTemplate = QString("lport %1 { reply \"%2\" } #%3\n");
64 _quasselStanzaRx = QRegExp(QString(R"(^lport .* \{ .* \} #%1\r?\n)").arg(_configTag));
66 // initially remove all Quassel stanzas that might be present
67 if (parseConfig(false) && writeConfig())
73 QString OidentdConfigGenerator::sysIdentForIdentity(const CoreIdentity* identity) const
75 // Make sure the identity's ident complies with strict mode if enabled
76 const CoreNetwork* network = qobject_cast<CoreNetwork*>(sender());
77 return network->coreSession()->strictCompliantIdent(identity);
80 bool OidentdConfigGenerator::addSocket(const CoreIdentity* identity,
81 const QHostAddress& localAddress,
83 const QHostAddress& peerAddress,
87 Q_UNUSED(localAddress)
92 const QString ident = sysIdentForIdentity(identity);
94 _quasselConfig.append(_quasselStanzaTemplate.arg(localPort).arg(ident).arg(_configTag).toLatin1());
96 bool ret = writeConfig();
101 //! not yet implemented
102 bool OidentdConfigGenerator::removeSocket(const CoreIdentity* identity,
103 const QHostAddress& localAddress,
105 const QHostAddress& peerAddress,
110 Q_UNUSED(localAddress)
112 Q_UNUSED(peerAddress)
119 bool OidentdConfigGenerator::parseConfig(bool readQuasselStanzas)
121 if (!_configFile->exists())
124 if (!_configFile->isOpen() && !_configFile->open(QIODevice::ReadOnly))
128 _parsedConfig.clear();
129 _configFile->seek(0);
130 while (!_configFile->atEnd()) {
131 QByteArray line = _configFile->readLine();
134 _parsedConfig.append(line);
135 else if (readQuasselStanzas)
136 _quasselConfig.append(line);
139 _configFile->close();
144 bool OidentdConfigGenerator::writeConfig()
147 mode_t prev_umask = umask(S_IXUSR | S_IWGRP | S_IXGRP | S_IWOTH | S_IXOTH); // == 0133, rw-r--r--
149 bool not_open = (!_configFile->isOpen() && !_configFile->open(QIODevice::ReadWrite | QIODevice::Text));
159 _configFile->seek(0);
160 _configFile->resize(0);
161 _configFile->write(_parsedConfig);
162 _configFile->write(_quasselConfig);
164 _configFile->close();
169 bool OidentdConfigGenerator::lineByUs(const QByteArray& line)
171 return _quasselStanzaRx.exactMatch(line);