LCOV - code coverage report
Current view: top level - src - net_permissions.cpp (source / functions) Hit Total Coverage
Test: coverage.lcov Lines: 82 82 100.0 %
Date: 2021-06-29 14:35:33 Functions: 4 4 100.0 %
Legend: Modified by patch:
Lines: hit not hit | Branches: + taken - not taken # not executed

Not modified by patch:
Lines: hit not hit | Branches: + taken - not taken # not executed
Branches: 51 52 98.1 %

           Branch data     Line data    Source code
#       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 <net_permissions.h>
#       6                 :            : #include <netbase.h>
#       7                 :            : #include <util/error.h>
#       8                 :            : #include <util/system.h>
#       9                 :            : #include <util/translation.h>
#      10                 :            : 
#      11                 :            : const std::vector<std::string> NET_PERMISSIONS_DOC{
#      12                 :            :     "bloomfilter (allow requesting BIP37 filtered blocks and transactions)",
#      13                 :            :     "noban (do not ban for misbehavior; implies download)",
#      14                 :            :     "forcerelay (relay transactions that are already in the mempool; implies relay)",
#      15                 :            :     "relay (relay even in -blocksonly mode, and unlimited transaction announcements)",
#      16                 :            :     "mempool (allow requesting BIP35 mempool contents)",
#      17                 :            :     "download (allow getheaders during IBD, no disconnect after maxuploadtarget limit)",
#      18                 :            :     "addr (responses to GETADDR avoid hitting the cache and contain random records with the most up-to-date info)"
#      19                 :            : };
#      20                 :            : 
#      21                 :            : namespace {
#      22                 :            : 
#      23                 :            : // Parse the following format: "perm1,perm2@xxxxxx"
#      24                 :            : bool TryParsePermissionFlags(const std::string& str, NetPermissionFlags& output, size_t& readen, bilingual_str& error)
#      25                 :        132 : {
#      26                 :        132 :     NetPermissionFlags flags = NetPermissionFlags::None;
#      27                 :        132 :     const auto atSeparator = str.find('@');
#      28                 :            : 
#      29                 :            :     // if '@' is not found (ie, "xxxxx"), the caller should apply implicit permissions
#      30         [ +  + ]:        132 :     if (atSeparator == std::string::npos) {
#      31                 :         16 :         NetPermissions::AddFlag(flags, NetPermissionFlags::Implicit);
#      32                 :         16 :         readen = 0;
#      33                 :         16 :     }
#      34                 :            :     // else (ie, "perm1,perm2@xxxxx"), let's enumerate the permissions by splitting by ',' and calculate the flags
#      35                 :        116 :     else {
#      36                 :        116 :         readen = 0;
#      37                 :            :         // permissions == perm1,perm2
#      38                 :        116 :         const auto permissions = str.substr(0, atSeparator);
#      39         [ +  + ]:        279 :         while (readen < permissions.length()) {
#      40                 :        166 :             const auto commaSeparator = permissions.find(',', readen);
#      41         [ +  + ]:        166 :             const auto len = commaSeparator == std::string::npos ? permissions.length() - readen : commaSeparator - readen;
#      42                 :            :             // permission == perm1
#      43                 :        166 :             const auto permission = permissions.substr(readen, len);
#      44                 :        166 :             readen += len; // We read "perm1"
#      45         [ +  + ]:        166 :             if (commaSeparator != std::string::npos) readen++; // We read ","
#      46                 :            : 
#      47 [ +  + ][ +  + ]:        166 :             if (permission == "bloomfilter" || permission == "bloom") NetPermissions::AddFlag(flags, NetPermissionFlags::BloomFilter);
#      48         [ +  + ]:        145 :             else if (permission == "noban") NetPermissions::AddFlag(flags, NetPermissionFlags::NoBan);
#      49         [ +  + ]:         52 :             else if (permission == "forcerelay") NetPermissions::AddFlag(flags, NetPermissionFlags::ForceRelay);
#      50         [ +  + ]:         37 :             else if (permission == "mempool") NetPermissions::AddFlag(flags, NetPermissionFlags::Mempool);
#      51         [ +  + ]:         33 :             else if (permission == "download") NetPermissions::AddFlag(flags, NetPermissionFlags::Download);
#      52         [ +  + ]:         26 :             else if (permission == "all") NetPermissions::AddFlag(flags, NetPermissionFlags::All);
#      53         [ +  + ]:         23 :             else if (permission == "relay") NetPermissions::AddFlag(flags, NetPermissionFlags::Relay);
#      54         [ -  + ]:         11 :             else if (permission == "addr") NetPermissions::AddFlag(flags, NetPermissionFlags::Addr);
#      55         [ +  + ]:         11 :             else if (permission.length() == 0); // Allow empty entries
#      56                 :          3 :             else {
#      57                 :          3 :                 error = strprintf(_("Invalid P2P permission: '%s'"), permission);
#      58                 :          3 :                 return false;
#      59                 :          3 :             }
#      60                 :        166 :         }
#      61                 :        116 :         readen++;
#      62                 :        113 :     }
#      63                 :            : 
#      64                 :        132 :     output = flags;
#      65                 :        129 :     error = Untranslated("");
#      66                 :        129 :     return true;
#      67                 :        132 : }
#      68                 :            : 
#      69                 :            : }
#      70                 :            : 
#      71                 :            : std::vector<std::string> NetPermissions::ToStrings(NetPermissionFlags flags)
#      72                 :       9660 : {
#      73                 :       9660 :     std::vector<std::string> strings;
#      74         [ +  + ]:       9660 :     if (NetPermissions::HasFlag(flags, NetPermissionFlags::BloomFilter)) strings.push_back("bloomfilter");
#      75         [ +  + ]:       9660 :     if (NetPermissions::HasFlag(flags, NetPermissionFlags::NoBan)) strings.push_back("noban");
#      76         [ +  + ]:       9660 :     if (NetPermissions::HasFlag(flags, NetPermissionFlags::ForceRelay)) strings.push_back("forcerelay");
#      77         [ +  + ]:       9660 :     if (NetPermissions::HasFlag(flags, NetPermissionFlags::Relay)) strings.push_back("relay");
#      78         [ +  + ]:       9660 :     if (NetPermissions::HasFlag(flags, NetPermissionFlags::Mempool)) strings.push_back("mempool");
#      79         [ +  + ]:       9660 :     if (NetPermissions::HasFlag(flags, NetPermissionFlags::Download)) strings.push_back("download");
#      80         [ +  + ]:       9660 :     if (NetPermissions::HasFlag(flags, NetPermissionFlags::Addr)) strings.push_back("addr");
#      81                 :       9660 :     return strings;
#      82                 :       9660 : }
#      83                 :            : 
#      84                 :            : bool NetWhitebindPermissions::TryParse(const std::string& str, NetWhitebindPermissions& output, bilingual_str& error)
#      85                 :         40 : {
#      86                 :         40 :     NetPermissionFlags flags;
#      87                 :         40 :     size_t offset;
#      88         [ +  + ]:         40 :     if (!TryParsePermissionFlags(str, flags, offset, error)) return false;
#      89                 :            : 
#      90                 :         38 :     const std::string strBind = str.substr(offset);
#      91                 :         38 :     CService addrBind;
#      92         [ +  + ]:         38 :     if (!Lookup(strBind, addrBind, 0, false)) {
#      93                 :          5 :         error = ResolveErrMsg("whitebind", strBind);
#      94                 :          5 :         return false;
#      95                 :          5 :     }
#      96         [ +  + ]:         33 :     if (addrBind.GetPort() == 0) {
#      97                 :          2 :         error = strprintf(_("Need to specify a port with -whitebind: '%s'"), strBind);
#      98                 :          2 :         return false;
#      99                 :          2 :     }
#     100                 :            : 
#     101                 :         31 :     output.m_flags = flags;
#     102                 :         31 :     output.m_service = addrBind;
#     103                 :         31 :     error = Untranslated("");
#     104                 :         31 :     return true;
#     105                 :         31 : }
#     106                 :            : 
#     107                 :            : bool NetWhitelistPermissions::TryParse(const std::string& str, NetWhitelistPermissions& output, bilingual_str& error)
#     108                 :         92 : {
#     109                 :         92 :     NetPermissionFlags flags;
#     110                 :         92 :     size_t offset;
#     111         [ +  + ]:         92 :     if (!TryParsePermissionFlags(str, flags, offset, error)) return false;
#     112                 :            : 
#     113                 :         91 :     const std::string net = str.substr(offset);
#     114                 :         91 :     CSubNet subnet;
#     115                 :         91 :     LookupSubNet(net, subnet);
#     116         [ +  + ]:         91 :     if (!subnet.IsValid()) {
#     117                 :          3 :         error = strprintf(_("Invalid netmask specified in -whitelist: '%s'"), net);
#     118                 :          3 :         return false;
#     119                 :          3 :     }
#     120                 :            : 
#     121                 :         88 :     output.m_flags = flags;
#     122                 :         88 :     output.m_subnet = subnet;
#     123                 :         88 :     error = Untranslated("");
#     124                 :         88 :     return true;
#     125                 :         88 : }

Generated by: LCOV version 1.14