diff options
Diffstat (limited to 'libsylph')
-rw-r--r-- | libsylph/pop.c | 12 | ||||
-rw-r--r-- | libsylph/utils.c | 40 | ||||
-rw-r--r-- | libsylph/utils.h | 3 |
3 files changed, 50 insertions, 5 deletions
diff --git a/libsylph/pop.c b/libsylph/pop.c index 8b110b3e..ed5edee3 100644 --- a/libsylph/pop.c +++ b/libsylph/pop.c @@ -464,12 +464,15 @@ GHashTable *pop3_get_uidl_table(PrefsAccount *ac_prefs) gchar uidl[POPBUFSIZE]; time_t recv_time; time_t now; + gchar *uid; table = g_hash_table_new(g_str_hash, g_str_equal); + uid = uriencode_for_filename(ac_prefs->userid); path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, UIDL_DIR, G_DIR_SEPARATOR_S, ac_prefs->recv_server, - "-", ac_prefs->userid, NULL); + "-", uid, NULL); + g_free(uid); if ((fp = g_fopen(path, "rb")) == NULL) { if (ENOENT != errno) FILE_OP_ERROR(path, "fopen"); g_free(path); @@ -504,13 +507,16 @@ gint pop3_write_uidl_list(Pop3Session *session) FILE *fp; Pop3MsgInfo *msg; gint n; + gchar *uid; if (!session->uidl_is_valid) return 0; + uid = uriencode_for_filename(session->ac_prefs->userid); path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, - "uidl", G_DIR_SEPARATOR_S, + UIDL_DIR, G_DIR_SEPARATOR_S, session->ac_prefs->recv_server, - "-", session->ac_prefs->userid, NULL); + "-", uid, NULL); + g_free(uid); if ((fp = g_fopen(path, "wb")) == NULL) { FILE_OP_ERROR(path, "fopen"); g_free(path); diff --git a/libsylph/utils.c b/libsylph/utils.c index e99f3d3a..296cd8d9 100644 --- a/libsylph/utils.c +++ b/libsylph/utils.c @@ -1,6 +1,6 @@ /* * LibSylph -- E-Mail client library - * Copyright (C) 1999-2005 Hiroyuki Yamamoto + * Copyright (C) 1999-2006 Hiroyuki Yamamoto * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -1532,6 +1532,14 @@ GList *uri_list_extract_filenames(const gchar *uri_list) } \ } +#define INT_TO_HEX(hex, val) \ +{ \ + if ((val) < 10) \ + hex = '0' + (val); \ + else \ + hex = 'a' + (val) - 10; \ +} + /* Converts two-digit hexadecimal to decimal. Used for unescaping escaped * characters. */ @@ -1545,6 +1553,16 @@ static gint axtoi(const gchar *hex_str) return (hi << 4) + lo; } +static void get_hex_str(gchar *out, guchar ch) +{ + gchar hex; + + INT_TO_HEX(hex, ch >> 4); + *out++ = hex; + INT_TO_HEX(hex, ch & 0x0f); + *out++ = hex; +} + gboolean is_uri_string(const gchar *str) { return (g_ascii_strncasecmp(str, "http://", 7) == 0 || @@ -1622,6 +1640,26 @@ gchar *encode_uri(const gchar *filename) return uri; } +gchar *uriencode_for_filename(const gchar *filename) +{ + const gchar *p = filename; + gchar *enc, *outp; + + outp = enc = g_malloc(strlen(filename) * 3 + 1); + + for (p = filename; *p != '\0'; p++) { + if (strchr("\t\r\n\"'\\/:;*?<>|", *p)) { + *outp++ = '%'; + get_hex_str(outp, *p); + outp += 2; + } else + *outp++ = *p; + } + + *outp = '\0'; + return enc; +} + gint scan_mailto_url(const gchar *mailto, gchar **to, gchar **cc, gchar **bcc, gchar **subject, gchar **body) { diff --git a/libsylph/utils.h b/libsylph/utils.h index 92fd831e..e5251991 100644 --- a/libsylph/utils.h +++ b/libsylph/utils.h @@ -1,6 +1,6 @@ /* * LibSylph -- E-Mail client library - * Copyright (C) 1999-2005 Hiroyuki Yamamoto + * Copyright (C) 1999-2006 Hiroyuki Yamamoto * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -346,6 +346,7 @@ gint get_uri_len (const gchar *str); void decode_uri (gchar *decoded_uri, const gchar *encoded_uri); gchar *encode_uri (const gchar *filename); +gchar *uriencode_for_filename (const gchar *filename); gint scan_mailto_url (const gchar *mailto, gchar **to, gchar **cc, |