]> code.delx.au - pymsnt/blobdiff - src/ft.py
Properly quote passwd when sending to passport servers.
[pymsnt] / src / ft.py
index f1984281775258a830bb3923b6304f5bb5ab2e14..218441a0d6384211ea12f5d25e96af0ce031352c 100644 (file)
--- a/src/ft.py
+++ b/src/ft.py
@@ -1,6 +1,7 @@
 # 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
 
@@ -14,6 +15,17 @@ import random
 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):
        try:
                size = int(size)
@@ -37,18 +49,24 @@ class FTSend:
                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:
@@ -119,7 +137,9 @@ class FTReceive:
                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()
@@ -151,7 +171,12 @@ class FTReceive:
 
                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)
@@ -275,6 +300,8 @@ class JEP65ConnectionSend(protocol.Protocol):
        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])
@@ -375,17 +402,17 @@ class Proxy65(protocol.Factory):
                        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.")
        
@@ -421,7 +448,7 @@ from debug import LogEvent, INFO, WARN, ERROR
 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)