File indexing completed on 2024-04-28 16:52:17

0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 // SPDX-FileCopyrightText: 2011 Craig Drummond <craig.p.drummond@gmail.com>
0003 // SPDX-FileCopyrightText: 2018 Alexis Lopes Zubeta <contact@azubieta.net>
0004 // SPDX-FileCopyrightText: 2020 Tomaz Canabrava <tcanabrava@kde.org>
0005 
0006 #ifndef UFW_RULE_H
0007 #define UFW_RULE_H
0008 
0009 #include <QDebug>
0010 #include <QObject>
0011 #include <QString>
0012 #include <kcm_firewall_core_export.h>
0013 #include <sys/socket.h>
0014 
0015 #include "types.h"
0016 
0017 class KCM_FIREWALL_CORE_EXPORT Rule : public QObject
0018 {
0019     Q_OBJECT
0020     Q_PROPERTY(QString policy READ policy WRITE setPolicy NOTIFY policyChanged)
0021     Q_PROPERTY(bool incoming READ incoming WRITE setIncoming NOTIFY incomingChanged)
0022     Q_PROPERTY(QString sourceAddress READ sourceAddress WRITE setSourceAddress NOTIFY sourceAddressChanged)
0023     Q_PROPERTY(QString sourcePort READ sourcePort WRITE setSourcePort NOTIFY sourcePortChanged)
0024     Q_PROPERTY(QString destinationAddress READ destinationAddress WRITE setDestinationAddress NOTIFY destinationAddressChanged)
0025     Q_PROPERTY(QString destinationPort READ destinationPort WRITE setDestinationPort NOTIFY destinationPortChanged)
0026     Q_PROPERTY(bool ipv6 READ ipv6 WRITE setIpv6 NOTIFY ipv6Changed)
0027     Q_PROPERTY(int protocol READ protocol WRITE setProtocol NOTIFY protocolChanged)
0028     Q_PROPERTY(int interface READ interface WRITE setInterface NOTIFY interfaceChanged)
0029     Q_PROPERTY(QString logging READ loggingStr WRITE setLogging NOTIFY loggingChanged)
0030     Q_PROPERTY(int position READ position WRITE setPosition NOTIFY positionChanged)
0031     Q_PROPERTY(bool simplified READ simplified WRITE setSimplified NOTIFY simplifiedChanged)
0032     Q_PROPERTY(QString sourceApplication READ sourceApplication WRITE setSourceApplication NOTIFY sourceApplicationChanged)
0033 
0034 public:
0035     static int servicePort(const QString &name);
0036     static QString protocolSuffix(int prot, const QString &sep = QString("/"));
0037     static QString
0038     modify(const QString &address, const QString &port, const QString &application, const QString &iface, int protocol, bool matchPortNoProto = false);
0039 
0040     Rule();
0041     Rule(Types::Policy pol,
0042          bool incomming,
0043          Types::Logging log,
0044          int protocolIdx,
0045          const QString &srcHost = QString(),
0046          const QString &srcPort = QString(),
0047          const QString &destHost = QString(),
0048          const QString &destPort = QString(),
0049          const QString &ifaceIn = QString(),
0050          const QString &ifaceOut = QString(),
0051          const QString &srcApp = QString(),
0052          const QString &destApp = QString(),
0053          unsigned int i = 0,
0054          bool ipv6 = false,
0055          bool simplified = true)
0056         : m_position(i)
0057         , m_action(pol)
0058         , m_incoming(incomming)
0059         , m_ipv6(ipv6)
0060         , m_simplified(simplified)
0061         , m_protocol(protocolIdx)
0062         , m_logtype(log)
0063         , m_destApplication(destApp)
0064         , m_sourceApplication(srcApp)
0065         , m_destAddress(destHost)
0066         , m_sourceAddress(srcHost)
0067         , m_destPort(destPort)
0068         , m_sourcePort(srcPort)
0069         , m_interfaceIn(ifaceIn)
0070         , m_interfaceOut(ifaceOut)
0071         , m_interface(0)
0072     {
0073     }
0074     Rule(const Rule &rhs, QObject *parent)
0075         : QObject(parent)
0076         , m_position(rhs.m_position)
0077         , m_action(rhs.m_action)
0078         , m_incoming(rhs.m_incoming)
0079         , m_ipv6(rhs.m_ipv6)
0080         , m_simplified(true)
0081         , m_protocol(rhs.m_protocol)
0082         , m_logtype(rhs.m_logtype)
0083         , m_destApplication(rhs.m_destApplication)
0084         , m_sourceApplication(rhs.m_sourceApplication)
0085         , m_destAddress(rhs.m_destAddress)
0086         , m_sourceAddress(rhs.m_sourceAddress)
0087         , m_destPort(rhs.m_destPort)
0088         , m_sourcePort(rhs.m_sourcePort)
0089         , m_interfaceIn(rhs.m_interfaceIn)
0090         , m_interfaceOut(rhs.m_interfaceIn)
0091         , m_interface(rhs.m_interface){};
0092 
0093     QString toStr() const;
0094     QString fromStr() const;
0095     QString actionStr() const;
0096     QString loggingStr() const;
0097     QString policy() const;
0098     QString destinationAddress() const;
0099     QString destinationPort() const;
0100     QString sourceApplication() const;
0101     QString sourceAddress() const;
0102     QString sourcePort() const;
0103     QString interfaceIn() const;
0104     QString interfaceOut() const;
0105     QString destinationApplication() const;
0106     Types::Logging logging() const;
0107 
0108     // TODO: are they really necessary?
0109     QString ipV6Str() const;
0110     QString interfaceStr() const;
0111 
0112     bool incoming() const;
0113     bool ipv6() const;
0114     bool simplified() const;
0115     int interface() const;
0116     int position() const;
0117     int protocol() const;
0118     Types::Policy action() const;
0119 
0120     // 'different' is used in the EditRule dialog to know whether the rule has actually changed...
0121     bool different(const Rule &o) const
0122     {
0123         return m_logtype != o.m_logtype /*|| description!=o.description*/ || !(*this == o);
0124     }
0125 
0126     bool operator==(const Rule &o) const
0127     {
0128         return m_action == o.m_action && m_incoming == o.m_incoming && m_ipv6 == o.m_ipv6 && m_protocol == o.m_protocol
0129             && m_destApplication == o.m_destApplication && m_sourceApplication == o.m_sourceApplication && m_destAddress == o.m_destAddress
0130             && m_sourceAddress == o.m_sourceAddress && (m_destApplication.isEmpty() && o.m_destApplication.isEmpty() ? m_destPort == o.m_destPort : true)
0131             && (m_sourceApplication.isEmpty() && o.m_sourceApplication.isEmpty() ? m_sourcePort == o.m_sourcePort : true) && m_interfaceIn == o.m_interfaceIn
0132             && m_interfaceOut == o.m_interfaceOut;
0133     }
0134 
0135 public slots:
0136     void setPolicy(const QString &policy);
0137     void setIncoming(bool incoming);
0138     void setSourceAddress(const QString &sourceAddress);
0139     void setSourcePort(const QString &sourcePort);
0140     void setDestinationAddress(const QString &destinationAddress);
0141     void setDestinationPort(const QString &destinationPort);
0142     void setIpv6(bool ipv6);
0143     void setProtocol(int protocol);
0144     void setInterface(int interface);
0145     void setLogging(const QString &logging);
0146     void setV6(const bool v);
0147     void setPosition(int position);
0148     void setSimplified(bool value);
0149     void setSourceApplication(const QString &app);
0150 
0151 Q_SIGNALS:
0152     void policyChanged(const QString &policy);
0153     void directionChanged(const QString &direction);
0154     void sourceAddressChanged(const QString &sourceAddress);
0155     void sourcePortChanged(const QString &sourcePort);
0156     void destinationAddressChanged(const QString &destinationAddress);
0157     void destinationPortChanged(const QString &destinationPort);
0158     void ipv6Changed(bool ipv6);
0159     void protocolChanged(int protocol);
0160     void interfaceChanged(int interface);
0161     void loggingChanged(const QString &logging);
0162     void incomingChanged(bool incoming);
0163     void positionChanged(int position);
0164     void simplifiedChanged(bool value);
0165     void sourceApplicationChanged(const QString &app);
0166 
0167 private:
0168     int m_position;
0169     Types::Policy m_action;
0170     bool m_incoming, m_ipv6, m_simplified;
0171     int m_protocol;
0172     Types::Logging m_logtype;
0173     QString m_destApplication;
0174     QString m_sourceApplication;
0175     QString m_destAddress;
0176     QString m_sourceAddress;
0177     QString m_destPort;
0178     QString m_sourcePort;
0179     QString m_interfaceIn;
0180     QString m_interfaceOut;
0181     QString m_interfaceStr;
0182     int m_interface;
0183 };
0184 
0185 #endif