diff options
Diffstat (limited to 'src/net_permissions.h')
-rw-r--r-- | src/net_permissions.h | 48 |
1 files changed, 31 insertions, 17 deletions
diff --git a/src/net_permissions.h b/src/net_permissions.h index bba0ea1695..c00689465e 100644 --- a/src/net_permissions.h +++ b/src/net_permissions.h @@ -5,6 +5,7 @@ #include <netaddress.h> #include <string> +#include <type_traits> #include <vector> #ifndef BITCOIN_NET_PERMISSIONS_H @@ -14,60 +15,73 @@ struct bilingual_str; extern const std::vector<std::string> NET_PERMISSIONS_DOC; -enum NetPermissionFlags { - PF_NONE = 0, +enum class NetPermissionFlags : uint32_t { + None = 0, // Can query bloomfilter even if -peerbloomfilters is false - PF_BLOOMFILTER = (1U << 1), + BloomFilter = (1U << 1), // Relay and accept transactions from this peer, even if -blocksonly is true // This peer is also not subject to limits on how many transaction INVs are tracked - PF_RELAY = (1U << 3), + Relay = (1U << 3), // Always relay transactions from this peer, even if already in mempool // Keep parameter interaction: forcerelay implies relay - PF_FORCERELAY = (1U << 2) | PF_RELAY, + ForceRelay = (1U << 2) | Relay, // Allow getheaders during IBD and block-download after maxuploadtarget limit - PF_DOWNLOAD = (1U << 6), + Download = (1U << 6), // Can't be banned/disconnected/discouraged for misbehavior - PF_NOBAN = (1U << 4) | PF_DOWNLOAD, + NoBan = (1U << 4) | Download, // Can query the mempool - PF_MEMPOOL = (1U << 5), + Mempool = (1U << 5), // Can request addrs without hitting a privacy-preserving cache - PF_ADDR = (1U << 7), + Addr = (1U << 7), // True if the user did not specifically set fine grained permissions - PF_ISIMPLICIT = (1U << 31), - PF_ALL = PF_BLOOMFILTER | PF_FORCERELAY | PF_RELAY | PF_NOBAN | PF_MEMPOOL | PF_DOWNLOAD | PF_ADDR, + Implicit = (1U << 31), + All = BloomFilter | ForceRelay | Relay | NoBan | Mempool | Download | Addr, }; +static inline constexpr NetPermissionFlags operator|(NetPermissionFlags a, NetPermissionFlags b) +{ + using t = typename std::underlying_type<NetPermissionFlags>::type; + return static_cast<NetPermissionFlags>(static_cast<t>(a) | static_cast<t>(b)); +} class NetPermissions { public: NetPermissionFlags m_flags; static std::vector<std::string> ToStrings(NetPermissionFlags flags); - static inline bool HasFlag(const NetPermissionFlags& flags, NetPermissionFlags f) + static inline bool HasFlag(NetPermissionFlags flags, NetPermissionFlags f) { - return (flags & f) == f; + using t = typename std::underlying_type<NetPermissionFlags>::type; + return (static_cast<t>(flags) & static_cast<t>(f)) == static_cast<t>(f); } static inline void AddFlag(NetPermissionFlags& flags, NetPermissionFlags f) { - flags = static_cast<NetPermissionFlags>(flags | f); + flags = flags | f; } + //! ClearFlag is only called with `f` == NetPermissionFlags::Implicit. + //! If that should change in the future, be aware that ClearFlag should not + //! be called with a subflag of a multiflag, e.g. NetPermissionFlags::Relay + //! or NetPermissionFlags::Download, as that would leave `flags` in an + //! invalid state corresponding to none of the existing flags. static inline void ClearFlag(NetPermissionFlags& flags, NetPermissionFlags f) { - flags = static_cast<NetPermissionFlags>(flags & ~f); + assert(f == NetPermissionFlags::Implicit); + using t = typename std::underlying_type<NetPermissionFlags>::type; + flags = static_cast<NetPermissionFlags>(static_cast<t>(flags) & ~static_cast<t>(f)); } }; class NetWhitebindPermissions : public NetPermissions { public: - static bool TryParse(const std::string str, NetWhitebindPermissions& output, bilingual_str& error); + static bool TryParse(const std::string& str, NetWhitebindPermissions& output, bilingual_str& error); CService m_service; }; class NetWhitelistPermissions : public NetPermissions { public: - static bool TryParse(const std::string str, NetWhitelistPermissions& output, bilingual_str& error); + static bool TryParse(const std::string& str, NetWhitelistPermissions& output, bilingual_str& error); CSubNet m_subnet; }; |