Revert "Disallow '?' in filename when saving message part on Windows."
[claws.git] / src / common / utils.c
index ad67d3cac9f42b9c6685ab9ca80d7a1446ac1a64..7edaf236c421d39b1840000583228cb6896a4a6f 100644 (file)
@@ -89,9 +89,6 @@
 #define BUFFSIZE       8192
 
 static gboolean debug_mode = FALSE;
-#ifdef G_OS_WIN32
-static GSList *tempfiles=NULL;
-#endif
 
 #if !GLIB_CHECK_VERSION(2, 26, 0)
 guchar *g_base64_decode_wa(const gchar *text, gsize *out_len)
@@ -1092,13 +1089,13 @@ static const gchar * line_has_quote_char_last(const gchar * str, const gchar *qu
        gchar * tmp_pos = NULL;
        int i;
 
-       if (quote_chars == NULL)
+       if (str == NULL || quote_chars == NULL)
                return NULL;
 
        for (i = 0; i < strlen(quote_chars); i++) {
-               tmp_pos = strrchr (str, quote_chars[i]);
+               tmp_pos = strrchr (str, quote_chars[i]);
                if(position == NULL
-                  || (tmp_pos != NULL && position <= tmp_pos) )
+                               || (tmp_pos != NULL && position <= tmp_pos) )
                        position = tmp_pos;
        }
        return position;
@@ -1181,13 +1178,13 @@ const gchar * line_has_quote_char(const gchar * str, const gchar *quote_chars)
        gchar * tmp_pos = NULL;
        int i;
 
-       if (quote_chars == NULL)
-               return FALSE;
+       if (str == NULL || quote_chars == NULL)
+               return NULL;
 
        for (i = 0; i < strlen(quote_chars); i++) {
-               tmp_pos = strchr (str,  quote_chars[i]);
+               tmp_pos = strchr (str, quote_chars[i]);
                if(position == NULL
-                  || (tmp_pos != NULL && position >= tmp_pos) )
+                               || (tmp_pos != NULL && position >= tmp_pos) )
                        position = tmp_pos;
        }
        return position;
@@ -1377,7 +1374,7 @@ GList *uri_list_extract_filenames(const gchar *uri_list)
                                        *file = '\0';
                                        strncpy(escaped_utf8uri, p, q - p + 1);
                                        escaped_utf8uri[q - p + 1] = '\0';
-                                       decode_uri(file, escaped_utf8uri);
+                                       decode_uri_with_plus(file, escaped_utf8uri, FALSE);
                    /*
                     * g_filename_from_uri() rejects escaped/locale encoded uri
                     * string which come from Nautilus.
@@ -1607,7 +1604,6 @@ gint scan_mailto_url(const gchar *mailto, gchar **from, gchar **to, gchar **cc,
                                g_warning("couldn't set insert file '%s' in body", value);
                        }
                        g_free(tmp);
-                       tmp = NULL;
                } else if (attach && !g_ascii_strcasecmp(field, "attach")) {
                        int i = 0;
                        gchar *tmp = decode_uri_gdup(value);
@@ -1616,7 +1612,6 @@ gint scan_mailto_url(const gchar *mailto, gchar **from, gchar **to, gchar **cc,
                                        g_print("Refusing to attach '%s', potential private data leak\n",
                                                        tmp);
                                        g_free(tmp);
-                                       tmp = NULL;
                                        break;
                                }
                        }
@@ -1793,7 +1788,7 @@ const gchar *get_home_dir(void)
                            (NULL, CSIDL_APPDATA|CSIDL_FLAG_CREATE,
                             NULL, 0, home_dir_utf16) < 0)
                                strcpy (home_dir_utf16, "C:\\Claws Mail");
-               home_dir_utf8 = g_utf16_to_utf8 ((const gunichar *)home_dir_utf16, -1, NULL, NULL, NULL);
+               home_dir_utf8 = g_utf16_to_utf8 ((const gunichar2 *)home_dir_utf16, -1, NULL, NULL, NULL);
        }
        return home_dir_utf8;
 #else
@@ -3538,7 +3533,7 @@ static void _get_rfc822_date(gchar *buf, gint len, gboolean hidetz)
        gchar day[4], mon[4];
        gint dd, hh, mm, ss, yyyy;
        struct tm buf1;
-       gchar buf2[BUFFSIZE];
+       gchar buf2[RFC822_DATE_BUFFSIZE];
 
        t = time(NULL);
        lt = localtime_r(&t, &buf1);
@@ -3731,39 +3726,6 @@ gint g_int_compare(gconstpointer a, gconstpointer b)
        return GPOINTER_TO_INT(a) - GPOINTER_TO_INT(b);
 }
 
-gchar *generate_msgid(gchar *buf, gint len, gchar *user_addr)
-{
-       struct tm *lt;
-       time_t t;
-       gchar *addr;
-       struct tm buft;
-
-       t = time(NULL);
-       lt = localtime_r(&t, &buft);
-
-       if (user_addr != NULL)
-             addr = g_strdup_printf(".%s", user_addr);
-       else if (strlen(buf) != 0)
-             addr = g_strdup_printf("@%s", buf);
-       else
-             addr = g_strdup_printf("@%s", get_domain_name());
-
-       /* Replace all @ but the last one in addr, with underscores.
-        * RFC 2822 States that msg-id syntax only allows one @.
-        */
-       while (strchr(addr, '@') != NULL && strchr(addr, '@') != strrchr(addr, '@'))
-               *(strchr(addr, '@')) = '_';
-
-       g_snprintf(buf, len, "%04d%02d%02d%02d%02d%02d.%08x%s",
-                  lt->tm_year + 1900, lt->tm_mon + 1,
-                  lt->tm_mday, lt->tm_hour,
-                  lt->tm_min, lt->tm_sec,
-                  (guint) rand(), addr);
-
-       g_free(addr);
-       return buf;
-}
-
 /*
    quote_cmd_argument()
 
@@ -4123,7 +4085,7 @@ void replace_returns(gchar *str)
 }
 
 /* get_uri_part() - retrieves a URI starting from scanpos.
-                   Returns TRUE if succesful */
+                   Returns TRUE if successful */
 gboolean get_uri_part(const gchar *start, const gchar *scanpos,
                             const gchar **bp, const gchar **ep, gboolean hdr)
 {
@@ -4159,7 +4121,7 @@ gboolean get_uri_part(const gchar *start, const gchar *scanpos,
         * should pass some URI type to this function and decide on that whether
         * to perform punctuation stripping */
 
-#define IS_REAL_PUNCT(ch)      (g_ascii_ispunct(ch) && !strchr("/?=-_)", ch))
+#define IS_REAL_PUNCT(ch)      (g_ascii_ispunct(ch) && !strchr("/?=-_~)", ch))
 
        for (; ep_ - 1 > scanpos + 1 &&
               IS_REAL_PUNCT(*(ep_ - 1));
@@ -4220,7 +4182,7 @@ static gboolean is_toplvl_domain(GHashTable *tab, const gchar *first, const gcha
        return g_hash_table_lookup(tab, buf) != NULL;
 }
 
-/* get_email_part() - retrieves an email address. Returns TRUE if succesful */
+/* get_email_part() - retrieves an email address. Returns TRUE if successful */
 gboolean get_email_part(const gchar *start, const gchar *scanpos,
                               const gchar **bp, const gchar **ep, gboolean hdr)
 {
@@ -4371,7 +4333,7 @@ search_again:
                ep_ += 3;
 
                /* go to matching '>' (or next non-rfc822 char, like \n) */
-               for (; *ep_ != '>' && *ep != '\0' && IS_RFC822_CHAR(*ep_); ep_++)
+               for (; *ep_ != '>' && *ep_ != '\0' && IS_RFC822_CHAR(*ep_); ep_++)
                        ;
 
                /* include the bracket */
@@ -5218,7 +5180,9 @@ static GSList *cm_split_path(const gchar *filename, int depth)
        GSList *canonical_parts = NULL;
        GStatBuf st;
        int i;
+#ifndef G_OS_WIN32
        gboolean follow_symlinks = TRUE;
+#endif
 
        if (depth > 32) {
 #ifndef G_OS_WIN32
@@ -5261,7 +5225,9 @@ static GSList *cm_split_path(const gchar *filename, int depth)
                        if(g_stat(tmp_path, &st) < 0) {
                                if (errno == ENOENT) {
                                        errno = 0;
+#ifndef G_OS_WIN32
                                        follow_symlinks = FALSE;
+#endif
                                }
                                if (errno != 0) {
                                        g_free(tmp_path);
@@ -5417,7 +5383,7 @@ get_random_bytes(void *buf, size_t count)
 
        rnd = open("/dev/urandom", O_RDONLY);
        if (rnd == -1) {
-               perror("open on /dev/urandom");
+               FILE_OP_ERROR("/dev/urandom", "open");
                debug_print("Could not open /dev/urandom.\n");
                return FALSE;
        }
@@ -5426,14 +5392,14 @@ get_random_bytes(void *buf, size_t count)
        /* Read data from the source into buf. */
 #if defined G_OS_WIN32
        if (!CryptGenRandom(rnd, count, buf)) {
-               debug_print("Could not read %d random bytes.\n", count);
+               debug_print("Could not read %zd random bytes.\n", count);
                CryptReleaseContext(rnd, 0);
                return FALSE;
        }
 #else
        ret = read(rnd, buf, count);
        if (ret != count) {
-               perror("read from /dev/urandom");
+               FILE_OP_ERROR("/dev/urandom", "read");
                debug_print("Could not read enough data from /dev/urandom, read only %ld of %lu bytes.\n", ret, count);
                close(rnd);
                return FALSE;