1 // Copyright (c) 2009-2020 The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #include <netaddress.h>
6 
7 #include <string>
8 #include <vector>
9 
10 #ifndef BITCOIN_NET_PERMISSIONS_H
11 #define BITCOIN_NET_PERMISSIONS_H
12 
13 struct bilingual_str;
14 
15 extern const std::vector<std::string> NET_PERMISSIONS_DOC;
16 
17 enum NetPermissionFlags {
18     PF_NONE = 0,
19     // Can query bloomfilter even if -peerbloomfilters is false
20     PF_BLOOMFILTER = (1U << 1),
21     // Relay and accept transactions from this peer, even if -blocksonly is true
22     // This peer is also not subject to limits on how many transaction INVs are tracked
23     PF_RELAY = (1U << 3),
24     // Always relay transactions from this peer, even if already in mempool
25     // Keep parameter interaction: forcerelay implies relay
26     PF_FORCERELAY = (1U << 2) | PF_RELAY,
27     // Allow getheaders during IBD and block-download after maxuploadtarget limit
28     PF_DOWNLOAD = (1U << 6),
29     // Can't be banned/disconnected/discouraged for misbehavior
30     PF_NOBAN = (1U << 4) | PF_DOWNLOAD,
31     // Can query the mempool
32     PF_MEMPOOL = (1U << 5),
33     // Can request addrs without hitting a privacy-preserving cache
34     PF_ADDR = (1U << 7),
35 
36     // True if the user did not specifically set fine grained permissions
37     PF_ISIMPLICIT = (1U << 31),
38     PF_ALL = PF_BLOOMFILTER | PF_FORCERELAY | PF_RELAY | PF_NOBAN | PF_MEMPOOL | PF_DOWNLOAD | PF_ADDR,
39 };
40 
41 class NetPermissions
42 {
43 public:
44     NetPermissionFlags m_flags;
45     static std::vector<std::string> ToStrings(NetPermissionFlags flags);
HasFlag(const NetPermissionFlags & flags,NetPermissionFlags f)46     static inline bool HasFlag(const NetPermissionFlags& flags, NetPermissionFlags f)
47     {
48         return (flags & f) == f;
49     }
AddFlag(NetPermissionFlags & flags,NetPermissionFlags f)50     static inline void AddFlag(NetPermissionFlags& flags, NetPermissionFlags f)
51     {
52         flags = static_cast<NetPermissionFlags>(flags | f);
53     }
ClearFlag(NetPermissionFlags & flags,NetPermissionFlags f)54     static inline void ClearFlag(NetPermissionFlags& flags, NetPermissionFlags f)
55     {
56         flags = static_cast<NetPermissionFlags>(flags & ~f);
57     }
58 };
59 
60 class NetWhitebindPermissions : public NetPermissions
61 {
62 public:
63     static bool TryParse(const std::string str, NetWhitebindPermissions& output, bilingual_str& error);
64     CService m_service;
65 };
66 
67 class NetWhitelistPermissions : public NetPermissions
68 {
69 public:
70     static bool TryParse(const std::string str, NetWhitelistPermissions& output, bilingual_str& error);
71     CSubNet m_subnet;
72 };
73 
74 #endif // BITCOIN_NET_PERMISSIONS_H
75