File indexing completed on 2024-04-14 03:57:40

0001 /*
0002     SPDX-FileCopyrightText: 2012-2013 Jan Grulich <jgrulich@redhat.com>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #include "wirelesssetting.h"
0008 #include "wirelesssetting_p.h"
0009 
0010 #include "utils.h"
0011 
0012 // define the deprecated&dropped values
0013 #define NM_SETTING_WIRELESS_SEC "security"
0014 #define NM_SETTING_WIRELESS_ASSIGNED_MAC_ADDRESS "assigned-mac-address"
0015 
0016 #include <QDebug>
0017 
0018 NetworkManager::WirelessSettingPrivate::WirelessSettingPrivate()
0019     : name(NM_SETTING_WIRELESS_SETTING_NAME)
0020     , mode(NetworkManager::WirelessSetting::Infrastructure)
0021     , band(NetworkManager::WirelessSetting::Automatic)
0022     , channel(0)
0023     , rate(0)
0024     , txPower(0)
0025     , mtu(0)
0026     , hidden(false)
0027     , macAddressRandomization(NetworkManager::Setting::MacAddressRandomizationDefault)
0028     , powersave(NetworkManager::WirelessSetting::PowerSaveDefault)
0029 {
0030 }
0031 
0032 NetworkManager::WirelessSetting::WirelessSetting()
0033     : Setting(Setting::Wireless)
0034     , d_ptr(new WirelessSettingPrivate())
0035 {
0036 }
0037 
0038 NetworkManager::WirelessSetting::WirelessSetting(const Ptr &setting)
0039     : Setting(setting)
0040     , d_ptr(new WirelessSettingPrivate)
0041 {
0042     setSsid(setting->ssid());
0043     setMode(setting->mode());
0044     setBand(setting->band());
0045     setChannel(setting->channel());
0046     setBssid(setting->bssid());
0047     setRate(setting->rate());
0048     setTxPower(setting->txPower());
0049     setMacAddress(setting->macAddress());
0050     setGenerateMacAddressMask(setting->generateMacAddressMask());
0051     setClonedMacAddress(setting->clonedMacAddress());
0052     setMacAddressBlacklist(setting->macAddressBlacklist());
0053     setMacAddressRandomization(setting->macAddressRandomization());
0054     setMtu(setting->mtu());
0055     setSeenBssids(setting->seenBssids());
0056     setPowerSave(setting->powerSave());
0057     setSecurity(setting->security());
0058     setHidden(setting->hidden());
0059     setAssignedMacAddress(setting->assignedMacAddress());
0060 }
0061 
0062 NetworkManager::WirelessSetting::~WirelessSetting()
0063 {
0064     delete d_ptr;
0065 }
0066 
0067 QString NetworkManager::WirelessSetting::name() const
0068 {
0069     Q_D(const WirelessSetting);
0070 
0071     return d->name;
0072 }
0073 
0074 void NetworkManager::WirelessSetting::setSsid(const QByteArray &ssid)
0075 {
0076     Q_D(WirelessSetting);
0077 
0078     d->ssid = ssid;
0079 }
0080 
0081 QByteArray NetworkManager::WirelessSetting::ssid() const
0082 {
0083     Q_D(const WirelessSetting);
0084 
0085     return d->ssid;
0086 }
0087 
0088 void NetworkManager::WirelessSetting::setMode(NetworkManager::WirelessSetting::NetworkMode mode)
0089 {
0090     Q_D(WirelessSetting);
0091 
0092     d->mode = mode;
0093 }
0094 
0095 NetworkManager::WirelessSetting::NetworkMode NetworkManager::WirelessSetting::mode() const
0096 {
0097     Q_D(const WirelessSetting);
0098 
0099     return d->mode;
0100 }
0101 
0102 void NetworkManager::WirelessSetting::setBand(NetworkManager::WirelessSetting::FrequencyBand band)
0103 {
0104     Q_D(WirelessSetting);
0105 
0106     d->band = band;
0107 }
0108 
0109 NetworkManager::WirelessSetting::FrequencyBand NetworkManager::WirelessSetting::band() const
0110 {
0111     Q_D(const WirelessSetting);
0112 
0113     return d->band;
0114 }
0115 
0116 void NetworkManager::WirelessSetting::setChannel(quint32 channel)
0117 {
0118     Q_D(WirelessSetting);
0119 
0120     d->channel = channel;
0121 }
0122 
0123 quint32 NetworkManager::WirelessSetting::channel() const
0124 {
0125     Q_D(const WirelessSetting);
0126 
0127     return d->channel;
0128 }
0129 
0130 void NetworkManager::WirelessSetting::setBssid(const QByteArray &bssid)
0131 {
0132     Q_D(WirelessSetting);
0133 
0134     d->bssid = bssid;
0135 }
0136 
0137 QByteArray NetworkManager::WirelessSetting::bssid() const
0138 {
0139     Q_D(const WirelessSetting);
0140 
0141     return d->bssid;
0142 }
0143 
0144 void NetworkManager::WirelessSetting::setRate(quint32 rate)
0145 {
0146     Q_D(WirelessSetting);
0147 
0148     d->rate = rate;
0149 }
0150 
0151 quint32 NetworkManager::WirelessSetting::rate() const
0152 {
0153     Q_D(const WirelessSetting);
0154 
0155     return d->rate;
0156 }
0157 
0158 void NetworkManager::WirelessSetting::setTxPower(quint32 power)
0159 {
0160     Q_D(WirelessSetting);
0161 
0162     d->txPower = power;
0163 }
0164 
0165 quint32 NetworkManager::WirelessSetting::txPower() const
0166 {
0167     Q_D(const WirelessSetting);
0168 
0169     return d->txPower;
0170 }
0171 
0172 void NetworkManager::WirelessSetting::setAssignedMacAddress(const QString &assignedMacAddress)
0173 {
0174     Q_D(WirelessSetting);
0175 
0176     d->assignedMacAddress = assignedMacAddress;
0177 }
0178 
0179 QString NetworkManager::WirelessSetting::assignedMacAddress() const
0180 {
0181     Q_D(const WirelessSetting);
0182 
0183     return d->assignedMacAddress;
0184 }
0185 
0186 void NetworkManager::WirelessSetting::setMacAddress(const QByteArray &address)
0187 {
0188     Q_D(WirelessSetting);
0189 
0190     d->macAddress = address;
0191 }
0192 
0193 QByteArray NetworkManager::WirelessSetting::macAddress() const
0194 {
0195     Q_D(const WirelessSetting);
0196 
0197     return d->macAddress;
0198 }
0199 
0200 void NetworkManager::WirelessSetting::setClonedMacAddress(const QByteArray &address)
0201 {
0202     Q_D(WirelessSetting);
0203 
0204     d->assignedMacAddress = NetworkManager::macAddressAsString(address);
0205 }
0206 
0207 QByteArray NetworkManager::WirelessSetting::clonedMacAddress() const
0208 {
0209     Q_D(const WirelessSetting);
0210 
0211     return NetworkManager::macAddressFromString(d->assignedMacAddress.toUtf8());
0212 }
0213 
0214 void NetworkManager::WirelessSetting::setGenerateMacAddressMask(const QString &macAddressMask)
0215 {
0216     Q_D(WirelessSetting);
0217 
0218     d->generateMacAddressMask = macAddressMask;
0219 }
0220 
0221 QString NetworkManager::WirelessSetting::generateMacAddressMask() const
0222 {
0223     Q_D(const WirelessSetting);
0224 
0225     return d->generateMacAddressMask;
0226 }
0227 
0228 void NetworkManager::WirelessSetting::setMacAddressBlacklist(const QStringList &list)
0229 {
0230     Q_D(WirelessSetting);
0231 
0232     d->macAddressBlacklist = list;
0233 }
0234 
0235 QStringList NetworkManager::WirelessSetting::macAddressBlacklist() const
0236 {
0237     Q_D(const WirelessSetting);
0238 
0239     return d->macAddressBlacklist;
0240 }
0241 
0242 void NetworkManager::WirelessSetting::setMacAddressRandomization(NetworkManager::Setting::MacAddressRandomization randomization)
0243 {
0244     Q_D(WirelessSetting);
0245 
0246     d->macAddressRandomization = randomization;
0247 }
0248 
0249 NetworkManager::Setting::MacAddressRandomization NetworkManager::WirelessSetting::macAddressRandomization() const
0250 {
0251     Q_D(const WirelessSetting);
0252 
0253     return d->macAddressRandomization;
0254 }
0255 
0256 void NetworkManager::WirelessSetting::setMtu(quint32 mtu)
0257 {
0258     Q_D(WirelessSetting);
0259 
0260     d->mtu = mtu;
0261 }
0262 
0263 quint32 NetworkManager::WirelessSetting::mtu() const
0264 {
0265     Q_D(const WirelessSetting);
0266 
0267     return d->mtu;
0268 }
0269 
0270 void NetworkManager::WirelessSetting::setSeenBssids(const QStringList &list)
0271 {
0272     Q_D(WirelessSetting);
0273 
0274     d->seenBssids = list;
0275 }
0276 
0277 QStringList NetworkManager::WirelessSetting::seenBssids() const
0278 {
0279     Q_D(const WirelessSetting);
0280 
0281     return d->seenBssids;
0282 }
0283 
0284 void NetworkManager::WirelessSetting::setPowerSave(NetworkManager::WirelessSetting::PowerSave powersave)
0285 {
0286     Q_D(WirelessSetting);
0287 
0288     d->powersave = powersave;
0289 }
0290 
0291 NetworkManager::WirelessSetting::PowerSave NetworkManager::WirelessSetting::powerSave() const
0292 {
0293     Q_D(const WirelessSetting);
0294 
0295     return d->powersave;
0296 }
0297 
0298 void NetworkManager::WirelessSetting::setSecurity(const QString &security)
0299 {
0300     Q_D(WirelessSetting);
0301 
0302     d->security = security;
0303 }
0304 
0305 QString NetworkManager::WirelessSetting::security() const
0306 {
0307     Q_D(const WirelessSetting);
0308 
0309     return d->security;
0310 }
0311 
0312 void NetworkManager::WirelessSetting::setHidden(bool hidden)
0313 {
0314     Q_D(WirelessSetting);
0315 
0316     d->hidden = hidden;
0317 }
0318 
0319 bool NetworkManager::WirelessSetting::hidden() const
0320 {
0321     Q_D(const WirelessSetting);
0322 
0323     return d->hidden;
0324 }
0325 
0326 void NetworkManager::WirelessSetting::fromMap(const QVariantMap &setting)
0327 {
0328     if (setting.contains(QLatin1String(NM_SETTING_WIRELESS_SSID))) {
0329         setSsid(setting.value(QLatin1String(NM_SETTING_WIRELESS_SSID)).toByteArray());
0330     }
0331 
0332     if (setting.contains(QLatin1String(NM_SETTING_WIRELESS_MODE))) {
0333         const QString mode = setting.value(QLatin1String(NM_SETTING_WIRELESS_MODE)).toString();
0334         if (mode == QLatin1String(NM_SETTING_WIRELESS_MODE_INFRA)) {
0335             setMode(Infrastructure);
0336         } else if (mode == QLatin1String(NM_SETTING_WIRELESS_MODE_ADHOC)) {
0337             setMode(Adhoc);
0338         } else if (mode == QLatin1String(NM_SETTING_WIRELESS_MODE_AP)) {
0339             setMode(Ap);
0340         }
0341     }
0342 
0343     if (setting.contains(QLatin1String(NM_SETTING_WIRELESS_BAND))) {
0344         const QString band = setting.value(QLatin1String(NM_SETTING_WIRELESS_BAND)).toString();
0345         if (band == "a") {
0346             setBand(A);
0347         } else if (band == "bg") {
0348             setBand(Bg);
0349         }
0350     }
0351 
0352     if (setting.contains(QLatin1String(NM_SETTING_WIRELESS_CHANNEL))) {
0353         setChannel(setting.value(QLatin1String(NM_SETTING_WIRELESS_CHANNEL)).toUInt());
0354     }
0355 
0356     if (setting.contains(QLatin1String(NM_SETTING_WIRELESS_BSSID))) {
0357         setBssid(setting.value(QLatin1String(NM_SETTING_WIRELESS_BSSID)).toByteArray());
0358     }
0359 
0360     if (setting.contains(QLatin1String(NM_SETTING_WIRELESS_RATE))) {
0361         setRate(setting.value(QLatin1String(NM_SETTING_WIRELESS_RATE)).toUInt());
0362     }
0363 
0364     if (setting.contains(QLatin1String(NM_SETTING_WIRELESS_TX_POWER))) {
0365         setTxPower(setting.value(QLatin1String(NM_SETTING_WIRELESS_TX_POWER)).toUInt());
0366     }
0367 
0368     if (setting.contains(QLatin1String(NM_SETTING_WIRELESS_ASSIGNED_MAC_ADDRESS))) {
0369         setAssignedMacAddress(setting.value(QLatin1String(NM_SETTING_WIRELESS_ASSIGNED_MAC_ADDRESS)).toString());
0370     }
0371 
0372     if (setting.contains(QLatin1String(NM_SETTING_WIRELESS_MAC_ADDRESS))) {
0373         setMacAddress(setting.value(QLatin1String(NM_SETTING_WIRELESS_MAC_ADDRESS)).toByteArray());
0374     }
0375 
0376     if (setting.contains(QLatin1String(NM_SETTING_WIRELESS_GENERATE_MAC_ADDRESS_MASK))) {
0377         setGenerateMacAddressMask(setting.value(QLatin1String(NM_SETTING_WIRELESS_GENERATE_MAC_ADDRESS_MASK)).toString());
0378     }
0379 
0380     if (setting.contains(QLatin1String(NM_SETTING_WIRELESS_CLONED_MAC_ADDRESS))) {
0381         setClonedMacAddress(setting.value(QLatin1String(NM_SETTING_WIRELESS_CLONED_MAC_ADDRESS)).toByteArray());
0382     }
0383 
0384     if (setting.contains(QLatin1String(NM_SETTING_WIRELESS_MAC_ADDRESS_BLACKLIST))) {
0385         setMacAddressBlacklist(setting.value(QLatin1String(NM_SETTING_WIRELESS_MAC_ADDRESS_BLACKLIST)).toStringList());
0386     }
0387 
0388     if (setting.contains(QLatin1String(NM_SETTING_WIRELESS_MAC_ADDRESS_RANDOMIZATION))) {
0389         setMacAddressRandomization(
0390             static_cast<Setting::MacAddressRandomization>(setting.value(QLatin1String(NM_SETTING_WIRELESS_MAC_ADDRESS_RANDOMIZATION)).toUInt()));
0391     }
0392 
0393     if (setting.contains(QLatin1String(NM_SETTING_WIRELESS_MTU))) {
0394         setMtu(setting.value(QLatin1String(NM_SETTING_WIRELESS_MTU)).toUInt());
0395     }
0396 
0397     if (setting.contains(QLatin1String(NM_SETTING_WIRELESS_SEEN_BSSIDS))) {
0398         setSeenBssids(setting.value(QLatin1String(NM_SETTING_WIRELESS_SEEN_BSSIDS)).toStringList());
0399     }
0400 
0401     if (setting.contains(QLatin1String(NM_SETTING_WIRELESS_POWERSAVE))) {
0402         setPowerSave(static_cast<WirelessSetting::PowerSave>(setting.value(QLatin1String(NM_SETTING_WIRELESS_POWERSAVE)).toUInt()));
0403     }
0404 
0405     if (setting.contains(QLatin1String(NM_SETTING_WIRELESS_SEC))) {
0406         setSecurity(setting.value(QLatin1String(NM_SETTING_WIRELESS_SEC)).toString());
0407     }
0408 
0409     if (setting.contains(QLatin1String(NM_SETTING_WIRELESS_HIDDEN))) {
0410         setHidden(setting.value(QLatin1String(NM_SETTING_WIRELESS_HIDDEN)).toBool());
0411     }
0412 }
0413 
0414 QVariantMap NetworkManager::WirelessSetting::toMap() const
0415 {
0416     QVariantMap setting;
0417 
0418     if (!ssid().isEmpty()) {
0419         setting.insert(QLatin1String(NM_SETTING_WIRELESS_SSID), ssid());
0420     }
0421 
0422     if (mode() == Infrastructure) {
0423         setting.insert(QLatin1String(NM_SETTING_WIRELESS_MODE), QLatin1String(NM_SETTING_WIRELESS_MODE_INFRA));
0424     } else if (mode() == Adhoc) {
0425         setting.insert(QLatin1String(NM_SETTING_WIRELESS_MODE), QLatin1String(NM_SETTING_WIRELESS_MODE_ADHOC));
0426     } else if (mode() == Ap) {
0427         setting.insert(QLatin1String(NM_SETTING_WIRELESS_MODE), QLatin1String(NM_SETTING_WIRELESS_MODE_AP));
0428     }
0429 
0430     if (band() != Automatic) {
0431         if (band() == A) {
0432             setting.insert(QLatin1String(NM_SETTING_WIRELESS_BAND), "a");
0433         } else if (band() == Bg) {
0434             setting.insert(QLatin1String(NM_SETTING_WIRELESS_BAND), "bg");
0435         }
0436     }
0437 
0438     if (channel()) {
0439         setting.insert(QLatin1String(NM_SETTING_WIRELESS_CHANNEL), channel());
0440     }
0441 
0442     if (!bssid().isEmpty()) {
0443         setting.insert(QLatin1String(NM_SETTING_WIRELESS_BSSID), bssid());
0444     }
0445 
0446     if (rate()) {
0447         setting.insert(QLatin1String(NM_SETTING_WIRELESS_RATE), rate());
0448     }
0449 
0450     if (txPower()) {
0451         setting.insert(QLatin1String(NM_SETTING_WIRELESS_TX_POWER), txPower());
0452     }
0453 
0454     if (!assignedMacAddress().isEmpty()) {
0455         setting.insert(QLatin1String(NM_SETTING_WIRELESS_ASSIGNED_MAC_ADDRESS), assignedMacAddress());
0456     }
0457 
0458     if (!macAddress().isEmpty()) {
0459         setting.insert(QLatin1String(NM_SETTING_WIRELESS_MAC_ADDRESS), macAddress());
0460     }
0461 
0462     if (!generateMacAddressMask().isEmpty()) {
0463         setting.insert(QLatin1String(NM_SETTING_WIRELESS_GENERATE_MAC_ADDRESS_MASK), generateMacAddressMask());
0464     }
0465 
0466     if (!macAddressBlacklist().isEmpty()) {
0467         setting.insert(QLatin1String(NM_SETTING_WIRELESS_MAC_ADDRESS_BLACKLIST), macAddressBlacklist());
0468     }
0469 
0470     setting.insert(QLatin1String(NM_SETTING_WIRELESS_MAC_ADDRESS_RANDOMIZATION), macAddressRandomization());
0471 
0472     if (mtu()) {
0473         setting.insert(QLatin1String(NM_SETTING_WIRELESS_MTU), mtu());
0474     }
0475 
0476     if (!seenBssids().isEmpty()) {
0477         setting.insert(QLatin1String(NM_SETTING_WIRELESS_SEEN_BSSIDS), seenBssids());
0478     }
0479 
0480     setting.insert(QLatin1String(NM_SETTING_WIRELESS_POWERSAVE), powerSave());
0481 
0482     if (!security().isEmpty()) {
0483         setting.insert(QLatin1String(NM_SETTING_WIRELESS_SEC), security());
0484     }
0485 
0486     if (hidden()) {
0487         setting.insert(QLatin1String(NM_SETTING_WIRELESS_HIDDEN), hidden());
0488     }
0489 
0490     return setting;
0491 }
0492 
0493 QDebug NetworkManager::operator<<(QDebug dbg, const NetworkManager::WirelessSetting &setting)
0494 {
0495     dbg.nospace() << "type: " << setting.typeAsString(setting.type()) << '\n';
0496     dbg.nospace() << "initialized: " << !setting.isNull() << '\n';
0497 
0498     dbg.nospace() << NM_SETTING_WIRELESS_SSID << ": " << setting.ssid() << '\n';
0499     dbg.nospace() << NM_SETTING_WIRELESS_MODE << ": " << setting.mode() << '\n';
0500     dbg.nospace() << NM_SETTING_WIRELESS_BAND << ": " << setting.band() << '\n';
0501     dbg.nospace() << NM_SETTING_WIRELESS_CHANNEL << ": " << setting.channel() << '\n';
0502     dbg.nospace() << NM_SETTING_WIRELESS_BSSID << ": " << setting.bssid() << '\n';
0503     dbg.nospace() << NM_SETTING_WIRELESS_RATE << ": " << setting.rate() << '\n';
0504     dbg.nospace() << NM_SETTING_WIRELESS_TX_POWER << ": " << setting.txPower() << '\n';
0505     dbg.nospace() << NM_SETTING_WIRELESS_ASSIGNED_MAC_ADDRESS << ": " << setting.assignedMacAddress() << '\n';
0506     dbg.nospace() << NM_SETTING_WIRELESS_MAC_ADDRESS << ": " << setting.macAddress() << '\n';
0507     dbg.nospace() << NM_SETTING_WIRELESS_GENERATE_MAC_ADDRESS_MASK << ": " << setting.generateMacAddressMask() << '\n';
0508     dbg.nospace() << NM_SETTING_WIRELESS_MAC_ADDRESS_BLACKLIST << ": " << setting.macAddressBlacklist() << '\n';
0509     dbg.nospace() << NM_SETTING_WIRELESS_MAC_ADDRESS_RANDOMIZATION << ": " << setting.macAddressRandomization() << '\n';
0510     dbg.nospace() << NM_SETTING_WIRELESS_MTU << ": " << setting.mtu() << '\n';
0511     dbg.nospace() << NM_SETTING_WIRELESS_SEEN_BSSIDS << ": " << setting.seenBssids() << '\n';
0512     dbg.nospace() << NM_SETTING_WIRELESS_POWERSAVE << ": " << setting.powerSave() << '\n';
0513     dbg.nospace() << NM_SETTING_WIRELESS_SEC << ": " << setting.security() << '\n';
0514     dbg.nospace() << NM_SETTING_WIRELESS_HIDDEN << ": " << setting.hidden() << '\n';
0515 
0516     return dbg.maybeSpace();
0517 }