aboutsummaryrefslogtreecommitdiff
path: root/libsylph
diff options
context:
space:
mode:
Diffstat (limited to 'libsylph')
-rw-r--r--libsylph/pop.c12
-rw-r--r--libsylph/utils.c40
-rw-r--r--libsylph/utils.h3
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,