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