Gregory Maxwell
9 years ago
6 changed files with 231 additions and 1 deletions
@ -0,0 +1,122 @@
@@ -0,0 +1,122 @@
|
||||
#!/usr/bin/env python2 |
||||
# Copyright (c) 2015 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 mulitple rpc user config option rpcauth |
||||
# |
||||
|
||||
from test_framework.test_framework import BitcoinTestFramework |
||||
from test_framework.util import * |
||||
import base64 |
||||
|
||||
try: |
||||
import http.client as httplib |
||||
except ImportError: |
||||
import httplib |
||||
try: |
||||
import urllib.parse as urlparse |
||||
except ImportError: |
||||
import urlparse |
||||
|
||||
class HTTPBasicsTest (BitcoinTestFramework): |
||||
def setup_nodes(self): |
||||
return start_nodes(4, self.options.tmpdir) |
||||
|
||||
def setup_chain(self): |
||||
print("Initializing test directory "+self.options.tmpdir) |
||||
initialize_chain(self.options.tmpdir) |
||||
#Append rpcauth to bitcoin.conf before initialization |
||||
rpcauth = "rpcauth=rt:93648e835a54c573682c2eb19f882535$7681e9c5b74bdd85e78166031d2058e1069b3ed7ed967c93fc63abba06f31144" |
||||
rpcauth2 = "rpcauth=rt2:f8607b1a88861fac29dfccf9b52ff9f$ff36a0c23c8c62b4846112e50fa888416e94c17bfd4c42f88fd8f55ec6a3137e" |
||||
with open(os.path.join(self.options.tmpdir+"/node0", "bitcoin.conf"), 'a') as f: |
||||
f.write(rpcauth+"\n") |
||||
f.write(rpcauth2+"\n") |
||||
|
||||
def run_test(self): |
||||
|
||||
################################################## |
||||
# Check correctness of the rpcauth config option # |
||||
################################################## |
||||
url = urlparse.urlparse(self.nodes[0].url) |
||||
|
||||
#Old authpair |
||||
authpair = url.username + ':' + url.password |
||||
|
||||
#New authpair generated via contrib/rpcuser tool |
||||
rpcauth = "rpcauth=rt:93648e835a54c573682c2eb19f882535$7681e9c5b74bdd85e78166031d2058e1069b3ed7ed967c93fc63abba06f31144" |
||||
password = "cA773lm788buwYe4g4WT+05pKyNruVKjQ25x3n0DQcM=" |
||||
|
||||
#Second authpair with different username |
||||
rpcauth2 = "rpcauth=rt2:f8607b1a88861fac29dfccf9b52ff9f$ff36a0c23c8c62b4846112e50fa888416e94c17bfd4c42f88fd8f55ec6a3137e" |
||||
password2 = "8/F3uMDw4KSEbw96U3CA1C4X05dkHDN2BPFjTgZW4KI=" |
||||
authpairnew = "rt:"+password |
||||
|
||||
headers = {"Authorization": "Basic " + base64.b64encode(authpair)} |
||||
|
||||
conn = httplib.HTTPConnection(url.hostname, url.port) |
||||
conn.connect() |
||||
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers) |
||||
resp = conn.getresponse() |
||||
assert_equal(resp.status==401, False) |
||||
conn.close() |
||||
|
||||
#Use new authpair to confirm both work |
||||
headers = {"Authorization": "Basic " + base64.b64encode(authpairnew)} |
||||
|
||||
conn = httplib.HTTPConnection(url.hostname, url.port) |
||||
conn.connect() |
||||
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers) |
||||
resp = conn.getresponse() |
||||
assert_equal(resp.status==401, False) |
||||
conn.close() |
||||
|
||||
#Wrong login name with rt's password |
||||
authpairnew = "rtwrong:"+password |
||||
headers = {"Authorization": "Basic " + base64.b64encode(authpairnew)} |
||||
|
||||
conn = httplib.HTTPConnection(url.hostname, url.port) |
||||
conn.connect() |
||||
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers) |
||||
resp = conn.getresponse() |
||||
assert_equal(resp.status==401, True) |
||||
conn.close() |
||||
|
||||
#Wrong password for rt |
||||
authpairnew = "rt:"+password+"wrong" |
||||
headers = {"Authorization": "Basic " + base64.b64encode(authpairnew)} |
||||
|
||||
conn = httplib.HTTPConnection(url.hostname, url.port) |
||||
conn.connect() |
||||
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers) |
||||
resp = conn.getresponse() |
||||
assert_equal(resp.status==401, True) |
||||
conn.close() |
||||
|
||||
#Correct for rt2 |
||||
authpairnew = "rt2:"+password2 |
||||
headers = {"Authorization": "Basic " + base64.b64encode(authpairnew)} |
||||
|
||||
conn = httplib.HTTPConnection(url.hostname, url.port) |
||||
conn.connect() |
||||
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers) |
||||
resp = conn.getresponse() |
||||
assert_equal(resp.status==401, False) |
||||
conn.close() |
||||
|
||||
#Wrong password for rt2 |
||||
authpairnew = "rt2:"+password2+"wrong" |
||||
headers = {"Authorization": "Basic " + base64.b64encode(authpairnew)} |
||||
|
||||
conn = httplib.HTTPConnection(url.hostname, url.port) |
||||
conn.connect() |
||||
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers) |
||||
resp = conn.getresponse() |
||||
assert_equal(resp.status==401, True) |
||||
conn.close() |
||||
|
||||
|
||||
|
||||
if __name__ == '__main__': |
||||
HTTPBasicsTest ().main () |
@ -0,0 +1,11 @@
@@ -0,0 +1,11 @@
|
||||
RPC Tools |
||||
--------------------- |
||||
|
||||
### [RPCUser](/share/rpcuser) ### |
||||
|
||||
Create an RPC user login credential. |
||||
|
||||
Usage: |
||||
|
||||
./rpcuser.py <username> |
||||
|
@ -0,0 +1,41 @@
@@ -0,0 +1,41 @@
|
||||
#!/usr/bin/env python2 |
||||
# Copyright (c) 2015 The Bitcoin Core developers |
||||
# Distributed under the MIT software license, see the accompanying |
||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php. |
||||
|
||||
import hashlib |
||||
import sys |
||||
import os |
||||
from random import SystemRandom |
||||
import base64 |
||||
import hmac |
||||
|
||||
if len(sys.argv) < 2: |
||||
sys.stderr.write('Please include username as an argument.\n') |
||||
sys.exit(0) |
||||
|
||||
username = sys.argv[1] |
||||
|
||||
#This uses os.urandom() underneath |
||||
cryptogen = SystemRandom() |
||||
|
||||
#Create 16 byte hex salt |
||||
salt_sequence = [cryptogen.randrange(256) for i in range(16)] |
||||
hexseq = list(map(hex, salt_sequence)) |
||||
salt = "".join([x[2:] for x in hexseq]) |
||||
|
||||
#Create 32 byte b64 password |
||||
password = base64.urlsafe_b64encode(os.urandom(32)) |
||||
|
||||
digestmod = hashlib.sha256 |
||||
|
||||
if sys.version_info.major >= 3: |
||||
password = password.decode('utf-8') |
||||
digestmod = 'SHA256' |
||||
|
||||
m = hmac.new(bytearray(salt, 'utf-8'), bytearray(password, 'utf-8'), digestmod) |
||||
result = m.hexdigest() |
||||
|
||||
print("String to be appended to bitcoin.conf:") |
||||
print("rpcauth="+username+":"+salt+"$"+result) |
||||
print("Your password:\n"+password) |
Loading…
Reference in new issue