Skip to content
This repository was archived by the owner on May 16, 2019. It is now read-only.

Commit 8cd0b10

Browse files
committed
Merge branch 'tyler-smith-TS_fix_httpseed'
2 parents f471eb4 + 484df80 commit 8cd0b10

File tree

2 files changed

+137
-135
lines changed

2 files changed

+137
-135
lines changed

keys/keychain.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ def __init__(self, database, callback=None, heartbeat_server=None):
1212
self.db = database
1313
guid_keys = self.db.keys.get_key("guid")
1414
if guid_keys is None:
15-
heartbeat_server.set_status("generating GUID")
15+
if heartbeat_server:
16+
heartbeat_server.set_status("generating GUID")
1617
threading.Thread(target=self.create_keychain, args=[callback]).start()
1718
else:
1819
g = GUID.from_privkey(guid_keys[0])
@@ -23,10 +24,10 @@ def __init__(self, database, callback=None, heartbeat_server=None):
2324
self.bitcoin_master_privkey, self.bitcoin_master_pubkey = self.db.keys.get_key("bitcoin")
2425
self.encryption_key = self.signing_key.to_curve25519_private_key()
2526
self.encryption_pubkey = self.verify_key.to_curve25519_public_key()
26-
if callback is not None:
27+
if callable(callback):
2728
callback(self)
2829

29-
def create_keychain(self, callback):
30+
def create_keychain(self, callback=None):
3031
"""
3132
The guid generation can take a while. While it's doing that we will
3233
open a port to allow a UI to connect and listen for generation to
@@ -46,5 +47,5 @@ def create_keychain(self, callback):
4647

4748
self.encryption_key = self.signing_key.to_curve25519_private_key()
4849
self.encryption_pubkey = self.verify_key.to_curve25519_public_key()
49-
callback(self, True)
50-
50+
if callable(callback):
51+
callback(self, True)

seed/httpseed.py

Lines changed: 131 additions & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -36,159 +36,160 @@ def run(*args):
3636
# Create the database
3737
db = Database(testnet=TESTNET)
3838

39-
# logging
40-
logFile = logfile.LogFile.fromFullPath(DATA_FOLDER + "debug.log", rotateLength=15000000, maxRotatedFiles=1)
41-
log.addObserver(FileLogObserver(logFile, level="debug").emit)
42-
log.addObserver(FileLogObserver(level="debug").emit)
43-
logger = Logger(system="Httpseed")
39+
def start_server(keychain, first_startup=False):
40+
# logging
41+
logFile = logfile.LogFile.fromFullPath(DATA_FOLDER + "debug.log", rotateLength=15000000, maxRotatedFiles=1)
42+
log.addObserver(FileLogObserver(logFile, level="debug").emit)
43+
log.addObserver(FileLogObserver(level="debug").emit)
44+
logger = Logger(system="Httpseed")
4445

45-
# Load the keys
46-
keychain = KeyChain(db)
46+
if os.path.isfile(DATA_FOLDER + 'keys.pickle'):
47+
keys = pickle.load(open(DATA_FOLDER + "keys.pickle", "r"))
48+
signing_key_hex = keys["signing_privkey"]
49+
signing_key = nacl.signing.SigningKey(signing_key_hex, encoder=nacl.encoding.HexEncoder)
50+
else:
51+
signing_key = nacl.signing.SigningKey.generate()
52+
keys = {
53+
'signing_privkey': signing_key.encode(encoder=nacl.encoding.HexEncoder),
54+
'signing_pubkey': signing_key.verify_key.encode(encoder=nacl.encoding.HexEncoder)
55+
}
56+
pickle.dump(keys, open(DATA_FOLDER + "keys.pickle", "wb"))
4757

48-
if os.path.isfile(DATA_FOLDER + 'keys.pickle'):
49-
keys = pickle.load(open(DATA_FOLDER + "keys.pickle", "r"))
50-
signing_key_hex = keys["signing_privkey"]
51-
signing_key = nacl.signing.SigningKey(signing_key_hex, encoder=nacl.encoding.HexEncoder)
52-
else:
53-
signing_key = nacl.signing.SigningKey.generate()
54-
keys = {
55-
'signing_privkey': signing_key.encode(encoder=nacl.encoding.HexEncoder),
56-
'signing_pubkey': signing_key.verify_key.encode(encoder=nacl.encoding.HexEncoder)
57-
}
58-
pickle.dump(keys, open(DATA_FOLDER + "keys.pickle", "wb"))
58+
# Stun
59+
port = 18467 if not TESTNET else 28467
60+
logger.info("Finding NAT Type...")
61+
response = stun.get_ip_info(stun_host="stun.l.google.com", source_port=port, stun_port=19302)
62+
logger.info("%s on %s:%s" % (response[0], response[1], response[2]))
63+
ip_address = response[1]
64+
port = response[2]
5965

60-
# Stun
61-
port = 18467 if not TESTNET else 28467
62-
logger.info("Finding NAT Type...")
63-
response = stun.get_ip_info(stun_host="stun.l.google.com", source_port=port, stun_port=19302)
64-
logger.info("%s on %s:%s" % (response[0], response[1], response[2]))
65-
ip_address = response[1]
66-
port = response[2]
66+
# Start the kademlia server
67+
this_node = Node(keychain.guid, ip_address, port,
68+
keychain.verify_key.encode(), None, objects.FULL_CONE, False)
69+
protocol = OpenBazaarProtocol(db, (ip_address, port), objects.FULL_CONE, testnet=TESTNET, relaying=True)
6770

68-
# Start the kademlia server
69-
this_node = Node(keychain.guid, ip_address, port,
70-
keychain.verify_key.encode(), None, objects.FULL_CONE, False)
71-
protocol = OpenBazaarProtocol(db, (ip_address, port), objects.FULL_CONE, testnet=TESTNET, relaying=True)
71+
try:
72+
kserver = Server.loadState('cache.pickle', ip_address, port, protocol, db, objects.FULL_CONE, None)
73+
except Exception:
74+
kserver = Server(this_node, db, keychain.signing_key)
75+
kserver.protocol.connect_multiplexer(protocol)
7276

73-
try:
74-
kserver = Server.loadState('cache.pickle', ip_address, port, protocol, db, objects.FULL_CONE, None)
75-
except Exception:
76-
kserver = Server(this_node, db, keychain.signing_key)
77-
kserver.protocol.connect_multiplexer(protocol)
77+
protocol.register_processor(kserver.protocol)
78+
kserver.saveStateRegularly('cache.pickle', 10)
7879

79-
protocol.register_processor(kserver.protocol)
80-
kserver.saveStateRegularly('cache.pickle', 10)
80+
reactor.listenUDP(port, protocol)
8181

82-
reactor.listenUDP(port, protocol)
83-
84-
class WebResource(resource.Resource):
85-
def __init__(self, kserver_r):
86-
resource.Resource.__init__(self)
87-
self.kserver = kserver_r
88-
self.nodes = {}
89-
for bucket in self.kserver.protocol.router.buckets:
90-
for node in bucket.getNodes():
91-
self.nodes[(node.ip, node.port)] = node
92-
self.nodes[(this_node.ip, this_node.port)] = this_node
93-
loopingCall = task.LoopingCall(self.crawl)
94-
loopingCall.start(180, True)
95-
96-
def crawl(self):
97-
def gather_results(result):
98-
for proto in result:
99-
n = objects.Node()
100-
try:
101-
n.ParseFromString(proto)
102-
node = Node(n.guid, n.nodeAddress.ip, n.nodeAddress.port, n.signedPublicKey,
103-
None if not n.HasField("relayAddress") else
104-
(n.relayAddress.ip, n.relayAddress.port),
105-
n.natType,
106-
n.vendor)
82+
class WebResource(resource.Resource):
83+
def __init__(self, kserver_r):
84+
resource.Resource.__init__(self)
85+
self.kserver = kserver_r
86+
self.nodes = {}
87+
for bucket in self.kserver.protocol.router.buckets:
88+
for node in bucket.getNodes():
10789
self.nodes[(node.ip, node.port)] = node
108-
except Exception:
109-
pass
90+
self.nodes[(this_node.ip, this_node.port)] = this_node
91+
loopingCall = task.LoopingCall(self.crawl)
92+
loopingCall.start(180, True)
11093

111-
def start_crawl(results):
112-
for node, result in results.items():
113-
if not result[0]:
114-
del self.nodes[(node.ip, node.port)]
115-
node = Node(digest(random.getrandbits(255)))
116-
nearest = self.kserver.protocol.router.findNeighbors(node)
117-
spider = NodeSpiderCrawl(self.kserver.protocol, node, nearest, 100, 4)
118-
spider.find().addCallback(gather_results)
94+
def crawl(self):
95+
def gather_results(result):
96+
for proto in result:
97+
n = objects.Node()
98+
try:
99+
n.ParseFromString(proto)
100+
node = Node(n.guid, n.nodeAddress.ip, n.nodeAddress.port, n.signedPublicKey,
101+
None if not n.HasField("relayAddress") else
102+
(n.relayAddress.ip, n.relayAddress.port),
103+
n.natType,
104+
n.vendor)
105+
self.nodes[(node.ip, node.port)] = node
106+
except Exception:
107+
pass
119108

120-
ds = {}
121-
for bucket in self.kserver.protocol.router.buckets:
122-
for node in bucket.getNodes():
123-
self.nodes[(node.ip, node.port)] = node
124-
for node in self.nodes.values():
125-
if node.id != this_node.id:
126-
ds[node] = self.kserver.protocol.callPing(node)
127-
deferredDict(ds).addCallback(start_crawl)
109+
def start_crawl(results):
110+
for node, result in results.items():
111+
if not result[0]:
112+
del self.nodes[(node.ip, node.port)]
113+
node = Node(digest(random.getrandbits(255)))
114+
nearest = self.kserver.protocol.router.findNeighbors(node)
115+
spider = NodeSpiderCrawl(self.kserver.protocol, node, nearest, 100, 4)
116+
spider.find().addCallback(gather_results)
128117

129-
def getChild(self, child, request):
130-
return self
118+
ds = {}
119+
for bucket in self.kserver.protocol.router.buckets:
120+
for node in bucket.getNodes():
121+
self.nodes[(node.ip, node.port)] = node
122+
for node in self.nodes.values():
123+
if node.id != this_node.id:
124+
ds[node] = self.kserver.protocol.callPing(node)
125+
deferredDict(ds).addCallback(start_crawl)
131126

132-
def render_GET(self, request):
133-
nodes = self.nodes.values()
134-
shuffle(nodes)
135-
logger.info("Received a request for nodes, responding...")
136-
if "format" in request.args:
137-
if request.args["format"][0] == "json":
138-
json_list = []
139-
if "type" in request.args and request.args["type"][0] == "vendors":
140-
for node in nodes:
141-
if node.vendor is True:
127+
def getChild(self, child, request):
128+
return self
129+
130+
def render_GET(self, request):
131+
nodes = self.nodes.values()
132+
shuffle(nodes)
133+
logger.info("Received a request for nodes, responding...")
134+
if "format" in request.args:
135+
if request.args["format"][0] == "json":
136+
json_list = []
137+
if "type" in request.args and request.args["type"][0] == "vendors":
138+
for node in nodes:
139+
if node.vendor is True:
140+
node_dic = {}
141+
node_dic["ip"] = node.ip
142+
node_dic["port"] = node.port
143+
node_dic["guid"] = node.id.encode("hex")
144+
json_list.append(node_dic)
145+
sig = signing_key.sign(str(json_list))
146+
resp = {"peers": json_list, "signature": hexlify(sig[:64])}
147+
request.write(json.dumps(resp, indent=4))
148+
else:
149+
for node in nodes[:50]:
142150
node_dic = {}
143151
node_dic["ip"] = node.ip
144152
node_dic["port"] = node.port
145-
node_dic["guid"] = node.id.encode("hex")
146153
json_list.append(node_dic)
147-
sig = signing_key.sign(str(json_list))
148-
resp = {"peers": json_list, "signature": hexlify(sig[:64])}
149-
request.write(json.dumps(resp, indent=4))
150-
else:
154+
sig = signing_key.sign(str(json_list))
155+
resp = {"peers": json_list, "signature": hexlify(sig[:64])}
156+
request.write(json.dumps(resp, indent=4))
157+
elif request.args["format"][0] == "protobuf":
158+
proto = peers.PeerSeeds()
151159
for node in nodes[:50]:
152-
node_dic = {}
153-
node_dic["ip"] = node.ip
154-
node_dic["port"] = node.port
155-
json_list.append(node_dic)
156-
sig = signing_key.sign(str(json_list))
157-
resp = {"peers": json_list, "signature": hexlify(sig[:64])}
158-
request.write(json.dumps(resp, indent=4))
159-
elif request.args["format"][0] == "protobuf":
160+
proto.serializedNode.append(node.getProto().SerializeToString())
161+
162+
sig = signing_key.sign("".join(proto.serializedNode))[:64]
163+
proto.signature = sig
164+
uncompressed_data = proto.SerializeToString()
165+
request.write(uncompressed_data.encode("zlib"))
166+
else:
160167
proto = peers.PeerSeeds()
161-
for node in nodes[:50]:
162-
proto.serializedNode.append(node.getProto().SerializeToString())
168+
if "type" in request.args and request.args["type"][0] == "vendors":
169+
for node in nodes:
170+
if node.vendor is True:
171+
proto.serializedNode.append(node.getProto().SerializeToString())
163172

164-
sig = signing_key.sign("".join(proto.serializedNode))[:64]
165-
proto.signature = sig
166-
uncompressed_data = proto.SerializeToString()
167-
request.write(uncompressed_data.encode("zlib"))
168-
else:
169-
proto = peers.PeerSeeds()
170-
if "type" in request.args and request.args["type"][0] == "vendors":
171-
for node in nodes:
172-
if node.vendor is True:
173+
sig = signing_key.sign("".join(proto.serializedNode))[:64]
174+
proto.signature = sig
175+
uncompressed_data = proto.SerializeToString()
176+
request.write(uncompressed_data.encode("zlib"))
177+
else:
178+
for node in nodes[:50]:
173179
proto.serializedNode.append(node.getProto().SerializeToString())
174180

175-
sig = signing_key.sign("".join(proto.serializedNode))[:64]
176-
proto.signature = sig
177-
uncompressed_data = proto.SerializeToString()
178-
request.write(uncompressed_data.encode("zlib"))
179-
else:
180-
for node in nodes[:50]:
181-
proto.serializedNode.append(node.getProto().SerializeToString())
181+
sig = signing_key.sign("".join(proto.serializedNode))[:64]
182+
proto.signature = sig
183+
uncompressed_data = proto.SerializeToString()
184+
request.write(uncompressed_data.encode("zlib"))
185+
request.finish()
186+
return server.NOT_DONE_YET
182187

183-
sig = signing_key.sign("".join(proto.serializedNode))[:64]
184-
proto.signature = sig
185-
uncompressed_data = proto.SerializeToString()
186-
request.write(uncompressed_data.encode("zlib"))
187-
request.finish()
188-
return server.NOT_DONE_YET
188+
server_protocol = server.Site(WebResource(kserver))
189+
reactor.listenTCP(HTTPPORT, server_protocol)
189190

190-
server_protocol = server.Site(WebResource(kserver))
191-
reactor.listenTCP(HTTPPORT, server_protocol)
191+
# Generate keys and then start the server
192+
KeyChain(db, start_server)
192193

193194
reactor.run()
194195

0 commit comments

Comments
 (0)