D15093: Add WireGuard capability.

Pino Toscano noreply at phabricator.kde.org
Mon Sep 3 07:01:18 BST 2018


pino requested changes to this revision.
pino added a comment.
This revision now requires changes to proceed.


  Much better now!
  
  General notes:
  
  - there are various checks on lengths of strings like `str.length() > 0` or `str.length() != 0`: if all you need is check whether a string is empty or not, just use `str.isEmpty()`
  - regarding the UI for all the pre/post scripts: since they are file paths, better use a KUrlRequester widget (limited to local existing files only, no URLs), so the users have a Browse button next to each line edit that can be used to open a file dialog

INLINE COMMENTS

> nm-wireguard-service.h:2
> +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
> +/* nm-openvpn-service - openvpn integration with NetworkManager
> + *

this comment needs to be fixed

> wireguard.cpp:25
> +#include <QStringBuilder>
> +#include <QFile>
> +#include <QFileInfo>

unused

> wireguard.cpp:29-30
> +#include <KLocalizedString>
> +#include <KMessageBox>
> +#include <KStandardDirs>
> +#include <KConfig>

both unused

> wireguard.cpp:41
> +
> +#include <arpa/inet.h>
> +

unused

> wireguard.cpp:60
> +#define NMV_WG_TAG_FWMARK                "FwMark"
> +#define NMV_WG_ASSIGN                    "="
> +

unused

> wireguard.cpp:151-153
> +    KConfig importFile(fileName, KConfig::NoGlobals);
> +    KConfigGroup interfaceGroup = importFile.group(NMV_WG_TAG_INTERFACE);
> +    KConfigGroup peerGroup = importFile.group(NMV_WG_TAG_PEER);;

make all 3 as `const`, so it is clear they are read-only (and attempts to use writeEntry() will result in build failures)

> wireguard.cpp:153
> +    KConfigGroup interfaceGroup = importFile.group(NMV_WG_TAG_INTERFACE);
> +    KConfigGroup peerGroup = importFile.group(NMV_WG_TAG_PEER);;
> +

extra ';'

> wireguard.cpp:166-172
> +    // The config file must have both [Interface] and [Peer] sections
> +    if (!importFile.groupList().contains("Interface")
> +        || !importFile.groupList().contains("Peer")) {
> +        mError = VpnUiPlugin::Error;
> +        mErrorMessage = i18n("Could not open file");
> +        return result;
> +    }

These checks can be moved right after reading the config file and getting the KConfigGroup objects.

> wireguard.cpp:167-168
> +    // The config file must have both [Interface] and [Peer] sections
> +    if (!importFile.groupList().contains("Interface")
> +        || !importFile.groupList().contains("Peer")) {
> +        mError = VpnUiPlugin::Error;

You do not need to get the list of groups in the config file (twice): earlier you get the KConfigGroup objects for the groups, so checking eg `interfaceGroup.exists()` should do the job.

> wireguard.cpp:175-178
> +    value = interfaceGroup.readEntry(NMV_WG_TAG_ADDRESS);
> +    {
> +        QStringList addressList;
> +        addressList << value.split(QRegExp("\\s*,\\s*"));

KConfig already supports comma-separated lists -- just pass QStringList() as `default` value to readEntry(), so KConfigGroup knows the value is a list.

> wireguard.cpp:195
> +    // Listen Port
> +    value = interfaceGroup.readEntry(NMV_WG_TAG_LISTEN_PORT);
> +    if (value.length() > 0) {

If you specify `0` as default parameter, KConfigGroup will try to decode the value as integer automatically. If `0` is a valid value for the port, then use `-1`.
After doing that, you do not need a validator anymore, just a manual range check will do the job.

> wireguard.cpp:209
> +        QRegExp validatorRegex(*regexStrings.keySpec);
> +        QRegExpValidator validator(validatorRegex);
> +        int pos = 0;

this validator is not needed, just use `validatorRegex` directly

> wireguard.cpp:231
> +    // MTU
> +    value = interfaceGroup.readEntry(NMV_WG_TAG_MTU);
> +    if (value.length() > 0) {

same as for the listen port: please read the value directly as integer.

> wireguard.cpp:271
> +        QRegExp validatorRegex(*regexStrings.keySpec);
> +        QRegExpValidator validator(validatorRegex);
> +        int pos = 0;

as above, no need for a validator, just use the QRegExp directly

> wireguard.cpp:288
> +                                 + ", *)*" + *regexStrings.ip4Orip6Address);
> +        QRegExpValidator *validator = new QRegExpValidator(allowedIPsRegex, this);
> +        if (validator->validate(value, pos) != QValidator::State::Invalid) {

as above, no need for a validator, just use the QRegExp directly

> wireguard.cpp:306
> +        QRegExp validatorRegex(*regexStrings.keySpec);
> +        QRegExpValidator validator(validatorRegex);
> +        int pos = 0;

as above, no need for a validator, just use the QRegExp directly

> wireguard.cpp:350-353
> +        value = dataMap[NM_WG_KEY_ADDR_IP4];
> +        if (dataMap.contains(QLatin1String(NM_WG_KEY_ADDR_IP6))) {
> +            value += "," + dataMap[NM_WG_KEY_ADDR_IP6];
> +        }

as mentioned above: KConfigGroup supports lists

> wireguard.cpp:361-365
> +    // Do Private Key
> +    if (dataMap.contains(QLatin1String(NM_WG_KEY_PRIVATE_KEY)))
> +        interfaceGroup.writeEntry(NMV_WG_TAG_PRIVATE_KEY, dataMap[NM_WG_KEY_PRIVATE_KEY]);
> +    else
> +        return false;

this, just like all the other required keys, should be checked before even opening the output file

> wireguard.ui:23-25
> +      <property name="fieldGrowthPolicy">
> +       <enum>QFormLayout::ExpandingFieldsGrow</enum>
> +      </property>

please leave the default behaviour, which is set by the style and/or the platform plugin

> wireguard.ui:26-28
> +      <property name="verticalSpacing">
> +       <number>6</number>
> +      </property>

no hardcoded margins/spacings please

> wireguard.ui:39
> +        <property name="toolTip">
> +         <string><html><head/><body><p>IPv4 intrnrt address assigned to the local interface. IPv4 or IPv6 address (or both) required</p></body></html></string>
> +        </property>

typo "Internet" (proper noun), also in other places in this .ui file

> wireguardadvanced.ui:39
> +        <property name="toolTip">
> +         <string><html><head/><body><p>A 16-bit port for listening. Optional; if not specified, chosen randomly.</p></body></html></string>
> +        </property>

IMHO specifying that is "16-bit" is out of scope, and of no value

> wireguardadvanced.ui:51-55
> +       <widget class="QLineEdit" name="mTULineEdit">
> +        <property name="toolTip">
> +         <string><html><head/><body><p>If not specified, the MTU is automatically determined from the endpoint addresses or the system default route, which is usually a sane choice. However, to manually specify an MTU to override this automatic discovery, this value may be specified explicitly.</p></body></html></string>
> +        </property>
> +       </widget>

IMHO this is better as QSpinBox, with `0` as default value (see also the `specialTextValue` property of QAbstractSpinBox).
This is also what the MTU configuration for wired connections uses, btw.

> wireguardadvancedwidget.h:59
> +    void loadConfig();
> +    void setOrClear(NMStringMap &data, QLatin1String key, QString value) const;
> +    Ui::WireGuardAdvancedWidget *m_ui;

const & for both the key and value parameters

> wireguardauth.cpp:49-50
> +
> +
> +
> +QVariantMap WireGuardAuthWidget::setting() const

extra empty lines

> wireguardwidget.cpp:31-32
> +
> +#include <KProcess>
> +#include <KUrlRequester>
> +

undeeded

> wireguardwidget.h:26
> +
> +#include <QProcess>
> +

unneeded

> wireguardwidget.h:58
> +    Private *d;
> +    void setOrClear(NMStringMap &data, QLatin1String key, QString value) const;
> +

const & for both the key and value parameters

REPOSITORY
  R116 Plasma Network Management Applet

REVISION DETAIL
  https://phabricator.kde.org/D15093

To: andersonbruce, #plasma, jgrulich, pino
Cc: acrouthamel, K900, anthonyfieroni, pino, lbeltrame, ngraham, plasma-devel, ragreen, Pitel, ZrenBot, lesliezhai, ali-mohamed, jensreuterberg, abetts, sebas, apol, mart
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/plasma-devel/attachments/20180903/aef7cc45/attachment-0001.html>


More information about the Plasma-devel mailing list