Skip to content

Commit 21a0efa

Browse files
committed
Merge bitcoin/bitcoin#29858: test: Add test for rpcwhitelistdefault
f0e5e4c test: Add test for rpcwhitelistdefault (naiyoma) Pull request description: This PR adds tests for `rpcwhitelistdefault.` The implementation is a continuation of this [PR](bitcoin/bitcoin#17805). Applied suggestions to include the tests in` rpc_whitelist.py` and to use a single node. PR covers three test cases: - rpcwhitelistdefault = 0, no permissions - rpcwhitelistdefault = 1, no permissions - rpcwhitelistdefault = 1, with user permissions I didn't add tests for rpcwhitelistdefault = 0 with user permissions since that is already tested here: [rpc_whitelist.py#L77](https://github.com/bitcoin/bitcoin/blob/master/test/functional/rpc_whitelist.py#L77). ACKs for top commit: achow101: ACK f0e5e4c ryanofsky: Code review ACK f0e5e4c. PR seems very clear and simple, moving 1 test and adding 3 new tests. ismaelsadeeq: Tested and Code review ACK f0e5e4c Tree-SHA512: c3652940d2f23746e769ebe834e43dee47b7af8f258cbb133e38663aa8a05a1a8d0194d3008c3a10b0c54d11b5b95420c9cad0aa761c0fc1b9559277443b0696
2 parents 8a00b75 + f0e5e4c commit 21a0efa

File tree

1 file changed

+62
-13
lines changed

1 file changed

+62
-13
lines changed

test/functional/rpc_whitelist.py

Lines changed: 62 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import http.client
1414
import urllib.parse
1515

16+
1617
def rpccall(node, user, method):
1718
url = urllib.parse.urlparse(node.url)
1819
headers = {"Authorization": "Basic " + str_to_b64str('{}:{}'.format(user[0], user[3]))}
@@ -24,7 +25,12 @@ def rpccall(node, user, method):
2425
return resp
2526

2627

28+
def get_permissions(whitelist):
29+
return [perm for perm in whitelist.replace(" ", "").split(",") if perm]
30+
31+
2732
class RPCWhitelistTest(BitcoinTestFramework):
33+
2834
def set_test_params(self):
2935
self.num_nodes = 1
3036

@@ -48,7 +54,9 @@ def run_test(self):
4854
["strangedude4", "990c895760a70df83949e8278665e19a$8f0906f20431ff24cb9e7f5b5041e4943bdf2a5c02a19ef4960dcf45e72cde1c", ":getblockcount, getbestblockhash", "s7R4nG3R7H1nGZ"],
4955
["strangedude4", "990c895760a70df83949e8278665e19a$8f0906f20431ff24cb9e7f5b5041e4943bdf2a5c02a19ef4960dcf45e72cde1c", ":getblockcount", "s7R4nG3R7H1nGZ"],
5056
# Testing the same permission twice
51-
["strangedude5", "d12c6e962d47a454f962eb41225e6ec8$2dd39635b155536d3c1a2e95d05feff87d5ba55f2d5ff975e6e997a836b717c9", ":getblockcount,getblockcount", "s7R4nG3R7H1nGZ"]
57+
["strangedude5", "d12c6e962d47a454f962eb41225e6ec8$2dd39635b155536d3c1a2e95d05feff87d5ba55f2d5ff975e6e997a836b717c9", ":getblockcount,getblockcount", "s7R4nG3R7H1nGZ"],
58+
# Test non-whitelisted user
59+
["strangedude6", "ab02e4fb22ef4ab004cca217a49ee8d2$90dd09b08edd12d552d9d8a5ada838dcef2ac587789fa7e9c47f5990e80cdf93", None, "password123"]
5260
]
5361
# These commands shouldn't be allowed for any user to test failures
5462
self.never_allowed = ["getnetworkinfo"]
@@ -60,21 +68,11 @@ def run_test(self):
6068
# Special cases
6169
for strangedude in self.strange_users:
6270
f.write("rpcauth=" + strangedude[0] + ":" + strangedude[1] + "\n")
63-
f.write("rpcwhitelist=" + strangedude[0] + strangedude[2] + "\n")
71+
if strangedude[2] is not None:
72+
f.write("rpcwhitelist=" + strangedude[0] + strangedude[2] + "\n")
6473
self.restart_node(0)
6574

6675
for user in self.users:
67-
permissions = user[2].replace(" ", "").split(",")
68-
# Pop all empty items
69-
i = 0
70-
while i < len(permissions):
71-
if permissions[i] == '':
72-
permissions.pop(i)
73-
74-
i += 1
75-
for permission in permissions:
76-
self.log.info("[" + user[0] + "]: Testing a permitted permission (" + permission + ")")
77-
assert_equal(200, rpccall(self.nodes[0], user, permission).status)
7876
for permission in self.never_allowed:
7977
self.log.info("[" + user[0] + "]: Testing a non permitted permission (" + permission + ")")
8078
assert_equal(403, rpccall(self.nodes[0], user, permission).status)
@@ -92,5 +90,56 @@ def run_test(self):
9290
self.log.info("Strange test 5")
9391
assert_equal(200, rpccall(self.nodes[0], self.strange_users[4], "getblockcount").status)
9492

93+
self.test_users_permissions()
94+
self.test_rpcwhitelistdefault_0_no_permissions()
95+
96+
# Replace file configurations
97+
self.nodes[0].replace_in_config([("rpcwhitelistdefault=0", "rpcwhitelistdefault=1")])
98+
with open(self.nodes[0].datadir_path / "bitcoin.conf", 'a', encoding='utf8') as f:
99+
f.write("rpcwhitelist=__cookie__:getblockcount,getblockchaininfo,getmempoolinfo,stop\n")
100+
self.restart_node(0)
101+
102+
# Test rpcwhitelistdefault=1
103+
self.test_users_permissions()
104+
self.test_rpcwhitelistdefault_1_no_permissions()
105+
106+
def test_users_permissions(self):
107+
"""
108+
* Permissions:
109+
(user1): getbestblockhash,getblockcount
110+
(user2): getblockcount
111+
Expected result: * users can only access whitelisted methods
112+
"""
113+
for user in self.users:
114+
permissions = get_permissions(user[2])
115+
for permission in permissions:
116+
self.log.info("[" + user[0] + "]: Testing whitelisted user permission (" + permission + ")")
117+
assert_equal(200, rpccall(self.nodes[0], user, permission).status)
118+
self.log.info("[" + user[0] + "]: Testing non-permitted permission: getblockchaininfo")
119+
assert_equal(403, rpccall(self.nodes[0], user, "getblockchaininfo").status)
120+
121+
def test_rpcwhitelistdefault_0_no_permissions(self):
122+
"""
123+
* rpcwhitelistdefault=0
124+
* No Permissions defined
125+
Expected result: * strangedude6 (not whitelisted) can access any method
126+
"""
127+
unrestricted_user = self.strange_users[6]
128+
for permission in ["getbestblockhash", "getblockchaininfo"]:
129+
self.log.info("[" + unrestricted_user[0] + "]: Testing unrestricted user permission (" + permission + ")")
130+
assert_equal(200, rpccall(self.nodes[0], unrestricted_user, permission).status)
131+
132+
def test_rpcwhitelistdefault_1_no_permissions(self):
133+
"""
134+
* rpcwhitelistdefault=1
135+
* No Permissions defined
136+
Expected result: * strangedude6 (not whitelisted) can not access any method
137+
"""
138+
139+
for permission in ["getbestblockhash", "getblockchaininfo"]:
140+
self.log.info("[" + self.strange_users[6][0] + "]: Testing rpcwhitelistdefault=1 no specified permission (" + permission + ")")
141+
assert_equal(403, rpccall(self.nodes[0], self.strange_users[6], permission).status)
142+
143+
95144
if __name__ == "__main__":
96145
RPCWhitelistTest(__file__).main()

0 commit comments

Comments
 (0)