/*
* Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2015 Hiroyuki Yamamoto & The Claws Mail Team
+ * Copyright (C) 1999-2016 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
#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)
while (*ch != 0) {
c = g_utf8_get_char_validated(ch, -1);
- if (c < 0) {
+ if (c == (gunichar)-1 || c == (gunichar)-2) {
/* non-unicode byte, move past it */
ch++;
continue;
if (w32_shgetfolderpath
(NULL, CSIDL_APPDATA|CSIDL_FLAG_CREATE,
NULL, 0, home_dir_utf16) < 0)
- strcpy (home_dir_utf16, "C:\\Sylpheed");
- home_dir_utf8 = g_utf16_to_utf8 ((const gunichar *)home_dir_utf16, -1, NULL, NULL, NULL);
+ strcpy (home_dir_utf16, "C:\\Claws Mail");
+ home_dir_utf8 = g_utf16_to_utf8 ((const gunichar2 *)home_dir_utf16, -1, NULL, NULL, NULL);
}
return home_dir_utf8;
#else
return s.st_mtime;
}
-off_t get_file_size_as_crlf(const gchar *file)
-{
- FILE *fp;
- off_t size = 0;
- gchar buf[BUFFSIZE];
-
- if ((fp = g_fopen(file, "rb")) == NULL) {
- FILE_OP_ERROR(file, "g_fopen");
- return -1;
- }
-
- while (fgets(buf, sizeof(buf), fp) != NULL) {
- strretchomp(buf);
- size += strlen(buf) + 2;
- }
-
- if (ferror(fp)) {
- FILE_OP_ERROR(file, "fgets");
- size = -1;
- }
-
- fclose(fp);
-
- return size;
-}
-
gboolean file_exist(const gchar *file, gboolean allow_fifo)
{
GStatBuf s;
return buf;
}
-static gint execute_async(gchar *const argv[])
+static gint execute_async(gchar *const argv[], const gchar *working_directory)
{
cm_return_val_if_fail(argv != NULL && argv[0] != NULL, -1);
- if (g_spawn_async(NULL, (gchar **)argv, NULL, G_SPAWN_SEARCH_PATH,
+ if (g_spawn_async(working_directory, (gchar **)argv, NULL, G_SPAWN_SEARCH_PATH,
NULL, NULL, NULL, FALSE) == FALSE) {
g_warning("couldn't execute command: %s", argv[0]);
return -1;
return 0;
}
-static gint execute_sync(gchar *const argv[])
+static gint execute_sync(gchar *const argv[], const gchar *working_directory)
{
gint status;
cm_return_val_if_fail(argv != NULL && argv[0] != NULL, -1);
#ifdef G_OS_UNIX
- if (g_spawn_sync(NULL, (gchar **)argv, NULL, G_SPAWN_SEARCH_PATH,
+ if (g_spawn_sync(working_directory, (gchar **)argv, NULL, G_SPAWN_SEARCH_PATH,
NULL, NULL, NULL, NULL, &status, NULL) == FALSE) {
g_warning("couldn't execute command: %s", argv[0]);
return -1;
else
return -1;
#else
- if (g_spawn_sync(NULL, (gchar **)argv, NULL, G_SPAWN_SEARCH_PATH|
- G_SPAWN_CHILD_INHERITS_STDIN|G_SPAWN_LEAVE_DESCRIPTORS_OPEN,
+ if (g_spawn_sync(working_directory, (gchar **)argv, NULL,
+ G_SPAWN_SEARCH_PATH|
+ G_SPAWN_CHILD_INHERITS_STDIN|
+ G_SPAWN_LEAVE_DESCRIPTORS_OPEN,
NULL, NULL, NULL, NULL, &status, NULL) == FALSE) {
g_warning("couldn't execute command: %s", argv[0]);
return -1;
#endif
}
-gint execute_command_line(const gchar *cmdline, gboolean async)
+gint execute_command_line(const gchar *cmdline, gboolean async,
+ const gchar *working_directory)
{
gchar **argv;
gint ret;
argv = strsplit_with_quote(cmdline, " ", 0);
if (async)
- ret = execute_async(argv);
+ ret = execute_async(argv, working_directory);
else
- ret = execute_sync(argv);
+ ret = execute_sync(argv, working_directory);
g_strfreev(argv);
g_snprintf(buf, sizeof(buf), DEFAULT_BROWSER_CMD, encoded_uri);
}
- execute_command_line(buf, TRUE);
+ execute_command_line(buf, TRUE, NULL);
#else
ShellExecute(NULL, "open", uri, NULL, NULL, SW_SHOW);
#endif
g_snprintf(buf, sizeof(buf), DEFAULT_EDITOR_CMD, filepath);
}
- execute_command_line(buf, TRUE);
+ execute_command_line(buf, TRUE, NULL);
return 0;
}
return offset_string;
}
-void get_rfc822_date(gchar *buf, gint len)
+static void _get_rfc822_date(gchar *buf, gint len, gboolean hidetz)
{
struct tm *lt;
time_t t;
day, mon, &dd, &hh, &mm, &ss, &yyyy);
g_snprintf(buf, len, "%s, %d %s %d %02d:%02d:%02d %s",
- day, dd, mon, yyyy, hh, mm, ss, tzoffset(&t));
+ day, dd, mon, yyyy, hh, mm, ss, (hidetz? "-0000": tzoffset(&t)));
+}
+
+void get_rfc822_date(gchar *buf, gint len)
+{
+ _get_rfc822_date(buf, len, FALSE);
+}
+
+void get_rfc822_date_hide_tz(gchar *buf, gint len)
+{
+ _get_rfc822_date(buf, len, TRUE);
}
void debug_set_mode(gboolean mode)
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()
if ((fp = g_fopen(filename, "rb")) == NULL)
return FALSE;
while (i < 60 && score < 3
- && fgets(buffer, sizeof (buffer), fp) > 0) {
+ && fgets(buffer, sizeof (buffer), fp) != NULL) {
if (!strncmp(buffer, "From:", strlen("From:")))
score++;
else if (!strncmp(buffer, "Date:", strlen("Date:")))
GSList *canonical_parts = NULL;
GStatBuf st;
int i;
+#ifndef G_OS_WIN32
gboolean follow_symlinks = TRUE;
+#endif
if (depth > 32) {
#ifndef G_OS_WIN32
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);
return out;
}
#endif
+
+/* Attempts to read count bytes from a PRNG into memory area starting at buf.
+ * It is up to the caller to make sure there is at least count bytes
+ * available at buf. */
+gboolean
+get_random_bytes(void *buf, size_t count)
+{
+ /* Open our prng source. */
+#if defined G_OS_WIN32
+ HCRYPTPROV rnd;
+
+ if (!CryptAcquireContext(&rnd, NULL, NULL, PROV_RSA_FULL, 0) &&
+ !CryptAcquireContext(&rnd, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET)) {
+ debug_print("Could not acquire a CSP handle.\n");
+ return FALSE;
+ }
+#else
+ int rnd;
+ ssize_t ret;
+
+ rnd = open("/dev/urandom", O_RDONLY);
+ if (rnd == -1) {
+ perror("open on /dev/urandom");
+ debug_print("Could not open /dev/urandom.\n");
+ return FALSE;
+ }
+#endif
+
+ /* Read data from the source into buf. */
+#if defined G_OS_WIN32
+ if (!CryptGenRandom(rnd, count, buf)) {
+ 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");
+ debug_print("Could not read enough data from /dev/urandom, read only %ld of %lu bytes.\n", ret, count);
+ close(rnd);
+ return FALSE;
+ }
+#endif
+
+ /* Close the prng source. */
+#if defined G_OS_WIN32
+ CryptReleaseContext(rnd, 0);
+#else
+ close(rnd);
+#endif
+
+ return TRUE;
+}