2007-01-21 [colin] 2.7.1cvs44
[claws.git] / src / common / utils.c
index dcd0375036ca71b0862f4c55e663dc566eeac63f..c1d1d84c15c4cc67c3358f771905e2c5254b8cbd 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2006 Hiroyuki Yamamoto & The Sylpheed-Claws Team
+ * Copyright (C) 1999-2007 Hiroyuki Yamamoto & The Claws Mail Team
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -351,14 +351,14 @@ gchar *to_human_readable(off_t size)
                gb_format = _("%.2fGB");
        }
        
-       if (size < 1024) {
+       if (size < (off_t)1024) {
                g_snprintf(str, sizeof(str), b_format, (gint)size);
                return str;
-       } else if (size >> 10 < 1024) {
+       } else if (size >> 10 < (off_t)1024) {
                divide(size, 10, t, r);
                g_snprintf(str, sizeof(str), kb_format, t, r);
                return str;
-       } else if (size >> 20 < 1024) {
+       } else if (size >> 20 < (off_t)1024) {
                divide(size, 20, t, r);
                g_snprintf(str, sizeof(str), mb_format, t, r);
                return str;
@@ -1639,10 +1639,14 @@ void decode_uri(gchar *decoded_uri, const gchar *encoded_uri)
 }
 
 gint scan_mailto_url(const gchar *mailto, gchar **to, gchar **cc, gchar **bcc,
-                    gchar **subject, gchar **body)
+                    gchar **subject, gchar **body, gchar **attach)
 {
        gchar *tmp_mailto;
        gchar *p;
+       const gchar *forbidden_uris[] = { ".gnupg/",
+                                         "/etc/passwd",
+                                         "/etc/shadow",
+                                         NULL };
 
        Xstrdup_a(tmp_mailto, mailto, return -1);
 
@@ -1689,6 +1693,19 @@ gint scan_mailto_url(const gchar *mailto, gchar **to, gchar **cc, gchar **bcc,
                } else if (body && !*body && !g_ascii_strcasecmp(field, "body")) {
                        *body = g_malloc(strlen(value) + 1);
                        decode_uri(*body, value);
+               } else if (attach && !*attach && !g_ascii_strcasecmp(field, "attach")) {
+                       int i = 0;
+                       *attach = g_malloc(strlen(value) + 1);
+                       decode_uri(*attach, value);
+                       for (; forbidden_uris[i]; i++) {
+                               if (strstr(*attach, forbidden_uris[i])) {
+                                       printf("Refusing to attach '%s', potential private data leak\n",
+                                                       *attach);
+                                       g_free(*attach);
+                                       *attach = NULL;
+                                       break;
+                               }
+                       }
                }
        }
 
@@ -1967,7 +1984,7 @@ const gchar *get_plugin_dir(void)
 
        if (!plugin_dir)
                plugin_dir = g_strconcat(w32_get_module_dir(),
-                                        "\\lib\\sylpheed-claws\\plugins\\",
+                                        "\\lib\\claws-mail\\plugins\\",
                                         NULL);
        return plugin_dir;
 #else
@@ -3103,7 +3120,7 @@ FILE *my_tmpfile(void)
        tmplen = strlen(tmpdir);
        progname = g_get_prgname();
        if (progname == NULL)
-               progname = "sylpheed-claws";
+               progname = "claws-mail";
        proglen = strlen(progname);
        Xalloca(fname, tmplen + 1 + proglen + sizeof(suffix),
                return tmpfile());
@@ -3145,12 +3162,12 @@ FILE *get_tmpfile_in_dir(const gchar *dir, gchar **filename)
 {
        int fd;
 #ifdef G_OS_WIN32
-       char *template = g_strdup_printf ("%s%csylpheed.XXXXXX",
+       char *template = g_strdup_printf ("%s%cclaws.XXXXXX",
                                          dir, G_DIR_SEPARATOR);
        fd = mkstemp_name(template, filename);
        g_free(template);
 #else
-       *filename = g_strdup_printf("%s%csylpheed.XXXXXX", dir, G_DIR_SEPARATOR);
+       *filename = g_strdup_printf("%s%cclaws.XXXXXX", dir, G_DIR_SEPARATOR);
        fd = mkstemp(*filename);
 #endif
        return fdopen(fd, "w+");
@@ -3277,7 +3294,7 @@ gchar *file_read_stream_to_str(FILE *fp)
        return str;
 }
 
-gint execute_async(gchar *const argv[])
+static gint execute_async(gchar *const argv[])
 {
        g_return_val_if_fail(argv != NULL && argv[0] != NULL, -1);
 
@@ -3290,7 +3307,7 @@ gint execute_async(gchar *const argv[])
        return 0;
 }
 
-gint execute_sync(gchar *const argv[])
+static gint execute_sync(gchar *const argv[])
 {
        gint status;
 
@@ -3361,7 +3378,7 @@ static gint is_unchanged_uri_char(char c)
        }
 }
 
-void encode_uri(gchar *encoded_uri, gint bufsize, const gchar *uri)
+static void encode_uri(gchar *encoded_uri, gint bufsize, const gchar *uri)
 {
        int i;
        int k;
@@ -4532,9 +4549,9 @@ static gchar *mailcap_get_command_in_file(const gchar *path, const gchar *type,
        while (fgets(buf, sizeof (buf), fp) != NULL) {
                gchar **parts = g_strsplit(buf, ";", 3);
                gchar *trimmed = parts[0];
-               while (trimmed[0] == ' ')
+               while (trimmed[0] == ' ' || trimmed[0] == '\t')
                        trimmed++;
-               while (trimmed[strlen(trimmed)-1] == ' ')
+               while (trimmed[strlen(trimmed)-1] == ' ' || trimmed[strlen(trimmed)-1] == '\t')
                        trimmed[strlen(trimmed)-1] = '\0';
 
                if (!strcmp(trimmed, type)) {
@@ -4547,13 +4564,13 @@ static gchar *mailcap_get_command_in_file(const gchar *path, const gchar *type,
                                gchar *testcmd = orig_testcmd;
                                if (strstr(testcmd,";"))
                                        *(strstr(testcmd,";")) = '\0';
-                               while (testcmd[0] == ' ')
+                               while (testcmd[0] == ' ' || testcmd[0] == '\t')
                                        testcmd++;
                                while (testcmd[strlen(testcmd)-1] == '\n')
                                        testcmd[strlen(testcmd)-1] = '\0';
                                while (testcmd[strlen(testcmd)-1] == '\r')
                                        testcmd[strlen(testcmd)-1] = '\0';
-                               while (testcmd[strlen(testcmd)-1] == ' ')
+                               while (testcmd[strlen(testcmd)-1] == ' ' || testcmd[strlen(testcmd)-1] == '\t')
                                        testcmd[strlen(testcmd)-1] = '\0';
                                        
                                if (strstr(testcmd, "%s")) {
@@ -4578,13 +4595,13 @@ static gchar *mailcap_get_command_in_file(const gchar *path, const gchar *type,
                        }
                        
                        trimmed = parts[1];
-                       while (trimmed[0] == ' ')
+                       while (trimmed[0] == ' ' || trimmed[0] == '\t')
                                trimmed++;
                        while (trimmed[strlen(trimmed)-1] == '\n')
                                trimmed[strlen(trimmed)-1] = '\0';
                        while (trimmed[strlen(trimmed)-1] == '\r')
                                trimmed[strlen(trimmed)-1] = '\0';
-                       while (trimmed[strlen(trimmed)-1] == ' ')
+                       while (trimmed[strlen(trimmed)-1] == ' ' || trimmed[strlen(trimmed)-1] == '\t')
                                trimmed[strlen(trimmed)-1] = '\0';
                        result = g_strdup(trimmed);
                        g_strfreev(parts);
@@ -4641,18 +4658,13 @@ void mailcap_update_default(const gchar *type, const gchar *command)
        FILE *outfp = fopen(outpath, "wb");
        gchar buf[BUFFSIZE];
 
-       if (!fp) {
-               g_free(path);
-               g_free(outpath);
-               return;
-       }
        if (!outfp) {
                g_free(path);
                g_free(outpath);
                fclose(fp);
                return;
        }
-       while (fgets(buf, sizeof (buf), fp) != NULL) {
+       while (fp && fgets(buf, sizeof (buf), fp) != NULL) {
                gchar **parts = g_strsplit(buf, ";", 3);
                gchar *trimmed = parts[0];
                while (trimmed[0] == ' ')
@@ -4670,7 +4682,10 @@ void mailcap_update_default(const gchar *type, const gchar *command)
                g_strfreev(parts);
        }
        fprintf(outfp, "%s; %s\n", type, command);
-       fclose(fp);
+
+       if (fp)
+               fclose(fp);
+
        fclose(outfp);
        g_rename(outpath, path);
 }
@@ -4695,14 +4710,30 @@ gint copy_dir(const gchar *src, const gchar *dst)
                debug_print("copying: %s -> %s\n", old_file, new_file);
                if (g_file_test(old_file, G_FILE_TEST_IS_REGULAR)) {
                        gint r = copy_file(old_file, new_file, TRUE);
-                       if (r < 0)
+                       if (r < 0) {
+                               g_dir_close(dir);
                                return r;
+                       }
+               } else if (g_file_test(old_file, G_FILE_TEST_IS_SYMLINK)) {
+                       GError *error;
+                       gint r = 0;
+                       gchar *target = g_file_read_link(old_file, &error);
+                       if (target)
+                               r = symlink(target, new_file);
+                       g_free(target);
+                       if (r < 0) {
+                               g_dir_close(dir);
+                               return r;
+                       }
                } else if (g_file_test(old_file, G_FILE_TEST_IS_DIR)) {
                        gint r = copy_dir(old_file, new_file);
-                       if (r < 0)
+                       if (r < 0) {
+                               g_dir_close(dir);
                                return r;
+                       }
                }
        }
+       g_dir_close(dir);
        return 0;
 }