Navigation Menu

Skip to content

Commit

Permalink
[settings-vpn] When VPN doesn't provide domain create one. Fixes JB#4…
Browse files Browse the repository at this point in the history
…1638

Do not use fixed defaultDomain for VPNs that do not provide
domain. Due this it was it possible to import same VPN configuration multiple
times and alter their settings.

This also introduces a new default domain naming.
  • Loading branch information
rainemak committed Apr 13, 2018
1 parent 9162723 commit a8c6a12
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 4 deletions.
49 changes: 45 additions & 4 deletions src/vpnmodel.cpp
Expand Up @@ -44,7 +44,8 @@

namespace {

const QString defaultDomain(QStringLiteral("merproject.org"));
const auto defaultDomain = QStringLiteral("sailfishos.org");
const auto legacyDefaultDomain(QStringLiteral("merproject.org"));
const auto connmanService = QStringLiteral("net.connman");
const auto connmanVpnService = QStringLiteral("net.connman.vpn");
const auto autoConnectKey = QStringLiteral("AutoConnect");
Expand Down Expand Up @@ -405,7 +406,7 @@ void VpnModel::createConnection(const QVariantMap &createProperties)
QVariantMap properties(createProperties);
const QString domain(properties.value(QString("domain")).toString());
if (domain.isEmpty()) {
properties.insert(QString("domain"), QVariant::fromValue(defaultDomain));
properties.insert(QString("domain"), QVariant::fromValue(createDefaultDomain()));
}

QDBusPendingCall call = connmanVpn_.Create(propertiesToDBus(properties));
Expand Down Expand Up @@ -450,7 +451,7 @@ void VpnModel::modifyConnection(const QString &path, const QVariantMap &properti

const QString domain(updatedProperties.value(QString("domain")).toString());
if (domain.isEmpty()) {
updatedProperties.insert(QString("domain"), QVariant::fromValue(defaultDomain));
updatedProperties.insert(QString("domain"), QVariant::fromValue(createDefaultDomain()));
}

const QString location(CredentialsRepository::locationForObjectPath(path));
Expand Down Expand Up @@ -830,7 +831,11 @@ void VpnModel::updateConnection(VpnConnection *conn, const QVariantMap &updatePr

ppit = properties.find(QStringLiteral("domain"));
if (ppit != properties.end()) {
if ((*ppit).value<QString>() == defaultDomain) {
QString domain = (*ppit).value<QString>();
if (isDefaultDomain(domain)) {
// Default domains are dropped from the model data but
// let's track what default domains we have seen.
defaultDomains_.insert(domain);
properties.erase(ppit);
}
}
Expand Down Expand Up @@ -1098,6 +1103,42 @@ QVariantMap VpnModel::processOpenVpnProvisioningFile(QFile &provisioningFile)
return rv;
}

bool VpnModel::domainInUse(const QString &domain) const
{
if (defaultDomains_.contains(domain)) {
return true;
}

const int itemCount(count());
for (int index = 0; index < itemCount; ++index) {
const VpnConnection *connection = get<VpnConnection>(index);
if (connection->domain() == domain) {
return true;
}
}
return false;
}

QString VpnModel::createDefaultDomain() const
{
QString newDomain = defaultDomain;
int index = 1;
while (domainInUse(newDomain)) {
newDomain = defaultDomain + QString(".%1").arg(index);
++index;
}
return newDomain;
}

bool VpnModel::isDefaultDomain(const QString &domain) const
{
if (domain == legacyDefaultDomain)
return true;

static const QRegularExpression domainPattern(QStringLiteral("^%1(\\.\\d+)?$").arg(defaultDomain));
return domainPattern.match(domain).hasMatch();
}


VpnConnection::VpnConnection(const QString &path)
: QObject(0)
Expand Down
5 changes: 5 additions & 0 deletions src/vpnmodel.h
Expand Up @@ -101,6 +101,10 @@ private slots:

QVariantMap processOpenVpnProvisioningFile(QFile &provisioningFile);

bool domainInUse(const QString &domain) const;
QString createDefaultDomain() const;
bool isDefaultDomain(const QString &domain) const;

class CredentialsRepository
{
public:
Expand All @@ -125,6 +129,7 @@ private slots:
ConnmanVpnProxy connmanVpn_;
QHash<QString, ConnmanVpnConnectionProxy *> connections_;
QHash<QString, ConnmanServiceProxy *> vpnServices_;
QSet<QString> defaultDomains_;
QMap<QString, VpnConnection*> pendingDisconnects_;
QString pendingConnect_;
CredentialsRepository credentials_;
Expand Down

0 comments on commit a8c6a12

Please sign in to comment.