[tor-commits] [gettor/master] Allowed attachment size of your provider too small? Get a

kaner at torproject.org kaner at torproject.org
Mon Oct 24 15:43:44 UTC 2011


commit 1ebe00e786a5a36856cd8db6c3ea54e8c0681907
Author: Christian Fromme <kaner at strace.org>
Date:   Sun Oct 16 21:04:29 2011 +0200

    Allowed attachment size of your provider too small? Get a
    nice response by GetTor telling you so. Fixes #4166, #2520
    and parts of #3920
---
 gettor.conf             |    5 +++++
 lib/gettor/i18n.py      |   10 +++++++++-
 lib/gettor/requests.py  |    4 +++-
 lib/gettor/responses.py |   41 +++++++++++++++++++++++++++++++++++++++--
 lib/gettor/utils.py     |   34 +++++++++++++++++++++++++++++-----
 5 files changed, 85 insertions(+), 9 deletions(-)

diff --git a/gettor.conf b/gettor.conf
index 56f8c35..c022e88 100644
--- a/gettor.conf
+++ b/gettor.conf
@@ -33,6 +33,11 @@ BLACKLIST_THRES = 3
 # Which mirror to sync packages from
 RSYNC_MIRROR = "rsync.torproject.org"
 
+# Which email provider allows for what size of attachments? (Size in MB)
+PROVIDER_ATTACHMENT_SIZES = { "gmail.com": 25,
+                              "yahoo.com": 25,
+                              "yahoo.cn": 25 }
+
 # Default locale
 DEFAULT_LOCALE = "en"
 
diff --git a/lib/gettor/i18n.py b/lib/gettor/i18n.py
index 64c9a5c..6c77fd2 100644
--- a/lib/gettor/i18n.py
+++ b/lib/gettor/i18n.py
@@ -269,5 +269,13 @@ _("""How do I extract the file(s) you sent me?"""),
  # GETTOR_TEXT[63]
 _("""QUESTION:"""),
  # GETTOR_TEXT[64]
-_("""ANSWER:""")
+_("""ANSWER:"""),
+ # GETTOR_TEXT[65]
+_("""Sorry, but the package you requested (%s) is too large for your 
+provider to accept as an attachment. Try using another provider that allows 
+for larger email attachments. Or try one of the following mirrors:
+
+  https://www.oignon.net/dist/torbrowser/
+  https://tor.beme-it.de/dist/torbrowser/
+  https://www.torservers.net/mirrors/torproject.org/dist/torbrowser/""")
 ]
diff --git a/lib/gettor/requests.py b/lib/gettor/requests.py
index 0a2741e..4383813 100644
--- a/lib/gettor/requests.py
+++ b/lib/gettor/requests.py
@@ -24,13 +24,15 @@ class requestMail:
         self.request['user'] = self.parsedMessage["Return-Path"]
         # Normalize address before hashing
         normalized_addr = gettor.utils.normalizeAddress(self.request['user'])
+        max_attach = gettor.utils.getMaxAttSize(normalized_addr, config)
         self.request['hashed_user'] = gettor.utils.getHash(normalized_addr)
         self.request['ouraddr'] = self.getRealTo(self.parsedMessage["to"])
         self.request['locale'] = self.getLocaleInTo(self.request['ouraddr'])
         self.request['package'] = None
         self.request['split'] = False
         self.request['forward'] = None
-        self.request['valid'] = False # This will get set by gettor.filters
+        self.request['valid'] = False  # This will get set by gettor.filters
+        self.request['max_attach'] = max_attach
 
     def getRealTo(self, toField):
         """If someone wrote to `gettor+zh_CN at torproject.org', the `From:' field
diff --git a/lib/gettor/responses.py b/lib/gettor/responses.py
index 6a5adf7..6448f37 100644
--- a/lib/gettor/responses.py
+++ b/lib/gettor/responses.py
@@ -165,6 +165,11 @@ def getDelayAlertMsg(t, packageInfo):
          + t.gettext(i18n.GETTOR_TEXT[39]) + "\n\n" \
          + getSupportText(t)
 
+def getSorrySizeMsg(t, packageInfo):
+    return getGreetingText(t) \
+           + t.gettext(i18n.GETTOR_TEXT[65] % packageInfo) + "\n\n" \
+           + getSupportText(t)
+
 def getNoSplitAvailable(t):
     return getGreetingText(t) \
          + t.gettext(i18n.GETTOR_TEXT[1]) + "\n\n" \
@@ -210,7 +215,27 @@ class Response:
             if self.reqInfo['split']:
                 return self.sendSplitPackage()
             else:
-                return self.sendPackage()
+                # Check if the user's allowed attachment size is okay.
+                if self.attachmentSizeOk(self.reqInfo['package'], self.reqInfo['max_attach']):
+                    return self.sendPackage()
+                else:
+                    return self.sendSorrySize()
+
+    def attachmentSizeOk(self, package, max_attach):
+        """Check if the user is allowed to receive a certain attachment size-wise.
+        """
+        if max_attach == 0:
+           return True
+
+        try:
+            package_path = os.path.join(self.config.BASEDIR, "packages", package + ".z")
+            package_size = os.path.getsize(package_path)
+            if package_size <= max_attach:
+                return True
+        except OSError:
+            log.error("Ugh, this is bad. package %s isnt available!" % package_path)
+
+        return False
 
     def isAllowed(self):
         """Do all checks necessary to decide whether the reply-to user is 
@@ -365,7 +390,19 @@ class Response:
 
         logging.info("Sending delay alert to %s" % self.reqInfo['hashed_user'])
         return self.sendTextEmail(getDelayAlertMsg(self.t, packageInfo))
-            
+
+
+    def sendSorrySize(self):
+        """Send a polite note that the user's provider doesn't support the
+           attachment size necessary for a given package.
+        """
+        if self.isBlacklistedForMessageType("sendSorrySize"):
+            # Don't send anything
+            return False
+
+        logging.info("Sending sorry size email to %s" % self.reqInfo['hashed_user']) 
+        return self.sendTextEmail(getSorrySizeMsg(self.t, self.reqInfo['package']))
+
     def sendHelp(self):
         """Send a help mail. This happens when a user sent us a request we 
            didn't really understand
diff --git a/lib/gettor/utils.py b/lib/gettor/utils.py
index c06e40f..edcd945 100644
--- a/lib/gettor/utils.py
+++ b/lib/gettor/utils.py
@@ -298,6 +298,25 @@ def removeFromListByRegex(l, string):
 
     return l
 
+def getBase64Size(unencoded_size):
+    """Return the number of bytes a given byte sequence will expand to if it
+       is base64 (MIME) encoded.
+
+       Source for the formula: Wikipedia
+    """
+    return (unencoded_size + 814) * 1.37
+
+def getMaxAttSize(addr, config):
+    """Return the maximum attachment size allowed for a certain email 
+       provider. If the provider isn't known by us, return 0, indicating
+       an unlimited attachment size.
+    """
+    (_, domain) = emailGetLocalAndDomainPart(addr)
+    if domain in config.PROVIDER_ATTACHMENT_SIZES:
+       return config.PROVIDER_ATTACHMENT_SIZES[domain] * 1024 * 1024
+    else:
+       return 0
+
 # The following code is more or less taken from BridgeDB
 
 class BadEmail(Exception):
@@ -355,10 +374,10 @@ def extractAddrSpec(addr):
     localpart, domain = m.groups()
     return localpart, domain
 
-def normalizeEmail(addr):
-    """Given the contents of a from line, and a map of supported email
-       domains (in lowercase), raise BadEmail or return a normalized
-       email address.
+def emailGetLocalAndDomainPart(addr):
+    """For a given email address, return a touple of localpart, domainpart.
+       Example:
+       bla at foo.org -> bla, foo.org
     """
     addr = addr.lower()
     localpart, domain = extractAddrSpec(addr)
@@ -369,5 +388,10 @@ def normalizeEmail(addr):
         localpart = localpart[:idx]
     localpart = localpart.replace(".", "")
 
-    return "%s@%s"%(localpart, domain)
+    return localpart, domain
+
+def normalizeEmail(addr):
+    """Return normalized email address.
+    """
+    return "%s@%s" % emailGetLocalAndDomainPart(addr)
 





More information about the tor-commits mailing list