diff --git a/src/base/preferences.cpp b/src/base/preferences.cpp index 7742ac281..b76198e93 100644 --- a/src/base/preferences.cpp +++ b/src/base/preferences.cpp @@ -548,10 +548,9 @@ QVector Preferences::getWebUiAuthSubnetWhitelist() const for (const QString &rawSubnet : subnets) { - bool ok = false; - const Utils::Net::Subnet subnet = Utils::Net::parseSubnet(rawSubnet.trimmed(), &ok); - if (ok) - ret.append(subnet); + const std::optional subnet = Utils::Net::parseSubnet(rawSubnet.trimmed()); + if (subnet) + ret.append(subnet.value()); } return ret; @@ -561,9 +560,7 @@ void Preferences::setWebUiAuthSubnetWhitelist(QStringList subnets) { Algorithm::removeIf(subnets, [](const QString &subnet) { - bool ok = false; - Utils::Net::parseSubnet(subnet.trimmed(), &ok); - return !ok; + return !Utils::Net::parseSubnet(subnet.trimmed()).has_value(); }); setValue(u"Preferences/WebUI/AuthSubnetWhitelist"_qs, subnets); diff --git a/src/base/utils/net.cpp b/src/base/utils/net.cpp index aab83656c..4d46323b6 100644 --- a/src/base/utils/net.cpp +++ b/src/base/utils/net.cpp @@ -47,22 +47,15 @@ namespace Utils return !QHostAddress(ip).isNull(); } - Subnet parseSubnet(const QString &subnetStr, bool *ok) + std::optional parseSubnet(const QString &subnetStr) { - const Subnet invalid = qMakePair(QHostAddress(), -1); const Subnet subnet = QHostAddress::parseSubnet(subnetStr); - if (ok) - *ok = (subnet != invalid); + const Subnet invalid = {QHostAddress(), -1}; + if (subnet == invalid) + return std::nullopt; return subnet; } - bool canParseSubnet(const QString &subnetStr) - { - bool ok = false; - parseSubnet(subnetStr, &ok); - return ok; - } - bool isLoopbackAddress(const QHostAddress &addr) { return (addr == QHostAddress::LocalHost) diff --git a/src/base/utils/net.h b/src/base/utils/net.h index f9712d59c..3f885f852 100644 --- a/src/base/utils/net.h +++ b/src/base/utils/net.h @@ -28,8 +28,10 @@ #pragma once -#include +#include + #include +#include class QSslCertificate; class QSslKey; @@ -37,11 +39,11 @@ class QString; namespace Utils::Net { + // alias for `QHostAddress::parseSubnet()` return type using Subnet = QPair; bool isValidIP(const QString &ip); - Subnet parseSubnet(const QString &subnetStr, bool *ok = nullptr); - bool canParseSubnet(const QString &subnetStr); + std::optional parseSubnet(const QString &subnetStr); bool isLoopbackAddress(const QHostAddress &addr); bool isIPInRange(const QHostAddress &addr, const QVector &subnets); QString subnetToString(const Subnet &subnet); diff --git a/src/gui/ipsubnetwhitelistoptionsdialog.cpp b/src/gui/ipsubnetwhitelistoptionsdialog.cpp index 96da8fcbc..3a0e92a2f 100644 --- a/src/gui/ipsubnetwhitelistoptionsdialog.cpp +++ b/src/gui/ipsubnetwhitelistoptionsdialog.cpp @@ -90,16 +90,15 @@ void IPSubnetWhitelistOptionsDialog::on_buttonBox_accepted() void IPSubnetWhitelistOptionsDialog::on_buttonWhitelistIPSubnet_clicked() { - bool ok = false; - const Utils::Net::Subnet subnet = Utils::Net::parseSubnet(m_ui->txtIPSubnet->text(), &ok); - if (!ok) + const std::optional subnet = Utils::Net::parseSubnet(m_ui->txtIPSubnet->text()); + if (!subnet) { QMessageBox::critical(this, tr("Error"), tr("The entered subnet is invalid.")); return; } m_model->insertRow(m_model->rowCount()); - m_model->setData(m_model->index(m_model->rowCount() - 1, 0), Utils::Net::subnetToString(subnet)); + m_model->setData(m_model->index(m_model->rowCount() - 1, 0), Utils::Net::subnetToString(subnet.value())); m_ui->txtIPSubnet->clear(); m_modified = true; } @@ -114,5 +113,5 @@ void IPSubnetWhitelistOptionsDialog::on_buttonDeleteIPSubnet_clicked() void IPSubnetWhitelistOptionsDialog::on_txtIPSubnet_textChanged(const QString &subnetStr) { - m_ui->buttonWhitelistIPSubnet->setEnabled(Utils::Net::canParseSubnet(subnetStr)); + m_ui->buttonWhitelistIPSubnet->setEnabled(Utils::Net::parseSubnet(subnetStr).has_value()); }