# Copyright 2005 James Bunton <james@delx.cjb.net>
# Licensed for distribution under the GPL version 2, check COPYING for details
+from tlib.throttle import Throttler
from tlib.xmlw import Element
from twisted.internet import protocol
import sys
+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):
- if not config.ftSizeLimit:
- return True # No limit
try:
size = int(size)
limit = int(config.ftSizeLimit)
except ValueError:
return False
+ if limit == 0:
+ return True
return limit > size
###########
self.filesize = filesize
if not checkSizeOk(self.filesize):
LogEvent(INFO, session.jabberID, "File too large.")
- session.legacycon.sendMessage(to, "", lang.get(session.lang).msnFtSizeRejected % (self.filename, config.ftSizeLimit, config.website), True)
+ 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):
- self.startTransfer(legacyFileSend)
+ doRateLimit(self.startTransfer, legacyFileSend)
+ self.cleanup()
def reject(self):
- del self.startTransfer
self.cancelTransfer()
+ self.cleanup()
+
+ def cleanup(self):
+ del self.startTransfer, self.cancelTransfer
try:
if not checkSizeOk(legacyftp.filesize):
LogEvent(INFO, session.jabberID, "File too large.")
legacyftp.reject()
- session.legacycon.sendMessage(senderJID, "", lang.get(session.lang).msnFtSizeRejected % (legacyftp.filename, config.ftSizeLimit, config.website), False)
+ text = lang.get(session.lang).msnFtSizeRejected % (legacyftp.filename, config.ftSizeLimit, config.website)
+ session.legacycon.sendMessage(senderJID, "", text, False)
+ session.sendMessage(to=session.jabberID, fro=senderJID, body=text)
return
self.session = session
self.toJID = self.session.jabberID + "/" + self.session.highestResource()
def discoFail(err=None):
LogEvent(INFO, self.ident, str(err))
- self.messageOobMode()
+ if hasattr(self.session.pytrans, "ftOOBReceive"):
+ self.messageOobMode()
+ else:
+ # No support
+ self.legacyftp.reject()
+ del self.legacyftp
d = disco.DiscoRequest(self.session.pytrans, self.toJID).doDisco()
d.addCallbacks(discoDone, discoFail)
def connectionLost(self, reason):
if self.state == self.STATE_READY:
self.factory.consumer.close()
+ else:
+ self.factory.consumer.error()
def _waitAuthOk(self):
ver, method = struct.unpack("!BB", self.buf[:2])
assert address not in self.activeConns
self.activeConns[address] = None
- if not isinstance(olist[0], (JEP65ConnectionReceive, JEP65ConnectionSend)):
+ if not isinstance(olist[0], JEP65ConnectionReceive):
legacyftp = olist[0]
connection = olist[1]
- elif not isinstance(olist[1], (JEP65ConnectionReceive, JEP65ConnectionSend)):
+ elif not isinstance(olist[1], JEP65ConnectionReceive):
legacyftp = olist[1]
connection = olist[0]
else:
LogEvent(WARN, '', "No JEP65Connection")
return
- legacyftp.accept(connection.transport)
+ doRateLimit(legacyftp.accept, connection.transport)
else:
LogEvent(WARN, '', "No pending connection.")
class OOBReceiveConnector:
def __init__(self, ftReceive, ftHttpPush):
self.ftReceive, self.ftHttpPush = ftReceive, ftHttpPush
- self.ftReceive.legacyftp.accept(self)
+ doRateLimit(self.ftReceive.legacyftp.accept, self)
def write(self, data):
self.ftHttpPush.write(data)