Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
# parse the decision here, create the connection parameters dict
ver = int(decision['banana-decision-version'])
vocab_index_string = decision.get('initial-vocab-table-index')
if vocab_index_string:
vocab_index, vocab_hash = vocab_index_string.split()
vocab_index = int(vocab_index)
else:
vocab_index = 0
check_inrange(self.initialVocabTableRange[0],
self.initialVocabTableRange[1],
vocab_index, "initial vocab table index")
our_hash = vocab.hashVocabTable(vocab_index)
if vocab_index > 0 and our_hash != vocab_hash:
msg = ("Our hash for vocab-table-index %d (%s) does not match "
"your hash (%s)" % (vocab_index, our_hash, vocab_hash))
raise NegotiationError(msg)
if self.theirTubRef in self.tub.brokers:
# we're the slave, so we need to drop our existing connection and
# use the one picked by the master
self.log("master told us to use a new connection, "
"so we must drop the existing one", level=UNUSUAL)
err = DeadReferenceError("replaced by a new connection")
why = Failure(err)
self.tub.brokers[self.theirTubRef].shutdown(why)
current_connection = decision.get('current-connection')
if current_connection:
tubID = self.theirTubRef.getTubID()
if tubID != "":
self.tub.slave_table[tubID] = tuple(current_connection.split())
else:
the connection parameters we will use ourselves.
- We are the master, we can't accomodate their request: raise
NegotiationError
- We are not the master: DECISION is None
"""
self.log("evaluateHello(isClient=%s): offer=%s" %
(self.isClient, offer))
if not offer.has_key('banana-negotiation-range'):
if offer.has_key('banana-negotiation-version'):
msg = ("Peer is speaking foolscap-0.0.5 or earlier, "
"which is not compatible with this version. "
"Please upgrade the peer.")
raise NegotiationError(msg)
raise NegotiationError("No valid banana-negotiation sequence seen")
min_s, max_s = offer['banana-negotiation-range'].split()
theirMinVer = int(min_s)
theirMaxVer = int(max_s)
# best_overlap() might raise a NegotiationError
best = best_overlap(self.minVersion, self.maxVersion,
theirMinVer, theirMaxVer,
"banana version")
negfunc = getattr(self, "evaluateNegotiationVersion%d" % best)
self.decision_version = best
return negfunc(offer)
- We are the master, we can't accomodate their request: raise
NegotiationError
- We are not the master: DECISION is None
"""
self.log("evaluateHello(isClient=%s): offer=%s" %
(self.isClient, offer))
if not offer.has_key('banana-negotiation-range'):
if offer.has_key('banana-negotiation-version'):
msg = ("Peer is speaking foolscap-0.0.5 or earlier, "
"which is not compatible with this version. "
"Please upgrade the peer.")
raise NegotiationError(msg)
raise NegotiationError("No valid banana-negotiation sequence seen")
min_s, max_s = offer['banana-negotiation-range'].split()
theirMinVer = int(min_s)
theirMaxVer = int(max_s)
# best_overlap() might raise a NegotiationError
best = best_overlap(self.minVersion, self.maxVersion,
theirMinVer, theirMaxVer,
"banana version")
negfunc = getattr(self, "evaluateNegotiationVersion%d" % best)
self.decision_version = best
return negfunc(offer)
"""
# the client sends us a GET message
lines = header.split("\r\n")
if not lines[0].startswith("GET "):
raise BananaError("not right")
command, url, version = lines[0].split()
if not url.startswith("/id/"):
# probably a web browser
raise BananaError("not right")
targetTubID = url[4:]
Message.log(event_type=u"handlePLAINTEXTServer", tub_id=targetTubID)
if targetTubID == "":
# they're asking for an old UnauthenticatedTub. Refuse.
raise NegotiationError("secure Tubs require encryption")
if isSubstring("Upgrade: TLS/1.0\r\n", header):
wantEncrypted = True
else:
wantEncrypted = False
Message.log(event_type=u"handlePLAINTEXTServer", want_encrypted=wantEncrypted)
self._handleTubRequest(header, targetTubID)
raise NegotiationError("secure Tubs require encryption")
# now that we know which Tub the client wants to connect to, either
# send a Redirect, or start the ENCRYPTED phase
tub, redirect = self.listener.lookupTubID(targetTubID)
if tub:
self.tub = tub # our tub
self.options.update(self.tub.options)
self.brokerClass = self.tub.brokerClass
self.myTubID = tub.tubID
self.sendPlaintextServerAndStartENCRYPTED(wantEncrypted)
elif redirect:
self.sendRedirect(redirect)
else:
raise NegotiationError("unknown TubID %s" % targetTubID)
def check_inrange(my_min, my_max, decision, name):
if decision < my_min or decision > my_max:
raise NegotiationError("I can't handle %s %d" % (name, decision))
level=UNUSUAL)
existing = self.tub.brokers[theirTubRef]
acceptOffer = self.compareOfferAndExisting(offer, existing, lp)
if acceptOffer:
# drop the old one
self.log("accepting new offer, dropping existing connection",
parent=lp)
err = DeadReferenceError("[%s] replaced by a new connection"
% theirTubRef.getShortTubID())
why = Failure(err)
existing.shutdown(why)
else:
# reject the new one
self.log("rejecting the offer: we already have one",
parent=lp)
raise NegotiationError("Duplicate connection")
if theirTubRef:
# generate a new seqnum, one higher than the last one we've
# used. Note that UnauthenticatedTubs all share the same
# index, so we leak certain information about how many
# connections we've established.
old_seqnum = self.tub.master_table.get(theirTubRef.getTubID(),
0)
new_seqnum = old_seqnum + 1
new_slave_IR = offer.get('my-incarnation', None)
self.tub.master_table[theirTubRef.getTubID()] = new_seqnum
my_IR = self.tub.getIncarnationString()
decision['current-connection'] = "%s %s" % (my_IR, new_seqnum)
# these params will be copied into the Broker where we can
# retrieve them later, when we need to compare it against a new
# offer.
def _handleTubRequest(self, header, targetTubID):
"""
Proxy to the destination which is responsible for the target TubID.
:param bytes header: The first part of the Foolscap negotiation which
will need to be passed along to the proxy target.
:param bytes targetTubID: The TubID which was requested.
"""
try:
_, (ip, port_number) = self.factory.route_mapping()[targetTubID]
except KeyError:
raise NegotiationError("unknown TubID %s" % (targetTubID,))
if not ip:
raise NegotiationError("TubID not yet available %s" % (targetTubID,))
# Now proxy to ip:port_number
proxy(self, TCP4ClientEndpoint(self.factory.reactor, ip, port_number), header)
def _handleTubRequest(self, header, targetTubID):
"""
Proxy to the destination which is responsible for the target TubID.
:param bytes header: The first part of the Foolscap negotiation which
will need to be passed along to the proxy target.
:param bytes targetTubID: The TubID which was requested.
"""
try:
_, (ip, port_number) = self.factory.route_mapping()[targetTubID]
except KeyError:
raise NegotiationError("unknown TubID %s" % (targetTubID,))
if not ip:
raise NegotiationError("TubID not yet available %s" % (targetTubID,))
# Now proxy to ip:port_number
proxy(self, TCP4ClientEndpoint(self.factory.reactor, ip, port_number), header)