+
+def doRateLimit(setConsumer, consumer):
+ try:
+ rateLimit = int(config.ftRateLimit)
+ except ValueError:
+ rateLimit = 0
+ if rateLimit > 0:
+ throttler = Throttler(consumer, rateLimit)
+ setConsumer(throttler)
+ else:
+ setConsumer(consumer)
+
+def checkSizeOk(size):
+ try:
+ size = int(size)
+ limit = int(config.ftSizeLimit)
+ except ValueError:
+ return False
+ if limit == 0:
+ return True
+ return limit > size
+
+###########
+# Sending #
+###########
+
+class FTSend:
+ """ For file transfers going from Jabber to MSN. """
+ def __init__(self, session, to, startTransfer, cancelTransfer, filename, filesize):
+ self.startTransfer = startTransfer
+ self.cancelTransfer = cancelTransfer
+ self.filename = filename
+ self.filesize = filesize
+ if not checkSizeOk(self.filesize):
+ LogEvent(INFO, session.jabberID, "File too large.")
+ text = lang.get(session.lang).msnFtSizeRejected % (self.filename, config.ftSizeLimit, config.website)
+ session.legacycon.sendMessage(to, "", text, True)
+ session.sendMessage(to=session.jabberID, fro=to, body=text)
+ self.reject()
+ return
+
+ session.legacycon.sendFile(to, self)
+
+ def accept(self, legacyFileSend):
+ doRateLimit(self.startTransfer, legacyFileSend)
+ self.cleanup()
+
+ def reject(self):
+ self.cancelTransfer()
+ self.cleanup()
+
+ def cleanup(self):
+ del self.startTransfer, self.cancelTransfer
+
+
+try:
+ from twisted.web import http
+except ImportError:
+ try:
+ from twisted.protocols import http
+ except ImportError:
+ print "Couldn't find http.HTTPClient. If you're using Twisted 2.0, make sure that you've installed twisted.web"
+ raise
+
+
+class OOBHeaderHelper(http.HTTPClient):
+ """ Makes a HEAD request and grabs the length """
+ def connectionMade(self):
+ self.sendCommand("HEAD", self.factory.path.encode("utf-8"))
+ self.sendHeader("Host", (self.factory.host + ":" + str(self.factory.port)).encode("utf-8"))
+ self.endHeaders()
+
+ def handleEndHeaders(self):
+ self.factory.gotLength(self.length)
+
+ def handleResponse(self, data):
+ pass
+
+
+class OOBSendConnector(http.HTTPClient):
+ def connectionMade(self):
+ self.sendCommand("GET", self.factory.path.encode("utf-8"))
+ self.sendHeader("Host", (self.factory.host + ":" + str(self.factory.port)).encode("utf-8"))
+ self.endHeaders()
+ self.first = True
+
+ def handleResponsePart(self, data):
+ self.factory.consumer.write(data)
+
+ def handleResponseEnd(self):
+ # This is called once before writing is finished, and once when the
+ # connection closes. We only consumer.close() on the second.
+ if self.first:
+ self.first = False
+ else:
+ self.factory.consumer.close()
+ self.factory.consumer = None
+ self.factory.finished()
+
+
+
+
+
+#############
+# Receiving #
+#############
+