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

Commit 22c4726

Browse files
committed
Switch websocket libraries
1 parent 6a6e0db commit 22c4726

6 files changed

Lines changed: 65 additions & 77 deletions

File tree

api/restapi.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from twisted.web import server
1313
from twisted.web.resource import NoResource
1414
from twisted.web import http
15+
from twisted.web.server import Site
1516
from twisted.internet import defer, reactor
1617
from twisted.protocols.basic import FileSender
1718

@@ -1084,3 +1085,16 @@ def get_cases(self, request):
10841085
request.write(json.dumps(cases_list, indent=4))
10851086
request.finish()
10861087
return server.NOT_DONE_YET
1088+
1089+
1090+
class RestAPI(Site):
1091+
1092+
def __init__(self, mserver, kserver, openbazaar_protocol, only_ip="127.0.0.1", timeout=60 * 60 * 1):
1093+
self.only_ip = only_ip
1094+
api_resource = OpenBazaarAPI(mserver, kserver, openbazaar_protocol)
1095+
Site.__init__(self, api_resource, timeout=timeout)
1096+
1097+
def buildProtocol(self, addr):
1098+
if addr.host != self.only_ip and self.only_ip != "0.0.0.0":
1099+
return
1100+
return Site.buildProtocol(self, addr)

api/ws.py

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,26 @@
88
from market.profile import Profile
99
from keyutils.keys import KeyChain
1010
from random import shuffle
11-
from autobahn.twisted.websocket import WebSocketServerFactory, WebSocketServerProtocol
1211
from protos.countries import CountryCode
1312
from protos.objects import PlaintextMessage, Value, Listings
1413
from protos import objects
1514
from binascii import unhexlify
1615
from dht.node import Node
16+
from twisted.internet.protocol import Protocol, Factory, connectionDone
1717

1818

19-
class WSProtocol(WebSocketServerProtocol):
19+
# pylint: disable=W0232
20+
class WSProtocol(Protocol):
2021
"""
2122
Handles new incoming requests coming from a websocket.
2223
"""
2324

24-
def onOpen(self):
25+
def connectionMade(self):
2526
self.factory.register(self)
2627

28+
def connectionLost(self, reason=connectionDone):
29+
self.factory.unregister(self)
30+
2731
def get_vendors(self, message_id):
2832
if message_id in self.factory.outstanding_vendors:
2933
queried = self.factory.outstanding_vendors[message_id]
@@ -55,7 +59,7 @@ def handle_response(metadata, node):
5559
"nsfw": metadata.nsfw
5660
}
5761
}
58-
self.sendMessage(json.dumps(vendor, indent=4), False)
62+
self.transport.write(json.dumps(vendor, indent=4))
5963
queried.append(node.id)
6064
return True
6165
else:
@@ -92,7 +96,7 @@ def parse_profile(profile, node):
9296
"fee": profile.moderation_fee
9397
}
9498
}
95-
self.sendMessage(json.dumps(moderator, indent=4), False)
99+
self.transport.write(json.dumps(moderator, indent=4))
96100
else:
97101
m.delete_moderator(node.id)
98102
for mod in moderators:
@@ -152,7 +156,7 @@ def handle_response(listings, node):
152156
self.factory.mserver.get_image(node, l.thumbnail_hash)
153157
if not os.path.isfile(DATA_FOLDER + 'cache/' + listings.avatar_hash.encode("hex")):
154158
self.factory.mserver.get_image(node, listings.avatar_hash)
155-
self.sendMessage(json.dumps(listing_json, indent=4), False)
159+
self.transport.write(json.dumps(listing_json, indent=4))
156160
count += 1
157161
self.factory.outstanding_listings[message_id].append(l.contract_hash)
158162
if count == 3:
@@ -202,7 +206,7 @@ def respond(l, node):
202206
}
203207
for country in l.ships_to:
204208
listing_json["listing"]["ships_to"].append(str(CountryCode.Name(country)))
205-
self.sendMessage(json.dumps(listing_json, indent=4), False)
209+
self.transport.write(json.dumps(listing_json, indent=4))
206210

207211
def parse_results(values):
208212
if values is not None:
@@ -230,7 +234,7 @@ def parse_results(values):
230234
pass
231235
self.factory.kserver.get(keyword.lower()).addCallback(parse_results)
232236

233-
def onMessage(self, payload, isBinary):
237+
def dataReceived(self, payload):
234238
try:
235239
request_json = json.loads(payload)
236240
if isinstance(request_json, unicode):
@@ -262,32 +266,26 @@ def onMessage(self, payload, isBinary):
262266
except Exception as e:
263267
print 'Exception occurred: %s' % e
264268

265-
def connectionLost(self, reason):
266-
WebSocketServerProtocol.connectionLost(self, reason)
267-
self.factory.unregister(self)
268-
269-
270-
class WSFactory(WebSocketServerFactory):
271269

272-
"""
273-
Simple broadcast server broadcasting any message it receives to all
274-
currently connected clients.
275-
"""
270+
class WSFactory(Factory):
276271

277-
def __init__(self, url, mserver, kserver, only_ip="127.0.0.1", debug=False, debugCodePaths=False):
278-
WebSocketServerFactory.__init__(self, url, debug=debug, debugCodePaths=debugCodePaths)
272+
def __init__(self, mserver, kserver, only_ip="127.0.0.1"):
279273
self.mserver = mserver
280274
self.kserver = kserver
281275
self.db = mserver.db
282276
self.outstanding_listings = {}
283277
self.outstanding_vendors = {}
284-
self.clients = []
278+
self.protocol = WSProtocol
285279
self.only_ip = only_ip
280+
self.clients = []
281+
282+
def buildProtocol(self, addr):
283+
if addr.host != self.only_ip and self.only_ip != "0.0.0.0":
284+
return
285+
return Factory.buildProtocol(self, addr)
286286

287287
def register(self, client):
288-
if client.transport.getPeer().host != self.only_ip and self.only_ip != "0.0.0.0":
289-
client.transport.loseConnection()
290-
elif client not in self.clients:
288+
if client not in self.clients:
291289
self.clients.append(client)
292290

293291
def unregister(self, client):
@@ -296,4 +294,6 @@ def unregister(self, client):
296294

297295
def push(self, msg):
298296
for c in self.clients:
299-
c.sendMessage(msg)
297+
c.transport.write(msg)
298+
299+

market/contracts.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -629,7 +629,7 @@ def add_receipt(self,
629629
if s["input_index"] == index:
630630
if bitcointools.verify_tx_input(tx, index, redeem_script, s["signature"], vendor_key):
631631
tx = bitcointools.apply_multisignatures(tx, index, str(redeem_script),
632-
sig, str(s["signature"]))
632+
sig, str(s["signature"]))
633633
valid_inputs += 1
634634
receipt_json["buyer_receipt"]["receipt"]["payout"] = {}
635635
if valid_inputs == len(outpoints):
@@ -795,7 +795,6 @@ def on_tx_received(self, address_version, address_hash, height, block_hash, tx):
795795
funding level. We need to keep a running balance and increment it when a new transaction
796796
is received. If the contract is fully funded, we push a notification to the websockets.
797797
"""
798-
print "3"
799798
try:
800799
# decode the transaction
801800
self.log.info("Bitcoin transaction detected")
@@ -1121,8 +1120,8 @@ def validate_for_moderation(self, proof_sig):
11211120
validation_failures.append("Guid signature in vendor_offer not valid;")
11221121

11231122
valid = bitcointools.ecdsa_raw_verify(listing,
1124-
bitcointools.decode_sig(vendor_bitcoin_signature),
1125-
vendor_bitcoin_pubkey)
1123+
bitcointools.decode_sig(vendor_bitcoin_signature),
1124+
vendor_bitcoin_pubkey)
11261125
if not valid:
11271126
validation_failures.append("Bitcoin signature in vendor_offer is not valid;")
11281127

@@ -1139,7 +1138,8 @@ def validate_for_moderation(self, proof_sig):
11391138
except Exception:
11401139
validation_failures.append("Guid signature in buyer_order not valid;")
11411140

1142-
valid = bitcointools.ecdsa_raw_verify(order, bitcointools.decode_sig(buyer_bitcoin_signature), buyer_bitcoin_pubkey)
1141+
valid = bitcointools.ecdsa_raw_verify(order, bitcointools.decode_sig(buyer_bitcoin_signature),
1142+
buyer_bitcoin_pubkey)
11431143
if not valid:
11441144
validation_failures.append("Bitcoin signature in buyer_order not valid;")
11451145

market/network.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,8 @@ def get_result(result):
112112

113113
bitcoin_key = contract["vendor_offer"]["listing"]["id"]["pubkeys"]["bitcoin"]
114114
bitcoin_sig = contract["vendor_offer"]["signatures"]["bitcoin"]
115-
valid = bitcointools.ecdsa_raw_verify(verify_obj, bitcointools.decode_sig(bitcoin_sig), bitcoin_key)
115+
valid = bitcointools.ecdsa_raw_verify(verify_obj, bitcointools.decode_sig(bitcoin_sig),
116+
bitcoin_key)
116117
if not valid:
117118
raise Exception("Invalid Bitcoin signature")
118119

@@ -901,7 +902,7 @@ def release_funds(self, order_id):
901902
if s["input_index"] == index:
902903
if bitcointools.verify_tx_input(tx, index, redeem_script, s["signature"], mod_key):
903904
tx = bitcointools.apply_multisignatures(tx, index, str(redeem_script),
904-
sig, str(s["signature"]))
905+
sig, str(s["signature"]))
905906
valid_inputs += 1
906907

907908
if valid_inputs == len(outpoints):

openbazaard.py

Lines changed: 17 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,8 @@
88
import stun
99
import sys
1010
import time
11-
from api.ws import WSFactory, WSProtocol
12-
from api.restapi import OpenBazaarAPI
13-
from autobahn.twisted.websocket import listenWS
11+
from api.ws import WSFactory
12+
from api.restapi import RestAPI
1413
from constants import DATA_FOLDER, KSIZE, ALPHA, LIBBITCOIN_SERVER,\
1514
LIBBITCOIN_SERVER_TESTNET, SSL_KEY, SSL_CERT, SEEDS
1615
from daemon import Daemon
@@ -31,8 +30,7 @@
3130
from protos.objects import FULL_CONE, RESTRICTED, SYMMETRIC
3231
from twisted.internet import reactor, task
3332
from twisted.python import log, logfile
34-
from twisted.web.server import Site
35-
from twisted.web.static import File
33+
from txws import WebSocketFactory
3634

3735

3836
def run(*args):
@@ -119,48 +117,22 @@ def on_bootstrap_complete(resp):
119117

120118
reactor.listenUDP(port, protocol)
121119

122-
class OnlyIP(Site):
123-
def __init__(self, resource, ip, timeout=60 * 60 * 1):
124-
self.ip = ip
125-
Site.__init__(self, resource, timeout=timeout)
126-
127-
def buildProtocol(self, addr):
128-
if addr.host == self.ip:
129-
return Site.buildProtocol(self, addr)
130-
return None
120+
interface = "0.0.0.0" if ALLOWIP not in ("127.0.0.1", "0.0.0.0") else ALLOWIP
131121

132122
# websockets api
123+
ws_api = WSFactory(mserver, kserver, only_ip=ALLOWIP)
133124
if SSL:
134-
ws_factory = WSFactory("wss://127.0.0.1:" + str(WSPORT), mserver, kserver, only_ip=ALLOWIP)
135-
contextFactory = ChainedOpenSSLContextFactory(SSL_KEY, SSL_CERT)
136-
ws_factory.protocol = WSProtocol
137-
listenWS(ws_factory, contextFactory)
138-
else:
139-
ws_factory = WSFactory("ws://127.0.0.1:" + str(WSPORT), mserver, kserver, only_ip=ALLOWIP)
140-
ws_factory.protocol = WSProtocol
141-
listenWS(ws_factory)
142-
143-
if ALLOWIP != "127.0.0.1" and ALLOWIP != "0.0.0.0":
144-
ws_interface = "0.0.0.0"
125+
reactor.listenSSL(RESTPORT, WebSocketFactory(ws_api),
126+
ChainedOpenSSLContextFactory(SSL_KEY, SSL_CERT), interface=interface)
145127
else:
146-
ws_interface = ALLOWIP
147-
webdir = File(".")
148-
web = Site(webdir)
149-
150-
reactor.listenTCP(WSPORT - 1, web, interface=ws_interface)
128+
reactor.listenTCP(WSPORT, WebSocketFactory(ws_api), interface=interface)
151129

152130
# rest api
153-
api = OpenBazaarAPI(mserver, kserver, protocol)
154-
if ALLOWIP != "127.0.0.1" and ALLOWIP != "0.0.0.0":
155-
rest_interface = "0.0.0.0"
156-
site = OnlyIP(api, ALLOWIP, timeout=None)
157-
else:
158-
rest_interface = ALLOWIP
159-
site = Site(api, timeout=None)
131+
rest_api = RestAPI(mserver, kserver, protocol, only_ip=ALLOWIP)
160132
if SSL:
161-
reactor.listenSSL(RESTPORT, site, ChainedOpenSSLContextFactory(SSL_KEY, SSL_CERT), interface=rest_interface)
133+
reactor.listenSSL(RESTPORT, rest_api, ChainedOpenSSLContextFactory(SSL_KEY, SSL_CERT), interface=interface)
162134
else:
163-
reactor.listenTCP(RESTPORT, site, interface=rest_interface)
135+
reactor.listenTCP(RESTPORT, rest_api, interface=interface)
164136

165137
# blockchain
166138
if TESTNET:
@@ -169,17 +141,19 @@ def buildProtocol(self, addr):
169141
libbitcoin_client = LibbitcoinClient(LIBBITCOIN_SERVER, log=Logger(service="LibbitcoinClient"))
170142

171143
# listeners
172-
nlistener = NotificationListenerImpl(ws_factory, db)
144+
nlistener = NotificationListenerImpl(ws_api, db)
173145
mserver.protocol.add_listener(nlistener)
174-
mlistener = MessageListenerImpl(ws_factory, db)
146+
mlistener = MessageListenerImpl(ws_api, db)
175147
mserver.protocol.add_listener(mlistener)
176-
blistener = BroadcastListenerImpl(ws_factory, db)
148+
blistener = BroadcastListenerImpl(ws_api, db)
177149
mserver.protocol.add_listener(blistener)
178150

179-
protocol.set_servers(ws_factory, libbitcoin_client)
151+
protocol.set_servers(ws_api, libbitcoin_client)
180152

181153
logger.info("Startup took %s seconds" % str(round(time.time() - args[7], 2)))
182154

155+
reactor.callLater(15, ws_api.push, "Hello world")
156+
183157
reactor.run()
184158

185159
if __name__ == "__main__":

requirements.txt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ bitcointools==1.1.44
66
gnupg==2.0.2
77
pynacl==0.3.0
88
txrestapi==0.2
9-
autobahn==0.10.9
10-
txaio==1.1.0
9+
txws==0.9.1
1110
python-libbitcoinclient==0.3.2
1211
requests==2.7.0
1312
pyopenssl==0.15.1

0 commit comments

Comments
 (0)