src/strip.vala
[app.mailtrimmer] / src / strip.vala
index 4e65238..466bc28 100644 (file)
@@ -368,13 +368,28 @@ public class Strip : GLib.Object {
                return;
        }
        
+       // initialize it with known data..
+       // that should wipe out dupes.
+       var matches = this.execute("SELECT id   FROM Attachment WHERE id = %d".printf(
+                       int.parse(sid)));  
+
+                
+               if (matches == "") {     
+                       // our old mailfort code deleted the crap out of old records...
+                       // if this occurs we will need to create the record again..
+                       this.fix_deleted_attachment_db(int.parse(sid),attachment);
+                       return;
+               }
+       
+       
        // initialize it with known data..
        // that should wipe out dupes.
        var filesize = this.execute("SELECT filesize FROM Attachment WHERE id = %d".printf(
                        int.parse(sid)));  
 
                if (filesize=="") {      
-                  GLib.debug("Ignoring record id (missing in database) :%s", sid);
+                  GLib.error("Ignoring record id (missing in database) :%s", sid);
                   return;
                }
                if (int.parse(filesize) < 1) {
@@ -423,6 +438,100 @@ public class Strip : GLib.Object {
     }
     
     
+    public void fix_deleted_attachment_db(int id, GMime.Part attachment)
+    {
+               
+        var filename = attachment.get_header("X-strip-content-name");
+        var file_path  = attachment.get_header("X-strip-path");
+        var fn =  StripApplication.opt_target_path + "/" + file_path;
+        var chksum = this.md5_file(fn);
+               var mime_type = attachment.get_header("X-strip-content-type");
+
+               var fileinfo = File.new_for_path(fn)
+                                       .query_info(GLib.FileAttribute.STANDARD_SIZE+","+GLib.FileAttribute.TIME_MODIFIED
+                                               ,GLib.FileQueryInfoFlags.NONE,null);
+       var file_size = (int) fileinfo.get_size();
+
+               if (!FileUtils.test (fn, FileTest.EXISTS)) {
+                       GLib.debug("SKIP -- file does not exist");
+               }
+      
+               this.real_query(-1, """
+                      
+                      
+                               INSERT INTO Attachment  (  
+                                       id, 
+                                       
+                                   msgid ,
+                                   queue_id ,
+                                   mime_filename ,
+                                   mime_type,
+                                    
+                                   stored_filename ,
+                                   mime_charset ,
+                                   mime_cdisp ,
+                                   mime_is_cover ,
+                                   
+                                   mime_is_multi ,
+                                   mime_is_mail,
+                                   mime_size ,
+                                   filesize,
+                                   
+                                   checksum,
+                                   created
+
+                               ) VALUES (
+                                       %d,  -- id
+                                       
+                                   '%s' , -- msgid
+                                   0,
+                                   '%s'  , -- filename
+                                   '%s',  -- mimetype
+                                   
+                                   '%s', -- stored file anme
+                                   '', -- charset
+                                   'attachment',
+                                   0,
+                                   0,
+                                   0,
+                                   %d, -- size
+                                   %d, -- size
+                                   
+                                   '%s', -- checkum
+                                       '%s' -- created:
+                               )
+                      
+                      
+                     """.printf(
+                               id,
+                                     this.mysql_escape(this.active_message_exim_id),
+                                     this.mysql_escape(filename),
+                                 this.mysql_escape(mime_type),
+                                 this.mysql_escape(file_path),
+                                       file_size,
+                                     file_size,
+                                     this.mysql_escape(chksum),
+                                       this.created_date
+                        ));
+             // this is done to fix the queue_id or maillog_id ??
+                this.query("""
+                 SELECT attachment_update(
+                      %d, -- in_id INT(11),
+                                               '', -- mime type
+                      '%s', -- in_created DATETIME,
+                      '%s' -- in_mailfort_sig varchar(64)
+                 )
+             """.printf(
+                               id, 
+                               this.created_date,
+                               this.mysql_escape(this.active_message_x_mailfort_sig)
+             
+             )
+               );
+               // GLib.error("added attachment?");
+    }
+    
+    
     public void replace_attachment(GMime.Multipart parent, GMime.Part attachment)
     {
         var sid = attachment.get_header("X-strip-id");
@@ -435,7 +544,7 @@ public class Strip : GLib.Object {
         
         var filename = attachment.get_filename().replace("/", "-").replace("\n", "").replace("\t", " ");
         var fn = GLib.Environment.get_tmp_dir() +
-                       "/"+ this.active_name + "."+   filename;
+                       "/"+ this.active_name + "."+   GLib.Uri.escape_string(filename,"", false);
 
            var outfile = new GMime.StreamFile.for_path(fn, "w");
            outfile.set_owner(true);
@@ -471,7 +580,7 @@ public class Strip : GLib.Object {
           """.printf(
                        this.mysql_escape(this.active_message_exim_id),
                        chksum,
-                       this.mysql_escape( attachment.get_filename() ), // what is thsi is invalid?
+                       this.mysql_escape( GLib.Uri.escape_string(attachment.get_filename(),"", false) ), // what is thsi is invalid?
                         file_size)
                );
                 
@@ -515,10 +624,10 @@ public class Strip : GLib.Object {
                var target_fn = "";
 
            if (StripApplication.opt_is_extracting) {
-                       target_fn = StripApplication.opt_target_path + "/" + this.created_dir +"/"+ file_id  + "-" + filename;
+                       target_fn = StripApplication.opt_target_path + "/" + this.created_dir +"/"+ file_id  + "-" + GLib.Uri.escape_string(filename,"", false);
                } 
                    
-           var stored =  "/" + this.created_dir +"/"+ file_id  + "-" + filename;
+           var stored =  "/" + this.created_dir +"/"+ file_id  + "-" + GLib.Uri.escape_string(filename,"", false);
                 this.query("""
                
                        SELECT attachment_update_store(
@@ -577,13 +686,19 @@ public class Strip : GLib.Object {
     }
     public string query(string str)
     {
-           return this.real_query(true, str);
+           return this.real_query(1, str);
     }
     public string execute(string str)
     {
-           return this.real_query(false, str);
+           return this.real_query(0, str);
     }
-    public string real_query(bool need_return, string str)
+    /**
+    * need_return 
+    0 = no
+    1 = yes
+    -1 = don't try.
+    */
+    public string real_query(int need_return, string str)
     {
                GLib.debug("Before Query : %u  : %s\n", this.mysql.errno(), this.mysql.error());
 
@@ -594,15 +709,19 @@ public class Strip : GLib.Object {
                
                
        
-       var rc=  this.mysql.query(str);         
+       var rc=  this.mysql.query(str); 
        if ( rc != 0 ) {
 
                    GLib.debug("ERROR %u: Query failed: %s\n", this.mysql.errno(), this.mysql.error());
                                Posix.exit(1);
                }
-               
-
-        var rs = mysql.use_result();
+       var rs = mysql.use_result();
+               if (need_return == -1) {
+                       return "";
+               }
+        
+        //GLib.debug("got %d rows", (int) rs.num_rows());
         
         var got_row = false;
                string[] row;
@@ -612,15 +731,21 @@ public class Strip : GLib.Object {
                        ret = row[0];
                
                }
-               if (!need_return) {
+               if (need_return == 0) {
+               if (StripApplication.opt_debug_sql) {
+                               GLib.debug("got %s", got_row ? "=Nothing=" : ret);
+                       }
                        return got_row ? "" : ret;
                }
                if (!got_row) {
+
                         GLib.debug("ERROR : no rows returned");
                        Posix.exit(1);
                        return "";
                }
-               GLib.debug("got %s", ret);
+       if (StripApplication.opt_debug_sql) {
+                       GLib.debug("got %s", ret);
+               }
                return ret;
                
                 
@@ -969,17 +1094,21 @@ public class Strip : GLib.Object {
                 continue;
             }
             
-
+            var ds = next_file.get_display_name();
             if (next_file.get_file_type() != FileType.DIRECTORY) {
                 
-                if (next_file.get_display_name()[0] == ',') {
+                
+                
+                if (ds[0] == ',') {
                        continue;
                }
                // other files to ignore?
-                
-                this.scan_file(basepath + subpath , next_file.get_display_name());
+                if (Regex.match_simple (".tgz$", ds)) {
+                       continue;
+               }
+                this.scan_file(basepath + subpath , ds);
                                if(this.has_replaced) {
-                                this.report_state("After scanning %s/%s".printf(basepath + subpath , next_file.get_display_name()));
+                                this.report_state("After scanning %s/%s".printf(basepath + subpath , ds));
                        }
                 continue;
             }
@@ -990,7 +1119,7 @@ public class Strip : GLib.Object {
 
 
         
-            var ds = next_file.get_display_name();
+
             // not really needed?? - we are storing attachments in a seperate location now...
             if (ds[0] == '.') {
                 next_file = null;