]> git.decadent.org.uk Git - dak.git/blobdiff - daklib/utils.py
mailwhitelist
[dak.git] / daklib / utils.py
index 27c3af38e422e1c5658462e5a0ccc4197cff749b..951270b5d2074fc380cfaba696d16b4d56bb010d 100755 (executable)
@@ -37,14 +37,14 @@ import stat
 import apt_pkg
 import database
 import time
-import tarfile
 import re
 import string
 import email as modemail
 from dak_exceptions import *
 from regexes import re_html_escaping, html_escaping, re_single_line_field, \
                     re_multi_line_field, re_srchasver, re_verwithext, \
-                    re_parse_maintainer, re_taint_free, re_gpg_uid, re_re_mark
+                    re_parse_maintainer, re_taint_free, re_gpg_uid, re_re_mark, \
+                    re_whitespace_comment
 
 ################################################################################
 
@@ -261,6 +261,7 @@ def create_hash(where, files, hashname, hashfunc):
             file_handle = open_file(f)
         except CantOpenError:
             rejmsg.append("Could not open file %s for checksumming" % (f))
+            continue
 
         files[f][hash_key(hashname)] = hashfunc(file_handle)
 
@@ -616,10 +617,11 @@ def send_mail (message, filename=""):
         whitelist_in = open_file(Cnf["Dinstall::MailWhiteList"])
         try:
             for line in whitelist_in:
-                if re_re_mark.match(line):
-                    whitelist.append(re.compile(re_re_mark.sub("", line.strip(), 1)))
-                else:
-                    whitelist.append(re.compile(re.escape(line.strip())))
+                if not re_whitespace_comment.match(line):
+                    if re_re_mark.match(line):
+                        whitelist.append(re.compile(re_re_mark.sub("", line.strip(), 1)))
+                    else:
+                        whitelist.append(re.compile(re.escape(line.strip())))
         finally:
             whitelist_in.close()
 
@@ -745,6 +747,15 @@ def where_am_i ():
 
 def which_conf_file ():
     res = socket.gethostbyaddr(socket.gethostname())
+    # In case we allow local config files per user, try if one exists
+    if Cnf.FindB("Config::" + res[0] + "::AllowLocalConfig"):
+        homedir = os.getenv("HOME")
+        confpath = os.path.join(homedir, "/etc/dak.conf")
+        if os.path.exists(confpath):
+            apt_pkg.ReadConfigFileISC(Cnf,default_config)
+
+    # We are still in here, so there is no local config file or we do
+    # not allow local files. Do the normal stuff.
     if Cnf.get("Config::" + res[0] + "::DakConfig"):
         return Cnf["Config::" + res[0] + "::DakConfig"]
     else:
@@ -752,6 +763,13 @@ def which_conf_file ():
 
 def which_apt_conf_file ():
     res = socket.gethostbyaddr(socket.gethostname())
+    # In case we allow local config files per user, try if one exists
+    if Cnf.FindB("Config::" + res[0] + "::AllowLocalConfig"):
+        homedir = os.getenv("HOME")
+        confpath = os.path.join(homedir, "/etc/dak.conf")
+        if os.path.exists(confpath):
+            apt_pkg.ReadConfigFileISC(Cnf,default_config)
+
     if Cnf.get("Config::" + res[0] + "::AptConfig"):
         return Cnf["Config::" + res[0] + "::AptConfig"]
     else:
@@ -1485,6 +1503,20 @@ def temp_filename(directory=None, prefix="dak", suffix=""):
 
 ################################################################################
 
+def temp_dirname(parent=None, prefix="dak", suffix=""):
+    """
+    Return a secure and unique directory by pre-creating it.
+    If 'parent' is non-null, it will be the directory the directory is pre-created in.
+    If 'prefix' is non-null, the filename will be prefixed with it, default is dak.
+    If 'suffix' is non-null, the filename will end with it.
+
+    Returns a pathname to the new directory
+    """
+
+    return tempfile.mkdtemp(suffix, prefix, parent)
+
+################################################################################
+
 def is_email_alias(email):
     """ checks if the user part of the email is listed in the alias file """
     global alias_cache
@@ -1526,54 +1558,4 @@ apt_pkg.ReadConfigFileISC(Cnf,default_config)
 if which_conf_file() != default_config:
     apt_pkg.ReadConfigFileISC(Cnf,which_conf_file())
 
-################################################################################
-
-def generate_contents_information(filename):
-    """
-    Generate a list of flies contained in a .deb
-
-    @ptype filename: string
-    @param filename: the path to a .deb
-
-    @rtype: list
-    @return: a list of files in the data.tar.* portion of the .deb
-    """
-    cmd = "ar t %s" % (filename)
-    (result, output) = commands.getstatusoutput(cmd)
-    if result != 0:
-        reject("%s: 'ar t' invocation failed." % (filename))
-        reject(utils.prefix_multi_line_string(output, " [ar output:] "), "")
-
-    # Ugh ... this is ugly ... Code ripped from process_unchecked.py
-    chunks = output.split('\n')
-
-    contents = []
-    try:
-        cmd = "ar x %s %s" % (filename, chunks[2])
-        (result, output) = commands.getstatusoutput(cmd)
-        if result != 0:
-            reject("%s: '%s' invocation failed." % (filename, cmd))
-            reject(utils.prefix_multi_line_string(output, " [ar output:] "), "")
-
-        # Got deb tarballs, now lets go through and determine what bits
-        # and pieces the deb had ...
-        if chunks[2] == "data.tar.gz":
-            data = tarfile.open("data.tar.gz", "r:gz")
-        elif chunks[2] == "data.tar.bz2":
-            data = tarfile.open("data.tar.bz2", "r:bz2")
-        else:
-            os.remove(chunks[2])
-            reject("couldn't find data.tar.*")
-
-        for tarinfo in data:
-            if not tarinfo.isdir():
-                contents.append(tarinfo.name[2:])
-
-    finally:
-        if os.path.exists( chunks[2] ):
-            shutil.rmtree( chunks[2] )
-            os.remove( chunks[2] )
-
-    return contents
-
 ###############################################################################