File indexing completed on 2024-04-21 04:00:04

0001 /*
0002     SPDX-FileCopyrightText: Pranav Gade <pranavgade20@gmail.com>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #include "macsecsetting.h"
0008 #include "macsecsetting_p.h"
0009 
0010 #include <QDebug>
0011 
0012 #if !NM_CHECK_VERSION(1, 6, 0)
0013 #define NM_SETTING_MACSEC_SETTING_NAME "macsec"
0014 
0015 #define NM_SETTING_MACSEC_PARENT "parent"
0016 #define NM_SETTING_MACSEC_MODE "mode"
0017 #define NM_SETTING_MACSEC_ENCRYPT "encrypt"
0018 #define NM_SETTING_MACSEC_MKA_CAK "mka-cak"
0019 #define NM_SETTING_MACSEC_MKA_CAK_FLAGS "mka-cak-flags"
0020 #define NM_SETTING_MACSEC_MKA_CKN "mka-ckn"
0021 #define NM_SETTING_MACSEC_PORT "port"
0022 #define NM_SETTING_MACSEC_VALIDATION "validation"
0023 #endif
0024 
0025 #if !NM_CHECK_VERSION(1, 12, 0)
0026 #define NM_SETTING_MACSEC_SEND_SCI "send-sci"
0027 #endif
0028 
0029 NetworkManager::MacsecSettingPrivate::MacsecSettingPrivate()
0030     : name(NM_SETTING_MACSEC_SETTING_NAME)
0031     , encrypt(true)
0032     , mode(NetworkManager::MacsecSetting::Psk)
0033     , port(1)
0034     , sendSci(true)
0035     , validation(NetworkManager::MacsecSetting::Strict)
0036 {
0037 }
0038 
0039 NetworkManager::MacsecSetting::MacsecSetting()
0040     : Setting(Setting::Macsec)
0041     , d_ptr(new MacsecSettingPrivate())
0042 {
0043 }
0044 
0045 NetworkManager::MacsecSetting::MacsecSetting(const Ptr &other)
0046     : Setting(other)
0047     , d_ptr(new MacsecSettingPrivate())
0048 {
0049     setEncrypt(other->encrypt());
0050     setMkaCak(other->mkaCak());
0051     setMkaCkn(other->mkaCkn());
0052     setMode(other->mode());
0053     setParent(other->parent());
0054     setPort(other->port());
0055     setSendSci(other->sendSci());
0056     setValidation(other->validation());
0057     setMkaCakFlags(other->mkaCakFlags());
0058 }
0059 
0060 NetworkManager::MacsecSetting::~MacsecSetting()
0061 {
0062     delete d_ptr;
0063 }
0064 
0065 QString NetworkManager::MacsecSetting::name() const
0066 {
0067     Q_D(const MacsecSetting);
0068 
0069     return d->name;
0070 }
0071 
0072 void NetworkManager::MacsecSetting::setEncrypt(bool encrypt)
0073 {
0074     Q_D(MacsecSetting);
0075 
0076     d->encrypt = encrypt;
0077 }
0078 
0079 bool NetworkManager::MacsecSetting::encrypt() const
0080 {
0081     Q_D(const MacsecSetting);
0082 
0083     return d->encrypt;
0084 }
0085 
0086 void NetworkManager::MacsecSetting::setMkaCak(const QString &mkaCak)
0087 {
0088     Q_D(MacsecSetting);
0089 
0090     d->mkaCak = mkaCak;
0091 }
0092 
0093 QString NetworkManager::MacsecSetting::mkaCak() const
0094 {
0095     Q_D(const MacsecSetting);
0096 
0097     return d->mkaCak;
0098 }
0099 
0100 void NetworkManager::MacsecSetting::setMkaCkn(const QString &mkaCkn)
0101 {
0102     Q_D(MacsecSetting);
0103 
0104     d->mkaCkn = mkaCkn;
0105 }
0106 
0107 QString NetworkManager::MacsecSetting::mkaCkn() const
0108 {
0109     Q_D(const MacsecSetting);
0110 
0111     return d->mkaCkn;
0112 }
0113 
0114 void NetworkManager::MacsecSetting::setMode(Mode mode)
0115 {
0116     Q_D(MacsecSetting);
0117 
0118     d->mode = mode;
0119 }
0120 
0121 NetworkManager::MacsecSetting::Mode NetworkManager::MacsecSetting::mode() const
0122 {
0123     Q_D(const MacsecSetting);
0124 
0125     return d->mode;
0126 }
0127 
0128 void NetworkManager::MacsecSetting::setParent(const QString &parent)
0129 {
0130     Q_D(MacsecSetting);
0131 
0132     d->parent = parent;
0133 }
0134 
0135 QString NetworkManager::MacsecSetting::parent() const
0136 {
0137     Q_D(const MacsecSetting);
0138 
0139     return d->parent;
0140 }
0141 
0142 void NetworkManager::MacsecSetting::setPort(qint32 port)
0143 {
0144     Q_D(MacsecSetting);
0145 
0146     d->port = port;
0147 }
0148 
0149 qint32 NetworkManager::MacsecSetting::port() const
0150 {
0151     Q_D(const MacsecSetting);
0152 
0153     return d->port;
0154 }
0155 
0156 void NetworkManager::MacsecSetting::setSendSci(bool sendSci)
0157 {
0158     Q_D(MacsecSetting);
0159 
0160     d->sendSci = sendSci;
0161 }
0162 
0163 bool NetworkManager::MacsecSetting::sendSci() const
0164 {
0165     Q_D(const MacsecSetting);
0166 
0167     return d->sendSci;
0168 }
0169 
0170 void NetworkManager::MacsecSetting::setValidation(Validation validation)
0171 {
0172     Q_D(MacsecSetting);
0173 
0174     d->validation = validation;
0175 }
0176 
0177 NetworkManager::MacsecSetting::Validation NetworkManager::MacsecSetting::validation() const
0178 {
0179     Q_D(const MacsecSetting);
0180 
0181     return d->validation;
0182 }
0183 
0184 void NetworkManager::MacsecSetting::setMkaCakFlags(NetworkManager::Setting::SecretFlags flags)
0185 {
0186     Q_D(MacsecSetting);
0187 
0188     d->mkaCakFlags = flags;
0189 }
0190 
0191 NetworkManager::Setting::SecretFlags NetworkManager::MacsecSetting::mkaCakFlags() const
0192 {
0193     Q_D(const MacsecSetting);
0194 
0195     return d->mkaCakFlags;
0196 }
0197 
0198 QStringList NetworkManager::MacsecSetting::needSecrets(bool requestNew) const
0199 {
0200     QStringList secrets;
0201 
0202     if ((mkaCak().isEmpty() || requestNew) && !mkaCakFlags().testFlag(Setting::NotRequired)) {
0203         secrets << QLatin1String(NM_SETTING_MACSEC_MKA_CAK);
0204     }
0205 
0206     return secrets;
0207 }
0208 
0209 void NetworkManager::MacsecSetting::secretsFromMap(const QVariantMap &secrets)
0210 {
0211     if (secrets.contains(QLatin1String(NM_SETTING_MACSEC_MKA_CAK))) {
0212         setMkaCak(secrets.value(QLatin1String(NM_SETTING_MACSEC_MKA_CAK)).toString());
0213     }
0214 }
0215 
0216 QVariantMap NetworkManager::MacsecSetting::secretsToMap() const
0217 {
0218     QVariantMap secrets;
0219 
0220     if (!mkaCak().isEmpty()) {
0221         secrets.insert(QLatin1String(NM_SETTING_MACSEC_MKA_CAK), mkaCak());
0222     }
0223 
0224     return secrets;
0225 }
0226 
0227 void NetworkManager::MacsecSetting::fromMap(const QVariantMap &setting)
0228 {
0229     if (setting.contains(QLatin1String(NM_SETTING_MACSEC_ENCRYPT))) {
0230         setEncrypt(setting.value(QLatin1String(NM_SETTING_MACSEC_ENCRYPT)).toBool());
0231     }
0232 
0233     if (setting.contains(QLatin1String(NM_SETTING_MACSEC_MKA_CAK))) {
0234         setMkaCak(setting.value(QLatin1String(NM_SETTING_MACSEC_MKA_CAK)).toString());
0235     }
0236 
0237     if (setting.contains(QLatin1String(NM_SETTING_MACSEC_MKA_CKN))) {
0238         setMkaCkn(setting.value(QLatin1String(NM_SETTING_MACSEC_MKA_CKN)).toString());
0239     }
0240 
0241     if (setting.contains(QLatin1String(NM_SETTING_MACSEC_MODE))) {
0242         setMode((Mode)setting.value(QLatin1String(NM_SETTING_MACSEC_MODE)).toInt());
0243     }
0244 
0245     if (setting.contains(QLatin1String(NM_SETTING_MACSEC_PARENT))) {
0246         setParent(setting.value(QLatin1String(NM_SETTING_MACSEC_PARENT)).toString());
0247     }
0248 
0249     if (setting.contains(QLatin1String(NM_SETTING_MACSEC_PORT))) {
0250         setPort(setting.value(QLatin1String(NM_SETTING_MACSEC_PORT)).toInt());
0251     }
0252 
0253     if (setting.contains(QLatin1String(NM_SETTING_MACSEC_SEND_SCI))) {
0254         setSendSci(setting.value(QLatin1String(NM_SETTING_MACSEC_SEND_SCI)).toBool());
0255     }
0256 
0257     if (setting.contains(QLatin1String(NM_SETTING_MACSEC_VALIDATION))) {
0258         setValidation((Validation)setting.value(QLatin1String(NM_SETTING_MACSEC_VALIDATION)).toInt());
0259     }
0260 
0261     if (setting.contains(QLatin1String(NM_SETTING_MACSEC_MKA_CAK_FLAGS))) {
0262         setMkaCakFlags((Setting::SecretFlags)setting.value(QLatin1String(NM_SETTING_MACSEC_MKA_CAK_FLAGS)).toUInt());
0263     }
0264 }
0265 
0266 QVariantMap NetworkManager::MacsecSetting::toMap() const
0267 {
0268     QVariantMap setting;
0269 
0270     if (!encrypt()) {
0271         setting.insert(QLatin1String(NM_SETTING_MACSEC_ENCRYPT), encrypt());
0272     }
0273 
0274     if (!mkaCak().isEmpty()) {
0275         setting.insert(QLatin1String(NM_SETTING_MACSEC_MKA_CAK), mkaCak());
0276     }
0277 
0278     if (!mkaCkn().isEmpty()) {
0279         setting.insert(QLatin1String(NM_SETTING_MACSEC_MKA_CKN), mkaCkn());
0280     }
0281 
0282     if (mode() > NetworkManager::MacsecSetting::Psk) {
0283         setting.insert(QLatin1String(NM_SETTING_MACSEC_MODE), (int)mode());
0284     }
0285 
0286     if (!parent().isEmpty()) {
0287         setting.insert(QLatin1String(NM_SETTING_MACSEC_PARENT), parent());
0288     }
0289 
0290     if (port() > 1) {
0291         setting.insert(QLatin1String(NM_SETTING_MACSEC_PORT), port());
0292     }
0293 
0294     if (!sendSci()) {
0295         setting.insert(QLatin1String(NM_SETTING_MACSEC_SEND_SCI), sendSci());
0296     }
0297 
0298     if (validation() != NetworkManager::MacsecSetting::Strict) {
0299         setting.insert(QLatin1String(NM_SETTING_MACSEC_VALIDATION), (int)validation());
0300     }
0301 
0302     setting.insert(QLatin1String(NM_SETTING_MACSEC_MKA_CAK_FLAGS), (int)mkaCakFlags());
0303 
0304     return setting;
0305 }
0306 
0307 QDebug NetworkManager::operator<<(QDebug dbg, const NetworkManager::MacsecSetting &setting)
0308 {
0309     dbg.nospace() << "type: " << setting.typeAsString(setting.type()) << '\n';
0310     dbg.nospace() << "initialized: " << !setting.isNull() << '\n';
0311 
0312     dbg.nospace() << NM_SETTING_MACSEC_ENCRYPT << ": " << setting.encrypt() << '\n';
0313     dbg.nospace() << NM_SETTING_MACSEC_MKA_CAK << ": " << setting.mkaCak() << '\n';
0314     dbg.nospace() << NM_SETTING_MACSEC_MKA_CKN << ": " << setting.mkaCkn() << '\n';
0315     dbg.nospace() << NM_SETTING_MACSEC_MODE << ": " << setting.mode() << '\n';
0316     dbg.nospace() << NM_SETTING_MACSEC_PARENT << ": " << setting.parent() << '\n';
0317     dbg.nospace() << NM_SETTING_MACSEC_PORT << ": " << setting.port() << '\n';
0318     dbg.nospace() << NM_SETTING_MACSEC_SEND_SCI << ": " << setting.sendSci() << '\n';
0319     dbg.nospace() << NM_SETTING_MACSEC_VALIDATION << ": " << setting.validation() << '\n';
0320     dbg.nospace() << NM_SETTING_MACSEC_MKA_CAK_FLAGS << ": " << setting.mkaCakFlags() << '\n';
0321 
0322     return dbg.maybeSpace();
0323 }