mirror of
https://github.com/dashpay/dash.git
synced 2024-12-27 13:03:17 +01:00
6d46698979
c8330d4
qa: Use node.datadir instead of tmpdir in test framework (MarcoFalke) Pull request description: Commitc53c9831ee
introduced the utility function `get_datadir_path`, however not all places in the code use this util function. Using the util function everywhere makes it easier to review pull requests related to the datadir. This commit replaces datadir path creation with the `datadir` member of `TestNode`, which itself uses `get_datadir_path`. Tree-SHA512: c75707ab7149d732a6d56152a5813138a33459d3d07577b60b89f2a207c83b7663fac5f203593677c9892d1c23a5eba4bd45c5c4ababf040d720b437240fcddf
206 lines
7.7 KiB
Python
Executable File
206 lines
7.7 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# Copyright (c) 2015-2016 The Bitcoin Core developers
|
|
# Distributed under the MIT software license, see the accompanying
|
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
"""Test multiple RPC users."""
|
|
|
|
from test_framework.test_framework import BitcoinTestFramework
|
|
from test_framework.util import (
|
|
assert_equal,
|
|
get_datadir_path,
|
|
str_to_b64str,
|
|
)
|
|
|
|
import os
|
|
import http.client
|
|
import urllib.parse
|
|
import subprocess
|
|
from random import SystemRandom
|
|
import string
|
|
import configparser
|
|
|
|
|
|
class HTTPBasicsTest(BitcoinTestFramework):
|
|
def set_test_params(self):
|
|
self.num_nodes = 2
|
|
|
|
def setup_chain(self):
|
|
super().setup_chain()
|
|
#Append rpcauth to dash.conf before initialization
|
|
rpcauth = "rpcauth=rt:93648e835a54c573682c2eb19f882535$7681e9c5b74bdd85e78166031d2058e1069b3ed7ed967c93fc63abba06f31144"
|
|
rpcauth2 = "rpcauth=rt2:f8607b1a88861fac29dfccf9b52ff9f$ff36a0c23c8c62b4846112e50fa888416e94c17bfd4c42f88fd8f55ec6a3137e"
|
|
rpcuser = "rpcuser=rpcuser💻"
|
|
rpcpassword = "rpcpassword=rpcpassword🔑"
|
|
|
|
self.user = ''.join(SystemRandom().choice(string.ascii_letters + string.digits) for _ in range(10))
|
|
config = configparser.ConfigParser()
|
|
config.read_file(open(self.options.configfile))
|
|
gen_rpcauth = config['environment']['RPCAUTH']
|
|
p = subprocess.Popen([gen_rpcauth, self.user], stdout=subprocess.PIPE, universal_newlines=True)
|
|
lines = p.stdout.read().splitlines()
|
|
rpcauth3 = lines[1]
|
|
self.password = lines[3]
|
|
|
|
with open(os.path.join(get_datadir_path(self.options.tmpdir, 0), "dash.conf"), 'a', encoding='utf8') as f:
|
|
f.write(rpcauth+"\n")
|
|
f.write(rpcauth2+"\n")
|
|
f.write(rpcauth3+"\n")
|
|
with open(os.path.join(get_datadir_path(self.options.tmpdir, 1), "dash.conf"), 'a', encoding='utf8') as f:
|
|
f.write(rpcuser+"\n")
|
|
f.write(rpcpassword+"\n")
|
|
|
|
def run_test(self):
|
|
|
|
##################################################
|
|
# Check correctness of the rpcauth config option #
|
|
##################################################
|
|
url = urllib.parse.urlparse(self.nodes[0].url)
|
|
|
|
#Old authpair
|
|
authpair = url.username + ':' + url.password
|
|
|
|
#New authpair generated via share/rpcauth tool
|
|
password = "cA773lm788buwYe4g4WT+05pKyNruVKjQ25x3n0DQcM="
|
|
|
|
#Second authpair with different username
|
|
password2 = "8/F3uMDw4KSEbw96U3CA1C4X05dkHDN2BPFjTgZW4KI="
|
|
authpairnew = "rt:"+password
|
|
|
|
self.log.info('Correct...')
|
|
headers = {"Authorization": "Basic " + str_to_b64str(authpair)}
|
|
|
|
conn = http.client.HTTPConnection(url.hostname, url.port)
|
|
conn.connect()
|
|
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
|
|
resp = conn.getresponse()
|
|
assert_equal(resp.status, 200)
|
|
conn.close()
|
|
|
|
#Use new authpair to confirm both work
|
|
self.log.info('Correct...')
|
|
headers = {"Authorization": "Basic " + str_to_b64str(authpairnew)}
|
|
|
|
conn = http.client.HTTPConnection(url.hostname, url.port)
|
|
conn.connect()
|
|
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
|
|
resp = conn.getresponse()
|
|
assert_equal(resp.status, 200)
|
|
conn.close()
|
|
|
|
#Wrong login name with rt's password
|
|
self.log.info('Wrong...')
|
|
authpairnew = "rtwrong:"+password
|
|
headers = {"Authorization": "Basic " + str_to_b64str(authpairnew)}
|
|
|
|
conn = http.client.HTTPConnection(url.hostname, url.port)
|
|
conn.connect()
|
|
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
|
|
resp = conn.getresponse()
|
|
assert_equal(resp.status, 401)
|
|
conn.close()
|
|
|
|
#Wrong password for rt
|
|
self.log.info('Wrong...')
|
|
authpairnew = "rt:"+password+"wrong"
|
|
headers = {"Authorization": "Basic " + str_to_b64str(authpairnew)}
|
|
|
|
conn = http.client.HTTPConnection(url.hostname, url.port)
|
|
conn.connect()
|
|
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
|
|
resp = conn.getresponse()
|
|
assert_equal(resp.status, 401)
|
|
conn.close()
|
|
|
|
#Correct for rt2
|
|
self.log.info('Correct...')
|
|
authpairnew = "rt2:"+password2
|
|
headers = {"Authorization": "Basic " + str_to_b64str(authpairnew)}
|
|
|
|
conn = http.client.HTTPConnection(url.hostname, url.port)
|
|
conn.connect()
|
|
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
|
|
resp = conn.getresponse()
|
|
assert_equal(resp.status, 200)
|
|
conn.close()
|
|
|
|
#Wrong password for rt2
|
|
self.log.info('Wrong...')
|
|
authpairnew = "rt2:"+password2+"wrong"
|
|
headers = {"Authorization": "Basic " + str_to_b64str(authpairnew)}
|
|
|
|
conn = http.client.HTTPConnection(url.hostname, url.port)
|
|
conn.connect()
|
|
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
|
|
resp = conn.getresponse()
|
|
assert_equal(resp.status, 401)
|
|
conn.close()
|
|
|
|
#Correct for randomly generated user
|
|
self.log.info('Correct...')
|
|
authpairnew = self.user+":"+self.password
|
|
headers = {"Authorization": "Basic " + str_to_b64str(authpairnew)}
|
|
|
|
conn = http.client.HTTPConnection(url.hostname, url.port)
|
|
conn.connect()
|
|
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
|
|
resp = conn.getresponse()
|
|
assert_equal(resp.status, 200)
|
|
conn.close()
|
|
|
|
#Wrong password for randomly generated user
|
|
self.log.info('Wrong...')
|
|
authpairnew = self.user+":"+self.password+"Wrong"
|
|
headers = {"Authorization": "Basic " + str_to_b64str(authpairnew)}
|
|
|
|
conn = http.client.HTTPConnection(url.hostname, url.port)
|
|
conn.connect()
|
|
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
|
|
resp = conn.getresponse()
|
|
assert_equal(resp.status, 401)
|
|
conn.close()
|
|
|
|
###############################################################
|
|
# Check correctness of the rpcuser/rpcpassword config options #
|
|
###############################################################
|
|
url = urllib.parse.urlparse(self.nodes[1].url)
|
|
|
|
# rpcuser and rpcpassword authpair
|
|
self.log.info('Correct...')
|
|
rpcuserauthpair = "rpcuser💻:rpcpassword🔑"
|
|
|
|
headers = {"Authorization": "Basic " + str_to_b64str(rpcuserauthpair)}
|
|
|
|
conn = http.client.HTTPConnection(url.hostname, url.port)
|
|
conn.connect()
|
|
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
|
|
resp = conn.getresponse()
|
|
assert_equal(resp.status, 200)
|
|
conn.close()
|
|
|
|
#Wrong login name with rpcuser's password
|
|
rpcuserauthpair = "rpcuserwrong:rpcpassword"
|
|
headers = {"Authorization": "Basic " + str_to_b64str(rpcuserauthpair)}
|
|
|
|
conn = http.client.HTTPConnection(url.hostname, url.port)
|
|
conn.connect()
|
|
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
|
|
resp = conn.getresponse()
|
|
assert_equal(resp.status, 401)
|
|
conn.close()
|
|
|
|
#Wrong password for rpcuser
|
|
self.log.info('Wrong...')
|
|
rpcuserauthpair = "rpcuser:rpcpasswordwrong"
|
|
headers = {"Authorization": "Basic " + str_to_b64str(rpcuserauthpair)}
|
|
|
|
conn = http.client.HTTPConnection(url.hostname, url.port)
|
|
conn.connect()
|
|
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
|
|
resp = conn.getresponse()
|
|
assert_equal(resp.status, 401)
|
|
conn.close()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
HTTPBasicsTest ().main ()
|