0.9.4claws61
[claws.git] / src / common / utils.c
index 32821099e27d0d35ad029a14591cef115afee5a8..d5e861f527bca8e3d6f833ec2f96d1f101522c41 100644 (file)
@@ -576,7 +576,6 @@ gint subject_compare_for_sort(const gchar *s1, const gchar *s2)
 void trim_subject_for_compare(gchar *str)
 {
        gchar *srcp;
-       int skip;
 
        eliminate_parenthesis(str, '[', ']');
        eliminate_parenthesis(str, '(', ')');
@@ -3595,3 +3594,65 @@ gchar *generate_msgid(const gchar *address, gchar *buf, gint len)
        g_free(addr);
        return buf;
 }
+
+/**
+ * Create a new boundary in a way that it is very unlikely that this
+ * will occur in the following text.  It would be easy to ensure
+ * uniqueness if everything is either quoted-printable or base64
+ * encoded (note that conversion is allowed), but because MIME bodies
+ * may be nested, it may happen that the same boundary has already
+ * been used. We avoid scanning the message for conflicts and hope the
+ * best.
+ *
+ *   boundary := 0*69<bchars> bcharsnospace
+ *   bchars := bcharsnospace / " "
+ *   bcharsnospace := DIGIT / ALPHA / "'" / "(" / ")" /
+ *                    "+" / "_" / "," / "-" / "." /
+ *                    "/" / ":" / "=" / "?"  
+ *
+ * ":" and "," removed because of buggy MTAs
+ */
+
+gchar *generate_mime_boundary(void)
+{
+       static gchar tbl[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+                            "abcdefghijklmnopqrstuvwxyz" 
+                            "1234567890'()+_./=?";
+       gchar bufuniq[17];
+       gchar bufdate[BUFFSIZE];
+       int i, equal;
+       int pid;
+
+       pid = getpid();
+
+       /* We make the boundary depend on the pid, so that all running
+        * processed generate different values even when they have been
+        * started within the same second and srand48(time(NULL)) has been
+        * used.  I can't see whether this is really an advantage but it
+        * doesn't do any harm.
+        */
+       equal = -1;
+       for (i = 0; i < sizeof(bufuniq) - 1; i++) {
+               bufuniq[i] = tbl[(lrand48() ^ pid) % (sizeof(tbl) - 1)];        /* fill with random */
+               if (bufuniq[i] == '=' && equal == -1)
+                       equal = i;
+       }
+       bufuniq[i] = 0;
+
+       /* now make sure that we do have the sequence "=." in it which cannot
+        * be matched by quoted-printable or base64 encoding */
+       if (equal != -1 && (equal + 1) < i)
+               bufuniq[equal + 1] = '.';
+       else {
+               bufuniq[0] = '=';
+               bufuniq[1] = '.';
+       }
+
+       get_rfc822_date(bufdate, sizeof(bufdate));
+       subst_char(bufdate, ' ', '_');
+       subst_char(bufdate, ',', '_');
+       subst_char(bufdate, ':', '_');
+
+       return g_strdup_printf("Multipart_%s_%s",
+                              bufdate, bufuniq);
+}